├── .gitignore ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── flyjingfish │ │ └── modulecommunication │ │ ├── CollectApp.kt │ │ ├── MainActivity.kt │ │ ├── MyApp.kt │ │ ├── SchemeFilterActivity.kt │ │ └── WebActivity.kt │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ └── ic_launcher_background.xml │ ├── layout │ ├── activity_main.xml │ └── activity_web.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── values │ ├── colors.xml │ ├── strings.xml │ └── themes.xml │ └── xml │ ├── backup_rules.xml │ └── data_extraction_rules.xml ├── base-lib ├── .gitignore ├── build.gradle.kts ├── consumer-rules.pro ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── flyjingfish │ │ └── base_lib │ │ ├── IApplication.kt │ │ └── TestClass.kt │ └── res │ └── drawable-xxhdpi │ └── base_logo.webp ├── build.gradle.kts ├── communication ├── .gitignore ├── build.gradle.kts ├── consumer-rules.pro ├── proguard-rules.pro └── src │ └── main │ └── AndroidManifest.xml ├── communication2 ├── .gitignore ├── build.gradle.kts ├── consumer-rules.pro ├── proguard-rules.pro └── src │ └── main │ └── AndroidManifest.xml ├── gradle.properties ├── gradle ├── android_base.gradle ├── android_publish.gradle ├── java_base.gradle ├── java_publish.gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── keystore ├── lib-login ├── .gitignore ├── build.gradle.kts ├── consumer-rules.pro ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ ├── matching │ │ └── data.json │ └── swipe_like │ │ ├── data.json │ │ └── images │ │ ├── img_0.png │ │ ├── img_1.png │ │ ├── img_2.png │ │ └── img_3.png │ ├── java │ └── com │ │ └── flyjingfish │ │ └── login │ │ ├── Login.kt │ │ ├── LoginActivity.kt │ │ ├── LoginApplication.kt │ │ ├── LoginHelper.kt │ │ ├── LoginHelperImpl.kt │ │ ├── LoginIntercept.kt │ │ └── LoginLost.kt │ └── res │ ├── anim │ └── toast_out.xml │ ├── animator │ └── animator_incoming.xml │ ├── color │ └── textcolor_btn_tiger_bottom.xml │ ├── drawable-xxhdpi │ └── login_logo.webp │ ├── drawable-xxxhdpi │ └── login_logo.webp │ ├── font │ └── call_font.ttf │ ├── layout │ └── activity_login.xml │ ├── menu │ └── main_menu.xml │ ├── mipmap-xxhdpi │ └── login_logo2.webp │ ├── raw │ ├── call_video_play.wav │ └── connecting.mp3 │ ├── transition │ └── login_tran.xml │ ├── values │ ├── attrs.xml │ ├── colors.xml │ ├── dimen.xml │ ├── strings.xml │ └── style.xml │ └── xml │ └── dialog_match_success_scene.xml ├── lib-user ├── .gitignore ├── build.gradle.kts ├── consumer-rules.pro ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── flyjingfish │ │ └── user │ │ ├── BaseActivity.kt │ │ ├── DetailActivity.java │ │ ├── TestBean.kt │ │ ├── TestBean2.kt │ │ ├── User.kt │ │ ├── UserActivity.kt │ │ ├── UserApplication.kt │ │ ├── UserFragment.kt │ │ ├── UserHelper.kt │ │ ├── UserHelperImpl.kt │ │ ├── UserIntercept.kt │ │ ├── UserLost.kt │ │ └── Utils.kt │ └── res │ ├── layout │ ├── activity_detail.xml │ └── activity_user.xml │ └── values │ └── style.xml ├── module-communication-annotation ├── .gitignore ├── build.gradle.kts ├── gradle.properties └── src │ └── main │ └── java │ └── com │ └── flyjingfish │ └── module_communication_annotation │ ├── ExposeBean.kt │ ├── ExposeInterface.kt │ ├── ImplementClass.kt │ ├── ImplementClassUtils.kt │ ├── Route.kt │ ├── RouteParams.kt │ ├── bean │ ├── ParamsInfo.kt │ └── PathInfo.kt │ ├── enums │ └── PathType.kt │ └── interfaces │ ├── BaseRouter.kt │ ├── BaseRouterClass.kt │ ├── BindClass.kt │ └── NewAny.kt ├── module-communication-intercept ├── build.gradle.kts ├── gradle.properties └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── flyjingfish │ └── module_communication_intercept │ ├── RouterInterceptManager.kt │ ├── cut │ └── RouteInterceptCut.kt │ └── intercept │ ├── InterceptPoint.kt │ └── RouterIntercept.kt ├── module-communication-ksp ├── .gitignore ├── build.gradle.kts ├── gradle.properties └── src │ └── main │ ├── java │ └── com │ │ └── flyjingfish │ │ └── module_communication_ksp │ │ ├── CommunicationKspSymbolProcessor.kt │ │ ├── CommunicationKspSymbolProcessorProvider.kt │ │ ├── Expansions.kt │ │ ├── ParamTypeName.kt │ │ └── RouteParamsConfig.kt │ └── resources │ └── META-INF │ └── services │ └── com.google.devtools.ksp.processing.SymbolProcessorProvider ├── module-communication-plugin ├── .gitignore ├── build.gradle.kts ├── gradle.properties └── src │ └── main │ ├── kotlin │ └── com │ │ └── flyjingfish │ │ └── module_communication_plugin │ │ ├── ApplyExportPlugin.kt │ │ ├── CommunicationConfig.kt │ │ ├── CommunicationExportPlugin.kt │ │ ├── CommunicationModulePlugin.kt │ │ ├── Dom4jData.kt │ │ ├── ExportTask.kt │ │ ├── IncrementalRecord.kt │ │ ├── IncrementalRecordUtils.kt │ │ ├── LibVersion.kt │ │ ├── ResValue.kt │ │ ├── ResValueRecord.kt │ │ └── TmpUtils.kt │ └── resources │ └── META-INF │ └── gradle-plugins │ ├── communication.export.properties │ └── communication.module.properties ├── module-communication-route ├── build.gradle.kts ├── gradle.properties └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── flyjingfish │ └── module_communication_route │ ├── ModuleRoute.kt │ ├── bean │ ├── ClassInfo.kt │ └── NavigationResult.kt │ ├── callback │ ├── OnGoActivity.kt │ └── OnNavigationBack.kt │ ├── lost │ ├── LostPoint.kt │ ├── RouterLost.kt │ └── RouterLostManager.kt │ └── utils │ ├── IntentUtils.kt │ └── Utils.kt ├── screenshot ├── code.png ├── copy_all.png ├── copy_assets_res.png ├── copy_code.png ├── demo.png ├── gradle.png ├── gradle_set.png ├── res_demo.png ├── tip1.png └── tip2.png ├── settings.gradle.kts └── version.properties /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | build/ 17 | .idea 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [2024] [FlyJingFish] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | id("org.jetbrains.kotlin.android") 4 | id("com.google.devtools.ksp") 5 | id("android.aop") 6 | } 7 | 8 | androidAopConfig{ 9 | debug = true 10 | } 11 | 12 | android { 13 | namespace = "com.flyjingfish.modulecommunication" 14 | compileSdk = 34 15 | 16 | defaultConfig { 17 | applicationId = "com.flyjingfish.modulecommunication" 18 | minSdk = 21 19 | targetSdk = 33 20 | versionCode = 1 21 | versionName = "1.0" 22 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" 23 | vectorDrawables { 24 | useSupportLibrary = true 25 | } 26 | } 27 | 28 | 29 | compileOptions { 30 | sourceCompatibility = JavaVersion.VERSION_11 31 | targetCompatibility = JavaVersion.VERSION_11 32 | } 33 | kotlinOptions { 34 | jvmTarget = "11" 35 | } 36 | buildFeatures { 37 | compose = true 38 | viewBinding = true 39 | } 40 | composeOptions { 41 | kotlinCompilerExtensionVersion = "1.4.3" 42 | } 43 | 44 | signingConfigs { 45 | create("release") { 46 | storeFile = file(rootProject.file("keystore")) 47 | storePassword = "123456" 48 | keyAlias = "key0" 49 | keyPassword = "123456" 50 | } 51 | } 52 | 53 | buildTypes { 54 | debug { 55 | signingConfig = signingConfigs.getByName("release") 56 | isMinifyEnabled = false 57 | isShrinkResources = false 58 | proguardFiles( 59 | getDefaultProguardFile("proguard-android-optimize.txt"), 60 | "proguard-rules.pro" 61 | ) 62 | } 63 | release { 64 | signingConfig = signingConfigs.getByName("release") 65 | isMinifyEnabled = true 66 | isShrinkResources = true 67 | proguardFiles( 68 | getDefaultProguardFile("proguard-android-optimize.txt"), 69 | "proguard-rules.pro" 70 | ) 71 | } 72 | } 73 | } 74 | 75 | dependencies { 76 | 77 | implementation("androidx.core:core-ktx:1.9.0") 78 | implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") 79 | implementation("androidx.activity:activity-compose:1.8.1") 80 | implementation(platform("androidx.compose:compose-bom:2023.03.00")) 81 | implementation("androidx.compose.ui:ui") 82 | implementation("androidx.compose.ui:ui-graphics") 83 | implementation("androidx.compose.ui:ui-tooling-preview") 84 | implementation("androidx.compose.material3:material3") 85 | testImplementation("junit:junit:4.13.2") 86 | androidTestImplementation("androidx.test.ext:junit:1.1.5") 87 | androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") 88 | androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) 89 | androidTestImplementation("androidx.compose.ui:ui-test-junit4") 90 | debugImplementation("androidx.compose.ui:ui-tooling") 91 | debugImplementation("androidx.compose.ui:ui-test-manifest") 92 | 93 | implementation(project(mapOf("path" to ":base-lib"))) 94 | implementation(project(mapOf("path" to ":lib-user"))) 95 | implementation(project(mapOf("path" to ":lib-login"))) 96 | ksp(libs.androidAop.ksp) 97 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | 23 | -printmapping proguardMapping.txt 24 | 25 | -keepnames @com.flyjingfish.module_communication_annotation.ExposeInterface class * {*;} 26 | -keepnames class * implements com.flyjingfish.module_communication_annotation.interfaces.BindClass 27 | -keep class * implements com.flyjingfish.module_communication_annotation.interfaces.BindClass{ 28 | public (); 29 | } 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 16 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 31 | 32 | 34 | 35 | 36 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/flyjingfish/modulecommunication/CollectApp.kt: -------------------------------------------------------------------------------- 1 | package com.flyjingfish.modulecommunication 2 | 3 | import android.app.Application 4 | import android.util.Log 5 | import com.flyjingfish.android_aop_annotation.anno.AndroidAopCollectMethod 6 | import com.flyjingfish.base_lib.IApplication 7 | import com.flyjingfish.module_communication_annotation.ImplementClassUtils 8 | import com.flyjingfish.module_communication_annotation.interfaces.BaseRouterClass 9 | import com.flyjingfish.module_communication_annotation.interfaces.BindClass 10 | import com.flyjingfish.module_communication_intercept.intercept.RouterIntercept 11 | import com.flyjingfish.module_communication_intercept.RouterInterceptManager 12 | import com.flyjingfish.module_communication_route.ModuleRoute 13 | import com.flyjingfish.module_communication_route.lost.RouterLost 14 | import com.flyjingfish.module_communication_route.lost.RouterLostManager 15 | 16 | object CollectApp { 17 | private val allRouterIntercept = mutableSetOf() 18 | private val allIApplication = mutableSetOf() 19 | private val allRouteClazz = mutableSetOf() 20 | private val allRouterLost = mutableSetOf() 21 | 22 | /** 23 | * 这一步才可以收集到所有的拦截器 24 | */ 25 | @AndroidAopCollectMethod 26 | @JvmStatic 27 | fun collectIntercept(sub: RouterIntercept){ 28 | Log.e("CollectIntercept","collectIntercept=$sub") 29 | allRouterIntercept.add(sub) 30 | } 31 | 32 | /** 33 | * 这一步才可以收集到所有的路由路径信息 34 | */ 35 | 36 | @AndroidAopCollectMethod 37 | @JvmStatic 38 | fun collectRouterClass(sub: BaseRouterClass){ 39 | Log.e("CollectIntercept","collectRouterClass=$sub") 40 | allRouteClazz.add(sub) 41 | } 42 | 43 | /** 44 | * 收集所有的 module 的 IApplication 类 45 | */ 46 | @AndroidAopCollectMethod 47 | @JvmStatic 48 | fun collectIApplication(sub: IApplication){ 49 | Log.e("CollectIntercept","collectIApplication=$sub") 50 | allIApplication.add(sub) 51 | } 52 | 53 | /** 54 | * 收集所有的 module 的 @ExposeInterface 共享实现类 55 | */ 56 | @AndroidAopCollectMethod 57 | @JvmStatic 58 | fun collectBindClass(sub: BindClass<*>){ 59 | Log.e("CollectIntercept","collectBindClass=$sub") 60 | ImplementClassUtils.addBindClass(sub) 61 | } 62 | 63 | /** 64 | * 这一步才可以收集到所有的降级处理器 65 | */ 66 | @AndroidAopCollectMethod 67 | @JvmStatic 68 | fun collectRouterLost(sub: RouterLost){ 69 | Log.e("CollectIntercept","collectRouterLost=$sub") 70 | allRouterLost.add(sub) 71 | } 72 | 73 | fun onCreate(application: Application){ 74 | Log.e("CollectIntercept","getAllRouterIntercept-size=${allRouterIntercept.size}") 75 | //设置全部的拦截器让其起作用 76 | RouterInterceptManager.addAllIntercept(allRouterIntercept) 77 | //设置全部路由路径信息,这样ModuleRoute才可以起作用 78 | ModuleRoute.autoAddAllRouteClass(allRouteClazz) 79 | //循环调用各个 module 的 IApplication.onCreate 80 | allIApplication.forEach { 81 | it.onCreate(application) 82 | } 83 | //设置 application 之后可以不用传上下文 84 | ModuleRoute.setApplication(application) 85 | //设置全部降级策略类 86 | RouterLostManager.addAllRouterLost(allRouterLost) 87 | } 88 | } -------------------------------------------------------------------------------- /app/src/main/java/com/flyjingfish/modulecommunication/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.flyjingfish.modulecommunication 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.os.Bundle 6 | import android.util.Log 7 | import androidx.activity.ComponentActivity 8 | import com.flyjingfish.login.LoginActivity 9 | import com.flyjingfish.module_communication_intercept.RouterInterceptManager 10 | import com.flyjingfish.module_communication_intercept.intercept.InterceptPoint 11 | import com.flyjingfish.module_communication_intercept.intercept.RouterIntercept 12 | import com.flyjingfish.module_communication_route.ModuleRoute.builder 13 | import com.flyjingfish.modulecommunication.databinding.ActivityMainBinding 14 | import com.flyjingfish.user.UserActivity 15 | 16 | class MainActivity : ComponentActivity() { 17 | private lateinit var binding : ActivityMainBinding 18 | override fun onCreate(savedInstanceState: Bundle?) { 19 | super.onCreate(savedInstanceState) 20 | binding = ActivityMainBinding.inflate(layoutInflater) 21 | setContentView(binding.root) 22 | // BeanUtils.register(UserHelper::class.java,UserHelperImpl::class.java) 23 | // BeanUtils.register(LoginHelper::class.java,LoginHelperImpl::class.java) 24 | binding.btnGoLogin.setOnClickListener { 25 | startActivity(Intent(this,LoginActivity::class.java)) 26 | } 27 | binding.btnGoUser.setOnClickListener { 28 | startActivity(Intent(this,UserActivity::class.java)) 29 | } 30 | 31 | binding.btnGoUri.setOnClickListener { 32 | // ModuleRoute.builder("/sss/sss").go(object : OnNavigationBack{ 33 | // override fun onResult(result: NavigationResult) { 34 | // Log.e("onLost","--MainActivity--result=${result.found}") 35 | // } 36 | // 37 | // }) 38 | builder("/sss/sss").setOnGoActivity { context: Context, intent: Intent -> true } 39 | .go { 40 | Log.e("onLost","--MainActivity--result=${it.found}") 41 | } 42 | RouterInterceptManager.addIntercept(object :RouterIntercept{ 43 | override fun onIntercept(point: InterceptPoint) { 44 | Log.e("onIntercept","--MainActivity--${point.path},params = ${point.paramsMap},byPath = ${point.byPath}") 45 | point.proceed() 46 | } 47 | 48 | override fun order(): Int { 49 | return 4 50 | } 51 | 52 | }) 53 | startActivity(Intent(this,SchemeFilterActivity::class.java)) 54 | // startActivity(Intent(this,WebActivity::class.java)) 55 | } 56 | 57 | Log.e("MainActivity","------${Int::class.qualifiedName}") 58 | } 59 | } -------------------------------------------------------------------------------- /app/src/main/java/com/flyjingfish/modulecommunication/MyApp.kt: -------------------------------------------------------------------------------- 1 | package com.flyjingfish.modulecommunication 2 | 3 | import android.app.Application 4 | 5 | class MyApp : Application() { 6 | override fun onCreate() { 7 | super.onCreate() 8 | CollectApp.onCreate(this) 9 | } 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/flyjingfish/modulecommunication/SchemeFilterActivity.kt: -------------------------------------------------------------------------------- 1 | package com.flyjingfish.modulecommunication 2 | 3 | import android.os.Bundle 4 | import android.util.Log 5 | import androidx.activity.ComponentActivity 6 | import androidx.core.net.toUri 7 | import com.flyjingfish.module_communication_annotation.ImplementClassUtils 8 | import com.flyjingfish.module_communication_route.ModuleRoute 9 | import com.flyjingfish.module_communication_route.callback.OnNavigationBack 10 | import com.flyjingfish.user.TestBean 11 | import com.flyjingfish.user.TestBean2 12 | import com.flyjingfish.user.UserHelper 13 | import com.google.gson.Gson 14 | import java.util.ArrayList 15 | 16 | 17 | class SchemeFilterActivity : ComponentActivity() { 18 | override fun onCreate(savedInstanceState: Bundle?) { 19 | super.onCreate(savedInstanceState) 20 | // val uri = intent.data 21 | val userHelper = ImplementClassUtils.getSingleInstance(UserHelper::class) 22 | val user = userHelper?.getUser() 23 | val gson = Gson() 24 | val intArray = intArrayOf(1,2,3) 25 | val stringArray = arrayOf("4","5") 26 | val testArray = arrayOf(TestBean(1),TestBean(2)) 27 | val idArray = ArrayList(listOf("3","3")) 28 | val userTestBean2List = ArrayList(listOf(TestBean2(11), TestBean2(22))) 29 | val testBean2Array = arrayOf(TestBean2(33),TestBean2(44)) 30 | // Log.e("SchemeFilterActivity",gson.toJson(intArray)) 31 | val uriTest = "lightrouter://test.flyjingfish.com/user/DetailActivity?age=10&name=" + 32 | "hahahaha&aChar=a&user=${gson.toJson(user)}&userIds=${gson.toJson(intArray)}&stringArray=${gson.toJson(stringArray)}" + 33 | "&userList=${gson.toJson(testArray)}&userIdList=${gson.toJson(idArray)}&userTestBean2List=${gson.toJson(userTestBean2List)}" + 34 | "&testBean2Array=${gson.toJson(testBean2Array)}" 35 | Log.e("SchemeFilterActivity",uriTest) 36 | 37 | val uri = uriTest.toUri() 38 | uri?.let { 39 | ModuleRoute.builder(it)?.go() 40 | finish() 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /app/src/main/java/com/flyjingfish/modulecommunication/WebActivity.kt: -------------------------------------------------------------------------------- 1 | package com.flyjingfish.modulecommunication 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import android.webkit.WebChromeClient 6 | import android.webkit.WebSettings 7 | import android.webkit.WebView 8 | import android.webkit.WebViewClient 9 | import androidx.activity.ComponentActivity 10 | import com.flyjingfish.modulecommunication.databinding.ActivityWebBinding 11 | 12 | class WebActivity : ComponentActivity() { 13 | private lateinit var binding : ActivityWebBinding 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | binding = ActivityWebBinding.inflate(layoutInflater) 17 | setContentView(binding.root) 18 | initView() 19 | } 20 | 21 | override fun onDestroy() { 22 | super.onDestroy() 23 | binding.web.destroy() 24 | } 25 | 26 | override fun onResume() { 27 | super.onResume() 28 | binding.web.onResume() 29 | } 30 | 31 | override fun onPause() { 32 | super.onPause() 33 | binding.web.onPause() 34 | } 35 | 36 | fun initView() { 37 | setWebHtmlView() 38 | binding.web.webViewClient = CharmWebViewClient() 39 | binding.web.webChromeClient = CharmWebChromeClient() 40 | // binding.mlStatus.showLoading(); 41 | binding.web.loadUrl("https://flyjingfish.github.io/demoweb/indexUri.html") 42 | } 43 | private fun setWebHtmlView() { 44 | val s: WebSettings = binding.web.settings 45 | s.allowFileAccess = false 46 | s.allowFileAccessFromFileURLs = false 47 | s.saveFormData = false 48 | s.savePassword = false 49 | s.layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN 50 | s.javaScriptEnabled = true 51 | s.cacheMode = WebSettings.LOAD_DEFAULT 52 | s.domStorageEnabled = true 53 | s.javaScriptCanOpenWindowsAutomatically = true 54 | s.setSupportZoom(false) 55 | s.builtInZoomControls = false 56 | s.displayZoomControls = false 57 | s.useWideViewPort = true 58 | s.loadWithOverviewMode = true 59 | // binding.web.addJavascriptInterface(this, "nativeApi") 60 | s.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW 61 | } 62 | 63 | private inner class CharmWebViewClient : WebViewClient() { 64 | override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { 65 | return if (url.startsWith("http") || url.startsWith("https")) { 66 | view.loadUrl(url) 67 | true 68 | } else { 69 | try { 70 | startActivity(Intent.parseUri(url, 0)) 71 | true 72 | } catch (e: Exception) { 73 | true 74 | } 75 | } 76 | } 77 | } 78 | 79 | private inner class CharmWebChromeClient : WebChromeClient() { 80 | override fun onReceivedTitle(view: WebView, title: String) { 81 | super.onReceivedTitle(view, title) 82 | } 83 | } 84 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 |