├── .github
└── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── custom.md
│ └── feature_request.md
├── .gitignore
├── .idea
├── caches
│ ├── build_file_checksums.ser
│ └── gradle_models.ser
├── codeStyles
│ └── Project.xml
├── compiler.xml
├── dictionaries
│ └── Wiki.xml
├── encodings.xml
├── gradle.xml
├── jarRepositories.xml
├── markdown-navigator.xml
├── markdown-navigator
│ └── profiles_settings.xml
├── misc.xml
├── modules.xml
└── vcs.xml
├── LICENSE
├── README.md
├── build.gradle
├── doc
├── IDEA 插件.md
├── RouterComponent、RouterTask、RouterDelegate对比.md
├── 利用拦截器实现统一处理页面URL和HTTP URL.md
├── 开始使用 GRouter.md
├── 引入 GRouter.md
├── 混淆 Proguard.md
├── 组件化关键概念.md
└── 通过服务降级拦截需要登录的页面,引导用户登录,成功后调到目标页面.md
├── example
├── app-shell
│ ├── shell-base
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src
│ │ │ ├── androidTest
│ │ │ └── java
│ │ │ │ └── com
│ │ │ │ └── t
│ │ │ │ └── example_shell_webview
│ │ │ │ └── ExampleInstrumentedTest.kt
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ │ └── t
│ │ │ │ │ └── example_shell_webview
│ │ │ │ │ ├── DebugMockInterceptor.kt
│ │ │ │ │ └── MockBaseApplication.kt
│ │ │ └── res
│ │ │ │ ├── drawable-v24
│ │ │ │ └── ic_launcher_foreground.xml
│ │ │ │ ├── drawable
│ │ │ │ └── ic_launcher_background.xml
│ │ │ │ ├── layout
│ │ │ │ └── activity_main.xml
│ │ │ │ ├── mipmap-anydpi-v26
│ │ │ │ ├── ic_launcher.xml
│ │ │ │ └── ic_launcher_round.xml
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ │ └── values
│ │ │ │ ├── colors.xml
│ │ │ │ ├── strings.xml
│ │ │ │ └── styles.xml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── com
│ │ │ └── t
│ │ │ └── example_shell_webview
│ │ │ └── ExampleUnitTest.kt
│ └── shell-webview
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── t
│ │ │ └── example_shell_webview
│ │ │ └── ExampleInstrumentedTest.kt
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── t
│ │ │ │ └── example_shell_webview
│ │ │ │ ├── MainActivity.kt
│ │ │ │ └── MockWebViewApplication.kt
│ │ └── res
│ │ │ ├── drawable-v24
│ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── drawable
│ │ │ └── ic_launcher_background.xml
│ │ │ ├── layout
│ │ │ └── activity_main.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── t
│ │ └── example_shell_webview
│ │ └── ExampleUnitTest.kt
├── app
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── debug
│ │ ├── AndroidManifest.xml2
│ │ └── java
│ │ │ └── mock
│ │ │ ├── DebugMockIntercepter.kt
│ │ │ ├── MockBaseApplication.kt
│ │ │ └── MockWebViewApplication.kt
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── grouter
│ │ │ │ └── demo
│ │ │ │ ├── AppRouterInterceptor.kt
│ │ │ │ ├── BaseActivity.java
│ │ │ │ ├── LoginRouterInterceptor.kt
│ │ │ │ ├── MainActivity.kt
│ │ │ │ ├── MyApplication.kt
│ │ │ │ ├── _GRouter.kt
│ │ │ │ ├── activity
│ │ │ │ ├── AboutUsActivity.java
│ │ │ │ ├── CinemaActivity.java
│ │ │ │ ├── CinemaDetailActivity.java
│ │ │ │ ├── LoginActivity.java
│ │ │ │ ├── MomentActivity.java
│ │ │ │ ├── MomentListActivity.java
│ │ │ │ ├── MovieActivity.java
│ │ │ │ ├── MoviePhotoActivity.java
│ │ │ │ ├── MovieWorkerActivity.java
│ │ │ │ ├── NetworkPingActivity.java
│ │ │ │ ├── OverridePendingTransitionActivity.kt
│ │ │ │ ├── OverridePendingTransitionTargetActivity.kt
│ │ │ │ ├── SettingsActivity.java
│ │ │ │ └── UserActivity.kt
│ │ │ │ ├── component
│ │ │ │ └── ComponentTestActivity.kt
│ │ │ │ ├── delegate
│ │ │ │ ├── MomentViewModel.kt
│ │ │ │ └── UserViewModel.java
│ │ │ │ ├── kotlin
│ │ │ │ └── Crew.kt
│ │ │ │ └── service
│ │ │ │ ├── FeedServiceImpl.kt
│ │ │ │ └── UserListTask.java
│ │ └── res
│ │ │ ├── layout
│ │ │ ├── activity_component_test.xml
│ │ │ ├── activity_main.xml
│ │ │ ├── activity_override_pending_transition.xml
│ │ │ ├── activity_override_pending_transition_target.xml
│ │ │ ├── activity_second.xml
│ │ │ ├── activity_test1.xml
│ │ │ ├── activity_test2.xml
│ │ │ ├── activity_third.xml
│ │ │ └── content_component_test.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── values-w820dp
│ │ │ └── dimens.xml
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── grouter
│ │ └── demo
│ │ ├── UserTest.kt
│ │ ├── delegate
│ │ └── UserViewModelTest.java
│ │ └── service
│ │ └── AccountServiceTest.java
├── base
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── taoweiji
│ │ │ └── basemodule
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── grouter
│ │ │ │ └── demo
│ │ │ │ ├── Account2Service.kt
│ │ │ │ ├── base
│ │ │ │ ├── model
│ │ │ │ │ ├── Moment.kt
│ │ │ │ │ └── User.kt
│ │ │ │ ├── service
│ │ │ │ │ ├── AccountService.kt
│ │ │ │ │ ├── FeedService.kt
│ │ │ │ │ └── UserService.kt
│ │ │ │ └── view
│ │ │ │ │ └── CrewActivity.java
│ │ │ │ └── service
│ │ │ │ └── WaimaiService.java
│ │ ├── res
│ │ │ ├── layout
│ │ │ │ ├── activity_crew.xml
│ │ │ │ └── content_crew.xml
│ │ │ ├── values
│ │ │ │ ├── dimens.xml
│ │ │ │ ├── strings.xml
│ │ │ │ └── styles.xml
│ │ │ └── xml
│ │ │ │ └── network_security_config.xml
│ │ └── router
│ │ │ └── com
│ │ │ └── grouter
│ │ │ ├── GActivityCenter.java
│ │ │ ├── GComponentCenter.java
│ │ │ ├── GDelegateCenter.java
│ │ │ ├── GRouterInitializer.java
│ │ │ ├── GTaskCenter.java
│ │ │ └── data
│ │ │ ├── Router-app.json
│ │ │ ├── Router-base.json
│ │ │ ├── Router-travel.json
│ │ │ ├── Router-waimai.json
│ │ │ └── Router-webview.json
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── taoweiji
│ │ └── basemodule
│ │ └── ExampleUnitTest.java
├── example.gradle
├── travel
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── grouter
│ │ │ └── example
│ │ │ └── travel
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── grouter
│ │ │ │ └── example
│ │ │ │ └── travel
│ │ │ │ ├── TravelHomeActivity.java
│ │ │ │ ├── TravelMapActivity.java
│ │ │ │ ├── TravelPoiActivity.java
│ │ │ │ └── TravelPoiDetailActivity.java
│ │ └── res
│ │ │ └── values
│ │ │ └── strings.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── grouter
│ │ └── example
│ │ └── travel
│ │ └── ExampleUnitTest.java
├── waimai
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── grouter
│ │ │ └── demo
│ │ │ ├── other
│ │ │ ├── OtherRouterInterceptor.java
│ │ │ ├── activity
│ │ │ │ ├── AccountBindActivity.java
│ │ │ │ ├── AccountLoginActivity.java
│ │ │ │ └── UserFragment.java
│ │ │ └── service
│ │ │ │ ├── AccountServiceImpl.kt
│ │ │ │ ├── GetUserTask.java
│ │ │ │ ├── UserLoginTask.java
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── service
│ │ │ └── WaimaiServiceImpl.java
│ │ └── res
│ │ ├── layout
│ │ └── activity_other_module.xml
│ │ ├── values-w820dp
│ │ └── dimens.xml
│ │ └── values
│ │ ├── dimens.xml
│ │ └── strings.xml
└── webview
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── assets
│ └── grouter_test.html
│ ├── java
│ └── com
│ │ └── grouter
│ │ └── demo
│ │ └── webview
│ │ └── activity
│ │ └── WebViewActivity.kt
│ └── res
│ ├── layout
│ ├── activity_other_module.xml
│ └── activity_web_view.xml
│ ├── values-w820dp
│ └── dimens.xml
│ └── values
│ ├── dimens.xml
│ └── strings.xml
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── grouter-annotation
├── .gitignore
├── build.gradle
└── src
│ └── main
│ └── java
│ └── com
│ └── grouter
│ ├── RouterActivity.java
│ ├── RouterComponent.java
│ ├── RouterComponentConstructor.java
│ ├── RouterDelegate.java
│ ├── RouterDelegateConstructor.java
│ ├── RouterDelegateMethod.java
│ ├── RouterDocument.java
│ ├── RouterField.java
│ ├── RouterInterceptor.java
│ └── RouterTask.java
├── grouter-compiler
├── .gitignore
├── build.gradle
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── grouter
│ │ │ └── compiler
│ │ │ ├── ActivityModel.java
│ │ │ ├── ComponentModel.java
│ │ │ ├── FileUtils.java
│ │ │ ├── InterceptorModel.java
│ │ │ ├── ParameterModel.java
│ │ │ ├── RouterActivityCodeBuilder.java
│ │ │ ├── RouterAutoInitializerBuilder.java
│ │ │ ├── RouterBuildHelper.java
│ │ │ ├── RouterComponentCodeBuilder.java
│ │ │ ├── RouterDelegateCodeBuilder.java
│ │ │ ├── RouterDelegateModel.java
│ │ │ ├── RouterModel.java
│ │ │ ├── RouterTaskCodeBuilder.java
│ │ │ ├── TaskModel.java
│ │ │ ├── TypeUtils.java
│ │ │ └── processor
│ │ │ ├── ActivityProcessor.java
│ │ │ ├── ComponentProcessor.java
│ │ │ ├── DelegateProcessor.java
│ │ │ ├── InterceptorProcessor.java
│ │ │ ├── RouterProcessor.java
│ │ │ └── TaskProcessor.java
│ └── resources
│ │ └── META-INF
│ │ └── services
│ │ └── javax.annotation.processing.Processor
│ └── test
│ └── java
│ └── com
│ └── grouter
│ └── compiler
│ ├── JavapoetTest.java
│ └── RouterBuildHelperTest.java
├── grouter-gradle-plugin
├── .gitignore
├── build.gradle
└── src
│ ├── main
│ ├── groovy
│ │ └── com
│ │ │ └── grouter
│ │ │ └── gradle
│ │ │ └── plugin
│ │ │ ├── GRouterExtension.groovy
│ │ │ └── GRouterPlugin.groovy
│ ├── java
│ │ ├── com
│ │ │ └── grouter
│ │ │ │ └── compiler
│ │ │ │ ├── ActivityModel.java
│ │ │ │ ├── ComponentModel.java
│ │ │ │ ├── FileUtils.java
│ │ │ │ ├── InterceptorModel.java
│ │ │ │ ├── ParameterModel.java
│ │ │ │ ├── RouterActivityCodeBuilder.java
│ │ │ │ ├── RouterAutoInitializerBuilder.java
│ │ │ │ ├── RouterBuildHelper.java
│ │ │ │ ├── RouterComponentCodeBuilder.java
│ │ │ │ ├── RouterDelegateCodeBuilder.java
│ │ │ │ ├── RouterDelegateModel.java
│ │ │ │ ├── RouterModel.java
│ │ │ │ ├── RouterTaskCodeBuilder.java
│ │ │ │ ├── TaskModel.java
│ │ │ │ └── TypeUtils.java
│ │ └── router
│ │ │ ├── KotlinTypeUtils.java
│ │ │ ├── ParserHelper.java
│ │ │ ├── activity
│ │ │ ├── ActivityJavaSourceFileParser.java
│ │ │ ├── ActivityKotlinSourceFileParser.java
│ │ │ ├── ActivitySourceFileParser.java
│ │ │ └── ActivitySourceFileParserHelper.java
│ │ │ ├── component
│ │ │ ├── ComponentJavaSourceFileParser.java
│ │ │ ├── ComponentKotlinSourceFileParser.java
│ │ │ ├── ComponentSourceFileHelper.java
│ │ │ └── ComponentSourceFileParser.java
│ │ │ ├── delegate
│ │ │ ├── DelegateJavaSourceFileParser.java
│ │ │ ├── DelegateKotlinSourceFileParser.java
│ │ │ ├── DelegateSourceFileHelper.java
│ │ │ └── DelegateSourceFileParser.java
│ │ │ └── task
│ │ │ ├── TaskJavaSourceFileParser.java
│ │ │ ├── TaskKotlinSourceFileParser.java
│ │ │ ├── TaskSourceFileParser.java
│ │ │ └── TaskSourceFileParserHelper.java
│ └── resources
│ │ └── META-INF
│ │ ├── gradle-plugins
│ │ └── grouter.properties
│ │ └── grouter.html
│ └── test
│ └── java
│ └── router
│ ├── ComponentRouterJavaRouterSourceFileParserTest.java
│ ├── DelegateKotlinSourceFileParserTest.java
│ ├── RouterJavaRouterSourceFileParserTest.java
│ └── RouterKotlinRouterSourceFileParserTest.java
├── grouter-kotlinextensions
├── .gitignore
├── build.gradle
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── grouter
│ │ └── kotlinextensions
│ │ └── ExampleInstrumentedTest.kt
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── grouter
│ │ └── kotlinextensions
│ │ └── ActivityExtensions.kt
│ └── res
│ └── values
│ └── strings.xml
├── grouter
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── grouter
│ │ └── hybrid
│ │ └── GRouterJavascriptInterfaceTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── grouter
│ │ │ ├── ActivityRequest.java
│ │ │ ├── ComponentRequest.java
│ │ │ ├── ComponentUtils.java
│ │ │ ├── DefaultMultiProjectGRouter.java
│ │ │ ├── ErrorTask.java
│ │ │ ├── GActivityBuilder.java
│ │ │ ├── GActivityUtils.java
│ │ │ ├── GRouter.java
│ │ │ ├── GRouterInterceptor.java
│ │ │ ├── GRouterLogger.java
│ │ │ ├── GRouterTask.java
│ │ │ ├── GRouterTaskBuilder.java
│ │ │ ├── InterceptorUtils.java
│ │ │ ├── LoggerUtils.java
│ │ │ ├── MockTask.java
│ │ │ ├── RouterInject.java
│ │ │ ├── RouterUtils.java
│ │ │ ├── SafeBundle.java
│ │ │ ├── TaskRequest.java
│ │ │ ├── fragment
│ │ │ └── FragmentBuilder.java
│ │ │ └── hybrid
│ │ │ └── GRouterJavascriptInterface.java
│ └── res
│ │ ├── anim
│ │ ├── activity_bottom_to_top_enter.xml
│ │ ├── activity_bottom_to_top_exit.xml
│ │ ├── activity_left_to_right_enter.xml
│ │ ├── activity_left_to_right_exit.xml
│ │ ├── activity_right_to_left_enter.xml
│ │ ├── activity_right_to_left_exit.xml
│ │ ├── activity_top_to_bottom_enter.xml
│ │ ├── activity_top_to_bottom_exit.xml
│ │ ├── fade_in.xml
│ │ ├── fade_out.xml
│ │ └── no_anim.xml
│ │ └── values
│ │ └── config.xml
│ └── test
│ └── java
│ └── com
│ └── grouter
│ ├── GRouterTaskTest.java
│ ├── RouterInjectTest.java
│ ├── fragment
│ └── FragmentBuilderTest.java
│ └── hybrid
│ └── GRouterJavascriptInterfaceTest.java
├── maven_public.gradle
└── settings.gradle
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here.
39 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/custom.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Custom issue template
3 | about: Describe this issue template's purpose here.
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | /upload_jcenter.sh
10 | repo
--------------------------------------------------------------------------------
/.idea/caches/build_file_checksums.ser:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/.idea/caches/build_file_checksums.ser
--------------------------------------------------------------------------------
/.idea/caches/gradle_models.ser:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/.idea/caches/gradle_models.ser
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.idea/dictionaries/Wiki.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | gcomponent
5 | grouter
6 | taoweiji
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
32 |
33 |
--------------------------------------------------------------------------------
/.idea/markdown-navigator/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | ext.kotlin_version = '1.3.41'
5 |
6 | repositories {
7 | maven { url uri('./repo') }
8 | mavenCentral()
9 | google()
10 | }
11 | dependencies {
12 | classpath 'com.android.tools.build:gradle:3.5.4'
13 | classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
14 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.41"
15 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
16 |
17 | classpath 'io.github.taoweiji.grouter:grouter-gradle-plugin:+'
18 | }
19 | }
20 |
21 | allprojects {
22 | repositories {
23 | maven { url uri('./repo') }
24 | mavenCentral()
25 | google()
26 | }
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
33 | allprojects {
34 | tasks.withType(Javadoc) {
35 | options.addStringOption('Xdoclint:none', '-quiet')
36 | options.addStringOption('encoding', 'UTF-8')
37 | }
38 | }
--------------------------------------------------------------------------------
/doc/IDEA 插件.md:
--------------------------------------------------------------------------------
1 | 为了方便开发,GRouter提供强大的 IDEA 插件,通过插件可以非常方便实现跳转到目标类。
2 |
3 |
--------------------------------------------------------------------------------
/doc/RouterComponent、RouterTask、RouterDelegate对比.md:
--------------------------------------------------------------------------------
1 |
2 | GRouter 提供三种组件间通信组件,RouterComponent、RouterTask和RouterDelegate,各个组件都有不同的特点有不同的应用场景。
3 |
4 |
5 |
6 | | | RouterComponent | RouterTask | RouterDelegate |
7 | | ------------- | ------------------------------------------------------------ | ----------------------------------------- | ------------------------------------------------------------ |
8 | | 跨Project调用 | 支持 | 支持 | 不支持 |
9 | | 描述 | 接口下沉式组件间服务 | 非下沉式组件间单任务服务 | 代理式服务 |
10 | | 缺点 | 需要在BaseModule下沉接口,适合在当前Project中使用,跨Project成本较大 | 每个Task只能执行一种任务 | 整体使用反射实现,与实现类关联性很低,只适合在当前Project使用 |
11 | | 优点 | | 依赖性很低,特别适合在跨Project项目中使用 | |
12 | | | | | |
13 |
14 |
15 |
16 | ### RouterComponent(需要下沉接口,多工程)
17 | 通常用于频繁使用的组件,比如获取当前的登录信息,获取单个用户信息等,使用频率很高,在各个Module都有不同程度的调用,由于是接口实现方式实现,代码调用方便。
18 |
19 | ### RouterDelegate(需要下沉Class,最简单,当前工程)
20 | RouterDelegate 的使用极其简单,原理是在BaseModule生成对应的壳类,通过反射代理的方式调用原来的类,虽然反射并没有降低太多的性能,但是使用时候需要更多的注意,因为需要代理的方法依赖的Class(eg. User.class)必须在BaseModule也存在,否则会生成代码出错,一旦出错就需要使用Gradle插件`GRouterFixRelease`命令解决错误。
21 |
22 | ### RouterTask(多工程、混合开发,功能强大)
23 |
24 | RouterTask的使用非常广泛,无需下沉接口,支持URL调用,相当于远程服务器API一样,可以在当前的Project使用,也可以解决不同的Project的服务调用问题,而且还支持 `Hybrid H5`和`Flutter`混合开发调用服务,支持转换成String、Map、反序列化对象和List,方便调用者在无依赖情况下使用,应用范围比RouterComponent和RouterDelegate大很多。
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/doc/利用拦截器实现统一处理页面URL和HTTP URL.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | 提出 grouter_extras 概念
4 | link url,结合iOS,HTTP协议
--------------------------------------------------------------------------------
/doc/引入 GRouter.md:
--------------------------------------------------------------------------------
1 | 配置 gradle.properties
2 |
3 | ```properties
4 | # 如果是多Module,请填写填写BaseModule的路径{base-module-name}/src/main/java
5 | GROUTER_SOURCE_PATH =app/src/main/java
6 | # 请填写自己项目独特的scheme
7 | GROUTER_SCHEME =grouter
8 | ```
9 |
10 | 配置根目录 build.gradle
11 |
12 | ```groovy
13 | buildscript {
14 | repositories {
15 | jcenter()
16 | maven { url 'https://dl.bintray.com/grouter/maven' }
17 | }
18 | dependencies {
19 | classpath 'com.grouter:grouter-gradle-plugin:1.0.0'
20 | }
21 | }
22 | ```
23 |
24 | 在每一个Module的 build.gradle 增加
25 |
26 | ```groovy
27 | // 需要注意顺序,必须放在其它 'apply plugin: XXX' 后面
28 | apply plugin: 'grouter'
29 | ```
30 |
31 | 在 MyApplication 进行初始化
32 |
33 | ```kotlin
34 | // 需要根据项目使用的json序列化框架实现序列化,下面的fastjson的序列化方案
35 | GRouter.setSerialization(object : GRouter.Serialization {
36 | override fun serializable(any: Any): String {
37 | return JSON.toJSONString(any)
38 | }
39 | override fun deserializeObject(json: String, clazz: Class): T? {
40 | return JSON.parseObject(json, clazz)
41 | }
42 | override fun deserializeList(json: String, clazz: Class): List? {
43 | return JSON.parseArray(json, clazz)
44 | }
45 | })
46 | GRouter.getInstance().init(this, BuildConfig.BUILD_TYPE, null)
47 | ```
48 |
49 |
--------------------------------------------------------------------------------
/doc/混淆 Proguard.md:
--------------------------------------------------------------------------------
1 | ### ProGuard 混淆
2 |
3 | 如果项目用到了混淆,需要添加下面代码到proguard-rules.pro
4 |
5 | ```properties
6 | -keep class com.grouter.GRouterInitializer
7 | -keep @com.grouter.RouterComponent class *
8 | -keep @com.grouter.RouterDelegate class *
9 | -keep @com.grouter.RouterInterceptor class *
10 | -keep @com.grouter.RouterTask class *
11 | -keep @com.grouter.RouterActivity class *
12 | -keepclasseswithmembers class * {
13 | @com.grouter.RouterField ;
14 | }
15 | -keepclasseswithmembers class * {
16 | @com.grouter.RouterDelegateMethod ;
17 | }
18 | -keepclasseswithmembers class * {
19 | @com.grouter.RouterDelegateConstructor (...);
20 | }
21 | -keepclasseswithmembers class * {
22 | @com.grouter.RouterComponentConstructor (...);
23 | }
24 |
25 | ```
26 |
27 |
--------------------------------------------------------------------------------
/doc/组件化关键概念.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/doc/组件化关键概念.md
--------------------------------------------------------------------------------
/doc/通过服务降级拦截需要登录的页面,引导用户登录,成功后调到目标页面.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/doc/通过服务降级拦截需要登录的页面,引导用户登录,成功后调到目标页面.md
--------------------------------------------------------------------------------
/example/app-shell/shell-base/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/example/app-shell/shell-base/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'kotlin-android'
3 | apply plugin: 'kotlin-android-extensions'
4 |
5 |
6 | android {
7 | compileSdkVersion 30
8 | buildToolsVersion '28.0.3'
9 |
10 | defaultConfig {
11 | minSdkVersion 14
12 | targetSdkVersion 30
13 | versionCode 1
14 | versionName "1.0"
15 |
16 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
17 |
18 | }
19 | buildTypes {
20 | release {
21 | minifyEnabled false
22 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
23 | }
24 | }
25 | compileOptions {
26 | sourceCompatibility 1.8
27 | targetCompatibility 1.8
28 | }
29 | }
30 |
31 | dependencies {
32 | implementation fileTree(include: ['*.jar'], dir: 'libs')
33 |
34 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
35 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
36 | testImplementation 'junit:junit:4.12'
37 | androidTestImplementation 'androidx.test.ext:junit:1.1.1'
38 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
39 | api 'androidx.appcompat:appcompat:1.0.0'
40 | // api project(':example:grouter')
41 | api project(':example:base')
42 | api 'com.alibaba:fastjson:1.1.45.android'
43 | // api 'org.mockito:mockito-core:3.0.0'
44 | api 'org.mockito:mockito-android:3.0.0'
45 | }
--------------------------------------------------------------------------------
/example/app-shell/shell-base/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 |
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/androidTest/java/com/t/example_shell_webview/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.t.example_shell_webview
2 |
3 | import android.support.test.InstrumentationRegistry
4 | import android.support.test.runner.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22 | assertEquals("com.t.example_shell_webview", appContext.packageName)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/java/com/t/example_shell_webview/DebugMockInterceptor.kt:
--------------------------------------------------------------------------------
1 | package com.t.example_shell_webview
2 |
3 | import com.grouter.*
4 | import com.grouter.demo.base.model.User
5 | import com.grouter.demo.base.service.AccountService
6 | import com.grouter.demo.base.service.UserService
7 | import org.mockito.Mockito
8 | import java.lang.Exception
9 |
10 | class DebugMockInterceptor : GRouterInterceptor() {
11 |
12 | override fun process(request: TaskRequest): Boolean {
13 | if (request.path == "getLoginUser") {
14 | request.onContinueResult(User(123, "202cb962ac59075b964b07152d234b70"))
15 | return true
16 | }
17 | return super.process(request)
18 | }
19 |
20 | override fun onError(request: TaskRequest, exception: Exception): Boolean {
21 | if (request.path == "getLoginUser") {
22 | request.onContinueResult(User(123, "202cb962ac59075b964b07152d234b70"))
23 | return true
24 | }
25 | return super.onError(request, exception)
26 | }
27 |
28 | override fun process(request: ComponentRequest): Boolean {
29 | if (request.protocol == UserService::class.java) {
30 | val userService = Mockito.mock(UserService::class.java)
31 | Mockito.`when`(userService.getUser(1)).thenReturn(User(1, "Mockito"))
32 | request.onContinue(userService)
33 | return true
34 | } else if (request.protocol == AccountService::class.java) {
35 | val accountService = Mockito.mock(AccountService::class.java)
36 | Mockito.`when`(accountService.getLoginUser()).thenReturn(User(101, "Mockito"))
37 | request.onContinue(accountService)
38 | return true
39 | }
40 | return super.process(request)
41 | }
42 |
43 | override fun onError(request: ComponentRequest, exception: Exception): Boolean {
44 | if (request.protocol == UserService::class.java) {
45 | val userService: UserService = Mockito.mock(UserService::class.java)
46 | Mockito.`when`(userService.getUser(1)).thenReturn(User(1, "Mockito"))
47 | request.onContinue(userService)
48 | return true
49 | }
50 | return super.onError(request, exception)
51 | }
52 |
53 | }
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/java/com/t/example_shell_webview/MockBaseApplication.kt:
--------------------------------------------------------------------------------
1 | package com.t.example_shell_webview
2 |
3 | import android.app.Application
4 | import android.content.Context
5 | import com.alibaba.fastjson.JSON
6 | import com.grouter.GComponentCenter
7 | import com.grouter.GRouter
8 | import com.grouter.demo.base.model.User
9 | import com.grouter.demo.base.service.UserService
10 | import com.t.example_shell_base.BuildConfig
11 | import org.mockito.Mockito
12 | import org.mockito.Mockito.mock
13 |
14 | open class MockBaseApplication:Application() {
15 | override fun onCreate() {
16 | super.onCreate()
17 | GRouter.setSerialization(object : GRouter.Serialization {
18 | override fun serialize(any: Any): String {
19 | return JSON.toJSONString(any)
20 | }
21 |
22 | override fun deserializeObject(json: String, clazz: Class): T? {
23 | return JSON.parseObject(json, clazz)
24 | }
25 |
26 | override fun deserializeList(json: String, clazz: Class): List? {
27 | return JSON.parseArray(json, clazz)
28 | }
29 | })
30 | GRouter.getInstance().init(this, BuildConfig.BUILD_TYPE, null)
31 | System.setProperty("org.mockito.android.target",getDir("target", Context.MODE_PRIVATE).absolutePath)
32 | }
33 | }
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
17 |
18 |
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-base/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-base/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-base/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-base/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-base/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-base/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-base/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-base/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-base/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-base/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #008577
4 | #00574B
5 | #D81B60
6 |
7 |
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | MockApplication
3 |
4 |
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/example/app-shell/shell-base/src/test/java/com/t/example_shell_webview/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.t.example_shell_webview
2 |
3 | import com.alibaba.fastjson.JSON
4 | import com.grouter.demo.base.model.User
5 | import com.grouter.demo.base.service.UserService
6 | import org.junit.Test
7 |
8 | import org.junit.Assert.*
9 | import org.mockito.Mockito
10 | import org.mockito.internal.util.MockUtil
11 | import org.mockito.mock.MockCreationSettings
12 | import org.mockito.plugins.MockMaker
13 | import org.mockito.plugins.MockitoPlugins
14 | import java.io.File
15 |
16 | /**
17 | * Example local unit test, which will execute on the development machine (host).
18 | *
19 | * See [testing documentation](http://d.android.com/tools/testing).
20 | */
21 | class ExampleUnitTest {
22 | @Test
23 | fun addition_isCorrect() {
24 | System.setProperty("org.mockito.android.target",File("test").absolutePath)
25 | // MockUtil.createMock()
26 | // MockUtil.createMock(AndroidByteBuddyMockMaker())
27 | val userService = Mockito.mock(UserService::class.java)
28 | Mockito.`when`(userService.getUser(1)).thenReturn(User(1,"Mockito"))
29 | val user = userService.getUser(1)
30 | println(JSON.toJSONString(user))
31 | assertEquals("Mockito", user.name)
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | apply plugin: 'kotlin-android'
3 | apply plugin: 'kotlin-android-extensions'
4 | android {
5 | compileSdkVersion 30
6 |
7 |
8 | defaultConfig {
9 | applicationId "com.t.example_shell_webview"
10 | minSdkVersion 21
11 | targetSdkVersion 30
12 | versionCode 1
13 | versionName "1.0"
14 |
15 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
16 | }
17 |
18 | buildTypes {
19 | release {
20 | minifyEnabled false
21 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
22 | }
23 | }
24 | compileOptions {
25 | sourceCompatibility 1.8
26 | targetCompatibility 1.8
27 | }
28 |
29 | }
30 |
31 | dependencies {
32 | implementation fileTree(dir: 'libs', include: ['*.jar'])
33 | testImplementation 'junit:junit:4.12'
34 | androidTestImplementation 'androidx.test.ext:junit:1.1.1'
35 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
36 | implementation project(':example:app-shell:shell-base')
37 | implementation project(':example:webview')
38 | }
39 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/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 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/androidTest/java/com/t/example_shell_webview/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.t.example_shell_webview
2 |
3 | import android.support.test.InstrumentationRegistry
4 | import android.support.test.runner.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22 | assertEquals("com.t.example_shell_webview", appContext.packageName)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/java/com/t/example_shell_webview/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.t.example_shell_webview
2 |
3 | import androidx.appcompat.app.AppCompatActivity
4 | import android.os.Bundle
5 | import android.util.Log
6 | import com.alibaba.fastjson.JSON
7 | import com.grouter.GActivityCenter
8 | import com.grouter.GComponentCenter
9 | import com.grouter.GRouter
10 | import com.grouter.demo.base.model.User
11 | import com.grouter.demo.base.service.UserService
12 | import kotlinx.android.synthetic.main.activity_main.*
13 |
14 | class MainActivity : AppCompatActivity() {
15 |
16 | override fun onCreate(savedInstanceState: Bundle?) {
17 | super.onCreate(savedInstanceState)
18 | setContentView(R.layout.activity_main)
19 | val response = GRouter.getInstance().taskBuilder("getLoginUser").put("uid", 1).execute()
20 | Log.e("getLoginUser", "结果${response.string()}")
21 | open_web_view.setOnClickListener {
22 | GActivityCenter.WebViewActivity().url("http://baidu.com").start(this)
23 | }
24 | val userService = GComponentCenter.UserServiceImpl()
25 | val user = userService.getUser(1)
26 | Log.e("getUser", "结果${JSON.toJSONString(user)}")
27 |
28 | val accountService = GComponentCenter.AccountServiceImpl()
29 | val loginUser: User? = accountService.getLoginUser()
30 | Log.e("loginUser", "结果${JSON.toJSONString(loginUser)}")
31 |
32 | GRouter.getInstance().getComponent("userService",UserService::class.java)
33 |
34 | GRouter.getInstance().taskBuilder("grouter://task/getUser?uid=1").execute().value(User::class.java)
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/java/com/t/example_shell_webview/MockWebViewApplication.kt:
--------------------------------------------------------------------------------
1 | package com.t.example_shell_webview
2 |
3 | import com.grouter.GRouter
4 |
5 | class MockWebViewApplication : MockBaseApplication() {
6 | override fun onCreate() {
7 | GRouter.getInstance().addInterceptor(DebugMockInterceptor())
8 | super.onCreate()
9 | }
10 | }
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
18 |
19 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-webview/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-webview/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-webview/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-webview/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-webview/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-webview/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-webview/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-webview/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-webview/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app-shell/shell-webview/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #008577
4 | #00574B
5 | #D81B60
6 |
7 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | MockApplication
3 |
4 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/example/app-shell/shell-webview/src/test/java/com/t/example_shell_webview/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.t.example_shell_webview
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/example/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/example/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | apply plugin: 'kotlin-android'
3 | apply plugin: 'kotlin-android-extensions'
4 | apply plugin: 'kotlin-kapt'
5 | apply plugin: 'grouter'
6 |
7 | android {
8 | compileSdkVersion 30
9 | buildToolsVersion '28.0.3'
10 |
11 | defaultConfig {
12 | applicationId "com.grouter.demo"
13 | minSdkVersion 14
14 | targetSdkVersion 30
15 | versionCode 1
16 | versionName "1.0"
17 |
18 | javaCompileOptions {
19 | annotationProcessorOptions {
20 | includeCompileClasspath false
21 | }
22 | }
23 |
24 | // javaCompileOptions {
25 | // annotationProcessorOptions {
26 | // arguments = [
27 | // targetModuleName : project.name,
28 | // RouterHelperLocation : rootDir.getAbsolutePath()+"/build/router"
29 | // ]
30 | // }
31 | // }
32 | }
33 | buildTypes {
34 | release {
35 | minifyEnabled false
36 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
37 | }
38 | debug {
39 | minifyEnabled false
40 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
41 | }
42 | }
43 | compileOptions {
44 | sourceCompatibility 1.8
45 | targetCompatibility 1.8
46 | }
47 | }
48 |
49 | dependencies {
50 | implementation fileTree(include: ['*.jar'], dir: 'libs')
51 | implementation 'androidx.appcompat:appcompat:1.3.1'
52 | implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
53 | implementation 'com.google.android.material:material:1.4.0'
54 | testImplementation 'junit:junit:4.12'
55 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.41"
56 | implementation project(':example:waimai')
57 | implementation project(':example:base')
58 | implementation project(':example:travel')
59 | implementation project(':example:webview')
60 | implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
61 | implementation 'com.alibaba:fastjson:1.1.45.android'
62 | implementation 'com.google.code.gson:gson:2.8.6'
63 |
64 | kapt project(':grouter-compiler')
65 | }
66 |
--------------------------------------------------------------------------------
/example/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/Wiki/Documents/Tools/android-sdk-macosx/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
19 | # 避免GRouterInitializer类名被混淆
20 | -keep class com.grouter.GRouterInitializer
21 | # 避免带有@RouterField的字段名称被混淆
22 | -keepclasseswithmembers class * {
23 | @com.grouter.RouterField ;
24 | }
25 | # 避免带有@RouterDelegateMethod的方法被混淆
26 | -keepclasseswithmembers class * {
27 | @com.grouter.RouterDelegateMethod ;
28 | }
29 | # 避免带有@RouterDelegateConstructor的构造方法被混淆
30 | -keepclasseswithmembers class * {
31 | @com.grouter.RouterDelegateConstructor (...);
32 | }
33 | # 避免带有@RouterComponentConstructor的构造方法被混淆
34 | -keepclasseswithmembers class * {
35 | @com.grouter.RouterComponentConstructor (...);
36 | }
37 | -keep @com.grouter.RouterComponent class *
38 | -keep @com.grouter.RouterDelegate class *
39 | -keep @com.grouter.RouterInterceptor class *
40 | -keep @com.grouter.RouterTask class *
41 | -keep @com.grouter.RouterActivity class *
42 |
43 |
44 |
45 |
46 |
47 | #-keep
48 | #-keepnames
49 | #-keepattributes
50 | #-keepclasseswithmembernames
51 | #-keepclasseswithmembers
52 | #-keepclassmembers
53 | #-keeppackagenames
54 | #-keepparameternames
55 | #-whyareyoukeeping
--------------------------------------------------------------------------------
/example/app/src/debug/AndroidManifest.xml2:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/example/app/src/debug/java/mock/DebugMockIntercepter.kt:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import android.content.Context
4 | import com.grouter.GRouterInterceptor
5 | import com.grouter.GRouterTask
6 | import com.grouter.RouterInterceptor
7 | import com.grouter.TaskRequest
8 | import com.grouter.demo.base.model.User
9 | import com.grouter.demo.other.service.GetUserTask
10 | import java.lang.Exception
11 |
12 | class DebugMockIntercepter : GRouterInterceptor() {
13 |
14 | override fun process(request: TaskRequest): Boolean {
15 | if (request.taskClass == GetUserTask::class.java.name) {
16 | val uid = request.params["uid"].toString().toInt()
17 | request.onContinueResult(User(uid, "MockUser"))
18 | return true
19 | }
20 | if (request.path == "getLoginUser") {
21 | request.onContinueResult(User(123,"202cb962ac59075b964b07152d234b70"))
22 | return true
23 | }
24 | return super.process(request)
25 | }
26 |
27 | override fun onError(request: TaskRequest, exception: Exception): Boolean {
28 | if (request.path == "getLoginUser") {
29 | request.onContinueResult(User(123,"202cb962ac59075b964b07152d234b70"))
30 | return true
31 | }
32 | return super.onError(request, exception)
33 | }
34 | }
--------------------------------------------------------------------------------
/example/app/src/debug/java/mock/MockBaseApplication.kt:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import android.app.Application
4 | import com.alibaba.fastjson.JSON
5 | import com.grouter.GRouter
6 | import com.grouter.demo.BuildConfig
7 |
8 | open class MockBaseApplication:Application() {
9 | override fun onCreate() {
10 | super.onCreate()
11 | GRouter.setSerialization(object : GRouter.Serialization {
12 | override fun serialize(any: Any): String {
13 | return JSON.toJSONString(any)
14 | }
15 |
16 | override fun deserializeObject(json: String, clazz: Class): T? {
17 | return JSON.parseObject(json, clazz)
18 | }
19 |
20 | override fun deserializeList(json: String, clazz: Class): List? {
21 | return JSON.parseArray(json, clazz)
22 | }
23 | })
24 | GRouter.getInstance().init(this, BuildConfig.BUILD_TYPE, null)
25 |
26 | // TODO GSON解析
27 |
28 | // GRouter.getInstance().openAppCheck();
29 |
30 | // GRouter.getInstance().registerMultiProject(new MainProjectGRouterInitializer());
31 |
32 | GRouter.getInstance().init(this, BuildConfig.BUILD_TYPE, null)
33 | }
34 | }
--------------------------------------------------------------------------------
/example/app/src/debug/java/mock/MockWebViewApplication.kt:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import android.app.Application
4 | import com.alibaba.fastjson.JSON
5 | import com.grouter.GRouter
6 | import com.grouter.demo.BuildConfig
7 |
8 | class MockWebViewApplication : MockBaseApplication() {
9 | override fun onCreate() {
10 | super.onCreate()
11 | GRouter.getInstance().addInterceptor(DebugMockIntercepter())
12 | }
13 | }
--------------------------------------------------------------------------------
/example/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/AppRouterInterceptor.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo
2 |
3 | import com.grouter.*
4 | import com.grouter.demo.activity.LoginActivity
5 |
6 | import java.lang.Exception
7 |
8 | @Suppress("unused")
9 | @RouterInterceptor
10 | class AppRouterInterceptor : GRouterInterceptor() {
11 | override fun process(request: ActivityRequest): Boolean {
12 | // 修改跳转的目标Activity
13 | // request.onContinue(Activity::class.java)
14 | // 拦截中断访问
15 | // request.onInterrupt(Exception("无权访问"))
16 | request.data
17 | request.extras
18 | request.activityClass
19 | request.context
20 | request.requestCode
21 | request.intent
22 | // request.onContinue(LoginActivity::class.java)
23 |
24 | return super.process(request)
25 | }
26 |
27 |
28 |
29 | override fun process(request: TaskRequest): Boolean {
30 | // request.onContinue(null)
31 | // request.onInterrupt(Exception("无权访问"))
32 | request.taskClass
33 | request.uri
34 | request.params
35 | return super.process(request)
36 | }
37 |
38 | override fun process(request: ComponentRequest): Boolean {
39 | request.protocol
40 | return super.process(request)
41 | }
42 |
43 | override fun onError(request: ActivityRequest, exception: Exception): Boolean {
44 | // 修改跳转的目标Activity
45 | // request.onContinue(Activity::class.java)
46 | // 拦截中断访问
47 | // request.onInterrupt(Exception("无权访问"))
48 | request.data
49 | request.extras
50 | request.activityClass
51 | request.context
52 | request.requestCode
53 | request.intent
54 | return super.onError(request, exception)
55 | }
56 |
57 | override fun onError(request: TaskRequest, exception: Exception): Boolean {
58 | // request.onContinue(null)
59 | // request.onInterrupt(Exception("无权访问"))
60 | request.taskClass
61 | request.uri
62 | request.params
63 | return super.onError(request, exception)
64 | }
65 |
66 | override fun onError(request: ComponentRequest, exception: Exception): Boolean {
67 | exception.printStackTrace()
68 | return super.onError(request, exception)
69 | }
70 |
71 | }
72 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/BaseActivity.java:
--------------------------------------------------------------------------------
1 | //package com.grouter.demo;
2 | //
3 | //import android.content.Intent;
4 | //import android.os.Bundle;
5 | //import androidx.appcompat.app.AppCompatActivity;
6 | //
7 | //import com.grouter.RouterField;
8 | //
9 | ///**
10 | // * Created by Wiki on 19/7/30.
11 | // */
12 | //public class BaseActivity extends AppCompatActivity {
13 | // @RouterField("formActivity")
14 | // protected String formActivity;
15 | //
16 | //
17 | // @Override
18 | // public void startForResult(Intent intent, int requestCode, Bundle options) {
19 | // intent.putExtra("formActivity", getClass().getName());
20 | // super.startForResult(intent, requestCode, options);
21 | // }
22 | //}
23 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/LoginRouterInterceptor.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo
2 |
3 | import android.content.Context
4 | import android.widget.Toast
5 | import com.grouter.*
6 | import com.grouter.demo.activity.LoginActivity
7 |
8 | import com.grouter.demo.activity.UserActivity
9 | import com.grouter.demo.base.model.User
10 | import com.grouter.demo.webview.activity.WebViewActivity
11 | import java.lang.Exception
12 |
13 | import java.util.HashSet
14 |
15 | @Suppress("unused")
16 | @RouterInterceptor
17 | class LoginRouterInterceptor : GRouterInterceptor() {
18 | /**
19 | * 没有登录状态下可以访问的页面
20 | */
21 | private val visitorAccess = listOf(
22 | UserActivity::class.java.name,
23 | MainActivity::class.java.name,
24 | WebViewActivity::class.java.name,
25 | LoginActivity::class.java.name
26 | )
27 | private var loginUser: User? = null
28 |
29 | override fun init(context: Context, buildType: String?, params: MutableMap?) {
30 | super.init(context, buildType, params)
31 | loginUser = params?.get("loginUser") as User?
32 | }
33 |
34 | override fun process(request: ActivityRequest): Boolean {
35 | // if (loginUser == null && !visitorAccess.contains(request.activityClass)) {
36 | // Toast.makeText(request.context, "请登录", Toast.LENGTH_SHORT).show()
37 | // request.onContinue(LoginActivity::class.java)
38 | // GActivityCenter.LoginActivity().start(request.context)
39 | // request.onInterrupt(Exception("无访问权限"))
40 | // return true
41 | // }
42 | return super.process(request)
43 | }
44 |
45 | override fun onError(request: ActivityRequest, exception: Exception): Boolean {
46 | exception.printStackTrace()
47 | Toast.makeText(request.context, "访问出错:$exception.message", Toast.LENGTH_SHORT).show()
48 | // GActivityCenter.ErrorActivity().start(request.context)
49 | return super.onError(request, exception)
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/_GRouter.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo
2 |
3 | import com.grouter.GActivityBuilder
4 | import com.grouter.GRouter
5 | import io.reactivex.Observable
6 |
7 |
8 | fun GActivityBuilder.result(): Observable {
9 | return Observable.just(null)
10 | }
11 |
12 | fun GRouter.resultOnFinish(any: Any){
13 |
14 | }
15 |
16 | fun GRouter.result(any: Any){
17 |
18 | }
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/AboutUsActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.GRouter;
8 | import com.grouter.RouterActivity;
9 |
10 | @RouterActivity(value = "settings/about_us,about_us",exported = false)
11 | public class AboutUsActivity extends AppCompatActivity {
12 | @Override
13 | protected void onCreate(@Nullable Bundle savedInstanceState) {
14 | super.onCreate(savedInstanceState);
15 | GRouter.inject(this);
16 | setTitle(getClass().getSimpleName());
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/CinemaActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.GActivityCenter;
8 | import com.grouter.GRouter;
9 | import com.grouter.RouterActivity;
10 | import com.grouter.RouterField;
11 |
12 | @RouterActivity("cinema")
13 | public class CinemaActivity extends AppCompatActivity {
14 | @RouterField
15 | public String cinemaId;
16 | @Override
17 | protected void onCreate(@Nullable Bundle savedInstanceState) {
18 | super.onCreate(savedInstanceState);
19 | GRouter.inject(this);
20 | setTitle(getClass().getSimpleName());
21 | GActivityCenter.CinemaActivity();
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/CinemaDetailActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.GRouter;
8 | import com.grouter.RouterActivity;
9 | import com.grouter.RouterField;
10 |
11 | @RouterActivity("cinema/detail")
12 | public class CinemaDetailActivity extends AppCompatActivity {
13 | @RouterField
14 | public String cinemaId;
15 | @Override
16 | protected void onCreate(@Nullable Bundle savedInstanceState) {
17 | super.onCreate(savedInstanceState);
18 | GRouter.inject(this);
19 | setTitle(getClass().getSimpleName());
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/LoginActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.GRouter;
8 | import com.grouter.RouterActivity;
9 |
10 | @RouterActivity
11 | public class LoginActivity extends AppCompatActivity {
12 | @Override
13 | protected void onCreate(@Nullable Bundle savedInstanceState) {
14 | super.onCreate(savedInstanceState);
15 | GRouter.inject(this);
16 | setTitle(getClass().getSimpleName());
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/MomentActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.GRouter;
8 | import com.grouter.RouterActivity;
9 | import com.grouter.RouterField;
10 |
11 | @RouterActivity("moment")
12 | public class MomentActivity extends AppCompatActivity {
13 | @RouterField
14 | public String mid;
15 | @Override
16 | protected void onCreate(@Nullable Bundle savedInstanceState) {
17 | super.onCreate(savedInstanceState);
18 | GRouter.inject(this);
19 | setTitle(getClass().getSimpleName());
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/MomentListActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.GRouter;
8 | import com.grouter.RouterActivity;
9 | import com.grouter.RouterField;
10 |
11 | @RouterActivity("moment/list")
12 | public class MomentListActivity extends AppCompatActivity {
13 | @RouterField
14 | public String mid;
15 | @Override
16 | protected void onCreate(@Nullable Bundle savedInstanceState) {
17 | super.onCreate(savedInstanceState);
18 | GRouter.inject(this);
19 | setTitle(getClass().getSimpleName());
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/MovieActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.GRouter;
8 | import com.grouter.RouterActivity;
9 | import com.grouter.RouterField;
10 |
11 | @RouterActivity("movie")
12 | public class MovieActivity extends AppCompatActivity {
13 | @RouterField
14 | public String movieId;
15 | @Override
16 | protected void onCreate(@Nullable Bundle savedInstanceState) {
17 | super.onCreate(savedInstanceState);
18 | GRouter.inject(this);
19 | setTitle(getClass().getSimpleName());
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/MoviePhotoActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.GRouter;
8 | import com.grouter.RouterActivity;
9 | import com.grouter.RouterField;
10 |
11 | @RouterActivity("movie/photo")
12 | public class MoviePhotoActivity extends AppCompatActivity {
13 | @RouterField
14 | public String movieId;
15 | @Override
16 | protected void onCreate(@Nullable Bundle savedInstanceState) {
17 | super.onCreate(savedInstanceState);
18 | GRouter.inject(this);
19 | setTitle(getClass().getSimpleName());
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/MovieWorkerActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.GRouter;
8 | import com.grouter.RouterActivity;
9 | import com.grouter.RouterField;
10 |
11 | @RouterActivity("movie/worker")
12 | public class MovieWorkerActivity extends AppCompatActivity {
13 | @RouterField
14 | public String movieId;
15 | @Override
16 | protected void onCreate(@Nullable Bundle savedInstanceState) {
17 | super.onCreate(savedInstanceState);
18 | GRouter.inject(this);
19 | setTitle(getClass().getSimpleName());
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/NetworkPingActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.GRouter;
8 | import com.grouter.RouterActivity;
9 |
10 | @RouterActivity("settings/network/ping")
11 | public class NetworkPingActivity extends AppCompatActivity {
12 | @Override
13 | protected void onCreate(@Nullable Bundle savedInstanceState) {
14 | super.onCreate(savedInstanceState);
15 | GRouter.inject(this);
16 | setTitle(getClass().getSimpleName());
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/OverridePendingTransitionActivity.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity
2 |
3 | import android.os.Bundle
4 | import androidx.appcompat.app.AppCompatActivity
5 | import android.view.View
6 | import android.widget.AdapterView
7 |
8 | import com.grouter.RouterActivity
9 | import com.grouter.demo.R
10 | import android.widget.ArrayAdapter
11 | import com.grouter.GActivityCenter
12 | import kotlinx.android.synthetic.main.activity_override_pending_transition.*
13 |
14 |
15 | @RouterActivity
16 | class OverridePendingTransitionActivity : AppCompatActivity(), AdapterView.OnItemClickListener {
17 |
18 |
19 | override fun onCreate(savedInstanceState: Bundle?) {
20 | super.onCreate(savedInstanceState)
21 | setContentView(R.layout.activity_override_pending_transition)
22 | title = javaClass.simpleName
23 | val data = arrayOf("从右进入", "从左进入", "顶部进入", "底部进入", "淡入")
24 | val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, data)
25 | list_view.adapter = adapter
26 | list_view.onItemClickListener = this
27 | }
28 |
29 | override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
30 | val builder = GActivityCenter.OverridePendingTransitionTargetActivity()
31 | when (position) {
32 | 0 -> builder.transitionRightIn()
33 | 1 -> builder.transitionLeftIn()
34 | 2 -> builder.transitionTopIn()
35 | 3 -> builder.transitionBottomIn()
36 | 4 -> builder.transitionFadeIn()
37 | }
38 | builder.start(this)
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/OverridePendingTransitionTargetActivity.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity
2 |
3 | import android.os.Bundle
4 | import androidx.appcompat.app.AppCompatActivity
5 | import android.view.View
6 | import android.view.animation.AccelerateDecelerateInterpolator
7 | import android.widget.AdapterView
8 | import android.widget.ArrayAdapter
9 | import android.widget.ProgressBar
10 | import com.grouter.GActivityBuilder
11 | import com.grouter.GActivityCenter
12 | import com.grouter.GActivityUtils
13 |
14 | import com.grouter.RouterActivity
15 | import com.grouter.demo.R
16 | import kotlinx.android.synthetic.main.activity_override_pending_transition.*
17 |
18 | @RouterActivity
19 | class OverridePendingTransitionTargetActivity : AppCompatActivity(), AdapterView.OnItemClickListener {
20 |
21 | override fun onCreate(savedInstanceState: Bundle?) {
22 | setTheme(R.style.ThemeOverlay_AppCompat_Dark)
23 | super.onCreate(savedInstanceState)
24 | setContentView(R.layout.activity_override_pending_transition_target)
25 | title = javaClass.simpleName
26 | val data = arrayOf("从右离开", "从左离开", "顶部离开", "底部离开", "淡出")
27 | val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, data)
28 | list_view.adapter = adapter
29 | list_view.onItemClickListener = this
30 |
31 | }
32 |
33 | override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
34 | when (position) {
35 | 0 -> GActivityUtils.finishTransitionRightOut(this)
36 | 1 -> GActivityUtils.finishTransitionLeftOut(this)
37 | 2 -> GActivityUtils.finishTransitionTopOut(this)
38 | 3 -> GActivityUtils.finishTransitionBottomOut(this)
39 | 4 -> GActivityUtils.finishTransitionFadeOut(this)
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/SettingsActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.Nullable;
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.GRouter;
8 | import com.grouter.RouterActivity;
9 | import com.grouter.demo.R;
10 |
11 | @RouterActivity(value = "settings",exported = false)
12 | public class SettingsActivity extends AppCompatActivity {
13 | @Override
14 | protected void onCreate(@Nullable Bundle savedInstanceState) {
15 | super.onCreate(savedInstanceState);
16 | GRouter.inject(this);
17 | setTitle(getClass().getSimpleName());
18 | }
19 |
20 | @Override
21 | public void finish() {
22 | super.finish();
23 | overridePendingTransition(R.anim.abc_fade_in, R.anim.abc_fade_out);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/activity/UserActivity.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.activity
2 |
3 | import android.os.Bundle
4 | import androidx.appcompat.app.AppCompatActivity
5 | import android.util.Log
6 | import android.widget.Toast
7 | import com.alibaba.fastjson.JSON
8 | import com.grouter.GRouter
9 | import com.grouter.RouterActivity
10 | import com.grouter.RouterField
11 | import com.grouter.demo.base.model.User
12 |
13 | @RouterActivity("user", name = "用户信息页", description = "展示用户信息")
14 | class UserActivity : AppCompatActivity() {
15 | @RouterField
16 | var uid: Int? = null
17 | @RouterField
18 | var name: String? = null
19 | @RouterField
20 | var user: User? = null
21 | @RouterField
22 | var users: List? = null
23 | @RouterField
24 | var uidArray: IntArray? = null
25 |
26 |
27 | override fun onCreate(savedInstanceState: Bundle?) {
28 | super.onCreate(savedInstanceState)
29 | // val time = System.currentTimeMillis()
30 | GRouter.inject(this)
31 | // Log.e("注入耗时", (System.currentTimeMillis() - time).toString())
32 | Log.e("uid", uid.toString())
33 | title = javaClass.simpleName
34 | user?.let { user ->
35 | Toast.makeText(this, "传递对象 User(uid:${user.uid},name:${user.name})", Toast.LENGTH_SHORT).show()
36 | }
37 | users?.let { users ->
38 | Toast.makeText(this, "传递List" + JSON.toJSONString(users), Toast.LENGTH_SHORT).show()
39 | }
40 | uidArray?.let { uidArray ->
41 | Toast.makeText(this, "传递数组" + JSON.toJSONString(uidArray), Toast.LENGTH_SHORT).show()
42 | }
43 | if (name != null) {
44 | Toast.makeText(this, "uid:$uid,name:$name", Toast.LENGTH_SHORT).show()
45 | }
46 | // ActivityUtils.getResult(this).value = User()
47 | // ActivityUtils.getResult(this).params["User"] = User()
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/component/ComponentTestActivity.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.component
2 |
3 | import android.os.Bundle
4 | import androidx.appcompat.app.AppCompatActivity;
5 | import com.grouter.GComponentCenter
6 | import com.grouter.GRouter
7 | import com.grouter.GTaskCenter
8 | import com.grouter.demo.R
9 | import com.grouter.demo.base.service.UserService
10 |
11 | import kotlinx.android.synthetic.main.activity_component_test.*
12 |
13 | class ComponentTestActivity : AppCompatActivity() {
14 |
15 | override fun onCreate(savedInstanceState: Bundle?) {
16 | super.onCreate(savedInstanceState)
17 | setContentView(R.layout.activity_component_test)
18 | setSupportActionBar(toolbar)
19 |
20 | fab.setOnClickListener {
21 | val userService = GComponentCenter.UserServiceImpl(this)
22 | GComponentCenter.FeedServiceImpl()
23 | // GComponentCenter.getFeedService(this)
24 | userService.sayHello()
25 | val feedService = GComponentCenter.FeedServiceImpl()
26 | // feedService.listUser()
27 | }
28 | // val userService1 = GRouter.getInstance().getComponent("base/user",UserService::class.java)
29 | // val userService2 = GRouter.getInstance().getComponent(UserService::class.java)
30 | val userService = GComponentCenter.UserServiceImpl()
31 | GComponentCenter.UserFragment()
32 | // val map = GTaskCenter.UserLoginTask().execute().map()
33 | // map["uid"]
34 |
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/delegate/MomentViewModel.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.delegate
2 |
3 | import android.content.Context
4 | import com.grouter.RouterDelegate
5 | import com.grouter.RouterDelegateConstructor
6 | import com.grouter.RouterDelegateMethod
7 | import com.grouter.demo.base.model.Moment
8 | import java.util.*
9 |
10 | @RouterDelegate
11 | class MomentViewModel {
12 | private var context: Context
13 |
14 | @RouterDelegateConstructor
15 | constructor(context: Context) {
16 | this.context = context
17 | }
18 |
19 | @RouterDelegateMethod
20 | fun getMoment(uid: Int): Moment {
21 | return Moment()
22 | }
23 |
24 | @RouterDelegateMethod
25 | fun listMoment(ids: IntArray): List {
26 | return ArrayList()
27 | }
28 |
29 | @RouterDelegateMethod
30 | fun listMoment2(ids: IntArray): Vector? {
31 | return null
32 | }
33 |
34 |
35 | @RouterDelegateMethod
36 | fun delete(moment: Moment) {
37 |
38 | }
39 |
40 |
41 |
42 |
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/delegate/UserViewModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.delegate;
2 |
3 | import android.content.Context;
4 |
5 | import com.alibaba.fastjson.JSON;
6 | import com.grouter.RouterDelegate;
7 | import com.grouter.RouterDelegateConstructor;
8 | import com.grouter.RouterDelegateMethod;
9 | import com.grouter.demo.base.model.User;
10 |
11 | import java.util.ArrayList;
12 | import java.util.List;
13 | import java.util.Map;
14 | import java.util.Vector;
15 |
16 | @RouterDelegate
17 | public class UserViewModel {
18 |
19 | private Context context;
20 |
21 | // @RouterDelegateConstructor
22 | public UserViewModel() {
23 |
24 | }
25 | public UserViewModel(Context context) {
26 | this.context = context;
27 | }
28 |
29 | // @RouterDelegateConstructor
30 | public UserViewModel(Context context, Map map) {
31 | this.context = context;
32 | }
33 |
34 | public UserViewModel(Context context, int age) {
35 | this.context = context;
36 | }
37 |
38 |
39 |
40 |
41 | @RouterDelegateMethod
42 | public User getUser(int uid) {
43 | User user = new User();
44 | user.setUid(uid);
45 | return user;
46 | }
47 |
48 | @RouterDelegateMethod
49 | public User getUser(String name) {
50 | return new User(name);
51 | }
52 |
53 |
54 | @RouterDelegateMethod
55 | public List listUser(int[] uids) {
56 | List users = new ArrayList<>();
57 | for (int uid : uids) {
58 | User user = new User();
59 | user.setUid(uid);
60 | users.add(user);
61 | }
62 | return users;
63 | }
64 | // @RouterDelegateMethod
65 | public Vector listUser2(int[] uids) {
66 |
67 | return null;
68 | }
69 |
70 | @RouterDelegateMethod
71 | public void delete(User user,StringBuilder stringBuilder) {
72 | System.out.println("删除成功-" + JSON.toJSONString(user));
73 | }
74 |
75 |
76 |
77 |
78 |
79 | }
80 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/kotlin/Crew.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.kotlin
2 |
3 | private object Crew {
4 | var uid:Int = 0
5 | }
6 |
7 |
8 | data class Good(val name:String,var age:Int){
9 | var ggg:String? = null
10 | }
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/service/FeedServiceImpl.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.service
2 |
3 | import android.app.Activity
4 | import android.content.Context
5 |
6 | import com.grouter.RouterComponent
7 | import com.grouter.RouterComponentConstructor
8 | import com.grouter.demo.base.service.FeedService
9 | import com.grouter.demo.base.model.User
10 |
11 | @RouterComponent(protocol = FeedService::class,name = "动态服务", description = "本地缓存和网络请求")
12 | class FeedServiceImpl @RouterComponentConstructor constructor() : FeedService {
13 | private var context: Context? = null
14 | @RouterComponentConstructor
15 | constructor(context: Context, uid: Int, sums: IntArray) : this() {
16 | this.context = context
17 | }
18 |
19 | @RouterComponentConstructor
20 | constructor(activity: Activity?) : this() {
21 | this.context = activity
22 | }
23 |
24 | override fun getUser(uid: Int): User {
25 | return User("Wiki")
26 | }
27 |
28 | override fun listUser(): List {
29 | return listOf(User("Wiki"))
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/example/app/src/main/java/com/grouter/demo/service/UserListTask.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.service;
2 |
3 | import android.app.Activity;
4 | import android.app.Application;
5 | import android.content.Context;
6 |
7 | import com.grouter.GRouterTask;
8 | import com.grouter.RouterField;
9 | import com.grouter.RouterTask;
10 | import com.grouter.demo.base.model.User;
11 |
12 | import java.util.List;
13 | import java.util.Map;
14 |
15 | @RouterTask(value = "UserList", returns = "List")
16 | public class UserListTask extends GRouterTask {
17 |
18 | @RouterField
19 | public String name;
20 | @RouterField
21 | public Context context;
22 | @RouterField
23 | public Activity activity;
24 | @RouterField
25 | public Application application;
26 |
27 |
28 | @Override
29 | public Object process() throws Exception {
30 | return null;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/example/app/src/main/res/layout/activity_component_test.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
13 |
14 |
20 |
21 |
22 |
23 |
24 |
25 |
32 |
33 |
--------------------------------------------------------------------------------
/example/app/src/main/res/layout/activity_override_pending_transition.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/example/app/src/main/res/layout/activity_override_pending_transition_target.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/example/app/src/main/res/layout/activity_second.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
15 |
16 |
--------------------------------------------------------------------------------
/example/app/src/main/res/layout/activity_test1.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/example/app/src/main/res/layout/activity_test2.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
--------------------------------------------------------------------------------
/example/app/src/main/res/layout/activity_third.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
15 |
16 |
--------------------------------------------------------------------------------
/example/app/src/main/res/layout/content_component_test.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
--------------------------------------------------------------------------------
/example/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/example/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/example/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/example/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 | 16dp
6 |
7 |
--------------------------------------------------------------------------------
/example/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | ActivityRouter
3 | ComponentTestActivity
4 |
5 |
--------------------------------------------------------------------------------
/example/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/example/app/src/test/java/com/grouter/demo/UserTest.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo
2 |
3 | import com.alibaba.fastjson.JSON
4 | import com.google.gson.Gson
5 | import com.google.gson.reflect.TypeToken
6 | import com.grouter.GRouter
7 |
8 | import org.junit.Test
9 |
10 | class UserTest {
11 |
12 | @Test
13 | fun a() {
14 | val text = "[\"abc\", \"def\", \"ghi\"]"
15 | GRouter.setSerialization(object : GRouter.Serialization{
16 | var gson = Gson()
17 | override fun serialize(any: Any?): String {
18 | return gson.toJson(any)
19 | }
20 |
21 | override fun deserializeObject(json: String?, clazz: Class?): T {
22 | return gson.fromJson(json,clazz)
23 | }
24 |
25 | override fun deserializeList(json: String?, clazz: Class?): MutableList {
26 | return gson.fromJson(json, TypeToken.getParameterized(List::class.java,clazz).type)
27 | }
28 | })
29 |
30 | val result = GRouter.serialization.deserializeList(text,String::class.java)
31 | println(JSON.toJSONString(result))
32 | }
33 | }
34 | //GRouter.setSerialization(object : GRouter.Serialization{
35 | // var gson = Gson()
36 | // override fun serialize(any: Any?): String {
37 | // return gson.toJson(any)
38 | // }
39 | //
40 | // override fun deserializeObject(json: String?, clazz: Class?): T {
41 | // return gson.fromJson(json,clazz)
42 | // }
43 | //
44 | // override fun deserializeList(json: String?, clazz: Class?): MutableList {
45 | // return gson.fromJson(json, TypeToken.getParameterized(List::class.java,clazz).type)
46 | // }
47 | //})
--------------------------------------------------------------------------------
/example/app/src/test/java/com/grouter/demo/delegate/UserViewModelTest.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.delegate;
2 |
3 | import com.alibaba.fastjson.JSON;
4 | import com.grouter.GDelegateCenter;
5 |
6 | import org.junit.Test;
7 |
8 | public class UserViewModelTest {
9 | GDelegateCenter.UserViewModelDelegate userViewModelDelegate;
10 |
11 | {
12 | try {
13 | userViewModelDelegate = GDelegateCenter.UserViewModel();
14 | } catch (Exception e) {
15 | e.printStackTrace();
16 | }
17 | }
18 |
19 | @Test
20 | public void getUser() throws Exception {
21 | System.out.println(JSON.toJSONString(userViewModelDelegate.getUser(1),true));
22 | }
23 |
24 | @Test
25 | public void getUser1() throws Exception {
26 | System.out.println(JSON.toJSONString(userViewModelDelegate.getUser("Wiki"),true));
27 | }
28 |
29 | @Test
30 | public void listUser() throws Exception {
31 | System.out.println(JSON.toJSONString(userViewModelDelegate.listUser(new int[]{1,2,3,4}),true));
32 | }
33 |
34 | @Test
35 | public void delete() {
36 | // userViewModelDelegate.delete(new User());
37 | }
38 | }
--------------------------------------------------------------------------------
/example/app/src/test/java/com/grouter/demo/service/AccountServiceTest.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.service;
2 |
3 |
4 | import org.junit.Test;
5 |
6 | public class AccountServiceTest {
7 |
8 | @Test
9 | public void login() {
10 | // AccountService accountService = new AccountService();
11 | //// AccountServiceDelegate accountServiceDelegate = new AccountServiceDelegate();
12 | // long start = System.currentTimeMillis();
13 | // for (int i = 0; i < 100000; i++) {
14 | // User user = accountService.login("1","2");
15 | // }
16 | // System.out.println(System.currentTimeMillis() - start);
17 | //
18 |
19 |
20 | }
21 | }
--------------------------------------------------------------------------------
/example/base/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/example/base/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'kotlin-android'
3 | apply plugin: 'kotlin-android-extensions'
4 | apply plugin: 'grouter'
5 | apply plugin: 'kotlin-kapt'
6 |
7 | android {
8 | compileSdkVersion 30
9 |
10 |
11 | defaultConfig {
12 | minSdkVersion 14
13 | targetSdkVersion 30
14 | versionCode 1
15 | versionName "1.0"
16 |
17 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
18 |
19 | }
20 |
21 | buildTypes {
22 | release {
23 | minifyEnabled false
24 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
25 | }
26 | }
27 | compileOptions {
28 | sourceCompatibility 1.8
29 | targetCompatibility 1.8
30 | }
31 | lintOptions {
32 | abortOnError false
33 | }
34 |
35 |
36 | sourceSets { main { java.srcDirs = ['src/main/java', 'src/main/router'] } }
37 | }
38 |
39 | dependencies {
40 | implementation fileTree(dir: 'libs', include: ['*.jar'])
41 |
42 | implementation 'androidx.appcompat:appcompat:1.0.0'
43 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
44 | implementation 'com.google.android.material:material:1.0.0'
45 | testImplementation 'junit:junit:4.12'
46 | androidTestImplementation 'androidx.test.ext:junit:1.1.1'
47 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
48 | implementation 'com.alibaba:fastjson:1.1.45.android'
49 |
50 | api project(':grouter')
51 | api project(':grouter-annotation')
52 |
53 | kapt project(':grouter-compiler')
54 | }
55 | //def task1 = tasks.create("task1").doLast {
56 | // println("task1")
57 | //}
58 | //def task2 = tasks.create("task2").doFirst {
59 | // println("task2")
60 | //}
61 | //
62 | //def task3 = tasks.create("task3").doFirst {
63 | // println("task3")
64 | //}
65 | //
66 | //task1.dependsOn task3
67 | //task2.dependsOn task3
68 |
--------------------------------------------------------------------------------
/example/base/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 |
--------------------------------------------------------------------------------
/example/base/src/androidTest/java/com/taoweiji/basemodule/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.taoweiji.basemodule;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.*;
11 |
12 | /**
13 | * Instrumented test, which will executeObject on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.taoweiji.basemodule.test", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/example/base/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/example/base/src/main/java/com/grouter/demo/Account2Service.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo
2 |
3 |
4 | import android.content.Context
5 |
6 | import com.grouter.RouterDelegate
7 | import com.grouter.RouterDelegateConstructor
8 | import com.grouter.RouterDelegateMethod
9 | import com.grouter.demo.base.model.User
10 |
11 | @RouterDelegate
12 | class Account2Service {
13 | // private MyApplication application;
14 | private var context: Context? = null
15 |
16 | @RouterDelegateConstructor
17 | constructor() {
18 | }
19 |
20 | @RouterDelegateConstructor
21 | constructor(context: Context, uid: Int, uids: IntArray, userMap: Map, users: List, user: User, names: Array) {
22 | this.context = context
23 | }
24 |
25 | @RouterDelegateConstructor
26 | constructor(stringBuilder: StringBuilder) {
27 |
28 | }
29 |
30 |
31 | @RouterDelegateMethod
32 | fun login(uid: String, pwd: String): User {
33 | return User("Wiki")
34 | }
35 |
36 | @RouterDelegateMethod
37 | fun logout(context: Context, map: Map, users: List, a: IntArray, dad: Int) {
38 |
39 | }
40 |
41 | @RouterDelegateMethod
42 | fun showUser() {
43 |
44 | }
45 |
46 | @RouterDelegateMethod
47 | fun showUser2(): Int {
48 | return 0
49 | }
50 |
51 | @RouterDelegateMethod
52 | fun showUser3(): User? {
53 | return null
54 | }
55 |
56 |
57 | @RouterDelegateMethod
58 | fun showUser4(): IntArray? {
59 | return null
60 | }
61 |
62 |
63 | // @RouterDelegateMethod
64 | // public Account getAccount() {
65 | // return null;
66 | // }
67 | //
68 | // @RouterDelegateMethod
69 | // public void updateToken(Account account) {
70 | //
71 | // }
72 |
73 | }
74 |
--------------------------------------------------------------------------------
/example/base/src/main/java/com/grouter/demo/base/model/Moment.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.base.model
2 |
3 | class Moment {
4 | }
--------------------------------------------------------------------------------
/example/base/src/main/java/com/grouter/demo/base/model/User.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.base.model
2 |
3 | import java.io.Serializable
4 |
5 | /**
6 | * Created by Wiki on 19/7/30.
7 | */
8 | class User() : Serializable {
9 | var uid: Int? = null
10 | var name: String? = null
11 |
12 | constructor(name: String) : this() {
13 | this.name = name
14 | }
15 |
16 | constructor(uid: Int?, name: String?) : this() {
17 | this.uid = uid
18 | this.name = name
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/example/base/src/main/java/com/grouter/demo/base/service/AccountService.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.base.service
2 |
3 | import com.grouter.demo.base.model.User
4 |
5 | interface AccountService {
6 | fun sayHi()
7 | fun getUser(uid: Int): User?
8 | fun getLoginUser(): User?
9 | }
10 |
--------------------------------------------------------------------------------
/example/base/src/main/java/com/grouter/demo/base/service/FeedService.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.base.service
2 |
3 | import com.grouter.demo.base.model.User
4 |
5 | interface FeedService {
6 | fun getUser(uid: Int): User
7 | fun listUser(): List
8 | }
--------------------------------------------------------------------------------
/example/base/src/main/java/com/grouter/demo/base/service/UserService.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.base.service
2 |
3 | import com.grouter.demo.base.model.User
4 |
5 | interface UserService {
6 | fun getUser(uid: Int): User
7 | fun listUser(): List
8 | fun sayHello()
9 | }
--------------------------------------------------------------------------------
/example/base/src/main/java/com/grouter/demo/base/view/CrewActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.base.view;
2 |
3 | import android.os.Bundle;
4 |
5 | import androidx.appcompat.app.AppCompatActivity;
6 | import androidx.appcompat.widget.Toolbar;
7 |
8 | import com.google.android.material.floatingactionbutton.FloatingActionButton;
9 | import com.grouter.RouterActivity;
10 | import com.grouter.demo.base.R;
11 |
12 | @RouterActivity
13 | public class CrewActivity extends AppCompatActivity {
14 |
15 | @Override
16 | protected void onCreate(Bundle savedInstanceState) {
17 | super.onCreate(savedInstanceState);
18 | setContentView(R.layout.activity_crew);
19 | Toolbar toolbar = findViewById(R.id.toolbar);
20 | setSupportActionBar(toolbar);
21 |
22 | FloatingActionButton fab = findViewById(R.id.fab);
23 | fab.setOnClickListener(view -> {
24 | // GActivityCenter.ThirdActivity().uid(12).age(1).start(this);
25 | // GActivityCenter.SecondActivity().age(26).start(this);
26 | // GActivityCenter.KotlinActivity().start(this);
27 | // GActivityCenter.KotlinActivity().name("Wiki").start(this);
28 | });
29 | // GComponentCenter.getFeedServiceImpl();
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/example/base/src/main/java/com/grouter/demo/service/WaimaiService.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.service;
2 |
3 | public interface WaimaiService {
4 | }
5 |
--------------------------------------------------------------------------------
/example/base/src/main/res/layout/activity_crew.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
20 |
21 |
22 |
23 |
24 |
25 |
32 |
33 |
--------------------------------------------------------------------------------
/example/base/src/main/res/layout/content_crew.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
--------------------------------------------------------------------------------
/example/base/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 | 16dp
3 |
4 |
--------------------------------------------------------------------------------
/example/base/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | BaseModule
3 | CrewActivity
4 |
5 |
--------------------------------------------------------------------------------
/example/base/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/example/base/src/main/res/xml/network_security_config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/example/base/src/main/router/com/grouter/data/Router-travel.json:
--------------------------------------------------------------------------------
1 | {
2 | "activityModels":[
3 | {
4 | "description":"",
5 | "exported":true,
6 | "module":"",
7 | "name":"",
8 | "params":[],
9 | "path":"travel/home",
10 | "type":"com.grouter.example.travel.TravelHomeActivity"
11 | },
12 | {
13 | "description":"",
14 | "exported":true,
15 | "module":"",
16 | "name":"",
17 | "params":[],
18 | "path":"travel/map",
19 | "type":"com.grouter.example.travel.TravelMapActivity"
20 | },
21 | {
22 | "description":"",
23 | "exported":true,
24 | "module":"",
25 | "name":"",
26 | "params":[],
27 | "path":"travel/poi",
28 | "type":"com.grouter.example.travel.TravelPoiActivity"
29 | }
30 | ],
31 | "componentModels":[],
32 | "delegateModels":[],
33 | "interceptorModels":[],
34 | "taskModels":[]
35 | }
--------------------------------------------------------------------------------
/example/base/src/main/router/com/grouter/data/Router-webview.json:
--------------------------------------------------------------------------------
1 | {
2 | "activityModels":[
3 | {
4 | "description":"",
5 | "exported":true,
6 | "name":"",
7 | "params":[
8 | {
9 | "name":"url",
10 | "queryName":"",
11 | "rawType":"java.lang.String",
12 | "type":"java.lang.String"
13 | }
14 | ],
15 | "path":"/web_view",
16 | "type":"com.grouter.demo.webview.activity.WebViewActivity"
17 | }
18 | ],
19 | "componentModels":[],
20 | "delegateModels":[],
21 | "interceptorModels":[],
22 | "taskModels":[]
23 | }
--------------------------------------------------------------------------------
/example/base/src/test/java/com/taoweiji/basemodule/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.taoweiji.basemodule;
2 |
3 |
4 |
5 | import org.junit.Test;
6 |
7 |
8 |
9 |
10 | /**
11 | * Example local unit test, which will executeObject on the development machine (host).
12 | *
13 | * @see Testing documentation
14 | */
15 | public class ExampleUnitTest {
16 | @Test
17 | public void addition_isCorrect() {
18 | // ClassName GActivityBuilder = ClassName.get("router", "GActivityBuilder");
19 | // ClassName BuilderSet = ClassName.get("router", "BuilderSet");
20 |
21 | // TypeSpec.classBuilder("GActivityBuilder").addModifiers();
22 |
23 |
24 |
25 | // TypeSpec.Builder mainActivityBuilder = TypeSpec.classBuilder("MainActivity")
26 | // .addModifiers(Modifier.PUBLIC)
27 | // .superclass(activity);
28 |
29 | }
30 | }
--------------------------------------------------------------------------------
/example/example.gradle:
--------------------------------------------------------------------------------
1 | include ':example:app',
2 | ':example:travel',
3 | ':example:webview',
4 | ':example:waimai',
5 | ':example:base'
6 |
7 | include ':example:app-shell:shell-webview',
8 | ':example:app-shell:shell-base'
--------------------------------------------------------------------------------
/example/travel/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/example/travel/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'grouter'
3 |
4 | android {
5 | compileSdkVersion 30
6 |
7 |
8 | defaultConfig {
9 | minSdkVersion 14
10 | targetSdkVersion 30
11 | versionCode 1
12 | versionName "1.0"
13 |
14 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
15 |
16 | }
17 |
18 | buildTypes {
19 | release {
20 | minifyEnabled false
21 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
22 | }
23 | }
24 |
25 | }
26 |
27 | dependencies {
28 | implementation fileTree(dir: 'libs', include: ['*.jar'])
29 |
30 | implementation 'androidx.appcompat:appcompat:1.0.0'
31 | testImplementation 'junit:junit:4.12'
32 | androidTestImplementation 'androidx.test.ext:junit:1.1.1'
33 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
34 | implementation project(':example:base')
35 | annotationProcessor project(':grouter-compiler')
36 | }
37 |
--------------------------------------------------------------------------------
/example/travel/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 |
--------------------------------------------------------------------------------
/example/travel/src/androidTest/java/com/grouter/example/travel/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.grouter.example.travel;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.*;
11 |
12 | /**
13 | * Instrumented test, which will execute on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.grouter.example.travel.test", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/example/travel/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
--------------------------------------------------------------------------------
/example/travel/src/main/java/com/grouter/example/travel/TravelHomeActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.example.travel;
2 |
3 | import androidx.appcompat.app.AppCompatActivity;
4 |
5 | import com.grouter.RouterActivity;
6 |
7 | @RouterActivity("travel/home")
8 | public class TravelHomeActivity extends AppCompatActivity {
9 | }
10 |
--------------------------------------------------------------------------------
/example/travel/src/main/java/com/grouter/example/travel/TravelMapActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.example.travel;
2 |
3 | import androidx.appcompat.app.AppCompatActivity;
4 |
5 | import com.grouter.RouterActivity;
6 | import com.grouter.RouterField;
7 |
8 | @RouterActivity("travel/map")
9 | public class TravelMapActivity extends AppCompatActivity {
10 | }
11 |
--------------------------------------------------------------------------------
/example/travel/src/main/java/com/grouter/example/travel/TravelPoiActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.example.travel;
2 |
3 | import androidx.appcompat.app.AppCompatActivity;
4 |
5 | import androidx.appcompat.app.AppCompatActivity;
6 |
7 | import com.grouter.RouterActivity;
8 |
9 | @RouterActivity("travel/poi")
10 | public class TravelPoiActivity extends AppCompatActivity {
11 | }
12 |
--------------------------------------------------------------------------------
/example/travel/src/main/java/com/grouter/example/travel/TravelPoiDetailActivity.java:
--------------------------------------------------------------------------------
1 | //package com.grouter.example.travel;
2 | //
3 | //import android.os.Bundle;
4 | //import androidx.annotation.Nullable;
5 | //import androidx.appcompat.app.AppCompatActivity;
6 | //
7 | //import com.grouter.GActivityCenter;
8 | //import com.grouter.RouterActivity;
9 | //
10 | //@RouterActivity("travel/poi/detail")
11 | //public class TravelPoiDetailActivity extends AppCompatActivity {
12 | // @Override
13 | // protected void onCreate(@Nullable Bundle savedInstanceState) {
14 | // super.onCreate(savedInstanceState);
15 | //// GActivityCenter.TravelPoiActivity()
16 | // }
17 | //}
18 |
--------------------------------------------------------------------------------
/example/travel/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | demo_travel
3 |
4 |
--------------------------------------------------------------------------------
/example/travel/src/test/java/com/grouter/example/travel/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.grouter.example.travel;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/example/waimai/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/example/waimai/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'kotlin-android'
3 | apply plugin: 'kotlin-android-extensions'
4 | apply plugin: 'grouter'
5 |
6 |
7 | android {
8 | compileSdkVersion 30
9 | buildToolsVersion '28.0.3'
10 |
11 | defaultConfig {
12 | minSdkVersion 14
13 | targetSdkVersion 30
14 | versionCode 1
15 | versionName "1.0"
16 |
17 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
18 |
19 | javaCompileOptions {
20 | annotationProcessorOptions {
21 | includeCompileClasspath false
22 | // arguments = [
23 | // MODULE_NAME : 'app',
24 | // GROUTER_SOURCE_PATH : '/Users/Wiki/Documents/Workspace/joyrun/joyrun-android-dev/lib.base/src/main/java',
25 | // GROUTER_HOST : '',
26 | // GROUTER_MULTI_PROJECT_NAME :'',
27 | // GROUTER_SCHEME : 'joyrun'
28 | // ]
29 | }
30 | }
31 | }
32 | buildTypes {
33 | release {
34 | minifyEnabled false
35 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
36 | }
37 | }
38 | compileOptions {
39 | sourceCompatibility 1.8
40 | targetCompatibility 1.8
41 | }
42 | }
43 |
44 | dependencies {
45 | implementation fileTree(include: ['*.jar'], dir: 'libs')
46 | implementation 'androidx.appcompat:appcompat:1.3.1'
47 | implementation project(':example:base')
48 | kapt project(':grouter-compiler')
49 | }
--------------------------------------------------------------------------------
/example/waimai/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Volumes/HD/Tools/ADT/android-sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/example/waimai/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/example/waimai/src/main/java/com/grouter/demo/other/OtherRouterInterceptor.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.other;
2 |
3 | import android.content.Context;
4 | import androidx.annotation.NonNull;
5 | import android.util.Log;
6 |
7 | import androidx.annotation.NonNull;
8 |
9 | import com.grouter.GRouterInterceptor;
10 | import com.grouter.ActivityRequest;
11 | import com.grouter.ComponentRequest;
12 | import com.grouter.RouterInterceptor;
13 | import com.grouter.TaskRequest;
14 |
15 | import java.util.Map;
16 |
17 | @RouterInterceptor
18 | public class OtherRouterInterceptor extends GRouterInterceptor {
19 | @Override
20 | public boolean process(@NonNull TaskRequest request) {
21 | return super.process(request);
22 | }
23 |
24 | @Override
25 | public boolean process(@NonNull ActivityRequest request) {
26 | return super.process(request);
27 | }
28 |
29 | @Override
30 | public boolean process(@NonNull ComponentRequest request) {
31 | return super.process(request);
32 | }
33 |
34 | // @Override
35 | // public void processActivity(InterceptorCallback interceptorCallback) {
36 | // interceptorCallback.onInterrupt(new Exception(""));
37 | // }
38 |
39 | @Override
40 | public void init(@NonNull Context context, String buildType, Map params) {
41 | Log.e("OtherRouterInterceptor","init");
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/example/waimai/src/main/java/com/grouter/demo/other/activity/AccountBindActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.other.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.appcompat.app.AppCompatActivity;
5 |
6 | import com.grouter.GActivityCenter;
7 | import com.grouter.RouterActivity;
8 | import com.grouter.demo.waimai.R;
9 |
10 |
11 | @RouterActivity("/account/bind")
12 | public class AccountBindActivity extends AppCompatActivity {
13 |
14 | @Override
15 | protected void onCreate(Bundle savedInstanceState) {
16 | super.onCreate(savedInstanceState);
17 | setContentView(R.layout.activity_other_module);
18 | GActivityCenter.AccountBindActivity();
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/example/waimai/src/main/java/com/grouter/demo/other/activity/AccountLoginActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.other.activity;
2 |
3 | import android.os.Bundle;
4 | import androidx.appcompat.app.AppCompatActivity;
5 |
6 | import com.grouter.RouterActivity;
7 | import com.grouter.demo.waimai.R;
8 |
9 |
10 | //@RouterActivity("/account/login")
11 | public class AccountLoginActivity extends AppCompatActivity {
12 |
13 | @Override
14 | protected void onCreate(Bundle savedInstanceState) {
15 | super.onCreate(savedInstanceState);
16 | setContentView(R.layout.activity_other_module);
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/example/waimai/src/main/java/com/grouter/demo/other/activity/UserFragment.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.other.activity;
2 |
3 |
4 | import androidx.fragment.app.Fragment;
5 |
6 | import com.grouter.RouterComponent;
7 |
8 | @RouterComponent(protocol = Fragment.class)
9 | public class UserFragment extends Fragment {
10 |
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/example/waimai/src/main/java/com/grouter/demo/other/service/AccountServiceImpl.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.other.service
2 |
3 | import android.util.Log
4 |
5 | import com.grouter.RouterComponent
6 | import com.grouter.demo.base.model.User
7 | import com.grouter.demo.base.service.AccountService
8 |
9 | @RouterComponent(protocol = AccountService::class, name = "")
10 | class AccountServiceImpl : AccountService {
11 | override fun getLoginUser(): User? {
12 | return User(101, "Wiki")
13 | }
14 |
15 | var stringBuilder: StringBuilder? = null
16 |
17 | constructor() {}
18 |
19 | constructor(stringBuilder: StringBuilder) {
20 | this.stringBuilder = stringBuilder
21 | }
22 |
23 | override fun sayHi() {
24 | Log.e("AccountServiceImpl", "sayHi")
25 | }
26 |
27 | override fun getUser(uid: Int): User? {
28 | return null
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/example/waimai/src/main/java/com/grouter/demo/other/service/GetUserTask.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.other.service;
2 |
3 | import android.util.Log;
4 |
5 | import com.grouter.GRouterTask;
6 | import com.grouter.RouterField;
7 | import com.grouter.RouterTask;
8 | import com.grouter.demo.base.model.User;
9 |
10 | import java.util.Map;
11 |
12 | @RouterTask(value = "getUser", returns = "User")
13 | public class GetUserTask extends GRouterTask {
14 |
15 | @RouterField
16 | public int uid;
17 |
18 | @RouterField
19 | public String name;
20 |
21 | @Override
22 | public Object process() {
23 | Log.e("name", String.valueOf(name));
24 | Log.e("uid", String.valueOf(uid));
25 | return new User(uid, name);
26 | }
27 | }
28 |
29 |
--------------------------------------------------------------------------------
/example/waimai/src/main/java/com/grouter/demo/other/service/UserLoginTask.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.other.service;
2 |
3 | import android.hardware.SensorEvent;
4 |
5 | import com.grouter.GRouterTask;
6 | import com.grouter.RouterField;
7 | import com.grouter.RouterTask;
8 |
9 | import java.util.Map;
10 |
11 | @RouterTask(value = "UserLogin",returns = "User")
12 | public class UserLoginTask extends GRouterTask {
13 | @RouterField
14 | public int uid;
15 |
16 | @RouterField
17 | public String pwd;
18 |
19 | @RouterField
20 | public SensorEvent sensorEvent;
21 |
22 |
23 | @Override
24 | protected Object process() throws Exception {
25 | return null;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/example/waimai/src/main/java/com/grouter/demo/other/service/UserServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.other.service;
2 |
3 | import android.content.Context;
4 | import androidx.annotation.NonNull;
5 | import android.util.Log;
6 |
7 | import com.grouter.RouterComponent;
8 | import com.grouter.RouterComponentConstructor;
9 | import com.grouter.demo.base.model.User;
10 | import com.grouter.demo.base.service.UserService;
11 |
12 | import java.util.Collections;
13 | import java.util.List;
14 |
15 | @RouterComponent(protocol = UserService.class, name = "用户服务",description = "本地或者服务端查询用户的信息")
16 | public final class UserServiceImpl implements UserService {
17 | private User user;
18 | private int uid;
19 | private Context context;
20 |
21 | @RouterComponentConstructor
22 | public UserServiceImpl() {
23 |
24 | }
25 | @RouterComponentConstructor
26 | public UserServiceImpl(Context context) {
27 | super();
28 | this.context = context;
29 | }
30 |
31 | // public UserServiceImpl(User user, int uid) {
32 | // super();
33 | // this.user = user;
34 | // this.uid = uid;
35 | // }
36 | //
37 | // public UserServiceImpl(User user, int uid, int[] sums) {
38 | // super();
39 | // this.user = user;
40 | // this.uid = uid;
41 | // }
42 | //
43 | //
44 | // @RouterComponentConstructor
45 | // public UserServiceImpl(List users) {
46 | // super();
47 | // }
48 | //
49 | // @RouterComponentConstructor
50 | // public UserServiceImpl(Map users) {
51 | // super();
52 | // }
53 | //
54 | // @RouterComponentConstructor
55 | // public UserServiceImpl(User[] users) {
56 | // super();
57 | // }
58 |
59 |
60 | public User getUser(int uid) {
61 | return new User("Wiki");
62 | }
63 |
64 | @NonNull
65 | public List listUser() {
66 | return Collections.singletonList(new User("Wiki"));
67 | }
68 |
69 | @Override
70 | public void sayHello() {
71 | Log.e("UserId", String.valueOf(uid));
72 | if (user != null) {
73 | Log.e("User", user.getName());
74 | }
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/example/waimai/src/main/java/com/grouter/demo/service/WaimaiServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.service;
2 |
3 | import com.grouter.RouterComponent;
4 |
5 | @RouterComponent(protocol = WaimaiService.class)
6 | public class WaimaiServiceImpl implements WaimaiService {
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/example/waimai/src/main/res/layout/activity_other_module.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
18 |
19 |
--------------------------------------------------------------------------------
/example/waimai/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/example/waimai/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/example/waimai/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | app_module
3 |
4 |
--------------------------------------------------------------------------------
/example/webview/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/example/webview/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'kotlin-android'
3 | apply plugin: 'kotlin-android-extensions'
4 | apply plugin: 'kotlin-kapt'
5 | apply plugin: 'grouter'
6 |
7 |
8 | android {
9 | compileSdkVersion 30
10 | buildToolsVersion '28.0.3'
11 |
12 | defaultConfig {
13 | minSdkVersion 14
14 | targetSdkVersion 30
15 | versionCode 1
16 | versionName "1.0"
17 |
18 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
19 |
20 | }
21 | buildTypes {
22 | release {
23 | minifyEnabled false
24 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
25 | }
26 | }
27 | compileOptions {
28 | sourceCompatibility 1.8
29 | targetCompatibility 1.8
30 | }
31 | }
32 |
33 | dependencies {
34 | implementation fileTree(include: ['*.jar'], dir: 'libs')
35 | implementation 'androidx.appcompat:appcompat:1.0.0'
36 | implementation project(':example:base')
37 | kapt project(':grouter-compiler')
38 | }
--------------------------------------------------------------------------------
/example/webview/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Volumes/HD/Tools/ADT/android-sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/example/webview/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/example/webview/src/main/assets/grouter_test.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/example/webview/src/main/java/com/grouter/demo/webview/activity/WebViewActivity.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.demo.webview.activity
2 |
3 | import android.annotation.SuppressLint
4 | import android.os.Bundle
5 | import androidx.appcompat.app.AppCompatActivity
6 | import android.webkit.WebChromeClient
7 | import android.webkit.WebView
8 | import android.webkit.WebViewClient
9 | import com.grouter.GRouter
10 |
11 | import com.grouter.RouterActivity
12 | import com.grouter.RouterField
13 | import com.grouter.demo.webview.R
14 | import com.grouter.hybrid.GRouterJavascriptInterface
15 | import kotlinx.android.synthetic.main.activity_web_view.*
16 |
17 | @Suppress("DEPRECATION")
18 | @SuppressLint("SetJavaScriptEnabled", "AddJavascriptInterface")
19 | @RouterActivity("/web_view")
20 | class WebViewActivity : AppCompatActivity() {
21 | @RouterField
22 | var url: String? = null
23 | var javascriptInterface = GRouterJavascriptInterface(this)
24 |
25 | override fun onCreate(savedInstanceState: Bundle?) {
26 | super.onCreate(savedInstanceState)
27 | GRouter.inject(this)
28 | title = javaClass.simpleName
29 | setContentView(R.layout.activity_web_view)
30 | web_view.settings.javaScriptEnabled = true
31 | web_view.addJavascriptInterface(javascriptInterface, "grouter")
32 | web_view.webChromeClient = WebChromeClient()
33 | web_view.webViewClient = object : WebViewClient() {
34 | override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
35 | javascriptInterface.setUrl(url)
36 | return super.shouldOverrideUrlLoading(view, url)
37 | }
38 | }
39 | web_view.loadUrl("file:///android_asset/grouter_test.html")
40 | if (url != null) {
41 | web_view.loadUrl(url!!)
42 | }
43 | }
44 |
45 | override fun onBackPressed() {
46 | if (web_view.canGoBack()) {
47 | web_view.goBack()
48 | return
49 | }
50 | super.onBackPressed()
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/example/webview/src/main/res/layout/activity_other_module.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
18 |
19 |
--------------------------------------------------------------------------------
/example/webview/src/main/res/layout/activity_web_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
--------------------------------------------------------------------------------
/example/webview/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/example/webview/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/example/webview/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | app_module
3 |
4 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
19 |
20 | #GROUTER_SCHEME=router
21 | #GROUTER_HOST=
22 | #GROUTER_SOURCE_PATH=demo-base/src/main/router
23 |
24 | #grouter.scheme=router
25 | #grouter.host=host
26 | #grouter.helper.path=BaseModule/src/main/router
27 | android.enableJetifier=true
28 | android.useAndroidX=true
29 |
30 |
31 | GROUP_ID=io.github.taoweiji.grouter
32 | VERSION_NAME=1.2.3
33 | POM_NAME=grouter
34 | POM_DESCRIPTION=grouter for Android
35 | POM_URL=https://github.com/taoweiji/grouter
36 | POM_SCM_URL=https://github.com/taoweiji/grouter
37 | POM_SCM_CONNECTION=scm:git@github.com:taoweiji/grouter.git
38 | POM_SCM_DEV_CONNECTION=scm:git@github.com:taoweiji/grouter.git
39 | POM_LICENCE_NAME=The Apache Software License, Version 2.0
40 | POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
41 | POM_LICENCE_DIST=repo
42 |
43 |
44 |
45 |
46 | # --- 基本参数 ---
47 | # 必填,填写BaseModule的源代码目录
48 | GROUTER_SOURCE_PATH=example/base/src/main/router
49 | # 选填,用于外部APP(或浏览器)打开内部页面,如果无需该功能可以不填写
50 | GROUTER_SCHEME=grouter
51 | # --- 多工程模式 ---
52 | # 选填,多工程模式开关
53 | GROUTER_MULTI_PROJECT_MODE=false
54 | # 选填,多工程模式生成,如果APP是多工程模式,为每一个工程配置独立的名称,同时需要手工在Application配置
55 | GROUTER_MULTI_PROJECT_NAME=MainProject
56 |
57 | DEV_NOT_AUTO_DEPENDENCIES=true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sat Aug 31 16:30:45 CST 2019
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip
7 |
8 |
--------------------------------------------------------------------------------
/grouter-annotation/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/grouter-annotation/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'java'
2 | //apply plugin: 'com.github.dcendents.android-maven'
3 | apply plugin: 'maven'
4 |
5 |
6 | sourceCompatibility = JavaVersion.VERSION_1_7
7 | targetCompatibility = JavaVersion.VERSION_1_7
8 |
9 | dependencies {
10 | implementation fileTree(dir: 'libs', include: ['*.jar'])
11 | }
12 |
13 | apply from: '../maven_public.gradle'
--------------------------------------------------------------------------------
/grouter-annotation/src/main/java/com/grouter/RouterActivity.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * Created by Wiki on 19/7/28.
10 | */
11 | @Target(ElementType.TYPE)
12 | @Retention(RetentionPolicy.RUNTIME)
13 | public @interface RouterActivity {
14 |
15 | /**
16 | * 路径,eg. @RouterActivity("movie/worker")
17 | * 如果要匹配多个路径请使用{,}分割 eg. @RouterActivity("account/login,account/register")
18 | */
19 | String value() default "";
20 |
21 | /**
22 | * 是否可以从外部APP打开
23 | * 当path不为空时候,默认是true,否则默认是false,
24 | * 如果设置成false,那么值就是false,不随path改变。
25 | */
26 | boolean exported() default true;
27 |
28 | /**
29 | * 用于文档,名称
30 | */
31 | String name() default "";
32 | /**
33 | * 用于文档,描述
34 | */
35 | String description() default "";
36 | }
37 |
--------------------------------------------------------------------------------
/grouter-annotation/src/main/java/com/grouter/RouterComponent.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * 默认使用空构造方法实现,如果带有参数的构造方法需要实现就要使用ComponentConstructor注解
10 | * Created by Wiki on 19/8/14.
11 | */
12 | @Target({ElementType.TYPE})
13 | @Retention(RetentionPolicy.RUNTIME)
14 | public @interface RouterComponent {
15 | /**
16 | * path
17 | */
18 | String value() default "";
19 |
20 | /**
21 | * 接口
22 | */
23 | Class protocol();
24 |
25 | /**
26 | * 用于文档,名称
27 | */
28 | String name() default "";
29 | /**
30 | * 用于文档,描述
31 | */
32 | String description() default "";
33 | }
34 |
--------------------------------------------------------------------------------
/grouter-annotation/src/main/java/com/grouter/RouterComponentConstructor.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * Created by Wiki on 19/8/14.
10 | */
11 | @Target({ElementType.CONSTRUCTOR})
12 | @Retention(RetentionPolicy.RUNTIME)
13 | public @interface RouterComponentConstructor {
14 | }
15 |
--------------------------------------------------------------------------------
/grouter-annotation/src/main/java/com/grouter/RouterDelegate.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * 非下沉式代理组件,RouterDelegate需要搭配RouterDelegateMethod使用
10 | * Created by Wiki on 19/7/28.
11 | */
12 | @Target({ElementType.TYPE})
13 | @Retention(RetentionPolicy.RUNTIME)
14 | public @interface RouterDelegate {
15 | /**
16 | * 用于文档,名称
17 | */
18 | String name() default "";
19 |
20 | /**
21 | * 用于文档,描述
22 | */
23 | String description() default "";
24 | }
--------------------------------------------------------------------------------
/grouter-annotation/src/main/java/com/grouter/RouterDelegateConstructor.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | @Target({ElementType.CONSTRUCTOR})
9 | @Retention(RetentionPolicy.RUNTIME)
10 | public @interface RouterDelegateConstructor {
11 | /**
12 | * 用于文档,名称
13 | */
14 | String name() default "";
15 | /**
16 | * 用于文档,描述
17 | */
18 | String description() default "";
19 | }
--------------------------------------------------------------------------------
/grouter-annotation/src/main/java/com/grouter/RouterDelegateMethod.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | @Target({ElementType.METHOD})
9 | @Retention(RetentionPolicy.RUNTIME)
10 | public @interface RouterDelegateMethod {
11 | /**
12 | * 用于文档,名称
13 | */
14 | String name() default "";
15 | /**
16 | * 用于文档,描述
17 | */
18 | String description() default "";
19 | }
--------------------------------------------------------------------------------
/grouter-annotation/src/main/java/com/grouter/RouterDocument.java:
--------------------------------------------------------------------------------
1 | //package com.grouter;
2 | //
3 | //import java.lang.annotation.ElementType;
4 | //import java.lang.annotation.Retention;
5 | //import java.lang.annotation.RetentionPolicy;
6 | //import java.lang.annotation.Target;
7 | //
8 | //@Target({ElementType.CONSTRUCTOR,ElementType.TYPE,ElementType.METHOD})
9 | //@Retention(RetentionPolicy.RUNTIME)
10 | //public @interface RouterDocument {
11 | // /**
12 | // * 用于文档,名称
13 | // */
14 | // String name() default "";
15 | // /**
16 | // * 用于文档,描述
17 | // */
18 | // String description() default "";
19 | //}
--------------------------------------------------------------------------------
/grouter-annotation/src/main/java/com/grouter/RouterField.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Inherited;
5 | import java.lang.annotation.Retention;
6 | import java.lang.annotation.RetentionPolicy;
7 | import java.lang.annotation.Target;
8 | import java.util.Arrays;
9 |
10 | /**
11 | * Created by Wiki on 19/7/28.
12 | */
13 | @Inherited
14 | @Target(ElementType.FIELD)
15 | @Retention(RetentionPolicy.RUNTIME)
16 | public @interface RouterField {
17 | /**
18 | * 字段名称,用于解析URL参数使用
19 | */
20 | String value() default "";
21 | /**
22 | * 用于文档,描述
23 | */
24 | String description() default "";
25 | }
26 |
--------------------------------------------------------------------------------
/grouter-annotation/src/main/java/com/grouter/RouterInterceptor.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * 默认使用空构造方法实现,如果带有参数的构造方法需要实现就要使用ComponentConstructor注解
10 | * Created by Wiki on 19/8/14.
11 | */
12 | @Target({ElementType.TYPE})
13 | @Retention(RetentionPolicy.RUNTIME)
14 | public @interface RouterInterceptor {
15 | int priority() default 0;
16 | }
17 |
--------------------------------------------------------------------------------
/grouter-annotation/src/main/java/com/grouter/RouterTask.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * 默认使用空构造方法实现,如果带有参数的构造方法需要实现就要使用ComponentConstructor注解
10 | * Created by Wiki on 19/8/14.
11 | */
12 | @Target({ElementType.TYPE})
13 | @Retention(RetentionPolicy.RUNTIME)
14 | public @interface RouterTask {
15 | /**
16 | * path
17 | */
18 | String value() default "";
19 |
20 | /**
21 | * 用于文档,用于文档标记返回值使用
22 | */
23 | String returns() default "";
24 |
25 | /**
26 | * 用于文档,名称
27 | */
28 | String name() default "";
29 |
30 | /**
31 | * 用于文档,描述
32 | */
33 | String description() default "";
34 | }
35 |
--------------------------------------------------------------------------------
/grouter-compiler/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/grouter-compiler/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'java'
2 | //apply plugin: 'com.github.dcendents.android-maven'
3 | apply plugin: 'maven'
4 |
5 | sourceCompatibility = JavaVersion.VERSION_1_7
6 | targetCompatibility = JavaVersion.VERSION_1_7
7 |
8 | dependencies {
9 | implementation fileTree(include: ['*.jar'], dir: 'libs')
10 | implementation 'com.google.auto.service:auto-service:1.0-rc2'
11 | implementation 'com.squareup:javapoet:1.11.1'
12 | implementation project(':grouter-annotation')
13 | implementation 'com.alibaba:fastjson:1.1.45.android'
14 | testImplementation 'junit:junit:4.12'
15 | }
16 |
17 | apply from: '../maven_public.gradle'
--------------------------------------------------------------------------------
/grouter-compiler/src/main/java/com/grouter/compiler/ActivityModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class ActivityModel implements Comparable {
7 | public String module;
8 | public String name;
9 | public String path;
10 | public String type;
11 | public String description;
12 | public String argument;
13 | public boolean exported;
14 | public List params = new ArrayList<>();
15 |
16 | @Override
17 | public int compareTo(ActivityModel model) {
18 | if (this.module == null) {
19 | this.module = "";
20 | }
21 | if (model.module == null) {
22 | model.module = "";
23 | }
24 | if (this.path == null) {
25 | this.path = "";
26 | }
27 | if (model.path == null) {
28 | model.path = "";
29 | }
30 | if (!module.equals(model.module)) {
31 | return this.module.compareTo(model.module);
32 | }
33 | if (!path.equals(model.path)) {
34 | return this.path.compareTo(model.path);
35 | }
36 | return this.type.compareTo(model.type);
37 | }
38 | }
--------------------------------------------------------------------------------
/grouter-compiler/src/main/java/com/grouter/compiler/ComponentModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class ComponentModel implements Comparable {
7 | public String protocol;
8 | public String implement;
9 | public List constructors = new ArrayList<>();
10 | public String path;
11 | public String module;
12 | public String name;
13 | public String description;
14 |
15 | @Override
16 | public int compareTo(ComponentModel model) {
17 | if (this.module == null) {
18 | this.module = "";
19 | }
20 | if (model.module == null) {
21 | model.module = "";
22 | }
23 | if (!module.equals(model.module)) {
24 | return this.module.compareTo(model.module);
25 | }
26 | return this.implement.compareTo(model.implement);
27 | }
28 | public static class ConstructorBean {
29 | public List parameterTypes = new ArrayList<>();
30 | public List parameterNames = new ArrayList<>();
31 | }
32 | }
--------------------------------------------------------------------------------
/grouter-compiler/src/main/java/com/grouter/compiler/InterceptorModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 |
4 | public class InterceptorModel implements Comparable {
5 | public String type;
6 |
7 | public int priority;
8 | public String module;
9 |
10 | @Override
11 | public int compareTo(InterceptorModel interceptorModel) {
12 | return this.type.compareTo(interceptorModel.type);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/grouter-compiler/src/main/java/com/grouter/compiler/ParameterModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 | public class ParameterModel implements Comparable {
4 | /**
5 | * 字段名称
6 | */
7 | public String name;
8 | /**
9 | * 支持类型,支持基本类型、基本类型数组、List、Map、Activity、Context、Application
10 | */
11 | public String type;
12 |
13 | /**
14 | * 原始类型
15 | */
16 | public String rawType;
17 | /**
18 | * URL解析名称
19 | */
20 | public String queryName;
21 | /**
22 | * 描述
23 | */
24 | public String description;
25 |
26 | @Override
27 | public int compareTo(ParameterModel model) {
28 | return this.type.compareTo(model.type);
29 | }
30 | }
--------------------------------------------------------------------------------
/grouter-compiler/src/main/java/com/grouter/compiler/RouterDelegateModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 |
4 | import java.util.ArrayList;
5 | import java.util.List;
6 |
7 | public class RouterDelegateModel implements Comparable {
8 | /**
9 | * type : com.grouter.demo.service.UserListTask
10 | * methods : [{"name":"getUser","returns":"User","parameterTypes":["String","int"],"parameterNames":["uid","limt"]}]
11 | * constructors : [{"parameterTypes":["String","int"],"parameterNames":["uid","limt"]}]
12 | */
13 |
14 | public String type;
15 | public List methods = new ArrayList<>();
16 | public List constructor = new ArrayList<>();
17 | public String module;
18 |
19 | @Override
20 | public int compareTo(RouterDelegateModel model) {
21 | if (this.module == null) {
22 | this.module = "";
23 | }
24 | if (model.module == null) {
25 | model.module = "";
26 | }
27 | if (!module.equals(model.module)) {
28 | return this.module.compareTo(model.module);
29 | }
30 | return this.type.compareTo(model.type);
31 | }
32 |
33 | public static class MethodsBean {
34 | /**
35 | * name : getUser
36 | * returns : User
37 | * parameterTypes : ["String","int"]
38 | * parameterNames : ["uid","limt"]
39 | */
40 | public String name;
41 | public String returns;
42 | public List parameterTypes = new ArrayList<>();
43 | public List parameterNames = new ArrayList<>();
44 | }
45 |
46 | public static class ConstructorBean {
47 | public List parameterTypes = new ArrayList<>();
48 | public List parameterNames = new ArrayList<>();
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/grouter-compiler/src/main/java/com/grouter/compiler/RouterModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class RouterModel {
7 | public List activityModels = new ArrayList<>();
8 | public List componentModels = new ArrayList<>();
9 | public List interceptorModels = new ArrayList<>();
10 | public List taskModels = new ArrayList<>();
11 | public List delegateModels = new ArrayList<>();
12 | public String scheme;
13 | public String host;
14 | public String projectName;
15 |
16 | public void add(RouterModel routerModel) {
17 | activityModels.addAll(routerModel.activityModels);
18 | taskModels.addAll(routerModel.taskModels);
19 | interceptorModels.addAll(routerModel.interceptorModels);
20 | componentModels.addAll(routerModel.componentModels);
21 | delegateModels.addAll(routerModel.delegateModels);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/grouter-compiler/src/main/java/com/grouter/compiler/TaskModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class TaskModel implements Comparable {
7 | public String module;
8 | public String name;
9 | public String path;
10 | public String type;
11 | public String argument;
12 | public String description;
13 | public String returns;
14 | public List params = new ArrayList<>();
15 |
16 | @Override
17 | public int compareTo(TaskModel model) {
18 | if (this.module == null) {
19 | this.module = "";
20 | }
21 | if (model.module == null) {
22 | model.module = "";
23 | }
24 | if (this.path == null) {
25 | this.path = "";
26 | }
27 | if (model.path == null) {
28 | model.path = "";
29 | }
30 | if (!module.equals(model.module)) {
31 | return this.module.compareTo(model.module);
32 | }
33 | if (!path.equals(model.path)) {
34 | return this.path.compareTo(model.path);
35 | }
36 | return this.type.compareTo(model.type);
37 | }
38 | }
--------------------------------------------------------------------------------
/grouter-compiler/src/main/java/com/grouter/compiler/processor/InterceptorProcessor.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler.processor;
2 |
3 | import com.alibaba.fastjson.JSON;
4 | import com.grouter.RouterInterceptor;
5 | import com.grouter.compiler.InterceptorModel;
6 | import com.grouter.compiler.TypeUtils;
7 | import com.squareup.javapoet.ClassName;
8 |
9 | import java.io.File;
10 | import java.io.FileWriter;
11 | import java.util.ArrayList;
12 | import java.util.Collections;
13 | import java.util.List;
14 | import java.util.Set;
15 |
16 | import javax.annotation.processing.RoundEnvironment;
17 | import javax.lang.model.element.Element;
18 |
19 | public class InterceptorProcessor {
20 | private RouterProcessor routerProcessor;
21 |
22 | public InterceptorProcessor(RouterProcessor routerProcessor) {
23 | this.routerProcessor = routerProcessor;
24 | }
25 | public List process(RoundEnvironment roundEnv) {
26 | Set extends Element> elements = roundEnv.getElementsAnnotatedWith(RouterInterceptor.class);
27 | List interceptorModels = new ArrayList<>();
28 | for (Element element : elements) {
29 | RouterInterceptor routerInterceptor = element.getAnnotation(RouterInterceptor.class);
30 | ClassName className = (ClassName) ClassName.get(element.asType());
31 | InterceptorModel interceptorModel = new InterceptorModel();
32 | interceptorModel.priority = routerInterceptor.priority();
33 | interceptorModel.type = TypeUtils.reflectionName(className);
34 | interceptorModels.add(interceptorModel);
35 | }
36 | Collections.sort(interceptorModels);
37 | // File dir = new File(routerProcessor.GROUTER_SOURCE_PATH);
38 | // try {
39 | // dir = new File(dir, "com/grouter");
40 | // File file = new File(dir, "RouterInterceptor-" + routerProcessor.MODULE_NAME + ".json");
41 | // FileWriter fileWriter = new FileWriter(file);
42 | // fileWriter.write(JSON.toJSONString(interceptorModels, true));
43 | // fileWriter.close();
44 | // } catch (Exception e) {
45 | // e.printStackTrace();
46 | // }
47 | return interceptorModels;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/grouter-compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor:
--------------------------------------------------------------------------------
1 | com.grouter.compiler.processor.RouterProcessor
2 |
--------------------------------------------------------------------------------
/grouter-compiler/src/test/java/com/grouter/compiler/RouterBuildHelperTest.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 | import org.junit.Test;
4 |
5 | import java.io.File;
6 |
7 | import static org.junit.Assert.*;
8 |
9 | public class RouterBuildHelperTest {
10 |
11 | @Test
12 | public void getRouterModel() {
13 | File file = new File("/Users/Wiki/Documents/Workspace/joyrun/joyrun-android-dev/lib.base/src/main/java/com/grouter/data");
14 | RouterModel routerModel = RouterBuildHelper.getRouterModel(file,"","","",false);
15 |
16 | }
17 | }
--------------------------------------------------------------------------------
/grouter-gradle-plugin/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/grouter-gradle-plugin/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'groovy'
2 | apply plugin: 'maven'
3 |
4 | sourceCompatibility = JavaVersion.VERSION_1_8
5 | targetCompatibility = JavaVersion.VERSION_1_8
6 |
7 |
8 | dependencies {
9 | testImplementation 'junit:junit:4.12'
10 |
11 | implementation gradleApi()
12 | implementation localGroovy()
13 | // 这里不能使用最新的,由于最新的gradle在maven仓库中无法找到
14 | implementation 'com.android.tools.build:gradle:2.3.0'
15 | // 这个可以使用最新的
16 | // implementation 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.31'
17 | // 这两个是用于解析Kotlin语法的工具
18 | implementation 'org.jetbrains.kotlin:kotlin-compiler-runner:1.3.31'
19 | implementation 'org.jetbrains.kotlin:kotlin-compiler-embeddable:1.3.31'
20 | implementation 'de.defmacro:eclipse-astparser:8.1'
21 | // 这里是用于解决Java语法
22 | // api 'org.eclipse.jdt:org.eclipse.jdt.core:3.18.0'
23 | // 这个是用于生产Java类的工具
24 | implementation 'com.squareup:javapoet:1.11.1'
25 | // 这个是辅助工具
26 | implementation 'com.alibaba:fastjson:1.1.45.android'
27 | // implementation project(':grouter-compiler')
28 | }
29 | repositories {
30 | mavenCentral()
31 | google()
32 | }
33 |
34 |
35 | apply from: '../maven_public.gradle'
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/groovy/com/grouter/gradle/plugin/GRouterExtension.groovy:
--------------------------------------------------------------------------------
1 | package com.grouter.gradle.plugin
2 |
3 | public class GRouterExtension {
4 | public boolean kotlinEnable = true
5 |
6 | // --- 基本参数 ---
7 | // 必填,填写BaseModule的源代码目录
8 | public String GROUTER_SOURCE_PATH = ""
9 | // 选填,用于外部APP(或浏览器)打开内部页面,如果无需该功能可以不填写
10 | public String GROUTER_SCHEME = 'grouter'
11 | // 选填, 和GROUTER_SCHEME参数联合使用,{GROUTER_SCHEME}://{GROUTER_HOST}/user
12 | public String GROUTER_HOST = 'grouter'
13 |
14 | // --- 多工程模式 ---
15 | // 选填,多工程模式开关
16 | public boolean GROUTER_MULTI_PROJECT_MODE = false
17 | // 选填,多工程模式生成,如果APP是多工程模式,为每一个工程配置独立的名称,同时需要手工在Application配置
18 | public String GROUTER_MULTI_PROJECT_NAME = "MainProject"
19 | // 选填,多工程模式生成,如果APP是多工程模式,为每一个工程配置独立的名称,避免冲突
20 | // public String GROUTER_CENTER_NAME = "GActivityCenter"
21 | // 选填,多工程模式生成,如果APP是多工程模式,为每一个工程配置独立的名称,避免冲突
22 | // public String GCOMPONENT_CENTER_NAME = "GComponentCenter"
23 | }
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/com/grouter/compiler/ActivityModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class ActivityModel implements Comparable {
7 | public String module;
8 | public String name;
9 | public String path;
10 | public String type;
11 | public String description;
12 | public String argument;
13 | public boolean exported;
14 | public List params = new ArrayList<>();
15 |
16 | @Override
17 | public int compareTo(ActivityModel model) {
18 | if (this.module == null) {
19 | this.module = "";
20 | }
21 | if (model.module == null) {
22 | model.module = "";
23 | }
24 | if (this.path == null) {
25 | this.path = "";
26 | }
27 | if (model.path == null) {
28 | model.path = "";
29 | }
30 | if (!module.equals(model.module)) {
31 | return this.module.compareTo(model.module);
32 | }
33 | if (!path.equals(model.path)) {
34 | return this.path.compareTo(model.path);
35 | }
36 | return this.type.compareTo(model.type);
37 | }
38 | }
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/com/grouter/compiler/ComponentModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class ComponentModel implements Comparable {
7 | public String protocol;
8 | public String implement;
9 | public List constructors = new ArrayList<>();
10 | public String path;
11 | public String module;
12 | public String name;
13 | public String description;
14 |
15 | @Override
16 | public int compareTo(ComponentModel model) {
17 | if (this.module == null) {
18 | this.module = "";
19 | }
20 | if (model.module == null) {
21 | model.module = "";
22 | }
23 | if (!module.equals(model.module)) {
24 | return this.module.compareTo(model.module);
25 | }
26 | return this.implement.compareTo(model.implement);
27 | }
28 | public static class ConstructorBean {
29 | public List parameterTypes = new ArrayList<>();
30 | public List parameterNames = new ArrayList<>();
31 | }
32 | }
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/com/grouter/compiler/InterceptorModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 |
4 | public class InterceptorModel implements Comparable {
5 | public String type;
6 |
7 | public int priority;
8 | public String module;
9 |
10 | @Override
11 | public int compareTo(InterceptorModel interceptorModel) {
12 | return this.type.compareTo(interceptorModel.type);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/com/grouter/compiler/ParameterModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 | public class ParameterModel implements Comparable {
4 | /**
5 | * 字段名称
6 | */
7 | public String name;
8 | /**
9 | * 支持类型,支持基本类型、基本类型数组、List、Map、Activity、Context、Application
10 | */
11 | public String type;
12 |
13 | /**
14 | * 原始类型
15 | */
16 | public String rawType;
17 | /**
18 | * URL解析名称
19 | */
20 | public String queryName;
21 | /**
22 | * 描述
23 | */
24 | public String description;
25 |
26 | @Override
27 | public int compareTo(ParameterModel model) {
28 | return this.type.compareTo(model.type);
29 | }
30 | }
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/com/grouter/compiler/RouterDelegateModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 |
4 | import java.util.ArrayList;
5 | import java.util.List;
6 |
7 | public class RouterDelegateModel implements Comparable {
8 | /**
9 | * type : com.grouter.demo.service.UserListTask
10 | * methods : [{"name":"getUser","returns":"User","parameterTypes":["String","int"],"parameterNames":["uid","limt"]}]
11 | * constructors : [{"parameterTypes":["String","int"],"parameterNames":["uid","limt"]}]
12 | */
13 |
14 | public String type;
15 | public List methods = new ArrayList<>();
16 | public List constructor = new ArrayList<>();
17 | public String module;
18 |
19 | @Override
20 | public int compareTo(RouterDelegateModel model) {
21 | if (this.module == null) {
22 | this.module = "";
23 | }
24 | if (model.module == null) {
25 | model.module = "";
26 | }
27 | if (!module.equals(model.module)) {
28 | return this.module.compareTo(model.module);
29 | }
30 | return this.type.compareTo(model.type);
31 | }
32 |
33 | public static class MethodsBean {
34 | /**
35 | * name : getUser
36 | * returns : User
37 | * parameterTypes : ["String","int"]
38 | * parameterNames : ["uid","limt"]
39 | */
40 | public String name;
41 | public String returns;
42 | public List parameterTypes = new ArrayList<>();
43 | public List parameterNames = new ArrayList<>();
44 | }
45 |
46 | public static class ConstructorBean {
47 | public List parameterTypes = new ArrayList<>();
48 | public List parameterNames = new ArrayList<>();
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/com/grouter/compiler/RouterModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class RouterModel {
7 | public List activityModels = new ArrayList<>();
8 | public List componentModels = new ArrayList<>();
9 | public List interceptorModels = new ArrayList<>();
10 | public List taskModels = new ArrayList<>();
11 | public List delegateModels = new ArrayList<>();
12 | public String scheme;
13 | public String host;
14 | public String projectName;
15 |
16 | public void add(RouterModel routerModel) {
17 | activityModels.addAll(routerModel.activityModels);
18 | taskModels.addAll(routerModel.taskModels);
19 | interceptorModels.addAll(routerModel.interceptorModels);
20 | componentModels.addAll(routerModel.componentModels);
21 | delegateModels.addAll(routerModel.delegateModels);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/com/grouter/compiler/TaskModel.java:
--------------------------------------------------------------------------------
1 | package com.grouter.compiler;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class TaskModel implements Comparable {
7 | public String module;
8 | public String name;
9 | public String path;
10 | public String type;
11 | public String argument;
12 | public String description;
13 | public String returns;
14 | public List params = new ArrayList<>();
15 |
16 | @Override
17 | public int compareTo(TaskModel model) {
18 | if (this.module == null) {
19 | this.module = "";
20 | }
21 | if (model.module == null) {
22 | model.module = "";
23 | }
24 | if (this.path == null) {
25 | this.path = "";
26 | }
27 | if (model.path == null) {
28 | model.path = "";
29 | }
30 | if (!module.equals(model.module)) {
31 | return this.module.compareTo(model.module);
32 | }
33 | if (!path.equals(model.path)) {
34 | return this.path.compareTo(model.path);
35 | }
36 | return this.type.compareTo(model.type);
37 | }
38 | }
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/router/ParserHelper.java:
--------------------------------------------------------------------------------
1 | package router;
2 |
3 | import com.grouter.compiler.RouterBuildHelper;
4 | import com.grouter.compiler.RouterModel;
5 |
6 | import java.io.File;
7 | import java.util.List;
8 |
9 | import router.activity.ActivitySourceFileParserHelper;
10 | import router.component.ComponentSourceFileHelper;
11 | import router.delegate.DelegateSourceFileHelper;
12 | import router.task.TaskSourceFileParserHelper;
13 |
14 | public class ParserHelper {
15 | public static void parse(File jsonDir, List files, String moduleName) {
16 | try {
17 | RouterModel routerModel = new RouterModel();
18 | routerModel.activityModels = ActivitySourceFileParserHelper.parse(files);
19 | routerModel.taskModels = TaskSourceFileParserHelper.parse(files);
20 | routerModel.componentModels = ComponentSourceFileHelper.parse(files);
21 | routerModel.delegateModels = DelegateSourceFileHelper.parse(files);
22 | RouterBuildHelper.saveRouterModel(jsonDir, routerModel, moduleName);
23 | } catch (Exception e) {
24 | e.printStackTrace();
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/router/activity/ActivitySourceFileParser.java:
--------------------------------------------------------------------------------
1 | package router.activity;
2 |
3 | import com.grouter.compiler.ActivityModel;
4 |
5 | import java.io.File;
6 | import java.util.List;
7 |
8 | public interface ActivitySourceFileParser {
9 | int parse(List typeModels, File file);
10 | }
11 |
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/router/component/ComponentSourceFileParser.java:
--------------------------------------------------------------------------------
1 | package router.component;
2 |
3 | import com.grouter.compiler.ComponentModel;
4 |
5 | import java.io.File;
6 | import java.util.List;
7 |
8 | public interface ComponentSourceFileParser {
9 | int parse(List componentModels, File file);
10 | }
11 |
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/router/delegate/DelegateSourceFileParser.java:
--------------------------------------------------------------------------------
1 | package router.delegate;
2 |
3 | import com.grouter.compiler.RouterDelegateModel;
4 |
5 | import java.io.File;
6 | import java.util.List;
7 |
8 | public interface DelegateSourceFileParser {
9 | int parse(List componentModels, File file);
10 | }
11 |
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/java/router/task/TaskSourceFileParser.java:
--------------------------------------------------------------------------------
1 | package router.task;
2 |
3 | import com.grouter.compiler.TaskModel;
4 |
5 | import java.io.File;
6 | import java.util.List;
7 |
8 | public interface TaskSourceFileParser {
9 | int parse(List typeModels, File file);
10 | }
11 |
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/main/resources/META-INF/gradle-plugins/grouter.properties:
--------------------------------------------------------------------------------
1 | implementation-class=com.grouter.gradle.plugin.GRouterPlugin
2 |
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/test/java/router/ComponentRouterJavaRouterSourceFileParserTest.java:
--------------------------------------------------------------------------------
1 | package router;
2 |
3 | import com.alibaba.fastjson.JSON;
4 | import com.grouter.compiler.ComponentModel;
5 | import com.squareup.javapoet.MethodSpec;
6 |
7 | import org.junit.Test;
8 |
9 | import java.io.File;
10 | import java.util.ArrayList;
11 | import java.util.List;
12 |
13 | import javax.lang.model.element.Modifier;
14 |
15 | import router.component.ComponentKotlinSourceFileParser;
16 | import router.component.ComponentSourceFileHelper;
17 |
18 | public class ComponentRouterJavaRouterSourceFileParserTest {
19 | private router.component.ComponentKotlinSourceFileParser parser = new ComponentKotlinSourceFileParser();
20 |
21 | @Test
22 | public void parse() {
23 | List componentModels = new ArrayList<>();
24 | parser.parse(componentModels, new File("/Users/Wiki/Documents/Workspace/joyrun/ActivityRouter/example/waimai/src/main/java/com/grouter/demo/other/service/AccountServiceImpl.kt"));
25 |
26 | System.out.println(JSON.toJSONString(componentModels, true));
27 | }
28 |
29 | @Test
30 | public void parseDirs() {
31 | List componentModels = new ArrayList<>();
32 | // String path = "/Users/Wiki/Documents/Workspace/joyrun/ActivityRouter/demo-other/src/main/java/com/grouter/demo/other";
33 | String path = "/Users/Wiki/Documents/Workspace/joyrun/ActivityRouter/demo/src/main/java/com/grouter/demo/service";
34 | ComponentSourceFileHelper.parse(componentModels, new File(path));
35 | System.out.println(JSON.toJSONString(componentModels, true));
36 | }
37 |
38 |
39 |
40 | @Test
41 | public void builder() {
42 | MethodSpec.Builder builder = MethodSpec.methodBuilder("test").addModifiers(Modifier.PUBLIC).addException(Exception.class);
43 | builder.addJavadoc("@return $N\n","dddddd");
44 | System.out.println(builder.build().toString());;
45 |
46 |
47 | // ComponentCodeBuilder.build("GComponentCenter",new File("/Users/Wiki/Documents/Workspace/joyrun/ActivityRouter/demo-base/src/main/router"));
48 |
49 | }
50 |
51 |
52 |
53 |
54 |
55 | }
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/test/java/router/DelegateKotlinSourceFileParserTest.java:
--------------------------------------------------------------------------------
1 | package router;
2 |
3 | import com.alibaba.fastjson.JSON;
4 | import com.grouter.compiler.RouterDelegateModel;
5 |
6 | import org.junit.Test;
7 |
8 | import java.io.File;
9 | import java.util.ArrayList;
10 | import java.util.List;
11 |
12 | import router.delegate.DelegateKotlinSourceFileParser;
13 |
14 | public class DelegateKotlinSourceFileParserTest {
15 |
16 | @Test
17 | public void parse() {
18 | router.delegate.DelegateKotlinSourceFileParser parser = new DelegateKotlinSourceFileParser();
19 | File file = new File("/Users/Wiki/Documents/Workspace/joyrun/ActivityRouter/example-base/src/main/java/com/grouter/demo/Account2Service.kt");
20 | List delegateModels = new ArrayList<>();
21 | parser.parse(delegateModels, file);
22 | System.out.println(JSON.toJSONString(delegateModels, true));
23 |
24 |
25 | // File file = new File("/Users/Wiki/Documents/Workspace/joyrun/ActivityRouter/example-waimai/src/main/java/com/grouter/demo/other/AccountService.java");
26 | // List delegateModels = new ArrayList<>();
27 | // DelegateJavaSourceFileParser parser = new DelegateJavaSourceFileParser();
28 | // parser.parse(delegateModels, file);
29 | // System.out.println(JSON.toJSONString(delegateModels, true));
30 | }
31 | }
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/test/java/router/RouterJavaRouterSourceFileParserTest.java:
--------------------------------------------------------------------------------
1 | package router;
2 |
3 | import org.junit.Test;
4 |
5 | import router.activity.ActivityJavaSourceFileParser;
6 |
7 | public class RouterJavaRouterSourceFileParserTest {
8 |
9 | @Test
10 | public void parse() {
11 | // String path = "/Users/Wiki/Documents/Workspace/joyrun/ActivityRouter/demo/src/main/java/com/grouter/demo/SecondActivity.java";
12 | String path = "/Users/Wiki/Documents/Workspace/joyrun/ActivityRouter/demo-other/src/main/java/com/grouter/demo/other/view/OtherActivity.java";
13 | router.activity.ActivityJavaSourceFileParser parser = new ActivityJavaSourceFileParser();
14 | // StringBuilder stringBuilder = new StringBuilder();
15 | // List infoList = new ArrayList<>();
16 | // List list = new ArrayList<>();
17 | // parser.parse(list,new File(path));
18 | // System.out.println(JSON.toJSONString(list));
19 | }
20 | }
--------------------------------------------------------------------------------
/grouter-gradle-plugin/src/test/java/router/RouterKotlinRouterSourceFileParserTest.java:
--------------------------------------------------------------------------------
1 | package router;
2 |
3 | import router.activity.ActivityKotlinSourceFileParser;
4 |
5 | public class RouterKotlinRouterSourceFileParserTest {
6 |
7 | private router.activity.ActivityKotlinSourceFileParser sourceParser = new ActivityKotlinSourceFileParser();
8 |
9 | @org.junit.Test
10 | public void parse() {
11 | String path = "/Users/Wiki/Documents/Workspace/joyrun/ActivityRouter/demo/src/main/java/com/grouter/demo/KotlinActivity.kt";
12 | // StringBuilder stringBuilder = new StringBuilder();
13 | // ActivitySourceFileParserHelper.parse(stringBuilder,new File(path));
14 | // sourceParser.parse(stringBuilder,new File(path));
15 | // System.out.println(stringBuilder.toString());
16 | }
17 | }
--------------------------------------------------------------------------------
/grouter-kotlinextensions/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/grouter-kotlinextensions/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'kotlin-android'
3 | apply plugin: 'kotlin-android-extensions'
4 | apply plugin: 'maven'
5 | android {
6 | compileSdkVersion 30
7 |
8 |
9 | defaultConfig {
10 | minSdkVersion 14
11 | targetSdkVersion 30
12 | versionCode 1
13 | versionName "1.0"
14 |
15 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
16 | consumerProguardFiles 'consumer-rules.pro'
17 | }
18 |
19 | buildTypes {
20 | release {
21 | minifyEnabled false
22 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
23 | }
24 | }
25 |
26 | }
27 |
28 | dependencies {
29 | implementation fileTree(dir: 'libs', include: ['*.jar'])
30 | implementation 'androidx.appcompat:appcompat:1.0.0'
31 | implementation project(path: ':grouter')
32 | }
33 | apply from: '../maven_public.gradle'
--------------------------------------------------------------------------------
/grouter-kotlinextensions/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taoweiji/grouter-android/6db9a3671e173eec56481c1a1adc1b4238933c9f/grouter-kotlinextensions/consumer-rules.pro
--------------------------------------------------------------------------------
/grouter-kotlinextensions/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 |
--------------------------------------------------------------------------------
/grouter-kotlinextensions/src/androidTest/java/com/grouter/kotlinextensions/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.kotlinextensions
2 |
3 | import android.support.test.InstrumentationRegistry
4 | import android.support.test.runner.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22 | assertEquals("com.grouter.kotlinextensions.test", appContext.packageName)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/grouter-kotlinextensions/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
--------------------------------------------------------------------------------
/grouter-kotlinextensions/src/main/java/com/grouter/kotlinextensions/ActivityExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.grouter.kotlinextensions
2 |
3 | import android.app.Activity
4 | import com.grouter.GActivityUtils
5 |
6 | //fun Activity.
7 |
8 | /**
9 | * 从右边离开
10 | * 对应 [com.grouter.GActivityUtils).transitionRightIn]
11 | */
12 | fun Activity.finishAsRightOut() {
13 | GActivityUtils.finishTransitionRightOut(this)
14 | }
15 |
16 | /**
17 | * 从左边离开
18 | * 对应 [com.grouter.GActivityUtils).transitionLeftIn]
19 | */
20 | fun Activity.finishAsLeftOut() {
21 | GActivityUtils.finishTransitionLeftOut(this)
22 | }
23 |
24 | /**
25 | * 从底部离开
26 | * 对应 [com.grouter.GActivityUtils).transitionBottomIn]
27 | */
28 | fun Activity.finishAsBottomOut() {
29 | GActivityUtils.finishTransitionBottomOut(this)
30 | }
31 |
32 | /**
33 | * 从顶部离开
34 | * 对应 [com.grouter.GActivityUtils).transitionTopIn]
35 | */
36 | fun Activity.finishAsTopOut() {
37 | GActivityUtils.finishTransitionTopOut(this)
38 | }
39 |
40 |
41 | /**
42 | * 淡出
43 | * 对应 [com.grouter.GActivityUtils).transitionFadeIn]
44 | */
45 | fun Activity.finishAsFadeOut() {
46 | GActivityUtils.finishTransitionFadeOut(this)
47 | }
--------------------------------------------------------------------------------
/grouter-kotlinextensions/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | grouter-kotlinextensions
3 |
4 |
--------------------------------------------------------------------------------
/grouter/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/grouter/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'maven'
3 | //apply plugin: 'com.github.dcendents.android-maven'
4 |
5 | sourceCompatibility = JavaVersion.VERSION_1_7
6 | targetCompatibility = JavaVersion.VERSION_1_7
7 | android {
8 | compileSdkVersion 30
9 | buildToolsVersion '28.0.3'
10 |
11 | defaultConfig {
12 | minSdkVersion 14
13 | targetSdkVersion 30
14 | versionCode 1
15 | versionName "1.0"
16 | }
17 | buildTypes {
18 | release {
19 | minifyEnabled false
20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
21 | }
22 | }
23 | }
24 |
25 | dependencies {
26 | implementation fileTree(include: ['*.jar'], dir: 'libs')
27 | testImplementation 'junit:junit:4.12'
28 |
29 | implementation 'androidx.fragment:fragment:1.3.6'
30 | implementation 'androidx.annotation:annotation:1.2.0'
31 | // implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.41"
32 | api project(':grouter-annotation')
33 | }
34 |
35 | apply from: '../maven_public.gradle'
--------------------------------------------------------------------------------
/grouter/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/Wiki/Documents/Tools/android-sdk-macosx/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/grouter/src/androidTest/java/com/grouter/hybrid/GRouterJavascriptInterfaceTest.java:
--------------------------------------------------------------------------------
1 | package com.grouter.hybrid;
2 |
3 | //import static org.junit.Assert.*;
4 | //
5 | //public class GRouterJavascriptInterfaceTest {
6 | //
7 | // @org.junit.Test
8 | // public void hasAccessPermission() {
9 | // }
10 | //}
--------------------------------------------------------------------------------
/grouter/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/grouter/src/main/java/com/grouter/ComponentRequest.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import androidx.annotation.NonNull;
4 |
5 | @SuppressWarnings("WeakerAccess")
6 | public class ComponentRequest extends GRouterInterceptor.BaseRequest {
7 | private Class[] parameterTypes;
8 | private Object[] parameterObjects;
9 | private String implementClass;
10 | private Object implement;
11 | private Class protocol;
12 |
13 | public ComponentRequest(Class protocol, String implementClass, Class[] parameterTypes, Object[] parameterObjects) {
14 | this.protocol = protocol;
15 | this.implementClass = implementClass;
16 | this.parameterTypes = parameterTypes;
17 | this.parameterObjects = parameterObjects;
18 | }
19 |
20 | public void onContinue(@NonNull Object implement) {
21 | this.implement = implement;
22 | this.interrupt = false;
23 | LoggerUtils.onContinue(this, implement);
24 | }
25 |
26 | public Class[] getParameterTypes() {
27 | return parameterTypes;
28 | }
29 |
30 | public Object[] getParameterObjects() {
31 | return parameterObjects;
32 | }
33 |
34 | public String getImplementClass() {
35 | return implementClass;
36 | }
37 |
38 | public Object getImplement() {
39 | return implement;
40 | }
41 |
42 | public Class getProtocol() {
43 | return protocol;
44 | }
45 | }
--------------------------------------------------------------------------------
/grouter/src/main/java/com/grouter/ComponentUtils.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.lang.reflect.Constructor;
4 |
5 | @SuppressWarnings({"unchecked"})
6 | public class ComponentUtils {
7 | public static T getInstance(Class protocol, String implementClass) {
8 | return getInstance(protocol, implementClass, null, null);
9 | }
10 |
11 | public static T getInstance(Class protocol, String implementClass, Class[] parameterTypes, Object[] parameterObjects) {
12 | ComponentRequest request = new ComponentRequest(protocol, implementClass, parameterTypes, parameterObjects);
13 | try {
14 |
15 | Object implement = InterceptorUtils.processComponent(request);
16 | if (request.isInterrupt()){
17 | return null;
18 | }
19 | if (implement != null) {
20 | return (T) implement;
21 | }
22 | Class clazz = Class.forName(request.getImplementClass());
23 | if (parameterTypes != null) {
24 | Constructor constructor = clazz.getConstructor(request.getParameterTypes());
25 | return (T) constructor.newInstance(request.getParameterObjects());
26 | } else {
27 | return (T) clazz.newInstance();
28 | }
29 | } catch (Exception e) {
30 | return (T) InterceptorUtils.getErrorDegradedComponent(request, e);
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/grouter/src/main/java/com/grouter/DefaultMultiProjectGRouter.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.util.HashMap;
4 |
5 | /**
6 | * 用于多工程项目
7 | */
8 | class DefaultMultiProjectGRouter extends GRouter {
9 | DefaultMultiProjectGRouter() {
10 | super("", "", new HashMap(), new HashMap(),new HashMap());
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/grouter/src/main/java/com/grouter/ErrorTask.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | /**
4 | * 用于响应错误
5 | */
6 | class ErrorTask extends GRouterTask {
7 | private Exception exception;
8 |
9 | ErrorTask(Exception exception) {
10 | this.exception = exception;
11 | }
12 |
13 | @Override
14 | public Object process() throws Exception {
15 | throw exception;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/grouter/src/main/java/com/grouter/GRouterLogger.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import androidx.annotation.NonNull;
4 | import androidx.annotation.Nullable;
5 | import android.util.Log;
6 |
7 | public abstract class GRouterLogger {
8 | public abstract void handleException(@NonNull Exception e);
9 |
10 | public abstract void logger(@NonNull String tag, @NonNull String message,@Nullable Throwable throwable);
11 |
12 |
13 | static GRouterLogger logger = new GRouterLogger() {
14 | @Override
15 | public void handleException(@NonNull Exception e) {
16 | e.printStackTrace();
17 | }
18 |
19 | @Override
20 | public void logger(@NonNull String tag, @NonNull String message, @Nullable Throwable throwable) {
21 | if (throwable != null && throwable.getMessage() != null){
22 | message += ",case " + throwable.getMessage();
23 | }
24 | Log.e(tag, message);
25 | }
26 | };
27 |
28 | public static void setLogger(GRouterLogger logger) {
29 | GRouterLogger.logger = logger;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/grouter/src/main/java/com/grouter/MockTask.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | /**
4 | * 用于响应错误
5 | */
6 | class MockTask extends GRouterTask {
7 | private Object result;
8 |
9 | public MockTask(Object result) {
10 | this.result = result;
11 | }
12 |
13 | @Override
14 | public Object process() throws Exception {
15 | return result;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/grouter/src/main/java/com/grouter/RouterUtils.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import java.lang.reflect.Field;
4 | import java.util.HashMap;
5 | import java.util.List;
6 | import java.util.Map;
7 | import java.util.Set;
8 |
9 | class RouterUtils {
10 | static Map objectToMap(Object obj) {
11 | Map map = new HashMap<>();
12 | if (obj == null) {
13 | return map;
14 | }
15 | if (obj instanceof Map) {
16 | Map tmp = (Map) obj;
17 | Set keySet = tmp.keySet();
18 | for (Object key : keySet) {
19 | Object value = tmp.get(key);
20 | if (value != null) {
21 | map.put(key.toString(), value);
22 | }
23 | }
24 | return map;
25 | }
26 | if (obj instanceof List) {
27 | List list = (List) obj;
28 | for (int i = 0; i < list.size(); i++) {
29 | map.put(String.valueOf(i), list.get(i));
30 | }
31 | return map;
32 | }
33 | Class> clazz = obj.getClass();
34 | for (Field field : clazz.getDeclaredFields()) {
35 | field.setAccessible(true);
36 | String fieldName = field.getName();
37 | try {
38 | Object value = field.get(obj);
39 | if (value != null) {
40 | map.put(fieldName, value);
41 | }
42 | } catch (IllegalAccessException e) {
43 | LoggerUtils.handleException(e);
44 | }
45 | }
46 | return map;
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/grouter/src/main/java/com/grouter/TaskRequest.java:
--------------------------------------------------------------------------------
1 | package com.grouter;
2 |
3 | import android.net.Uri;
4 | import androidx.annotation.NonNull;
5 |
6 | import java.util.HashMap;
7 | import java.util.Map;
8 |
9 | public class TaskRequest extends GRouterInterceptor.BaseRequest {
10 | private GRouterTaskBuilder taskBuilder;
11 | private GRouterTask task;
12 |
13 | public TaskRequest(GRouterTaskBuilder taskBuilder) {
14 | this.taskBuilder = taskBuilder;
15 | }
16 |
17 | public String getTaskClass() {
18 | return taskBuilder.cls;
19 | }
20 |
21 | public Uri getUri() {
22 | return taskBuilder.data;
23 | }
24 |
25 | public String getPath() {
26 | if (getUri() != null && getUri().getPath() != null) {
27 | return getUri().getPath().substring(1);
28 | }
29 | return "";
30 | }
31 |
32 | public Map getParams() {
33 | Map objectMap = new HashMap<>();
34 | objectMap.putAll(taskBuilder.params);
35 | objectMap.putAll(taskBuilder.uriParams);
36 | return objectMap;
37 | }
38 |
39 | GRouterTask getTask() {
40 | return task;
41 | }
42 |
43 | @Override
44 | public void onInterrupt(@NonNull Exception exception) {
45 | task = new ErrorTask(exception);
46 | super.onInterrupt(exception);
47 | }
48 |
49 | public void onContinue(@NonNull GRouterTask task) {
50 | this.task = task;
51 | this.interrupt = false;
52 | LoggerUtils.onContinue(this, task);
53 | }
54 |
55 | public void onContinueResult(@NonNull Object result) {
56 | onContinue(new MockTask(result));
57 | }
58 |
59 | }
--------------------------------------------------------------------------------
/grouter/src/main/java/com/grouter/fragment/FragmentBuilder.java:
--------------------------------------------------------------------------------
1 | package com.grouter.fragment;
2 |
3 | import android.os.Bundle;
4 | import androidx.annotation.IdRes;
5 | import androidx.annotation.Nullable;
6 | import androidx.fragment.app.Fragment;
7 | import androidx.fragment.app.FragmentManager;
8 | import android.text.TextUtils;
9 |
10 | public class FragmentBuilder {
11 | private Class extends Fragment> clazz;
12 | private String tag;
13 | private Fragment fragment;
14 | private Bundle args;
15 |
16 | public FragmentBuilder(Class extends Fragment> clazz, String tag) {
17 | this.clazz = clazz;
18 | this.tag = tag;
19 | }
20 |
21 | @SuppressWarnings("unchecked")
22 | public FragmentBuilder(String className, String tag) {
23 | try {
24 | this.clazz = (Class extends Fragment>) Class.forName(className);
25 | } catch (ClassNotFoundException e) {
26 | e.printStackTrace();
27 | }
28 | this.tag = tag;
29 | }
30 |
31 |
32 | public FragmentBuilder setArguments(@Nullable Bundle args) {
33 | this.args = args;
34 | return this;
35 | }
36 |
37 | public void addToView(FragmentManager fragmentManager, @IdRes int idRes) {
38 | fragmentManager.beginTransaction().add(idRes, getFragment(fragmentManager), tag).commit();
39 | }
40 |
41 | public Fragment getFragment(FragmentManager fragmentManager) {
42 | if (fragment != null) {
43 | return fragment;
44 | }
45 | fragment = newFragment(fragmentManager, tag);
46 | return fragment;
47 | }
48 |
49 | public Fragment newFragment(FragmentManager fragmentManager, String tag) {
50 | Fragment fragment = fragmentManager.findFragmentByTag(tag);
51 | if (!TextUtils.isEmpty(tag) && fragment != null) {
52 | return fragment;
53 | }
54 | try {
55 | fragment = clazz.newInstance();
56 | if (args != null) {
57 | fragment.setArguments(args);
58 | }
59 | return fragment;
60 | } catch (Exception e) {
61 | e.printStackTrace();
62 | }
63 | return null;
64 | }
65 |
66 | }
67 |
--------------------------------------------------------------------------------
/grouter/src/main/res/anim/activity_bottom_to_top_enter.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/grouter/src/main/res/anim/activity_bottom_to_top_exit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/grouter/src/main/res/anim/activity_left_to_right_enter.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/grouter/src/main/res/anim/activity_left_to_right_exit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/grouter/src/main/res/anim/activity_right_to_left_enter.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/grouter/src/main/res/anim/activity_right_to_left_exit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/grouter/src/main/res/anim/activity_top_to_bottom_enter.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/grouter/src/main/res/anim/activity_top_to_bottom_exit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/grouter/src/main/res/anim/fade_in.xml:
--------------------------------------------------------------------------------
1 |
19 |
20 |
25 |
--------------------------------------------------------------------------------
/grouter/src/main/res/anim/fade_out.xml:
--------------------------------------------------------------------------------
1 |
19 |
20 |
25 |
--------------------------------------------------------------------------------
/grouter/src/main/res/anim/no_anim.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
--------------------------------------------------------------------------------
/grouter/src/main/res/values/config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 300
4 | 400
5 |
--------------------------------------------------------------------------------
/grouter/src/test/java/com/grouter/GRouterTaskTest.java:
--------------------------------------------------------------------------------
1 | //package com.grouter;
2 | //
3 | //import org.junit.Test;
4 | //
5 | //import java.lang.reflect.ParameterizedType;
6 | //import java.util.ArrayList;
7 | //import java.util.Arrays;
8 | //import java.util.List;
9 | //
10 | //import static org.junit.Assert.*;
11 | //
12 | //public class GRouterTaskTest {
13 | // Object value;
14 | //
15 | // public List getList(Class clazz) {
16 | // if (value == null) {
17 | // return new ArrayList<>();
18 | // }
19 | //// if (GRouter.getSerialization() == null) {
20 | //// return null;
21 | //// }
22 | // try {
23 | // if (List.class.isAssignableFrom(value.getClass())) {
24 | // List list = (List) value;
25 | // if (list.size() == 0) {
26 | // return list;
27 | // }
28 | // Object first = list.get(0);
29 | // if (clazz.isAssignableFrom(first.getClass())) {
30 | // return (List) value;
31 | // }
32 | // } else {
33 | // throw new UnsupportedOperationException("value is " + value.getClass().getName());
34 | // }
35 | // System.out.println("反序列化");
36 | // return GRouter.getSerialization().deserializeList("", clazz);
37 | // } catch (Exception e) {
38 | // e.printStackTrace();
39 | // LoggerUtils.taskInfo(e);
40 | // }
41 | // return new ArrayList<>();
42 | // }
43 | //
44 | // @Test
45 | // public void execute() {
46 | // value = 1;
47 | //// value = Arrays.asList(new Runnable() {
48 | //// @Override
49 | //// public void run() {
50 | ////
51 | //// }
52 | //// }, new Thread());
53 | //
54 | //// List result = getList(Thread.class);
55 | ////
56 | //// for (Thread item : result) {
57 | //// System.out.println(item.getClass());
58 | //// System.out.println(item);
59 | //// }
60 | //
61 | // }
62 | //}
--------------------------------------------------------------------------------
/grouter/src/test/java/com/grouter/fragment/FragmentBuilderTest.java:
--------------------------------------------------------------------------------
1 | package com.grouter.fragment;
2 |
3 |
4 | import org.junit.Test;
5 |
6 | public class FragmentBuilderTest {
7 |
8 | @Test
9 | public void newFragment() {
10 | // FragmentBuilder fragmentBuilder = new FragmentBuilder(Fragment.class, "tag_1").setArguments(new Bundle());
11 | // fragmentBuilder.addToView(null,0);
12 | // fragmentBuilder.newFragment(null,null);
13 | }
14 | }
--------------------------------------------------------------------------------
/grouter/src/test/java/com/grouter/hybrid/GRouterJavascriptInterfaceTest.java:
--------------------------------------------------------------------------------
1 | package com.grouter.hybrid;
2 |
3 | import android.net.Uri;
4 |
5 | import org.junit.Test;
6 |
7 | import java.util.ArrayList;
8 | import java.util.List;
9 | import java.util.regex.Matcher;
10 | import java.util.regex.Pattern;
11 |
12 | import static org.junit.Assert.*;
13 |
14 | public class GRouterJavascriptInterfaceTest {
15 |
16 | @Test
17 | public void getTask() {
18 | }
19 |
20 | @Test
21 | public void startPage() {
22 | }
23 |
24 | @Test
25 | public void addAccessDomain() {
26 | List accessDomains = new ArrayList<>();
27 | accessDomains.add("*.grouter.com");
28 | String currentUrl = "https://wap.grouter.com";
29 |
30 | if (currentUrl == null || currentUrl.length() == 0) {
31 | System.out.println("匹配失败");
32 | return ;
33 | }
34 | try {
35 | Uri uri = Uri.parse(currentUrl);
36 | String host = uri.getHost();
37 | for (String reg : accessDomains) {
38 | if (host.equals(reg)) {
39 | System.out.println("匹配成功");
40 | return ;
41 | }
42 | if (reg.startsWith("*") && currentUrl.contains(reg.substring(2))) {
43 | System.out.println("匹配成功");
44 | return ;
45 | }
46 | }
47 | }catch (Exception e){
48 | e.printStackTrace();
49 | }
50 | System.out.println("匹配失败");
51 | return ;
52 | }
53 | }
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':grouter', ':grouter-kotlinextensions',
2 | ':grouter-compiler',
3 | ':grouter-annotation',
4 | ':grouter-gradle-plugin'
5 |
6 | apply from: "example/example.gradle"
7 |
8 | //include ':grouter-kotlin', ':grouter-flutter'
9 |
10 |
--------------------------------------------------------------------------------