Skip to content

Commit 2de31f8

Browse files
committed
完善router功能
1 parent 2b52b78 commit 2de31f8

File tree

10 files changed

+378
-39
lines changed

10 files changed

+378
-39
lines changed

app/src/main/java/com/flyjingfish/modulecommunication/SchemeFilterActivity.kt

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,31 @@ import androidx.core.net.toUri
77
import com.flyjingfish.module_communication_annotation.ImplementClassUtils
88
import com.flyjingfish.module_communication_route.ModuleRoute
99
import com.flyjingfish.user.TestBean
10+
import com.flyjingfish.user.TestBean2
1011
import com.flyjingfish.user.UserHelper
1112
import com.google.gson.Gson
13+
import java.util.ArrayList
14+
import java.util.Arrays
1215

1316

1417
class SchemeFilterActivity : ComponentActivity() {
1518
override fun onCreate(savedInstanceState: Bundle?) {
1619
super.onCreate(savedInstanceState)
17-
// val uri = intent.data
18-
val userHelper = ImplementClassUtils.getSingleInstance<UserHelper>(UserHelper::class)
19-
val user = userHelper?.getUser()
20-
val gson = Gson()
21-
val intArray = intArrayOf(1,2,3)
22-
val testArray = arrayOf(TestBean(1),TestBean(2))
23-
// Log.e("SchemeFilterActivity",gson.toJson(intArray))
24-
val uriTest = "lightrouter://test.flyjingfish.com/user/DetailActivity?age=10&name=hahahaha&aChar=a&user=${gson.toJson(user)}&userIds=${gson.toJson(intArray)}&userList=${gson.toJson(testArray)}"
25-
Log.e("SchemeFilterActivity",uriTest)
26-
27-
val uri = uriTest.toUri()
20+
val uri = intent.data
21+
// val userHelper = ImplementClassUtils.getSingleInstance<UserHelper>(UserHelper::class)
22+
// val user = userHelper?.getUser()
23+
// val gson = Gson()
24+
// val intArray = intArrayOf(1,2,3)
25+
// val testArray = arrayOf(TestBean(1),TestBean(2))
26+
// val idArray = ArrayList<String>(listOf("3","3"))
27+
// val userTestBean2List = ArrayList<TestBean2>(listOf(TestBean2(11), TestBean2(22)))
28+
//// Log.e("SchemeFilterActivity",gson.toJson(intArray))
29+
// val uriTest = "lightrouter://test.flyjingfish.com/user/DetailActivity?age=10&name=" +
30+
// "hahahaha&aChar=a&user=${gson.toJson(user)}&userIds=${gson.toJson(intArray)}" +
31+
// "&userList=${gson.toJson(testArray)}&userIdList=${gson.toJson(idArray)}&userTestBean2List=${gson.toJson(userTestBean2List)}"
32+
// Log.e("SchemeFilterActivity",uriTest)
33+
//
34+
// val uri = uriTest.toUri()
2835
uri?.let {
2936
ModuleRoute.builder(it)?.go()
3037
finish()

lib-user/src/main/java/com/flyjingfish/user/DetailActivity.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.flyjingfish.module_communication_annotation.Route;
1111
import com.flyjingfish.module_communication_annotation.RouteParams;
1212
import com.flyjingfish.user.databinding.ActivityDetailBinding;
13+
import com.google.gson.Gson;
1314

1415
import java.util.ArrayList;
1516
import java.util.Arrays;
@@ -29,6 +30,10 @@ public class DetailActivity extends AppCompatActivity {
2930
private int[] userIds;
3031
@RouteParams(name = "userList")
3132
private TestBean[] userList;
33+
@RouteParams(name = "userIdList")
34+
private ArrayList<String> userIdList;
35+
@RouteParams(name = "userTestBean2List")
36+
private ArrayList<TestBean2> userTestBean2List;
3237

3338
@Override
3439
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -41,8 +46,14 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
4146
user = (User) getIntent().getSerializableExtra("user");
4247
userIds = getIntent().getIntArrayExtra("userIds");
4348
userList = (TestBean[]) getIntent().getSerializableExtra("userList");
49+
userIdList = getIntent().getStringArrayListExtra("userIdList");
50+
userTestBean2List = getIntent().getParcelableArrayListExtra("userTestBean2List");
4451

45-
String logText = "age="+age+",name="+name+",aChar="+aChar+",user="+user+",userIds="+ userIds+"userList="+userList;
52+
Gson gson = new Gson();
53+
54+
String logText = "age="+age+",name="+name+",aChar="+aChar+",user="+user
55+
+",userIds="+ gson.toJson(userIds)+",userList="+gson.toJson(userList)+",userIdList="
56+
+userIdList+",userTestBean2List="+userTestBean2List;
4657
binding.tvText.setText(logText);
4758
Log.e("DetailActivity",logText);
4859

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.flyjingfish.user
2+
3+
import android.os.Parcel
4+
import android.os.Parcelable
5+
import com.flyjingfish.module_communication_annotation.ExposeBean
6+
import java.io.Serializable
7+
@ExposeBean
8+
data class TestBean2(val test:Int): Parcelable {
9+
constructor(parcel: Parcel) : this(parcel.readInt()) {
10+
}
11+
12+
override fun writeToParcel(parcel: Parcel, flags: Int) {
13+
parcel.writeInt(test)
14+
}
15+
16+
override fun describeContents(): Int {
17+
return 0
18+
}
19+
20+
companion object CREATOR : Parcelable.Creator<TestBean2> {
21+
override fun createFromParcel(parcel: Parcel): TestBean2 {
22+
return TestBean2(parcel)
23+
}
24+
25+
override fun newArray(size: Int): Array<TestBean2?> {
26+
return arrayOfNulls(size)
27+
}
28+
}
29+
}

module-communication-annotation/src/main/java/com/flyjingfish/module_communication_annotation/RouteParams.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ annotation class RouteParams(
99
*/
1010
val name: String,
1111
/**
12-
* 生成的函数的参数是否是可空类型
12+
* 生成的函数的参数是否是可空类型,同时也表示这一项是否为必传项
1313
*/
1414
val nullable: Boolean = false
1515
)

module-communication-annotation/src/main/java/com/flyjingfish/module_communication_annotation/bean/ParamsInfo.kt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,21 @@ package com.flyjingfish.module_communication_annotation.bean
22

33
import kotlin.reflect.KClass
44

5-
class ParamsInfo(val name: String, val clazz: KClass<*>, val nullable: Boolean)
5+
class ParamsInfo(
6+
/**
7+
* 参数名
8+
*/
9+
val name: String,
10+
/**
11+
* 参数类型
12+
*/
13+
val clazz: KClass<*>,
14+
/**
15+
* 参数的泛型类型,目前只有 [clazz] = [java.util.ArrayList] 时这一项才有值
16+
*/
17+
val genericsClazz: KClass<*>?,
18+
/**
19+
* 是否可为null
20+
*/
21+
val nullable: Boolean
22+
)

module-communication-ksp/src/main/java/com/flyjingfish/module_communication_ksp/CommunicationKspSymbolProcessor.kt

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,15 @@ class CommunicationKspSymbolProcessor(
235235
val targetClassName: String = value.className
236236
val typeName = value.getTypeClazzName()
237237
?: throw IllegalArgumentException("不支持 $className$paramsName 的类型:$targetClassName")
238-
paramsInfoStringBuilder.append(" add(ParamsInfo(\"$paramsName\",%T::class,$paramNullable))\n")
239-
paramsClazz.add(typeName)
238+
if (typeName.genericsClazzTypeName != null){
239+
paramsInfoStringBuilder.append(" add(ParamsInfo(\"$paramsName\",%T::class,%T::class,$paramNullable))\n")
240+
paramsClazz.add(typeName.clazzTypeName)
241+
paramsClazz.add(typeName.genericsClazzTypeName)
242+
// logger.error("typeName.genericsClazzTypeName=${typeName.genericsClazzTypeName}")
243+
}else{
244+
paramsInfoStringBuilder.append(" add(ParamsInfo(\"$paramsName\",%T::class,null,$paramNullable))\n")
245+
paramsClazz.add(typeName.clazzTypeName)
246+
}
240247
}
241248
}
242249

@@ -303,11 +310,23 @@ class CommunicationKspSymbolProcessor(
303310
val config = value.annoMap["@RouteParams"]
304311
if (config != null){
305312
val paramsName : String = config["name"] as String
306-
val typeName = value.getTypeName()
313+
val paramNullable: Boolean = config["nullable"] as Boolean
314+
val typeName = value.getTypeClazzName()
307315
typeName?.let {
308-
whatsMyName1.addParameter(paramsName,it)
316+
whatsMyName1.addParameter(paramsName,it.typeName.copy(nullable = paramNullable))
317+
val putStr = if (it.genericsClazzTypeName == null){
318+
"intent.putExtra(\"$paramsName\",$paramsName)"
319+
} else if (it.genericsClazzTypeName.toString() == String::class.qualifiedName){
320+
"intent.putStringArrayListExtra(\"$paramsName\",$paramsName)"
321+
} else if (it.genericsClazzTypeName.toString() == Int::class.qualifiedName){
322+
"intent.putIntegerArrayListExtra(\"$paramsName\",$paramsName)"
323+
} else if (it.genericsClazzTypeName.toString() == CharSequence::class.qualifiedName){
324+
"intent.putCharSequenceArrayListExtra(\"$paramsName\",$paramsName)"
325+
} else {
326+
"intent.putParcelableArrayListExtra(\"$paramsName\",$paramsName)"
327+
}
309328
whatsMyName1.addStatement(
310-
"intent.putExtra(\"$paramsName\",$paramsName)",
329+
putStr
311330
)
312331
}
313332

@@ -386,11 +405,23 @@ class CommunicationKspSymbolProcessor(
386405
val config = value.annoMap["@RouteParams"]
387406
if (config != null){
388407
val paramsName : String = config["name"] as String
389-
val typeName = value.getTypeName()
408+
val paramNullable: Boolean = config["nullable"] as Boolean
409+
val typeName = value.getTypeClazzName()
390410
typeName?.let {
391-
whatsMyName2.addParameter(paramsName,it)
411+
whatsMyName2.addParameter(paramsName,it.typeName.copy(nullable = paramNullable))
412+
val putStr = if (it.genericsClazzTypeName == null){
413+
"intent.putExtra(\"$paramsName\",$paramsName)"
414+
} else if (it.genericsClazzTypeName.toString() == String::class.qualifiedName){
415+
"intent.putStringArrayListExtra(\"$paramsName\",$paramsName)"
416+
} else if (it.genericsClazzTypeName.toString() == Int::class.qualifiedName){
417+
"intent.putIntegerArrayListExtra(\"$paramsName\",$paramsName)"
418+
} else if (it.genericsClazzTypeName.toString() == CharSequence::class.qualifiedName){
419+
"intent.putCharSequenceArrayListExtra(\"$paramsName\",$paramsName)"
420+
} else {
421+
"intent.putParcelableArrayListExtra(\"$paramsName\",$paramsName)"
422+
}
392423
whatsMyName2.addStatement(
393-
"intent.putExtra(\"$paramsName\",$paramsName)",
424+
putStr
394425
)
395426
}
396427
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.flyjingfish.module_communication_ksp
2+
3+
import com.squareup.kotlinpoet.TypeName
4+
5+
class ParamTypeName(val typeName: TypeName,val clazzTypeName: TypeName, val genericsClazzTypeName: TypeName?)

module-communication-ksp/src/main/java/com/flyjingfish/module_communication_ksp/RouteParamsConfig.kt

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@ import com.google.devtools.ksp.symbol.KSPropertyDeclaration
55
import com.squareup.kotlinpoet.ClassName
66
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
77
import com.squareup.kotlinpoet.TypeName
8+
import java.util.ArrayList
89

910
data class RouteParamsConfig(val className:String,val realClassName :String, val symbol: KSPropertyDeclaration, val annoMap : MutableMap<String, MutableMap<String, Any?>?>){
1011

1112
fun getTypeName() : TypeName? {
1213
val config = annoMap["@RouteParams"] ?: return null
1314
val paramNullable: Boolean = config["nullable"] as Boolean
14-
return getTypeClazzName()?.copy(nullable = paramNullable)
15+
return getTypeClazzName()?.typeName?.copy(nullable = paramNullable)
1516
}
1617

17-
fun getTypeClazzName() : TypeName? {
18+
fun getTypeClazzName() : ParamTypeName? {
1819
return when (this.realClassName) {
1920
Char::class.qualifiedName,CharArray::class.qualifiedName,
2021
Byte::class.qualifiedName,ByteArray::class.qualifiedName,
@@ -25,7 +26,8 @@ data class RouteParamsConfig(val className:String,val realClassName :String, val
2526
Double::class.qualifiedName,DoubleArray::class.qualifiedName,
2627
Boolean::class.qualifiedName,BooleanArray::class.qualifiedName,
2728
String::class.qualifiedName -> {
28-
ClassName.bestGuess(this.realClassName)
29+
val wholeTypeName = ClassName.bestGuess(this.realClassName)
30+
ParamTypeName(wholeTypeName,wholeTypeName,null)
2931
}
3032
Array::class.qualifiedName -> {
3133
val element = symbol.type.element
@@ -41,7 +43,8 @@ data class RouteParamsConfig(val className:String,val realClassName :String, val
4143
val typeClazzName = "$subPackageName.$subClazzName"
4244
val typeName = ClassName.bestGuess(this.realClassName)
4345
if (isSubtype){
44-
typeName.parameterizedBy(ClassName.bestGuess(typeClazzName))
46+
val wholeTypeName = typeName.parameterizedBy(ClassName.bestGuess(typeClazzName))
47+
ParamTypeName(wholeTypeName,wholeTypeName,null)
4548
}else{
4649
throw IllegalArgumentException("$typeClazzName 至少需要实现 java.io.Serializable 或 android.os.Parcelable 这两个接口中的一个")
4750
}
@@ -59,12 +62,43 @@ data class RouteParamsConfig(val className:String,val realClassName :String, val
5962

6063
if (className == realClassName){
6164
if (isSubtype){
62-
ClassName.bestGuess(this.realClassName)
65+
val wholeTypeName = ClassName.bestGuess(this.realClassName)
66+
ParamTypeName(wholeTypeName,wholeTypeName,null)
6367
}else{
6468
throw IllegalArgumentException("$realClassName 至少需要实现 java.io.Serializable 或 android.os.Parcelable 这两个接口中的一个")
6569
}
6670
}else{
67-
null
71+
if (realClassName == ArrayList::class.qualifiedName){
72+
val element = symbol.type.element
73+
if (element != null){
74+
val typeArguments = element.typeArguments
75+
val type = typeArguments[0].type
76+
if (type != null){
77+
val subPackageName = type.resolve().declaration.packageName.asString()
78+
val subClazzName = type.resolve().declaration.toString()
79+
val typeClazzName = "$subPackageName.$subClazzName"
80+
val typeName = ClassName.bestGuess(this.realClassName)
81+
82+
val canUse = (type.resolve().declaration as KSClassDeclaration).isSubtype("android.os.Parcelable")
83+
|| typeClazzName == Int::class.qualifiedName
84+
|| typeClazzName == String::class.qualifiedName
85+
|| typeClazzName == CharSequence::class.qualifiedName
86+
87+
if (canUse){
88+
val wholeTypeName = typeName.parameterizedBy(ClassName.bestGuess(typeClazzName))
89+
ParamTypeName(wholeTypeName,typeName,ClassName.bestGuess(typeClazzName))
90+
}else{
91+
null
92+
}
93+
}else{
94+
null
95+
}
96+
}else{
97+
null
98+
}
99+
}else{
100+
null
101+
}
68102
}
69103
}
70104
}

0 commit comments

Comments
 (0)