Skip to content

Commit 2e77a35

Browse files
committed
完善路由
1 parent ec8863a commit 2e77a35

File tree

10 files changed

+156
-69
lines changed

10 files changed

+156
-69
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ class MainActivity : ComponentActivity() {
2525
}
2626

2727
binding.btnGoUri.setOnClickListener {
28-
// startActivity(Intent(this,SchemeFilterActivity::class.java))
29-
startActivity(Intent(this,WebActivity::class.java))
28+
startActivity(Intent(this,SchemeFilterActivity::class.java))
29+
// startActivity(Intent(this,WebActivity::class.java))
3030
}
3131

3232
Log.e("MainActivity","------${Int::class.qualifiedName}")

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@ import com.google.gson.Gson
1313
class SchemeFilterActivity : ComponentActivity() {
1414
override fun onCreate(savedInstanceState: Bundle?) {
1515
super.onCreate(savedInstanceState)
16+
// val uri = intent.data
1617
val userHelper = ImplementClassUtils.getSingleInstance<UserHelper>(UserHelper::class)
1718
val user = userHelper?.getUser()
1819
val gson = Gson()
19-
// val uriTest = "lightrouter://test.flyjingfish.com/user/DetailActivity?age=10&name=hahahaha&aChar=a&user=${gson.toJson(user)}"
20-
// Log.e("SchemeFilterActivity",uriTest)
21-
// val uri = uriTest.toUri()
22-
val uri = intent.data
20+
val intArray = intArrayOf(1,2,3)
21+
// Log.e("SchemeFilterActivity",gson.toJson(intArray))
22+
val uriTest = "lightrouter://test.flyjingfish.com/user/DetailActivity?age=10&name=hahahaha&aChar=a&user=${gson.toJson(user)}&userIds=${gson.toJson(intArray)}"
23+
Log.e("SchemeFilterActivity",uriTest)
24+
25+
val uri = uriTest.toUri()
2326
uri?.let {
2427
ModuleRoute.builder(it)?.go()
2528
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
@@ -1,6 +1,7 @@
11
package com.flyjingfish.user;
22

33
import android.os.Bundle;
4+
import android.os.Parcelable;
45
import android.util.Log;
56

67
import androidx.annotation.Nullable;
@@ -10,6 +11,10 @@
1011
import com.flyjingfish.module_communication_annotation.RouteParams;
1112
import com.flyjingfish.user.databinding.ActivityDetailBinding;
1213

14+
import java.util.ArrayList;
15+
import java.util.Arrays;
16+
import java.util.List;
17+
1318
@Route(path = "/user/DetailActivity")
1419
public class DetailActivity extends AppCompatActivity {
1520
@RouteParams(name = "age")
@@ -20,6 +25,11 @@ public class DetailActivity extends AppCompatActivity {
2025
private char aChar = 's';
2126
@RouteParams(name = "user")
2227
private User user;
28+
@RouteParams(name = "userIds")
29+
private int[] userIds;
30+
// @RouteParams(name = "userList")
31+
// private ArrayList<User> userList;
32+
2333
@Override
2434
protected void onCreate(@Nullable Bundle savedInstanceState) {
2535
super.onCreate(savedInstanceState);
@@ -29,8 +39,9 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
2939
name = getIntent().getStringExtra("name");
3040
aChar = getIntent().getCharExtra("aChar",'s');
3141
user = (User) getIntent().getSerializableExtra("user");
42+
userIds = getIntent().getIntArrayExtra("userIds");
3243

33-
String logText = "age="+age+",name="+name+",aChar="+aChar+",user="+user;
44+
String logText = "age="+age+",name="+name+",aChar="+aChar+",user="+user+",userIds="+ userIds;
3445
binding.tvText.setText(logText);
3546
Log.e("DetailActivity",logText);
3647

lib-user/src/main/java/com/flyjingfish/user/UserActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class UserActivity : AppCompatActivity() {
3838
val theme = R.style.LoginAppTheme
3939
val bundle = Bundle()
4040

41-
41+
// intent.putExtra("ss", mutableListOf<User>())
4242
Log.e("UserActivity","params1=$params1,params2=$params2")
4343
}
4444
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
package com.flyjingfish.module_communication_annotation.bean
22

3-
class ParamsInfo(val name: String, val className: String, val nullable: Boolean)
3+
import kotlin.reflect.KClass
4+
5+
class ParamsInfo(val name: String, val clazz: KClass<*>, val nullable: Boolean)

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.flyjingfish.module_communication_annotation.bean
22

3-
class PathInfo(val path: String, val clazz: Class<*>, val tag: Int,val paramsInfo: MutableList<ParamsInfo>){
3+
import kotlin.reflect.KClass
4+
5+
class PathInfo(val path: String, val clazz: KClass<*>, val tag: Int, val paramsInfo: MutableList<ParamsInfo>){
46

57
/**
68
* 当前页面的 tag 是否存在 [item]

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

Lines changed: 51 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import com.squareup.kotlinpoet.ParameterSpec
3434
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
3535
import com.squareup.kotlinpoet.PropertySpec
3636
import com.squareup.kotlinpoet.STAR
37+
import com.squareup.kotlinpoet.TypeName
3738
import com.squareup.kotlinpoet.TypeSpec
3839
import java.io.File
3940
import java.io.FileInputStream
@@ -216,32 +217,42 @@ class CommunicationKspSymbolProcessor(
216217
val paramMap = routeParamsMap[className]
217218

218219
val paramsInfoStringBuilder = StringBuilder()
220+
val paramsClazz = mutableListOf<TypeName>()
221+
paramsClazz.add(ClassName.bestGuess(
222+
PathInfo::class.qualifiedName!!
223+
))
224+
paramsClazz.add(ClassName.bestGuess(
225+
className
226+
))
227+
paramsClazz.add(ClassName.bestGuess(
228+
ParamsInfo::class.qualifiedName!!
229+
))
219230
paramMap?.forEach { (_, value) ->
220231
val config = value.annoMap["@RouteParams"]
221232
if (config != null){
222233
val paramsName : String = config["name"] as String
223234
val paramNullable : Boolean = config["nullable"] as Boolean
224235
val targetClassName: String = value.className
225-
226-
paramsInfoStringBuilder.append(" add(ParamsInfo(\"$paramsName\",\"$targetClassName\",$paramNullable))\n")
236+
val typeName = value.getTypeClazzName()
237+
?: throw IllegalArgumentException("不支持 $className$paramsName 的类型:$targetClassName")
238+
paramsInfoStringBuilder.append(" add(ParamsInfo(\"$paramsName\",%T::class,$paramNullable))\n")
239+
paramsClazz.add(typeName)
227240
}
228241
}
229242

230-
val pathInfoStr = "%T(\"$usePath\",%T::class.java,$tag,mutableListOf<%T>().apply {\n" +
243+
val pathInfoStr = "%T(\"$usePath\",%T::class,$tag,mutableListOf<%T>().apply {\n" +
231244
paramsInfoStringBuilder.toString() +
232245
" })"
246+
247+
248+
val classMapTypeNames = paramsClazz.toTypedArray()
233249
val paramListStr = "val paramsInfoList = mutableListOf<%T>()"
250+
// logger.error("paramsInfoStringBuilder=$paramsInfoStringBuilder")
234251
if (isSubtype(symbol,"android.app.Activity")){
235252
val classFunName = "get${classKey}Class"
236253
val whatsMyName1 = whatsMyName("go$routeClassName")
237254
if (!emptyRoute){
238-
registerMapFun.addStatement("classMap[\"$usePath\"] = $pathInfoStr",ClassName.bestGuess(
239-
PathInfo::class.qualifiedName!!
240-
),ClassName.bestGuess(
241-
className
242-
),ClassName.bestGuess(
243-
ParamsInfo::class.qualifiedName!!
244-
))
255+
registerMapFun.addStatement("classMap[\"$usePath\"] = $pathInfoStr",*classMapTypeNames)
245256
classBuilder.addFunction(whatsMyName(classFunName)
246257
.returns(classStar.copy(nullable = true))
247258
.addStatement("return %T::class.java",ClassName.bestGuess(
@@ -263,13 +274,7 @@ class CommunicationKspSymbolProcessor(
263274
)
264275

265276
whatsMyName1.addStatement(
266-
"val pathInfo = $pathInfoStr",ClassName.bestGuess(
267-
PathInfo::class.qualifiedName!!
268-
),ClassName.bestGuess(
269-
className
270-
),ClassName.bestGuess(
271-
ParamsInfo::class.qualifiedName!!
272-
)
277+
"val pathInfo = $pathInfoStr",*classMapTypeNames
273278
)
274279

275280
whatsMyName1.addStatement(
@@ -300,12 +305,14 @@ class CommunicationKspSymbolProcessor(
300305
val config = value.annoMap["@RouteParams"]
301306
if (config != null){
302307
val paramsName : String = config["name"] as String
303-
val paramNullable : Boolean = config["nullable"] as Boolean
304-
val targetClassName: String = value.className
305-
whatsMyName1.addParameter(paramsName,ClassName.bestGuess(targetClassName).copy(nullable = paramNullable))
306-
whatsMyName1.addStatement(
307-
" intent.putExtra(\"$paramsName\",$paramsName)",
308-
)
308+
val typeName = value.getTypeName()
309+
typeName?.let {
310+
whatsMyName1.addParameter(paramsName,it)
311+
whatsMyName1.addStatement(
312+
" intent.putExtra(\"$paramsName\",$paramsName)",
313+
)
314+
}
315+
309316
}
310317
}
311318
whatsMyName1.addStatement(
@@ -327,9 +334,11 @@ class CommunicationKspSymbolProcessor(
327334
val config = value.annoMap["@RouteParams"]
328335
if (config != null){
329336
val paramsName : String = config["name"] as String
330-
val paramNullable : Boolean = config["nullable"] as Boolean
331-
val targetClassName: String = value.className
332-
whatsMyName1.addParameter(paramsName,ClassName.bestGuess(targetClassName).copy(nullable = paramNullable))
337+
val typeName = value.getTypeName()
338+
typeName?.let {
339+
whatsMyName1.addParameter(paramsName,it)
340+
}
341+
333342
}
334343
}
335344
}
@@ -343,13 +352,7 @@ class CommunicationKspSymbolProcessor(
343352

344353

345354
if (!emptyRoute){
346-
registerMapFun.addStatement("classMap[\"$usePath\"] = $pathInfoStr",ClassName.bestGuess(
347-
PathInfo::class.qualifiedName!!
348-
),ClassName.bestGuess(
349-
className
350-
),ClassName.bestGuess(
351-
ParamsInfo::class.qualifiedName!!
352-
))
355+
registerMapFun.addStatement("classMap[\"$usePath\"] = $pathInfoStr",*classMapTypeNames)
353356
classBuilder.addFunction(whatsMyName(classFunName)
354357
.returns(anyClassName.copy(nullable = true))
355358
.addStatement("return %T()",ClassName.bestGuess(
@@ -382,12 +385,13 @@ class CommunicationKspSymbolProcessor(
382385
val config = value.annoMap["@RouteParams"]
383386
if (config != null){
384387
val paramsName : String = config["name"] as String
385-
val paramNullable : Boolean = config["nullable"] as Boolean
386-
val targetClassName: String = value.className
387-
whatsMyName2.addParameter(paramsName,ClassName.bestGuess(targetClassName).copy(nullable = paramNullable))
388-
whatsMyName2.addStatement(
389-
"intent.putExtra(\"$paramsName\",$paramsName)",
390-
)
388+
val typeName = value.getTypeName()
389+
typeName?.let {
390+
whatsMyName2.addParameter(paramsName,it)
391+
whatsMyName2.addStatement(
392+
"intent.putExtra(\"$paramsName\",$paramsName)",
393+
)
394+
}
391395
}
392396
}
393397

@@ -429,9 +433,10 @@ class CommunicationKspSymbolProcessor(
429433
val config = value.annoMap["@RouteParams"]
430434
if (config != null){
431435
val paramsName : String = config["name"] as String
432-
val paramNullable : Boolean = config["nullable"] as Boolean
433-
val targetClassName: String = value.className
434-
whatsMyName2.addParameter(paramsName,ClassName.bestGuess(targetClassName).copy(nullable = paramNullable))
436+
val typeName = value.getTypeName()
437+
typeName?.let {
438+
whatsMyName2.addParameter(paramsName,it)
439+
}
435440
}
436441
}
437442
whatsMyName2.addStatement(
@@ -495,7 +500,10 @@ class CommunicationKspSymbolProcessor(
495500
parent = parent?.parent
496501
}
497502
className = className.substring(0,className.length-1)
498-
val config = RouteParamsConfig("${symbol.type.resolve().declaration.packageName.asString()}.${symbol.type}",annotationMap)
503+
val classShortName = "${symbol.type.resolve().declaration}"
504+
val realClassName = "${symbol.type.resolve().declaration.packageName.asString()}.${classShortName}"
505+
val seeClassName = "${symbol.type.resolve().declaration.packageName.asString()}.${symbol.type}"
506+
val config = RouteParamsConfig(seeClassName,realClassName,symbol,annotationMap)
499507
var map = routeParamsMap[className]
500508
if (map == null){
501509
map = mutableMapOf()
Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,57 @@
11
package com.flyjingfish.module_communication_ksp
22

3-
data class RouteParamsConfig(val className:String,val annoMap : MutableMap<String, MutableMap<String, Any?>?>)
3+
import com.google.devtools.ksp.symbol.KSPropertyDeclaration
4+
import com.squareup.kotlinpoet.ClassName
5+
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
6+
import com.squareup.kotlinpoet.TypeName
7+
8+
data class RouteParamsConfig(val className:String,val realClassName :String, val symbol: KSPropertyDeclaration, val annoMap : MutableMap<String, MutableMap<String, Any?>?>){
9+
10+
fun getTypeName() : TypeName? {
11+
val config = annoMap["@RouteParams"] ?: return null
12+
val paramNullable: Boolean = config["nullable"] as Boolean
13+
return getTypeClazzName()?.copy(nullable = paramNullable)
14+
}
15+
16+
fun getTypeClazzName() : TypeName? {
17+
return when (this.realClassName) {
18+
Char::class.qualifiedName,CharArray::class.qualifiedName,
19+
Byte::class.qualifiedName,ByteArray::class.qualifiedName,
20+
Short::class.qualifiedName,ShortArray::class.qualifiedName,
21+
Int::class.qualifiedName,IntArray::class.qualifiedName,
22+
Long::class.qualifiedName,LongArray::class.qualifiedName,
23+
Float::class.qualifiedName,FloatArray::class.qualifiedName,
24+
Double::class.qualifiedName,DoubleArray::class.qualifiedName,
25+
Boolean::class.qualifiedName,BooleanArray::class.qualifiedName,
26+
String::class.qualifiedName -> {
27+
ClassName.bestGuess(this.realClassName)
28+
}
29+
Array::class.qualifiedName -> {
30+
val element = symbol.type.element
31+
if (element != null){
32+
val typeArguments = element.typeArguments
33+
val type = typeArguments[0].type
34+
if (type != null){
35+
val subPackageName = type.resolve().declaration.packageName.asString()
36+
val subClazzName = type.resolve().declaration.toString()
37+
val typeClazzName = "$subPackageName.$subClazzName"
38+
val typeName = ClassName.bestGuess(this.realClassName)
39+
typeName.parameterizedBy(ClassName.bestGuess(typeClazzName))
40+
}else{
41+
null
42+
}
43+
}else{
44+
null
45+
}
46+
47+
}
48+
else ->{
49+
if (className == realClassName){
50+
ClassName.bestGuess(this.realClassName)
51+
}else{
52+
null
53+
}
54+
}
55+
}
56+
}
57+
}

module-communication-route/src/main/java/com/flyjingfish/module_communication_route/ModuleRoute.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.flyjingfish.module_communication_annotation.interfaces.BaseRouterClas
1111
import com.flyjingfish.module_communication_route.bean.ClassInfo
1212
import com.flyjingfish.module_communication_route.utils.Utils
1313
import com.flyjingfish.module_communication_route.utils.putValue
14+
import kotlin.reflect.KClass
1415

1516
object ModuleRoute {
1617
private val allRouteClass = mutableMapOf<String, BaseRouterClass>()
@@ -99,7 +100,7 @@ object ModuleRoute {
99100

100101
val clazzInfo = getClassInfo()
101102
clazzInfo?.let {
102-
intent.setClass(context, it.pathInfo.clazz)
103+
intent.setClass(context, it.pathInfo.clazz.java)
103104
}
104105
return if (clazzInfo != null){
105106
intent
@@ -126,7 +127,7 @@ object ModuleRoute {
126127

127128
val clazzInfo = getClassInfo()
128129
clazzInfo?.goRouterClazz?.goByPath(usePath, paramsMap, true,clazzInfo.pathInfo) {
129-
intent.setClass(context, clazzInfo.pathInfo.clazz)
130+
intent.setClass(context, clazzInfo.pathInfo.clazz.java)
130131
context.startActivity(intent)
131132
}
132133
}
@@ -145,6 +146,14 @@ object ModuleRoute {
145146
* 根据路径信息获取到对应的 [Class] 类
146147
*/
147148
fun getClassByPath(): Class<*>? {
149+
val clazzInfo = getClassInfo()
150+
return clazzInfo?.pathInfo?.clazz?.java
151+
}
152+
153+
/**
154+
* 根据路径信息获取到对应的 [Class] 类
155+
*/
156+
fun getKClassByPath(): KClass<*>? {
148157
val clazzInfo = getClassInfo()
149158
return clazzInfo?.pathInfo?.clazz
150159
}

0 commit comments

Comments
 (0)