From 0a7d22c27cca3b5df522ab74b59ab866a8de7056 Mon Sep 17 00:00:00 2001 From: mqzhangw Date: Fri, 8 Sep 2017 08:14:37 +0800 Subject: [PATCH 001/103] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8358e9a..026645c 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,8 @@ combuild { ``` 有关isRegisterCompoAuto的解释请参见上文第二篇文章 +关于如何定制化,请参看 [Wiki](https://github.com/luojilab/DDComponentForAndroid/wiki) + ### License   Copyright 2017  luoJiSiWei From 32aea2b6fc2203a09e415dd37b91af8bfc5a3808 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 17:19:13 +0800 Subject: [PATCH 002/103] Delete AndroidComponent.iml --- AndroidComponent.iml | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 AndroidComponent.iml diff --git a/AndroidComponent.iml b/AndroidComponent.iml deleted file mode 100644 index cdd69fd..0000000 --- a/AndroidComponent.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file From 055ca9d4b2466a968b2dc0dbb9e0727dc743fbd2 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 17:19:26 +0800 Subject: [PATCH 003/103] Delete AndroidComponentnew.iml --- AndroidComponentnew.iml | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 AndroidComponentnew.iml diff --git a/AndroidComponentnew.iml b/AndroidComponentnew.iml deleted file mode 100644 index ef51b06..0000000 --- a/AndroidComponentnew.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file From c6be84f33769d307d3c6c5fcc30fcc4a5bd18075 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 17:19:36 +0800 Subject: [PATCH 004/103] Delete ComponentDemo.iml --- ComponentDemo.iml | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 ComponentDemo.iml diff --git a/ComponentDemo.iml b/ComponentDemo.iml deleted file mode 100644 index b84e3c9..0000000 --- a/ComponentDemo.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file From 75cf93bba1869ddd78c1a648766f12722ec72707 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 17:19:48 +0800 Subject: [PATCH 005/103] Delete DDComponentForAndroid.iml --- DDComponentForAndroid.iml | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 DDComponentForAndroid.iml diff --git a/DDComponentForAndroid.iml b/DDComponentForAndroid.iml deleted file mode 100644 index 8db4d4e..0000000 --- a/DDComponentForAndroid.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file From 50b918afd693b51b9d7be009eb5eda075bf3c366 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 17:19:58 +0800 Subject: [PATCH 006/103] Delete MyApplication.iml --- MyApplication.iml | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 MyApplication.iml diff --git a/MyApplication.iml b/MyApplication.iml deleted file mode 100644 index 6ffdfe3..0000000 --- a/MyApplication.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file From 2792263cd389e34b564adfb3dc62ff92086952b5 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 18:52:30 +0800 Subject: [PATCH 007/103] Delete local.properties --- local.properties | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 local.properties diff --git a/local.properties b/local.properties deleted file mode 100644 index e443f8d..0000000 --- a/local.properties +++ /dev/null @@ -1,11 +0,0 @@ -## This file is automatically generated by Android Studio. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. -# -# Location of the SDK. This is only used by Gradle. -# For customization when using a Version Control System, please read the -# header note. -#Mon Aug 21 11:21:44 CST 2017 -sdk.dir=/Users/mrzhang/Library/Android/sdk From c6ff5dc347896b3f0a40715dfb29719da4363fce Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 18:54:33 +0800 Subject: [PATCH 008/103] =?UTF-8?q?=E5=88=A0=E9=99=A4.iml=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 +++ build-gradle/build-gradle.iml | 91 +---------------------------------- 2 files changed, 9 insertions(+), 89 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..916b245 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.iml +.gradle +/local.properties +/.idea +.DS_Store +/build +/captures \ No newline at end of file diff --git a/build-gradle/build-gradle.iml b/build-gradle/build-gradle.iml index 2820ec7..19dbd15 100644 --- a/build-gradle/build-gradle.iml +++ b/build-gradle/build-gradle.iml @@ -1,93 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 5094aeaa2db37a0423414e8e748f1fc39e7a6c8b Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 18:54:59 +0800 Subject: [PATCH 009/103] =?UTF-8?q?=E5=88=A0=E9=99=A4.iml=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/app.iml | 134 +------------------------- basiclib/basiclib.iml | 124 +----------------------- basicres/basicres.iml | 125 +----------------------- componentlib/componentlib.iml | 114 +--------------------- componentservice/componentservice.iml | 127 +----------------------- readercomponent/readercomponent.iml | 129 +------------------------ sharecomponent/sharecomponent.iml | 129 +------------------------ 7 files changed, 14 insertions(+), 868 deletions(-) diff --git a/app/app.iml b/app/app.iml index 9ad8818..19dbd15 100644 --- a/app/app.iml +++ b/app/app.iml @@ -1,136 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/basiclib/basiclib.iml b/basiclib/basiclib.iml index 12cec8e..19dbd15 100644 --- a/basiclib/basiclib.iml +++ b/basiclib/basiclib.iml @@ -1,126 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/basicres/basicres.iml b/basicres/basicres.iml index 48f6b01..19dbd15 100644 --- a/basicres/basicres.iml +++ b/basicres/basicres.iml @@ -1,127 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/componentlib/componentlib.iml b/componentlib/componentlib.iml index 2be6506..19dbd15 100644 --- a/componentlib/componentlib.iml +++ b/componentlib/componentlib.iml @@ -1,116 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - \ No newline at end of file diff --git a/componentservice/componentservice.iml b/componentservice/componentservice.iml index 69f3f3a..19dbd15 100644 --- a/componentservice/componentservice.iml +++ b/componentservice/componentservice.iml @@ -1,129 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/readercomponent/readercomponent.iml b/readercomponent/readercomponent.iml index 5c41cea..19dbd15 100644 --- a/readercomponent/readercomponent.iml +++ b/readercomponent/readercomponent.iml @@ -1,131 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/sharecomponent/sharecomponent.iml b/sharecomponent/sharecomponent.iml index f277834..19dbd15 100644 --- a/sharecomponent/sharecomponent.iml +++ b/sharecomponent/sharecomponent.iml @@ -1,131 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 9aa005ebca7f1ccb1c04bd602d397c600a87ef33 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 18:55:43 +0800 Subject: [PATCH 010/103] Delete app.iml --- app/app.iml | 136 ---------------------------------------------------- 1 file changed, 136 deletions(-) delete mode 100644 app/app.iml diff --git a/app/app.iml b/app/app.iml deleted file mode 100644 index 9ad8818..0000000 --- a/app/app.iml +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From e9c192ea802f621c40bcf23cb78ff68c1dd95aa9 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 18:55:59 +0800 Subject: [PATCH 011/103] Delete basiclib.iml --- basiclib/basiclib.iml | 126 ------------------------------------------ 1 file changed, 126 deletions(-) delete mode 100644 basiclib/basiclib.iml diff --git a/basiclib/basiclib.iml b/basiclib/basiclib.iml deleted file mode 100644 index 12cec8e..0000000 --- a/basiclib/basiclib.iml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From e06fa82cef514987e8da6f32ffc9bd6edeb28175 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 18:56:12 +0800 Subject: [PATCH 012/103] Delete basicres.iml --- basicres/basicres.iml | 127 ------------------------------------------ 1 file changed, 127 deletions(-) delete mode 100644 basicres/basicres.iml diff --git a/basicres/basicres.iml b/basicres/basicres.iml deleted file mode 100644 index 48f6b01..0000000 --- a/basicres/basicres.iml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 98a1348cd28069ff34317272964dbcc99c82fe39 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 18:56:27 +0800 Subject: [PATCH 013/103] Delete build-gradle.iml --- build-gradle/build-gradle.iml | 93 ----------------------------------- 1 file changed, 93 deletions(-) delete mode 100644 build-gradle/build-gradle.iml diff --git a/build-gradle/build-gradle.iml b/build-gradle/build-gradle.iml deleted file mode 100644 index 2820ec7..0000000 --- a/build-gradle/build-gradle.iml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 401fd9784b5dd48fe002845be6669f4d5fbdf952 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 18:56:39 +0800 Subject: [PATCH 014/103] Delete componentlib.iml --- componentlib/componentlib.iml | 116 ---------------------------------- 1 file changed, 116 deletions(-) delete mode 100644 componentlib/componentlib.iml diff --git a/componentlib/componentlib.iml b/componentlib/componentlib.iml deleted file mode 100644 index 2be6506..0000000 --- a/componentlib/componentlib.iml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 0154ff057abc12706d114bee55cbe13f5e6820fb Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 18:56:54 +0800 Subject: [PATCH 015/103] Delete componentservice.iml --- componentservice/componentservice.iml | 129 -------------------------- 1 file changed, 129 deletions(-) delete mode 100644 componentservice/componentservice.iml diff --git a/componentservice/componentservice.iml b/componentservice/componentservice.iml deleted file mode 100644 index 69f3f3a..0000000 --- a/componentservice/componentservice.iml +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 249294485c47b9e3a459d5c02dda25f7711db659 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 18:57:05 +0800 Subject: [PATCH 016/103] Delete readercomponent.iml --- readercomponent/readercomponent.iml | 131 ---------------------------- 1 file changed, 131 deletions(-) delete mode 100644 readercomponent/readercomponent.iml diff --git a/readercomponent/readercomponent.iml b/readercomponent/readercomponent.iml deleted file mode 100644 index 5c41cea..0000000 --- a/readercomponent/readercomponent.iml +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 8fb7e85cbbd4a2fae43f31c948515338080bdad5 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Mon, 11 Sep 2017 18:57:19 +0800 Subject: [PATCH 017/103] Delete sharecomponent.iml --- sharecomponent/sharecomponent.iml | 131 ------------------------------ 1 file changed, 131 deletions(-) delete mode 100644 sharecomponent/sharecomponent.iml diff --git a/sharecomponent/sharecomponent.iml b/sharecomponent/sharecomponent.iml deleted file mode 100644 index f277834..0000000 --- a/sharecomponent/sharecomponent.iml +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From e7188d2bf1f110639b5e37748053b3536ca4c845 Mon Sep 17 00:00:00 2001 From: EndSmile <745472638@qq.com> Date: Tue, 12 Sep 2017 08:47:47 +0800 Subject: [PATCH 018/103] =?UTF-8?q?=E5=B0=86=E4=BF=AE=E6=94=B9source?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E7=9A=84=E5=8A=9F=E8=83=BD=E6=94=BE?= =?UTF-8?q?=E5=85=A5gradle=E6=8F=92=E4=BB=B6=E5=86=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-gradle/build.gradle | 2 +- .../groovy/com.dd.buildgradle/ComBuild.groovy | 11 ++++++++- build.gradle | 2 +- readercomponent/build.gradle | 12 ---------- .../build-gradle/0.0.2/build-gradle-0.0.2.jar | Bin 0 -> 48502 bytes .../0.0.2/build-gradle-0.0.2.jar.md5 | 1 + .../0.0.2/build-gradle-0.0.2.jar.sha1 | 1 + .../build-gradle/0.0.2/build-gradle-0.0.2.pom | 22 ++++++++++++++++++ .../0.0.2/build-gradle-0.0.2.pom.md5 | 1 + .../0.0.2/build-gradle-0.0.2.pom.sha1 | 1 + .../build-gradle/maven-metadata.xml | 5 ++-- .../build-gradle/maven-metadata.xml.md5 | 2 +- .../build-gradle/maven-metadata.xml.sha1 | 2 +- sharecomponent/build.gradle | 11 --------- 14 files changed, 43 insertions(+), 30 deletions(-) create mode 100644 repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar create mode 100644 repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar.md5 create mode 100644 repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar.sha1 create mode 100644 repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.pom create mode 100644 repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.pom.md5 create mode 100644 repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.pom.sha1 diff --git a/build-gradle/build.gradle b/build-gradle/build.gradle index 3c7e919..26a1503 100644 --- a/build-gradle/build.gradle +++ b/build-gradle/build.gradle @@ -15,7 +15,7 @@ repositories { } group = 'com.mrzhang.andcomponent' -version = '0.0.1' +version = '0.0.2' uploadArchives { repositories { diff --git a/build-gradle/src/main/groovy/com.dd.buildgradle/ComBuild.groovy b/build-gradle/src/main/groovy/com.dd.buildgradle/ComBuild.groovy index 98c76b1..044a28f 100644 --- a/build-gradle/src/main/groovy/com.dd.buildgradle/ComBuild.groovy +++ b/build-gradle/src/main/groovy/com.dd.buildgradle/ComBuild.groovy @@ -31,8 +31,8 @@ public class ComBuild implements Plugin { //对于isRunAlone==true的情况需要根据实际情况修改其值, // 但如果是false,则不用修改,该module作为一个lib,运行module:assembleRelease则发布aar到中央仓库 boolean isRunAlone = Boolean.parseBoolean((project.properties.get("isRunAlone"))) + String mainmodulename = project.rootProject.property("mainmodulename") if (isRunAlone && assembleTask.isAssemble) { - String mainmodulename = project.rootProject.property("mainmodulename") //对于要编译的组件和主项目,isRunAlone修改为true,其他组件都强制修改为false //这就意味着组件不能引用主项目,这在层级结构里面也是这么规定的 if (module.equals(compilemodule) || module.equals(mainmodulename)) { @@ -46,6 +46,15 @@ public class ComBuild implements Plugin { //根据配置添加各种组件依赖,并且自动化生成组件加载代码 if (isRunAlone) { project.apply plugin: 'com.android.application' + if (!module.equals(mainmodulename)) { + project.android.sourceSets { + main { + manifest.srcFile 'src/main/runalone/AndroidManifest.xml' + java.srcDirs = ['src/main/java', 'src/main/runalone/java'] + res.srcDirs = ['src/main/res', 'src/main/runalone/res'] + } + } + } System.out.println("apply plugin is " + 'com.android.application'); if (assembleTask.isAssemble && module.equals(compilemodule)) { compileComponents(assembleTask, project) diff --git a/build.gradle b/build.gradle index 90cc5d4..69202a9 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' - classpath 'com.mrzhang.andcomponent:build-gradle:0.0.1' + classpath 'com.mrzhang.andcomponent:build-gradle:0.0.2' } } diff --git a/readercomponent/build.gradle b/readercomponent/build.gradle index c17ce1b..d38d0e0 100644 --- a/readercomponent/build.gradle +++ b/readercomponent/build.gradle @@ -27,18 +27,6 @@ android { resourcePrefix "readerbook_" - sourceSets { - main { - if (isRunAlone.toBoolean()) { - manifest.srcFile 'src/main/runalone/AndroidManifest.xml' - java.srcDirs = ['src/main/java', 'src/main/runalone/java'] - res.srcDirs = ['src/main/res', 'src/main/runalone/res'] - } else { - manifest.srcFile 'src/main/AndroidManifest.xml' - } - } - } - } dependencies { diff --git a/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar b/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..cd87b32f8b1f7b389ca1f55740415c83f9e3ebed GIT binary patch literal 48502 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 + + 4.0.0 + com.mrzhang.andcomponent + build-gradle + 0.0.2 + + + com.android.tools.build + gradle + 2.3.2 + compile + + + org.javassist + javassist + 3.20.0-GA + compile + + + diff --git a/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.pom.md5 b/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.pom.md5 new file mode 100644 index 0000000..06c5e2f --- /dev/null +++ b/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.pom.md5 @@ -0,0 +1 @@ +ffa35e4a308eef706abf4656eb1f9502 \ No newline at end of file diff --git a/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.pom.sha1 b/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.pom.sha1 new file mode 100644 index 0000000..d498875 --- /dev/null +++ b/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.pom.sha1 @@ -0,0 +1 @@ +66af111017db520230f4cd8890e514a20053cd45 \ No newline at end of file diff --git a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml index 45398c2..84eb57b 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml +++ b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml @@ -3,10 +3,11 @@ com.mrzhang.andcomponent build-gradle - 0.0.1 + 0.0.2 0.0.1 + 0.0.2 - 20170822072619 + 20170912004253 diff --git a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 index f42572f..070629a 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 +++ b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 @@ -1 +1 @@ -e8c8fd8e6525cb33c5843645ce43e961 \ No newline at end of file +96f8ca9061219a1454c4d8002031b307 \ No newline at end of file diff --git a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 index d567d10..8ba96d0 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 +++ b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 @@ -1 +1 @@ -3d5e982f4d8a222b8778ee340eb544465bc198a8 \ No newline at end of file +47d438afee116576a29c69d04dabecd9fdc8dd40 \ No newline at end of file diff --git a/sharecomponent/build.gradle b/sharecomponent/build.gradle index 5fef0c3..a404f20 100644 --- a/sharecomponent/build.gradle +++ b/sharecomponent/build.gradle @@ -22,17 +22,6 @@ android { resourcePrefix "share_" - sourceSets { - main { - if (isRunAlone.toBoolean()) { - manifest.srcFile 'src/main/runalone/AndroidManifest.xml' - java.srcDirs = ['src/main/java', 'src/main/runalone/java'] - res.srcDirs = ['src/main/res', 'src/main/runalone/res'] - } else { - manifest.srcFile 'src/main/AndroidManifest.xml' - } - } - } } dependencies { From 80e2c6dcd7a777762dcb6f4c89418a0503c50b0a Mon Sep 17 00:00:00 2001 From: zhangls <664271046@qq.com> Date: Tue, 12 Sep 2017 19:00:23 +0800 Subject: [PATCH 019/103] Update proguard-rules.pro --- app/proguard-rules.pro | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 8415401..9c6e3fa 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -25,4 +25,6 @@ #-renamesourcefileattribute SourceFile -keep class com.mrzhang.component.componentlib.** {*;} -keep class * implements com.mrzhang.component.componentlib.applicationlike.IApplicationLike {*;} - +-dontwarn okio.** +-dontwarn okhttp3.** +-dontwarn com.squareup.** From c83c5cb63ec14bfa4e3c1856a904210e1e2e458a Mon Sep 17 00:00:00 2001 From: mrzhang Date: Wed, 13 Sep 2017 10:44:44 +0800 Subject: [PATCH 020/103] =?UTF-8?q?=E6=89=93=E5=8C=85=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E5=8F=AA=E4=BC=9AaR=E7=BC=A9=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groovy/com.dd.buildgradle/ComBuild.groovy | 4 +++- componentrelease/readercomponent-release.aar | Bin 18121 -> 18121 bytes componentrelease/sharecomponent-release.aar | Bin 17908 -> 17960 bytes .../build-gradle/0.0.2/build-gradle-0.0.2.jar | Bin 48502 -> 48536 bytes .../0.0.2/build-gradle-0.0.2.jar.md5 | 2 +- .../0.0.2/build-gradle-0.0.2.jar.sha1 | 2 +- .../build-gradle/maven-metadata.xml | 2 +- .../build-gradle/maven-metadata.xml.md5 | 2 +- .../build-gradle/maven-metadata.xml.sha1 | 2 +- 9 files changed, 8 insertions(+), 6 deletions(-) diff --git a/build-gradle/src/main/groovy/com.dd.buildgradle/ComBuild.groovy b/build-gradle/src/main/groovy/com.dd.buildgradle/ComBuild.groovy index 044a28f..6ab7bce 100644 --- a/build-gradle/src/main/groovy/com.dd.buildgradle/ComBuild.groovy +++ b/build-gradle/src/main/groovy/com.dd.buildgradle/ComBuild.groovy @@ -111,7 +111,9 @@ public class ComBuild implements Plugin { private AssembleTask getTaskInfo(List taskNames) { AssembleTask assembleTask = new AssembleTask(); for (String task : taskNames) { - if (task.toUpperCase().contains("ASSEMBLE") || task.toUpperCase().contains("RESGUARD")) { + if (task.toUpperCase().contains("ASSEMBLE") + || task.contains("aR") + || task.toUpperCase().contains("RESGUARD")) { if (task.toUpperCase().contains("DEBUG")) { assembleTask.isDebug = true; } diff --git a/componentrelease/readercomponent-release.aar b/componentrelease/readercomponent-release.aar index 5ba3073807df4a37fb8c9b94096e2217e31fa4d3..f0431aa8bb945f57bda7ecd45e503de7473eb832 100644 GIT binary patch delta 219 zcmX@v%XqSvkvG7bnT3mifrEpgEl77GuQelcdywvCZ^p0OV1_gAUSkkrGP9#1m{xbx z080cpCW4ht-sS`rnEcSGpBZSxp=Kdh#U~5it8DR8Gk?1kA5=g{a-+>Hs#QAE;KqO%yDr;bsKYuMejC-K+p#yhGps delta 219 zcmX@v%XqSvkvG7bnT3mifrEn~s77ofuQekxklyUg_>~*XaOT}>3}Q@Xc2oq@>W&&< zi6F;Bu+qufoWKH;A3F7e6%;!wf$15}DqwoQGeqNKD4)y44lM5NVg{yLTnxZ;tef=Y sOD-Z{_DiUol4}Tt*;vo+j|z;vveK2**M01-Msv;Y7A diff --git a/componentrelease/sharecomponent-release.aar b/componentrelease/sharecomponent-release.aar index 11e8d53aed2554e38ec44bd00b1950475fbbdecf..0bfd9b2efd5c22b8196fd84ab685da03836d61c5 100644 GIT binary patch delta 3457 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 gKD8vK2;=ulKW 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
L&WV>u|XO3`4Kd4YlF%yOwk^P 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

-6P`zwf? zy~VZ&P8wmwXBw?Em!wU)XW~(D=JYPr;hklVgbenr(VUUDkg^5)!Rt`%2a<;5nKA5K z2vjUv!&slm;QP^y(&RrlNMnU>z0Lz1;M+| zz-R4Cwj#B+j;#j_0dv?`fjBiP$`g=43+$cJ<=$M+h>sIZGv zf-AOPG{>KnUN0o_8AA{%e~o?1MLO8lez&TYalw$nNzdJbU9UEvV|#87h38#X9me-z zlFv0lo&P=H{v}1Vw;n8$tXJpDR29EX3aAKF4+bRP>`CF8^Ew)w5Is#KrB%K=yA-qf zT%29$PPS8bzN7$RVT~Zv>%97dUWiM`9BV+PR zwZ3gAT7N~K8W)yni2@uhh9OA`HJZdP+`jnT+r}l zEBobT#VEnf8-mmy4><)vNr9}m&C;Kgw)0C@7l|7^99ukoUw01d8Tz3!CengyQ`$WdvQwn9f7MAeuEQ$E;$Xr%BUX_#bqplJFVv{MVdN6qF zD)!0B{+#A-FWxhRp}cY^?U8TteQx#s$HIM9EuS*xZtjI!mTMzQe+eA|jTATER>rq$ zQ@qjyZ7=3;C9b>W{MofPtCZ9xPrXY8Vpe&_;^}zbH8J|F)$$G*IxaB=FdK=rcZ;oT z(!s|>Yh3#`-1kV0{@P;$G~O__Wk$;kooPO>4V`J7B-9SsiP^h9x`@JDi-4D!f3z(7i+_@;9H%f|z@dVmSEd zR$slPTHLctcA+;*p*yPZOTHzsTeUnc6yhNuEf$o~`{8%*pR#;xTbN$H4g(eaZ;K)z zy(vsO{BPqPQ&A4(xnHlR(e*bVG89LBW(=)H|Mv75Ko0oNOhzE^S3?rD@;7yp;QUu? zn<@2|sn2Wu8`zfSKL=p+8op<@bj`-|)Bu>Sk@p`0Y}^R^GjjmmYUFuF!Y0vYUayJ$ z8DpBbp0T${9rp5UgJ6itcsag&HZ}K3#RTJYseHrjUtHiUM zrHvF$LmHeUEeZxY(O>@~vYEPz-$#al@x+0Fk^R%W`QKF>w5jk%C;-maKm(g7B7+~> z(4W^pZzqLg()c$;3g-CqmyY>E9~wNdyWTMGLO! zznp8cYqNa2nn|D`$pDd~9) z-V%}oY*ZMSuedNU(*IdwB;j8%BN(d_kK&&P_CEhk`vVaMrUnBBM(96cL9lq|^DGEB zzLOL#DDPh@1^7?-&-*ka|LQYEf`Ng>f`Os^ueJ1FF&db+3-`HJg)UOK_3A$~0hpr( z2}@NG77ic&@9@c=GQdfH(l2ZNmj*l4;DT4X{vPGgpVVyw*rAc+|8sG4lftrtmAYk+ K>Kgwk;Qs;NanBY2 diff --git a/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar.md5 b/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar.md5 index 60cfa4f..1cbd194 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar.md5 +++ b/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar.md5 @@ -1 +1 @@ -252d7568a21fd264f7709b598a3b10ef \ No newline at end of file +df4a49c46427903f323e04cfd3154674 \ No newline at end of file diff --git a/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar.sha1 b/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar.sha1 index 4153813..91da769 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar.sha1 +++ b/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar.sha1 @@ -1 +1 @@ -418b50bada1286b96fba53072b2dd086e8ade4ce \ No newline at end of file +9c3628effe6439a49408a0ea29e4d61e84c29966 \ No newline at end of file diff --git a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml index 84eb57b..abbc778 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml +++ b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml @@ -8,6 +8,6 @@ 0.0.1 0.0.2 - 20170912004253 + 20170913021630 diff --git a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 index 070629a..83f73e9 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 +++ b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 @@ -1 +1 @@ -96f8ca9061219a1454c4d8002031b307 \ No newline at end of file +2f7f7b5520212ff931f60ba115aa8ccc \ No newline at end of file diff --git a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 index 8ba96d0..2edd313 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 +++ b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 @@ -1 +1 @@ -47d438afee116576a29c69d04dabecd9fdc8dd40 \ No newline at end of file +b72cdc76b0766b2d5e59e22f1ca6f91c5382c6c8 \ No newline at end of file From d6e6d27e8eb37e416007c8e316df39e2b8f5cefd Mon Sep 17 00:00:00 2001 From: mrzhang Date: Wed, 13 Sep 2017 12:07:57 +0800 Subject: [PATCH 021/103] fix bug in unregisterComponent --- .../component/componentlib/router/Router.java | 60 ++++++++++++++++--- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java index e09aabb..73063a3 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java @@ -1,5 +1,8 @@ package com.mrzhang.component.componentlib.router; +import android.support.annotation.Nullable; +import android.text.TextUtils; + import com.mrzhang.component.componentlib.applicationlike.IApplicationLike; import java.util.HashMap; @@ -11,6 +14,8 @@ public class Router { private HashMap services = new HashMap<>(); + //注册的组件的集合 + private static HashMap components = new HashMap<>(); private static volatile Router instance; @@ -49,23 +54,62 @@ public synchronized void removeService(String serviceName) { services.remove(serviceName); } - public static void registerComponent(String classname) { +// public static void registerComponent(String classname) { +// try { +// Class clazz = Class.forName(classname); +// IApplicationLike applicationLike = (IApplicationLike) clazz.newInstance(); +// applicationLike.onCreate(); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// public static void unregisterComponent(String classname) { +// try { +// Class clazz = Class.forName(classname); +// IApplicationLike applicationLike = (IApplicationLike) clazz.newInstance(); +// applicationLike.onStop(); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + + + /** + * 注册组件 + * + * @param classname 组件名 + */ + public static void registerComponent(@Nullable String classname) { + if (TextUtils.isEmpty(classname)) { + return; + } + if (components.keySet().contains(classname)) { + return; + } try { Class clazz = Class.forName(classname); IApplicationLike applicationLike = (IApplicationLike) clazz.newInstance(); applicationLike.onCreate(); + components.put(classname, applicationLike); } catch (Exception e) { e.printStackTrace(); } } - public static void unregisterComponent(String classname) { - try { - Class clazz = Class.forName(classname); - IApplicationLike applicationLike = (IApplicationLike) clazz.newInstance(); - applicationLike.onStop(); - } catch (Exception e) { - e.printStackTrace(); + /** + * 反注册组件 + * + * @param classname 组件名 + */ + public static void unregisterComponent(@Nullable String classname) { + if (TextUtils.isEmpty(classname)) { + return; + } + if (components.keySet().contains(classname)) { + components.get(classname).onStop(); + components.remove(classname); + return; } } From 5688ea0d85e751ffc102ce23744a576a0b4afea6 Mon Sep 17 00:00:00 2001 From: mrzhang Date: Thu, 14 Sep 2017 19:04:53 +0800 Subject: [PATCH 022/103] fix issue #12 https://github.com/luojilab/DDComponentForAndroid/issues/12 --- .../component/componentlib/router/Router.java | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java index 73063a3..0b73204 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java @@ -54,27 +54,6 @@ public synchronized void removeService(String serviceName) { services.remove(serviceName); } -// public static void registerComponent(String classname) { -// try { -// Class clazz = Class.forName(classname); -// IApplicationLike applicationLike = (IApplicationLike) clazz.newInstance(); -// applicationLike.onCreate(); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// -// public static void unregisterComponent(String classname) { -// try { -// Class clazz = Class.forName(classname); -// IApplicationLike applicationLike = (IApplicationLike) clazz.newInstance(); -// applicationLike.onStop(); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } - - /** * 注册组件 * @@ -111,6 +90,14 @@ public static void unregisterComponent(@Nullable String classname) { components.remove(classname); return; } + try { + Class clazz = Class.forName(classname); + IApplicationLike applicationLike = (IApplicationLike) clazz.newInstance(); + applicationLike.onStop(); + components.remove(classname); + } catch (Exception e) { + e.printStackTrace(); + } } } From 994abaf4a424d2fc7a56682524414101713734b5 Mon Sep 17 00:00:00 2001 From: mqzhangw Date: Fri, 15 Sep 2017 12:07:20 +0800 Subject: [PATCH 023/103] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 026645c..f59ef3d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ demo解读请参考文章[Android彻底组件化demo发布](http://www.jianshu.c ### 实现功能: - 组件可以单独调试 - 组件之间通过接口+实现的方式进行数据传输 -- 使用schme和host路由的方式进行activity之间的跳转 +- 使用scheme和host路由的方式进行activity之间的跳转 - 任意组件可以充当host,集成其他组件进行集成调试 - 可以动态对已集成的组件进行加载和卸载 - 杜绝组件之前相互耦合,代码完全隔离,彻底解耦 From 6efe9344828394eb2d772d31561756f1a8c4c947 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Mon, 18 Sep 2017 11:29:01 +0800 Subject: [PATCH 024/103] [master] [fix spelling error of 'applicaton'] --- .../main/groovy/com.dd.buildgradle/ComCodeTransform.groovy | 2 +- .../groovy/com.dd.buildgradle/exten/ComExtension.groovy | 4 ++-- .../mrzhang/component/componentlib/router/ui/UIRouter.java | 7 +++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/build-gradle/src/main/groovy/com.dd.buildgradle/ComCodeTransform.groovy b/build-gradle/src/main/groovy/com.dd.buildgradle/ComCodeTransform.groovy index 8997ccc..81b891e 100644 --- a/build-gradle/src/main/groovy/com.dd.buildgradle/ComCodeTransform.groovy +++ b/build-gradle/src/main/groovy/com.dd.buildgradle/ComCodeTransform.groovy @@ -92,7 +92,7 @@ public class ComCodeTransform extends Transform { private void getRealApplicationName(Collection inputs) { - applicationName = project.extensions.combuild.applicatonName + applicationName = project.extensions.combuild.applicationName if (applicationName == null || applicationName.isEmpty()) { throw new RuntimeException("you should set applicationName in combuild") } diff --git a/build-gradle/src/main/groovy/com.dd.buildgradle/exten/ComExtension.groovy b/build-gradle/src/main/groovy/com.dd.buildgradle/exten/ComExtension.groovy index f96025d..d92ee1c 100644 --- a/build-gradle/src/main/groovy/com.dd.buildgradle/exten/ComExtension.groovy +++ b/build-gradle/src/main/groovy/com.dd.buildgradle/exten/ComExtension.groovy @@ -9,10 +9,10 @@ public class ComExtension { boolean isRegisterCompoAuto = false; /** - * 当前组件的applicatonName,用于字节码插入。 + * 当前组件的applicationName,用于字节码插入。 * 当isRegisterCompoAuto==true的时候是必须的 */ - String applicatonName + String applicationName } \ No newline at end of file diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java index 141252c..c21b384 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java @@ -75,7 +75,10 @@ public void unregisterUI(IComponentRouter router) { public boolean openUri(Context context, String url, Bundle bundle) { url = url.trim(); if (!TextUtils.isEmpty(url)) { - if (url.indexOf("://") < 0 && (!url.startsWith("tel:") || !url.startsWith("smsto:") || !url.startsWith("file:"))) { + if (!url.contains("://") && + (!url.startsWith("tel:") || + !url.startsWith("smsto:") || + !url.startsWith("file:"))) { url = "http://" + url; } Uri uri = Uri.parse(url); @@ -92,7 +95,7 @@ public boolean openUri(Context context, Uri uri, Bundle bundle) { return true; } } catch (Exception e) { - + e.printStackTrace(); } } return false; From 6bb823b56bac456bddd36879c11b818743f4e8a6 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Mon, 18 Sep 2017 12:13:02 +0800 Subject: [PATCH 025/103] [anno] [add annotation module; add router&autowired annotation ] --- router-annotation/.gitignore | 1 + router-annotation/build.gradle | 8 ++++ .../router/facade/annotation/Autowired.java | 36 +++++++++++++++ .../router/facade/annotation/RouteDef.java | 46 +++++++++++++++++++ settings.gradle | 2 +- 5 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 router-annotation/.gitignore create mode 100644 router-annotation/build.gradle create mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/annotation/Autowired.java create mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/annotation/RouteDef.java diff --git a/router-annotation/.gitignore b/router-annotation/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/router-annotation/.gitignore @@ -0,0 +1 @@ +/build diff --git a/router-annotation/build.gradle b/router-annotation/build.gradle new file mode 100644 index 0000000..49df001 --- /dev/null +++ b/router-annotation/build.gradle @@ -0,0 +1,8 @@ +apply plugin: 'java' + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) +} + +sourceCompatibility = "1.7" +targetCompatibility = "1.7" diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Autowired.java b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Autowired.java new file mode 100644 index 0000000..acfa005 --- /dev/null +++ b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Autowired.java @@ -0,0 +1,36 @@ +package com.ljsw.router.facade.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

Package: com.ljsw.router.facade.annotation

+ *

Project: DDComponentForAndroid

+ *

Classname: Autowired

+ *

Description: used to auto-inject dependency

+ * Created by leobert on 2017/9/18. + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.CLASS) +public @interface Autowired { + /** + * @return param's name or service name. + */ + String name() default ""; + + /** + * primitive java type check will be ignore + * check the result of DI, if inject failed, the value of + * the field will be null, if required, burst crash + * + * @return true for required,false otherwise + */ + boolean required() default false; + + /** + * @return feild description + */ + String desc() default "none desc."; +} diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/annotation/RouteDef.java b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/RouteDef.java new file mode 100644 index 0000000..cc31935 --- /dev/null +++ b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/RouteDef.java @@ -0,0 +1,46 @@ +package com.ljsw.router.facade.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

Package: com.ljsw.router.facade.annotation

+ *

Project: DDComponentForAndroid

+ *

Classname: RouteDef

+ *

Description: used to decline a route

+ * Created by leobert on 2017/9/18. + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.CLASS) +public @interface RouteDef { + /** + * path of one route + */ + String path(); + + /** + * refers to one group that contains a series of similar or related routers. + * use common words. + * e.g. + * '/user/login' and '/user/register' can be merger into group 'user' + * + */ + String group() default ""; + + /** + * Name of route, used to generate javadoc. + */ + String name() default "undefined"; + + /** + * Extra data, can be set by user. + */ + int extras() default Integer.MIN_VALUE; + + /** + * The priority of route. + */ + int priority() default -1; +} diff --git a/settings.gradle b/settings.gradle index 125ddce..c0966af 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':componentlib', ':readercomponent', ':sharecomponent', ':componentservice', ':build-gradle', ':basiclib', ':basicres' +include ':app', ':componentlib', ':readercomponent', ':sharecomponent', ':componentservice', ':build-gradle', ':basiclib', ':basicres', ':router-annotation' From 72b26c25cf7e02748c11283df26f6e7b0d9dd715 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Mon, 18 Sep 2017 16:37:29 +0800 Subject: [PATCH 026/103] [anno] [add json compnent] --- .../router/ui/IComponentRouter.java | 14 ++++----- .../componentlib/router/ui/IUIRouter.java | 1 + .../componentlib/router/ui/UIRouter.java | 10 +++--- .../readerbook/ReadBookService.java | 1 + jsoncompnent/.gitignore | 1 + jsoncompnent/build.gradle | 31 +++++++++++++++++++ jsoncompnent/proguard-rules.pro | 25 +++++++++++++++ .../json/ExampleInstrumentedTest.java | 26 ++++++++++++++++ jsoncompnent/src/main/AndroidManifest.xml | 10 ++++++ jsoncompnent/src/main/res/values/strings.xml | 3 ++ .../ljsw/component/json/ExampleUnitTest.java | 17 ++++++++++ settings.gradle | 11 ++++++- 12 files changed, 137 insertions(+), 13 deletions(-) create mode 100644 jsoncompnent/.gitignore create mode 100644 jsoncompnent/build.gradle create mode 100644 jsoncompnent/proguard-rules.pro create mode 100644 jsoncompnent/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java create mode 100644 jsoncompnent/src/main/AndroidManifest.xml create mode 100644 jsoncompnent/src/main/res/values/strings.xml create mode 100644 jsoncompnent/src/test/java/com/ljsw/component/json/ExampleUnitTest.java diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/IComponentRouter.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/IComponentRouter.java index e87da69..1f6af21 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/IComponentRouter.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/IComponentRouter.java @@ -5,23 +5,21 @@ import android.os.Bundle; /** + * router behaviors for component type * Created by mrzhang on 2017/6/20. */ - public interface IComponentRouter { /** * 打开一个链接 * - * @param url - * 目标url可以是http 或者 自定义scheme - * @param bundle - * 打开目录activity时要传入的参数。建议只传基本类型参数。 + * @param url 目标url可以是http 或者 自定义scheme + * @param bundle 打开目录activity时要传入的参数。建议只传基本类型参数。 * @return 是否正常打开 */ - public boolean openUri(Context context, String url, Bundle bundle); + boolean openUri(Context context, String url, Bundle bundle); - public boolean openUri(Context context,Uri uri, Bundle bundle); + boolean openUri(Context context, Uri uri, Bundle bundle); - public boolean verifyUri(Uri uri); + boolean verifyUri(Uri uri); } diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/IUIRouter.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/IUIRouter.java index 0bec77a..2facb10 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/IUIRouter.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/IUIRouter.java @@ -1,6 +1,7 @@ package com.mrzhang.component.componentlib.router.ui; /** + * router behaviors for component type, sub of {@link IComponentRouter} * Created by mrzhang on 2017/6/20. */ diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java index c21b384..cd2168a 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java @@ -9,16 +9,18 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; /** + * Singleton implement of {@link IUIRouter} + * provides services for UI-Component + *

* Created by mrzhang on 2017/6/20. */ public class UIRouter implements IUIRouter { - List uiRouters = new ArrayList(); - HashMap priorities = new HashMap(); + private List uiRouters = new ArrayList<>(); + private HashMap priorities = new HashMap<>(); private static volatile UIRouter instance; @@ -52,7 +54,7 @@ public void registerUI(IComponentRouter router, int priority) { i++; } uiRouters.add(i, router); - priorities.put(router, Integer.valueOf(priority)); + priorities.put(router, priority); } @Override diff --git a/componentservice/src/main/java/com/mrzhang/componentservice/readerbook/ReadBookService.java b/componentservice/src/main/java/com/mrzhang/componentservice/readerbook/ReadBookService.java index b818822..5bf451d 100644 --- a/componentservice/src/main/java/com/mrzhang/componentservice/readerbook/ReadBookService.java +++ b/componentservice/src/main/java/com/mrzhang/componentservice/readerbook/ReadBookService.java @@ -3,6 +3,7 @@ import android.support.v4.app.Fragment; /** + * export module services * Created by mrzhang on 2017/6/15. */ diff --git a/jsoncompnent/.gitignore b/jsoncompnent/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/jsoncompnent/.gitignore @@ -0,0 +1 @@ +/build diff --git a/jsoncompnent/build.gradle b/jsoncompnent/build.gradle new file mode 100644 index 0000000..e606bec --- /dev/null +++ b/jsoncompnent/build.gradle @@ -0,0 +1,31 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 26 + buildToolsVersion "26.0.1" + + defaultConfig { + minSdkVersion 14 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile 'com.android.support:appcompat-v7:26.+' + testCompile 'junit:junit:4.12' +} diff --git a/jsoncompnent/proguard-rules.pro b/jsoncompnent/proguard-rules.pro new file mode 100644 index 0000000..12ec531 --- /dev/null +++ b/jsoncompnent/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/leobert/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/jsoncompnent/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java b/jsoncompnent/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java new file mode 100644 index 0000000..9d4c1f0 --- /dev/null +++ b/jsoncompnent/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.ljsw.component.json; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.ljsw.component.json.test", appContext.getPackageName()); + } +} diff --git a/jsoncompnent/src/main/AndroidManifest.xml b/jsoncompnent/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1acc70f --- /dev/null +++ b/jsoncompnent/src/main/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/jsoncompnent/src/main/res/values/strings.xml b/jsoncompnent/src/main/res/values/strings.xml new file mode 100644 index 0000000..c272083 --- /dev/null +++ b/jsoncompnent/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + JsonCompnent + diff --git a/jsoncompnent/src/test/java/com/ljsw/component/json/ExampleUnitTest.java b/jsoncompnent/src/test/java/com/ljsw/component/json/ExampleUnitTest.java new file mode 100644 index 0000000..e1dc8d5 --- /dev/null +++ b/jsoncompnent/src/test/java/com/ljsw/component/json/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.ljsw.component.json; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index c0966af..0b1d8a0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,10 @@ -include ':app', ':componentlib', ':readercomponent', ':sharecomponent', ':componentservice', ':build-gradle', ':basiclib', ':basicres', ':router-annotation' +include ':app', ':jsoncompnent', + ':componentlib', + ':readercomponent', + ':sharecomponent', + ':componentservice', + ':build-gradle', + ':basiclib', + ':basicres', + ':router-annotation', + ':router-anno-compiler' From 3e1af2c4ba199476cd478a0b98467fd769e5bf81 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Mon, 18 Sep 2017 20:54:49 +0800 Subject: [PATCH 027/103] [anno] [fix json component error] --- app/build.gradle | 2 ++ app/gradle.properties | 2 +- .../com/mrzhang/component/MainActivity.java | 3 ++ .../componentservice/json/JsonService.java | 17 ++++++++++ jsoncompnent/build.gradle | 31 ++++++++++--------- jsoncompnent/gradle.properties | 18 +++++++++++ jsoncompnent/src/main/AndroidManifest.xml | 4 ++- .../component/json/applike/JsonAppLike.java | 26 ++++++++++++++++ .../json/serviceimpl/JsonServiceImpl.java | 24 ++++++++++++++ .../src/main/runalone/AndroidManifest.xml | 13 ++++++++ .../runalone/application/JsonApplication.java | 14 +++++++++ readercomponent/build.gradle | 2 +- .../com/mrzhang/reader/ReaderFragment.java | 4 ++- sharecomponent/build.gradle | 3 ++ .../java/com/mrzhang/share/ShareActivity.java | 12 +++++++ .../main/res/layout/share_activity_share.xml | 1 + 16 files changed, 158 insertions(+), 18 deletions(-) create mode 100644 componentservice/src/main/java/com/mrzhang/componentservice/json/JsonService.java create mode 100644 jsoncompnent/gradle.properties create mode 100644 jsoncompnent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java create mode 100644 jsoncompnent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java create mode 100644 jsoncompnent/src/main/runalone/AndroidManifest.xml create mode 100644 jsoncompnent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java diff --git a/app/build.gradle b/app/build.gradle index ee009a6..213098b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,6 +26,8 @@ android { dependencies { compile project(':componentservice') + + annotationProcessor project(':router-anno-compiler') } combuild { diff --git a/app/gradle.properties b/app/gradle.properties index 95a5887..726255b 100644 --- a/app/gradle.properties +++ b/app/gradle.properties @@ -13,6 +13,6 @@ org.gradle.jvmargs=-Xmx1536m # org.gradle.parallel=true isRunAlone=true debugComponent=readercomponent,com.mrzhang.share:sharecomponent -compileComponent=readercomponent,sharecomponent +compileComponent=readercomponent,sharecomponent,jsoncomponent diff --git a/app/src/main/java/com/mrzhang/component/MainActivity.java b/app/src/main/java/com/mrzhang/component/MainActivity.java index 16d052e..a46d0b8 100644 --- a/app/src/main/java/com/mrzhang/component/MainActivity.java +++ b/app/src/main/java/com/mrzhang/component/MainActivity.java @@ -4,10 +4,12 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; +import android.util.Log; import android.view.View; import android.widget.Button; import com.mrzhang.component.componentlib.router.Router; +import com.mrzhang.componentservice.json.JsonService; import com.mrzhang.componentservice.readerbook.ReadBookService; public class MainActivity extends AppCompatActivity implements View.OnClickListener { @@ -30,6 +32,7 @@ protected void onCreate(Bundle savedInstanceState) { showFragment(); } + private void showFragment() { if (fragment != null) { ft = getSupportFragmentManager().beginTransaction(); diff --git a/componentservice/src/main/java/com/mrzhang/componentservice/json/JsonService.java b/componentservice/src/main/java/com/mrzhang/componentservice/json/JsonService.java new file mode 100644 index 0000000..ec6ecda --- /dev/null +++ b/componentservice/src/main/java/com/mrzhang/componentservice/json/JsonService.java @@ -0,0 +1,17 @@ +package com.mrzhang.componentservice.json; + +/** + *

Package: com.mrzhang.componentservice.json

+ *

Project: DDComponentForAndroid

+ *

Classname: JsonService

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public interface JsonService { + + T json2Object(String text, Class clazz); + + String object2Json(Object instance); + +} diff --git a/jsoncompnent/build.gradle b/jsoncompnent/build.gradle index e606bec..495e04b 100644 --- a/jsoncompnent/build.gradle +++ b/jsoncompnent/build.gradle @@ -1,31 +1,34 @@ -apply plugin: 'com.android.library' +apply plugin: 'com.dd.comgradle' android { - compileSdkVersion 26 - buildToolsVersion "26.0.1" - + compileSdkVersion 25 + buildToolsVersion "25.0.2" defaultConfig { - minSdkVersion 14 - targetSdkVersion 26 + minSdkVersion 15 + targetSdkVersion 14 versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } + buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } + debug { + minifyEnabled false + } } + resourcePrefix "json_" } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { - exclude group: 'com.android.support', module: 'support-annotations' - }) - compile 'com.android.support:appcompat-v7:26.+' - testCompile 'junit:junit:4.12' + compile project(':componentservice') + compile 'com.alibaba:fastjson:1.1.63.android' } + +combuild { + applicatonName = 'com.ljsw.component.json.runalone.application.JsonApplication' + isRegisterCompoAuto = true +} \ No newline at end of file diff --git a/jsoncompnent/gradle.properties b/jsoncompnent/gradle.properties new file mode 100644 index 0000000..1483cb1 --- /dev/null +++ b/jsoncompnent/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +isRunAlone=true diff --git a/jsoncompnent/src/main/AndroidManifest.xml b/jsoncompnent/src/main/AndroidManifest.xml index 1acc70f..64bc793 100644 --- a/jsoncompnent/src/main/AndroidManifest.xml +++ b/jsoncompnent/src/main/AndroidManifest.xml @@ -2,7 +2,9 @@ package="com.ljsw.component.json"> - diff --git a/jsoncompnent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java b/jsoncompnent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java new file mode 100644 index 0000000..fae6db1 --- /dev/null +++ b/jsoncompnent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java @@ -0,0 +1,26 @@ +package com.ljsw.component.json.applike; + +import com.mrzhang.component.componentlib.applicationlike.IApplicationLike; + +/** + *

Package: com.ljsw.component.json.applike

+ *

Project: DDComponentForAndroid

+ *

Classname: JsonAppLike

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public class JsonAppLike implements IApplicationLike { + +// UIRouter uiRouter = UIRouter.getInstance(); + + //no ui-router for register + + @Override + public void onCreate() { + } + + @Override + public void onStop() { + } +} diff --git a/jsoncompnent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java b/jsoncompnent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java new file mode 100644 index 0000000..90b61f6 --- /dev/null +++ b/jsoncompnent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java @@ -0,0 +1,24 @@ +package com.ljsw.component.json.serviceimpl; + +import com.alibaba.fastjson.JSON; +import com.mrzhang.componentservice.json.JsonService; + +/** + *

Package: com.ljsw.component.json.serviceimpl

+ *

Project: DDComponentForAndroid

+ *

Classname: JsonServiceImpl

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public class JsonServiceImpl implements JsonService { + @Override + public T json2Object(String text, Class clazz) { + return JSON.parseObject(text,clazz); + } + + @Override + public String object2Json(Object instance) { + return JSON.toJSONString(instance); + } +} diff --git a/jsoncompnent/src/main/runalone/AndroidManifest.xml b/jsoncompnent/src/main/runalone/AndroidManifest.xml new file mode 100644 index 0000000..2d455bf --- /dev/null +++ b/jsoncompnent/src/main/runalone/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/jsoncompnent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java b/jsoncompnent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java new file mode 100644 index 0000000..0c32062 --- /dev/null +++ b/jsoncompnent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java @@ -0,0 +1,14 @@ +package com.ljsw.component.json.runalone.application; + +import android.app.Application; + +/** + *

Package: com.ljsw.component.json.runalone.application

+ *

Project: DDComponentForAndroid

+ *

Classname: JsonApplication

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public class JsonApplication extends Application { +} diff --git a/readercomponent/build.gradle b/readercomponent/build.gradle index d38d0e0..a84e726 100644 --- a/readercomponent/build.gradle +++ b/readercomponent/build.gradle @@ -31,7 +31,7 @@ android { dependencies { compile project(':componentservice') - compile fileTree(dir: 'libs', include: ['*.jar']) + compile fileTree(include: ['*.jar'], dir: 'libs') } combuild { diff --git a/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java b/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java index b60e68e..82dcfd4 100644 --- a/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java +++ b/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java @@ -29,7 +29,9 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Override public void onClick(View v) { - UIRouter.getInstance().openUri(getActivity(), "componentdemo://share", null); + Bundle bundle = new Bundle(); + bundle.putString("bookName","testBookName"); + UIRouter.getInstance().openUri(getActivity(), "componentdemo://share", bundle); } }); diff --git a/sharecomponent/build.gradle b/sharecomponent/build.gradle index a404f20..da2f237 100644 --- a/sharecomponent/build.gradle +++ b/sharecomponent/build.gradle @@ -26,6 +26,9 @@ android { dependencies { compile project(':componentservice') + + annotationProcessor project(':router-anno-compiler') + compile project(':router-annotation') } combuild { diff --git a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java index 268f3b0..101e7ec 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java @@ -3,6 +3,10 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; +import android.widget.TextView; + +import com.ljsw.router.facade.annotation.Autowired; +import com.mrzhang.component.componentlib.router.ui.UIRouter; /** * Created by mrzhang on 2017/6/20. @@ -10,10 +14,18 @@ public class ShareActivity extends AppCompatActivity { + @Autowired + String bookName; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.share_activity_share); +// UIRouter.getInstance().inject + + TextView textView = (TextView) findViewById(R.id.share_tv_tag); + textView.setText("share: " + bookName); + } } diff --git a/sharecomponent/src/main/res/layout/share_activity_share.xml b/sharecomponent/src/main/res/layout/share_activity_share.xml index ca04f8b..7206758 100644 --- a/sharecomponent/src/main/res/layout/share_activity_share.xml +++ b/sharecomponent/src/main/res/layout/share_activity_share.xml @@ -5,6 +5,7 @@ android:layout_height="match_parent"> Date: Mon, 18 Sep 2017 22:37:05 +0800 Subject: [PATCH 028/103] [anno] [add missing junit dependency & DIcomponent] --- app/build.gradle | 2 +- app/gradle.properties | 2 +- basicres/build.gradle | 4 ++ componentlib/build.gradle | 5 +++ .../component/componentlib/router/Router.java | 3 +- .../componentlib/router/RouterConstants.java | 28 ++++++++++++ .../componentlib/router/facade/ISyringe.java | 13 ++++++ componentservice/build.gradle | 5 +++ .../componentservice/di/AutowiredService.java | 18 ++++++++ dicomponent/.gitignore | 1 + dicomponent/build.gradle | 38 ++++++++++++++++ dicomponent/gradle.properties | 18 ++++++++ dicomponent/proguard-rules.pro | 25 +++++++++++ .../component/di/ExampleInstrumentedTest.java | 26 +++++++++++ dicomponent/src/main/AndroidManifest.xml | 10 +++++ .../di/applike/DepInjectAppLike.java | 25 +++++++++++ .../di/serviceimpl/AutowiredServiceImpl.java | 44 +++++++++++++++++++ dicomponent/src/main/res/values/strings.xml | 3 ++ .../src/main/runalone/AndroidManifest.xml | 13 ++++++ .../runalone/application/DIApplication.java | 14 ++++++ .../src/main/runalone/res/values/strings.xml | 2 + .../ljsw/component/di/ExampleUnitTest.java | 17 +++++++ jsoncompnent/build.gradle | 5 +++ .../src/main/runalone/res/values/strings.xml | 2 + readercomponent/build.gradle | 5 +++ settings.gradle | 2 +- sharecomponent/build.gradle | 5 +++ .../java/com/mrzhang/share/ShareActivity.java | 10 +++++ 28 files changed, 341 insertions(+), 4 deletions(-) create mode 100644 componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java create mode 100644 componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade/ISyringe.java create mode 100644 componentservice/src/main/java/com/mrzhang/componentservice/di/AutowiredService.java create mode 100644 dicomponent/.gitignore create mode 100644 dicomponent/build.gradle create mode 100644 dicomponent/gradle.properties create mode 100644 dicomponent/proguard-rules.pro create mode 100644 dicomponent/src/androidTest/java/com/ljsw/component/di/ExampleInstrumentedTest.java create mode 100644 dicomponent/src/main/AndroidManifest.xml create mode 100644 dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java create mode 100644 dicomponent/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java create mode 100644 dicomponent/src/main/res/values/strings.xml create mode 100644 dicomponent/src/main/runalone/AndroidManifest.xml create mode 100644 dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java create mode 100644 dicomponent/src/main/runalone/res/values/strings.xml create mode 100644 dicomponent/src/test/java/com/ljsw/component/di/ExampleUnitTest.java create mode 100644 jsoncompnent/src/main/runalone/res/values/strings.xml diff --git a/app/build.gradle b/app/build.gradle index 213098b..b605485 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ android { dependencies { compile project(':componentservice') - annotationProcessor project(':router-anno-compiler') +// annotationProcessor project(':router-anno-compiler') } combuild { diff --git a/app/gradle.properties b/app/gradle.properties index 726255b..5a7d880 100644 --- a/app/gradle.properties +++ b/app/gradle.properties @@ -13,6 +13,6 @@ org.gradle.jvmargs=-Xmx1536m # org.gradle.parallel=true isRunAlone=true debugComponent=readercomponent,com.mrzhang.share:sharecomponent -compileComponent=readercomponent,sharecomponent,jsoncomponent +compileComponent=readercomponent,sharecomponent,jsoncomponent,dicomponent diff --git a/basicres/build.gradle b/basicres/build.gradle index 4f4949d..da246f4 100644 --- a/basicres/build.gradle +++ b/basicres/build.gradle @@ -25,4 +25,8 @@ android { dependencies { compile project(':basiclib') + testCompile 'junit:junit:4.12' + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) } diff --git a/componentlib/build.gradle b/componentlib/build.gradle index 9f41ee4..54e48f9 100644 --- a/componentlib/build.gradle +++ b/componentlib/build.gradle @@ -27,6 +27,11 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:26.+' + + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + testCompile 'junit:junit:4.12' } diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java index 0b73204..5bfc643 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/Router.java @@ -8,9 +8,9 @@ import java.util.HashMap; /** + * Center router, works for component-dynamic-load/remove and services add/remove/get * Created by mrzhang on 2017/6/15. */ - public class Router { private HashMap services = new HashMap<>(); @@ -33,6 +33,7 @@ public static Router getInstance() { return instance; } + public synchronized void addService(String serviceName, Object serviceImpl) { if (serviceName == null || serviceImpl == null) { return; diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java new file mode 100644 index 0000000..3a59f10 --- /dev/null +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java @@ -0,0 +1,28 @@ +package com.mrzhang.component.componentlib.router; + +/** + *

Package: com.mrzhang.component.componentlib.router

+ *

Project: DDComponentForAndroid

+ *

Classname: RouterConstants

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public class RouterConstants { + public static final String SDK_NAME = "Router"; + public static final String TAG = SDK_NAME + "::"; + public static final String SEPARATOR = "$$"; + public static final String SUFFIX_ROOT = "Root"; + public static final String SUFFIX_INTERCEPTORS = "Interceptors"; + public static final String SUFFIX_PROVIDERS = "Providers"; + public static final String SUFFIX_AUTOWIRED = SEPARATOR + SDK_NAME + SEPARATOR + "Autowired"; + public static final String DOT = "."; + +// public static final String ROUTE_ROOT_PAKCAGE = "com.alibaba.android.arouter.routes"; +// +// public static final String AROUTER_SP_CACHE_KEY = "SP_AROUTER_CACHE"; +// public static final String AROUTER_SP_KEY_MAP = "ROUTER_MAP"; +// +// public static final String LAST_VERSION_NAME = "LAST_VERSION_NAME"; +// public static final String LAST_VERSION_CODE = "LAST_VERSION_CODE"; +} diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade/ISyringe.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade/ISyringe.java new file mode 100644 index 0000000..65ea0bc --- /dev/null +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade/ISyringe.java @@ -0,0 +1,13 @@ +package com.mrzhang.component.componentlib.router.facade; + +/** + *

Package: com.mrzhang.component.componentlib.router.facade

+ *

Project: DDComponentForAndroid

+ *

Classname: ISyringe

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public interface ISyringe { + void inject(Object self); +} diff --git a/componentservice/build.gradle b/componentservice/build.gradle index d6a5170..5af7151 100644 --- a/componentservice/build.gradle +++ b/componentservice/build.gradle @@ -25,4 +25,9 @@ dependencies { compile project(':componentlib') compile project(':basicres') compile fileTree(dir: 'libs', include: ['*.jar']) + + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + testCompile 'junit:junit:4.12' } diff --git a/componentservice/src/main/java/com/mrzhang/componentservice/di/AutowiredService.java b/componentservice/src/main/java/com/mrzhang/componentservice/di/AutowiredService.java new file mode 100644 index 0000000..1b38d16 --- /dev/null +++ b/componentservice/src/main/java/com/mrzhang/componentservice/di/AutowiredService.java @@ -0,0 +1,18 @@ +package com.mrzhang.componentservice.di; + +/** + *

Package: com.mrzhang.componentservice.di

+ *

Project: DDComponentForAndroid

+ *

Classname: AutowiredService

+ *

Description: Autowired Dependency inject

+ * Created by leobert on 2017/9/18. + */ + +public interface AutowiredService { + + /** + * Autowired core. + * @param instance the instance who need autowired. + */ + void autowire(Object instance); +} diff --git a/dicomponent/.gitignore b/dicomponent/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/dicomponent/.gitignore @@ -0,0 +1 @@ +/build diff --git a/dicomponent/build.gradle b/dicomponent/build.gradle new file mode 100644 index 0000000..c6e94f2 --- /dev/null +++ b/dicomponent/build.gradle @@ -0,0 +1,38 @@ +apply plugin: 'com.dd.comgradle' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.2" + defaultConfig { + minSdkVersion 15 + targetSdkVersion 14 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + debug { + minifyEnabled false + } + } + resourcePrefix "di_" +} + +dependencies { + compile project(':componentservice') + + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + testCompile 'junit:junit:4.12' +} + +combuild { + applicatonName = 'com.ljsw.component.di.runalone.application.DIApplication' + isRegisterCompoAuto = true +} \ No newline at end of file diff --git a/dicomponent/gradle.properties b/dicomponent/gradle.properties new file mode 100644 index 0000000..1483cb1 --- /dev/null +++ b/dicomponent/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +isRunAlone=true diff --git a/dicomponent/proguard-rules.pro b/dicomponent/proguard-rules.pro new file mode 100644 index 0000000..12ec531 --- /dev/null +++ b/dicomponent/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/leobert/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/dicomponent/src/androidTest/java/com/ljsw/component/di/ExampleInstrumentedTest.java b/dicomponent/src/androidTest/java/com/ljsw/component/di/ExampleInstrumentedTest.java new file mode 100644 index 0000000..9a3cf93 --- /dev/null +++ b/dicomponent/src/androidTest/java/com/ljsw/component/di/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.ljsw.component.di; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.ljsw.component.di.test", appContext.getPackageName()); + } +} diff --git a/dicomponent/src/main/AndroidManifest.xml b/dicomponent/src/main/AndroidManifest.xml new file mode 100644 index 0000000..6aca5f3 --- /dev/null +++ b/dicomponent/src/main/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java b/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java new file mode 100644 index 0000000..045342e --- /dev/null +++ b/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java @@ -0,0 +1,25 @@ +package com.ljsw.component.di.applike; + +import com.mrzhang.component.componentlib.applicationlike.IApplicationLike; + +/** + *

Package: com.ljsw.component.di.applike

+ *

Project: DDComponentForAndroid

+ *

Classname: DepInjectAppLike

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public class DepInjectAppLike implements IApplicationLike { + //nothing for router + + @Override + public void onCreate() { + + } + + @Override + public void onStop() { + + } +} diff --git a/dicomponent/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java b/dicomponent/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java new file mode 100644 index 0000000..f116849 --- /dev/null +++ b/dicomponent/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java @@ -0,0 +1,44 @@ +package com.ljsw.component.di.serviceimpl; + +import android.util.LruCache; + +import com.mrzhang.component.componentlib.router.facade.ISyringe; +import com.mrzhang.componentservice.di.AutowiredService; + +import java.util.ArrayList; +import java.util.List; + +import static com.mrzhang.component.componentlib.router.RouterConstants.SUFFIX_AUTOWIRED; + +/** + *

Package: com.ljsw.component.di.serviceimpl

+ *

Project: DDComponentForAndroid

+ *

Classname: DepInjectServiceImpl

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public class AutowiredServiceImpl implements AutowiredService { + + private LruCache classCache = new LruCache<>(50); + private List blackList = new ArrayList<>(); + + + @Override + public void autowire(Object instance) { + String className = instance.getClass().getName(); + try { + if (!blackList.contains(className)) { + ISyringe autowiredHelper = classCache.get(className); + if (null == autowiredHelper) { // No cache. + autowiredHelper = (ISyringe) Class.forName(instance.getClass().getName() + SUFFIX_AUTOWIRED) + .getConstructor().newInstance(); + } + autowiredHelper.inject(instance); + classCache.put(className, autowiredHelper); + } + } catch (Exception ex) { + blackList.add(className); // This instance need not autowired. + } + } +} diff --git a/dicomponent/src/main/res/values/strings.xml b/dicomponent/src/main/res/values/strings.xml new file mode 100644 index 0000000..2983a4f --- /dev/null +++ b/dicomponent/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + dicomponent + diff --git a/dicomponent/src/main/runalone/AndroidManifest.xml b/dicomponent/src/main/runalone/AndroidManifest.xml new file mode 100644 index 0000000..0514864 --- /dev/null +++ b/dicomponent/src/main/runalone/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java b/dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java new file mode 100644 index 0000000..76bef15 --- /dev/null +++ b/dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java @@ -0,0 +1,14 @@ +package com.ljsw.component.di.runalone.application; + +import android.app.Application; + +/** + *

Package: com.ljsw.component.json.runalone.application

+ *

Project: DDComponentForAndroid

+ *

Classname: JsonApplication

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public class DIApplication extends Application { +} diff --git a/dicomponent/src/main/runalone/res/values/strings.xml b/dicomponent/src/main/runalone/res/values/strings.xml new file mode 100644 index 0000000..8542005 --- /dev/null +++ b/dicomponent/src/main/runalone/res/values/strings.xml @@ -0,0 +1,2 @@ + + diff --git a/dicomponent/src/test/java/com/ljsw/component/di/ExampleUnitTest.java b/dicomponent/src/test/java/com/ljsw/component/di/ExampleUnitTest.java new file mode 100644 index 0000000..90d303d --- /dev/null +++ b/dicomponent/src/test/java/com/ljsw/component/di/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.ljsw.component.di; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/jsoncompnent/build.gradle b/jsoncompnent/build.gradle index 495e04b..b135185 100644 --- a/jsoncompnent/build.gradle +++ b/jsoncompnent/build.gradle @@ -26,6 +26,11 @@ android { dependencies { compile project(':componentservice') compile 'com.alibaba:fastjson:1.1.63.android' + + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + testCompile 'junit:junit:4.12' } combuild { diff --git a/jsoncompnent/src/main/runalone/res/values/strings.xml b/jsoncompnent/src/main/runalone/res/values/strings.xml new file mode 100644 index 0000000..8542005 --- /dev/null +++ b/jsoncompnent/src/main/runalone/res/values/strings.xml @@ -0,0 +1,2 @@ + + diff --git a/readercomponent/build.gradle b/readercomponent/build.gradle index a84e726..b303fb5 100644 --- a/readercomponent/build.gradle +++ b/readercomponent/build.gradle @@ -32,6 +32,11 @@ android { dependencies { compile project(':componentservice') compile fileTree(include: ['*.jar'], dir: 'libs') + + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + testCompile 'junit:junit:4.12' } combuild { diff --git a/settings.gradle b/settings.gradle index 0b1d8a0..1fe50f0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -include ':app', ':jsoncompnent', +include ':app', ':jsoncompnent', ':dicomponent', ':componentlib', ':readercomponent', ':sharecomponent', diff --git a/sharecomponent/build.gradle b/sharecomponent/build.gradle index da2f237..27a8c70 100644 --- a/sharecomponent/build.gradle +++ b/sharecomponent/build.gradle @@ -29,6 +29,11 @@ dependencies { annotationProcessor project(':router-anno-compiler') compile project(':router-annotation') + + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + testCompile 'junit:junit:4.12' } combuild { diff --git a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java index 101e7ec..6fd9621 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java @@ -6,7 +6,10 @@ import android.widget.TextView; import com.ljsw.router.facade.annotation.Autowired; +import com.mrzhang.component.componentlib.router.Router; import com.mrzhang.component.componentlib.router.ui.UIRouter; +import com.mrzhang.componentservice.di.AutowiredService; +import com.mrzhang.componentservice.readerbook.ReadBookService; /** * Created by mrzhang on 2017/6/20. @@ -23,6 +26,13 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { setContentView(R.layout.share_activity_share); // UIRouter.getInstance().inject + Router router = Router.getInstance(); + if (router.getService(AutowiredService.class.getSimpleName()) != null) { + AutowiredService service = (AutowiredService) router.getService(AutowiredService.class.getSimpleName()); + service.autowire(this); + } + + TextView textView = (TextView) findViewById(R.id.share_tv_tag); textView.setText("share: " + bookName); From 12a6023dd667c274fc51bce1f2d59381723f0808 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Mon, 18 Sep 2017 23:20:03 +0800 Subject: [PATCH 029/103] [anno] [complete autowire params fetches from intent-bundle] --- app/gradle.properties | 4 +- .../di/applike/DepInjectAppLike.java | 13 +- {jsoncompnent => jsoncomponent}/.gitignore | 0 {jsoncompnent => jsoncomponent}/build.gradle | 0 .../gradle.properties | 0 .../proguard-rules.pro | 0 .../json/ExampleInstrumentedTest.java | 0 .../src/main/AndroidManifest.xml | 0 .../component/json/applike/JsonAppLike.java | 9 +- .../json/serviceimpl/JsonServiceImpl.java | 0 .../src/main/res/values/strings.xml | 0 .../src/main/runalone/AndroidManifest.xml | 0 .../runalone/application/JsonApplication.java | 0 .../src/main/runalone/res/values/strings.xml | 0 .../ljsw/component/json/ExampleUnitTest.java | 0 router-anno-compiler/.gitignore | 1 + router-anno-compiler/build.gradle | 18 + .../processor/AutowiredProcessor.java | 325 ++++++++++++++++++ .../processor/RouterDefProcessor.java | 12 + .../ljsw/router/compiler/utils/Constants.java | 52 +++ .../ljsw/router/compiler/utils/Logger.java | 61 ++++ .../ljsw/router/compiler/utils/TypeUtils.java | 71 ++++ router-annotation/build.gradle | 6 +- .../com/ljsw/router/facade/enums/Type.java | 33 ++ settings.gradle | 2 +- .../java/com/mrzhang/share/ShareActivity.java | 2 - .../main/res/layout/share_activity_share.xml | 2 +- 27 files changed, 600 insertions(+), 11 deletions(-) rename {jsoncompnent => jsoncomponent}/.gitignore (100%) rename {jsoncompnent => jsoncomponent}/build.gradle (100%) rename {jsoncompnent => jsoncomponent}/gradle.properties (100%) rename {jsoncompnent => jsoncomponent}/proguard-rules.pro (100%) rename {jsoncompnent => jsoncomponent}/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java (100%) rename {jsoncompnent => jsoncomponent}/src/main/AndroidManifest.xml (100%) rename {jsoncompnent => jsoncomponent}/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java (53%) rename {jsoncompnent => jsoncomponent}/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java (100%) rename {jsoncompnent => jsoncomponent}/src/main/res/values/strings.xml (100%) rename {jsoncompnent => jsoncomponent}/src/main/runalone/AndroidManifest.xml (100%) rename {jsoncompnent => jsoncomponent}/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java (100%) rename {jsoncompnent => jsoncomponent}/src/main/runalone/res/values/strings.xml (100%) rename {jsoncompnent => jsoncomponent}/src/test/java/com/ljsw/component/json/ExampleUnitTest.java (100%) create mode 100644 router-anno-compiler/.gitignore create mode 100644 router-anno-compiler/build.gradle create mode 100644 router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java create mode 100644 router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterDefProcessor.java create mode 100644 router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java create mode 100644 router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Logger.java create mode 100644 router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/TypeUtils.java create mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/enums/Type.java diff --git a/app/gradle.properties b/app/gradle.properties index 5a7d880..448440a 100644 --- a/app/gradle.properties +++ b/app/gradle.properties @@ -12,7 +12,9 @@ org.gradle.jvmargs=-Xmx1536m # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true isRunAlone=true -debugComponent=readercomponent,com.mrzhang.share:sharecomponent +debugComponent=readercomponent,sharecomponent,jsoncomponent,dicomponent +#debugComponent=readercomponent,com.mrzhang.share:sharecomponent,jsoncomponent,dicomponent + compileComponent=readercomponent,sharecomponent,jsoncomponent,dicomponent diff --git a/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java b/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java index 045342e..2485135 100644 --- a/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java +++ b/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java @@ -1,6 +1,10 @@ package com.ljsw.component.di.applike; +import com.ljsw.component.di.serviceimpl.AutowiredServiceImpl; import com.mrzhang.component.componentlib.applicationlike.IApplicationLike; +import com.mrzhang.component.componentlib.router.Router; +import com.mrzhang.component.componentlib.router.ui.UIRouter; +import com.mrzhang.componentservice.di.AutowiredService; /** *

Package: com.ljsw.component.di.applike

@@ -11,15 +15,18 @@ */ public class DepInjectAppLike implements IApplicationLike { - //nothing for router + UIRouter uiRouter = UIRouter.getInstance(); + Router router = Router.getInstance(); + + //no ui-router for register @Override public void onCreate() { - + router.addService(AutowiredService.class.getSimpleName(),new AutowiredServiceImpl()); } @Override public void onStop() { - + router.removeService(AutowiredService.class.getSimpleName()); } } diff --git a/jsoncompnent/.gitignore b/jsoncomponent/.gitignore similarity index 100% rename from jsoncompnent/.gitignore rename to jsoncomponent/.gitignore diff --git a/jsoncompnent/build.gradle b/jsoncomponent/build.gradle similarity index 100% rename from jsoncompnent/build.gradle rename to jsoncomponent/build.gradle diff --git a/jsoncompnent/gradle.properties b/jsoncomponent/gradle.properties similarity index 100% rename from jsoncompnent/gradle.properties rename to jsoncomponent/gradle.properties diff --git a/jsoncompnent/proguard-rules.pro b/jsoncomponent/proguard-rules.pro similarity index 100% rename from jsoncompnent/proguard-rules.pro rename to jsoncomponent/proguard-rules.pro diff --git a/jsoncompnent/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java b/jsoncomponent/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java similarity index 100% rename from jsoncompnent/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java rename to jsoncomponent/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java diff --git a/jsoncompnent/src/main/AndroidManifest.xml b/jsoncomponent/src/main/AndroidManifest.xml similarity index 100% rename from jsoncompnent/src/main/AndroidManifest.xml rename to jsoncomponent/src/main/AndroidManifest.xml diff --git a/jsoncompnent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java b/jsoncomponent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java similarity index 53% rename from jsoncompnent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java rename to jsoncomponent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java index fae6db1..57a7642 100644 --- a/jsoncompnent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java +++ b/jsoncomponent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java @@ -1,6 +1,10 @@ package com.ljsw.component.json.applike; +import com.ljsw.component.json.serviceimpl.JsonServiceImpl; import com.mrzhang.component.componentlib.applicationlike.IApplicationLike; +import com.mrzhang.component.componentlib.router.Router; +import com.mrzhang.component.componentlib.router.ui.UIRouter; +import com.mrzhang.componentservice.json.JsonService; /** *

Package: com.ljsw.component.json.applike

@@ -12,15 +16,18 @@ public class JsonAppLike implements IApplicationLike { -// UIRouter uiRouter = UIRouter.getInstance(); + UIRouter uiRouter = UIRouter.getInstance(); + Router router = Router.getInstance(); //no ui-router for register @Override public void onCreate() { + router.addService(JsonService.class.getSimpleName(),new JsonServiceImpl()); } @Override public void onStop() { + router.removeService(JsonService.class.getSimpleName()); } } diff --git a/jsoncompnent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java b/jsoncomponent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java similarity index 100% rename from jsoncompnent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java rename to jsoncomponent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java diff --git a/jsoncompnent/src/main/res/values/strings.xml b/jsoncomponent/src/main/res/values/strings.xml similarity index 100% rename from jsoncompnent/src/main/res/values/strings.xml rename to jsoncomponent/src/main/res/values/strings.xml diff --git a/jsoncompnent/src/main/runalone/AndroidManifest.xml b/jsoncomponent/src/main/runalone/AndroidManifest.xml similarity index 100% rename from jsoncompnent/src/main/runalone/AndroidManifest.xml rename to jsoncomponent/src/main/runalone/AndroidManifest.xml diff --git a/jsoncompnent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java b/jsoncomponent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java similarity index 100% rename from jsoncompnent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java rename to jsoncomponent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java diff --git a/jsoncompnent/src/main/runalone/res/values/strings.xml b/jsoncomponent/src/main/runalone/res/values/strings.xml similarity index 100% rename from jsoncompnent/src/main/runalone/res/values/strings.xml rename to jsoncomponent/src/main/runalone/res/values/strings.xml diff --git a/jsoncompnent/src/test/java/com/ljsw/component/json/ExampleUnitTest.java b/jsoncomponent/src/test/java/com/ljsw/component/json/ExampleUnitTest.java similarity index 100% rename from jsoncompnent/src/test/java/com/ljsw/component/json/ExampleUnitTest.java rename to jsoncomponent/src/test/java/com/ljsw/component/json/ExampleUnitTest.java diff --git a/router-anno-compiler/.gitignore b/router-anno-compiler/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/router-anno-compiler/.gitignore @@ -0,0 +1 @@ +/build diff --git a/router-anno-compiler/build.gradle b/router-anno-compiler/build.gradle new file mode 100644 index 0000000..55f9fbf --- /dev/null +++ b/router-anno-compiler/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'java' + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + compile 'com.google.auto.service:auto-service:1.0-rc2' + compile 'com.squareup:javapoet:1.7.0' + + + compile 'org.apache.commons:commons-lang3:3.4' + compile 'org.apache.commons:commons-collections4:4.1' + + compile project(':router-annotation') +} + +compileJava { + sourceCompatibility = '1.7' + targetCompatibility = '1.7' +} diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java new file mode 100644 index 0000000..58d42cb --- /dev/null +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java @@ -0,0 +1,325 @@ +package com.ljsw.router.compiler.processor; + +import com.google.auto.service.AutoService; +import com.ljsw.router.compiler.utils.Constants; +import com.ljsw.router.compiler.utils.Logger; +import com.ljsw.router.compiler.utils.TypeUtils; +import com.ljsw.router.facade.annotation.Autowired; +import com.ljsw.router.facade.enums.Type; +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.FieldSpec; +import com.squareup.javapoet.JavaFile; +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.ParameterSpec; +import com.squareup.javapoet.TypeName; +import com.squareup.javapoet.TypeSpec; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.Filer; +import javax.annotation.processing.ProcessingEnvironment; +import javax.annotation.processing.Processor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedOptions; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.Element; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; + +import static com.ljsw.router.compiler.utils.Constants.ANNOTATION_TYPE_AUTOWIRED; +import static com.ljsw.router.compiler.utils.Constants.KEY_MODULE_NAME; +import static javax.lang.model.element.Modifier.PUBLIC; + +/** + *

Package: com.ljsw.router.compiler.processor

+ *

Project: DDComponentForAndroid

+ *

Classname: AutowiredProcessor

+ *

Description: Autowired Processor,Only Activity and Fragment/Fragment_V4 allowed

+ * Created by leobert on 2017/9/18. + */ +@AutoService(Processor.class) +@SupportedOptions(KEY_MODULE_NAME) +@SupportedSourceVersion(SourceVersion.RELEASE_7) +@SupportedAnnotationTypes({ANNOTATION_TYPE_AUTOWIRED}) +public class AutowiredProcessor extends AbstractProcessor { + private static final String TAG = AutowiredProcessor.class.getSimpleName(); + + private Logger logger; + + private Filer mFiler; + private Types types; + private TypeUtils typeUtils; + private Elements elements; + + /** + * Contain field need autowired and his super class. + */ + private Map> parentAndChild = new HashMap<>(); + + //UIRouter:com.mrzhang.component.componentlib.router.ui.UIRouter + private static final ClassName UIRouterClass = + ClassName.get("com.mrzhang.component.componentlib.router.ui", "UIRouter"); + + private static final ClassName RouterClass = + ClassName.get("com.mrzhang.component.componentlib.router", "Router"); + + // private static final ClassName ARouterClass = ClassName.get("com.alibaba.android.arouter.launcher", "ARouter"); + private static final ClassName AndroidLog = ClassName.get("android.util", "Log"); + + + @Override + public synchronized void init(ProcessingEnvironment processingEnvironment) { + super.init(processingEnvironment); + + mFiler = processingEnv.getFiler(); // Generate class. + types = processingEnv.getTypeUtils(); // Get type utils. + elements = processingEnv.getElementUtils(); // Get class meta. + + typeUtils = new TypeUtils(types, elements); + + logger = new Logger(processingEnv.getMessager()); // Package the log utils. + + logger.info(">>> AutowiredProcessor init. <<<"); + } + + @Override + public boolean process(Set set, RoundEnvironment roundEnvironment) { + if (CollectionUtils.isNotEmpty(set)) { + try { + logger.info(">>> Found autowired field, start... <<<"); + categories(roundEnvironment.getElementsAnnotatedWith(Autowired.class)); + generateHelper(); + + } catch (Exception e) { + logger.error(e); + } + return true; + } + + return false; + } + + private void generateHelper() throws IOException, IllegalAccessException { + TypeElement type_ISyringe = elements.getTypeElement(Constants.ISYRINGE); + + TypeElement type_JsonService = elements.getTypeElement(Constants.JSON_SERVICE); + +// TypeMirror iProvider = elements.getTypeElement(Constants.IPROVIDER).asType(); + + TypeMirror activityTm = elements.getTypeElement(Constants.ACTIVITY).asType(); + TypeMirror fragmentTm = elements.getTypeElement(Constants.FRAGMENT).asType(); + TypeMirror fragmentTmV4 = elements.getTypeElement(Constants.FRAGMENT_V4).asType(); + + // Build input param name. + ParameterSpec objectParamSpec = ParameterSpec.builder(TypeName.OBJECT, "target").build(); + + if (MapUtils.isNotEmpty(parentAndChild)) { + for (Map.Entry> entry : parentAndChild.entrySet()) { + // Build method : 'inject' + MethodSpec.Builder injectMethodBuilder = MethodSpec.methodBuilder("inject") + .addAnnotation(Override.class) + .addModifiers(PUBLIC) + .addParameter(objectParamSpec); + + TypeElement parent = entry.getKey(); + List childs = entry.getValue(); + + String qualifiedName = parent.getQualifiedName().toString(); + String packageName = qualifiedName.substring(0, qualifiedName.lastIndexOf(".")); + + String fileName = parent.getSimpleName() + "$$Router$$" + "Autowired"; + + logger.info(">>> Start process " + childs.size() + " field in " + parent.getSimpleName() + " ... <<<"); + + TypeSpec.Builder helper = TypeSpec.classBuilder(fileName) + .addJavadoc("Auto generated by " + TAG) + .addSuperinterface(ClassName.get(type_ISyringe)) + .addModifiers(PUBLIC); + + FieldSpec jsonServiceField = FieldSpec.builder(TypeName.get(type_JsonService.asType()), + "JsonService", Modifier.PRIVATE).build(); + helper.addField(jsonServiceField); + + // JsonService service = (JsonService) router.getService(JsonService.class.getSimpleName()); +// +// + logger.info("======== inject jsonservice"); + injectMethodBuilder.addStatement("JsonService = ($T) $T.getInstance().getService($T.class.getSimpleName())", + ClassName.get(type_JsonService), + RouterClass, + ClassName.get(type_JsonService)); + + injectMethodBuilder.addStatement("$T substitute = ($T)target", ClassName.get(parent), ClassName.get(parent)); + + // Generate method body, start inject. + for (Element element : childs) { + Autowired fieldConfig = element.getAnnotation(Autowired.class); + String fieldName = element.getSimpleName().toString(); +// if (types.isSubtype(element.asType(), iProvider)) { // It's provider +// if ("".equals(fieldConfig.name())) { // User has not set service path, then use byType. +// +// // Getter +// injectMethodBuilder.addStatement( +// "substitute." + fieldName + " = $T.getInstance().navigation($T.class)", +// ARouterClass, +// ClassName.get(element.asType()) +// ); +// } else { // use byName +// // Getter +// injectMethodBuilder.addStatement( +// "substitute." + fieldName + " = ($T)$T.getInstance().build($S).navigation();", +// ClassName.get(element.asType()), +// ARouterClass, +// fieldConfig.name() +// ); +// } +// +// // Validater +// if (fieldConfig.required()) { +// injectMethodBuilder.beginControlFlow("if (substitute." + fieldName + " == null)"); +// injectMethodBuilder.addStatement( +// "throw new RuntimeException(\"The field '" + fieldName + "' is null, in class '\" + $T.class.getName() + \"!\")", ClassName.get(parent)); +// injectMethodBuilder.endControlFlow(); +// } +// } +// else { // It's normal intent value + String originalValue = "substitute." + fieldName; + String statment = "substitute." + fieldName + " = substitute."; + boolean isActivity = false; + if (types.isSubtype(parent.asType(), activityTm)) { // Activity, then use getIntent() + isActivity = true; + statment += "getIntent()."; + } else if (types.isSubtype(parent.asType(), fragmentTm) || + types.isSubtype(parent.asType(), fragmentTmV4)) { // Fragment, then use getArguments() + statment += "getArguments()."; + } else { + throw new IllegalAccessException("The field [" + fieldName + "] need " + + "autowired from intent, its parent must be activity or fragment!"); + } + + statment = buildStatement(originalValue, statment, typeUtils.typeExchange(element), isActivity); + if (statment.startsWith("serializationService.")) { // Not mortals + injectMethodBuilder.beginControlFlow("if (null != serializationService)"); + injectMethodBuilder.addStatement( + "substitute." + fieldName + " = " + statment, + (StringUtils.isEmpty(fieldConfig.name()) ? fieldName : fieldConfig.name()), + ClassName.get(element.asType()) + ); + injectMethodBuilder.nextControlFlow("else"); + injectMethodBuilder.addStatement( + "$T.e(\"" + TAG + "\", \"You want automatic inject the field '" + + fieldName + "' in class '$T' ," + + " then you should implement 'SerializationService' to support " + + "object auto inject!\")", AndroidLog, ClassName.get(parent)); + + injectMethodBuilder.endControlFlow(); + } else { + injectMethodBuilder.addStatement(statment, StringUtils.isEmpty(fieldConfig.name()) ? fieldName : fieldConfig.name()); + } + + // Validator + if (fieldConfig.required() && !element.asType().getKind().isPrimitive()) { // Primitive wont be check. + injectMethodBuilder.beginControlFlow("if (null == substitute." + fieldName + ")"); + injectMethodBuilder.addStatement( + "$T.e(\"" + TAG + "\", \"The field '" + fieldName + "' is null, in class '\" + $T.class.getName() + \"!\")", AndroidLog, ClassName.get(parent)); + injectMethodBuilder.endControlFlow(); + } + } +// } + + helper.addMethod(injectMethodBuilder.build()); + + // Generate autowire helper + JavaFile.builder(packageName, helper.build()).build().writeTo(mFiler); + + logger.info(">>> " + parent.getSimpleName() + " has been processed, " + fileName + " has been generated. <<<"); + } + + logger.info(">>> Autowired processor stop. <<<"); + } + } + + /** + * @param originalValue bundleKey in the bundle of Intent + * @param statement original statement + * @param type type of data in the bundle + * @param isActivity true as Activity, false as Fragment/Fragment_V4 + * @return statement + */ + private String buildStatement(String originalValue, String statement, int type, boolean isActivity) { + + //Activity.getIntent().getXXExtra(); Fragment.getIntent().getXX(); + + if (type == Type.BOOLEAN.ordinal()) { + statement += (isActivity ? ("getBooleanExtra($S, " + originalValue + ")") : ("getBoolean($S)")); + } else if (type == Type.BYTE.ordinal()) { + statement += (isActivity ? ("getByteExtra($S, " + originalValue + ")") : ("getByte($S)")); + } else if (type == Type.SHORT.ordinal()) { + statement += (isActivity ? ("getShortExtra($S, " + originalValue + ")") : ("getShort($S)")); + } else if (type == Type.INT.ordinal()) { + statement += (isActivity ? ("getIntExtra($S, " + originalValue + ")") : ("getInt($S)")); + } else if (type == Type.LONG.ordinal()) { + statement += (isActivity ? ("getLongExtra($S, " + originalValue + ")") : ("getLong($S)")); + } else if (type == Type.CHAR.ordinal()) { + statement += (isActivity ? ("getCharExtra($S, " + originalValue + ")") : ("getChar($S)")); + } else if (type == Type.FLOAT.ordinal()) { + statement += (isActivity ? ("getFloatExtra($S, " + originalValue + ")") : ("getFloat($S)")); + } else if (type == Type.DOUBLE.ordinal()) { + statement += (isActivity ? ("getDoubleExtra($S, " + originalValue + ")") : ("getDouble($S)")); + } else if (type == Type.STRING.ordinal()) { + statement += (isActivity ? ("getStringExtra($S)") : ("getString($S)")); + } else if (type == Type.PARCELABLE.ordinal()) { + statement += (isActivity ? ("getParcelableExtra($S)") : ("getParcelable($S)")); + } else if (type == Type.OBJECT.ordinal()) { + statement = "serializationService.json2Object(substitute." + + (isActivity ? "getIntent()." : "getArguments().") + + (isActivity ? "getStringExtra($S)" : "getString($S)") + ", $T.class)"; + } + + return statement; + } + + /** + * Categories field, find his papa. + * + * @param elements Field need autowired + */ + private void categories(Set elements) throws IllegalAccessException { + if (CollectionUtils.isNotEmpty(elements)) { + for (Element element : elements) { + TypeElement enclosingElement = (TypeElement) element.getEnclosingElement(); + + if (element.getModifiers().contains(Modifier.PRIVATE)) { + throw new IllegalAccessException("The autowired fields CAN NOT BE 'private'!!! please check field [" + + element.getSimpleName() + "] in class [" + enclosingElement.getQualifiedName() + "]"); + } + + if (parentAndChild.containsKey(enclosingElement)) { // Has categries + parentAndChild.get(enclosingElement).add(element); + } else { + List childs = new ArrayList<>(); + childs.add(element); + parentAndChild.put(enclosingElement, childs); + } + } + + logger.info("categories finished."); + } + } + +} diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterDefProcessor.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterDefProcessor.java new file mode 100644 index 0000000..e017b52 --- /dev/null +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterDefProcessor.java @@ -0,0 +1,12 @@ +package com.ljsw.router.compiler.processor; + +/** + *

Package: com.ljsw.router.compiler.processor

+ *

Project: DDComponentForAndroid

+ *

Classname: RouterDefProcessor

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public class RouterDefProcessor { +} diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java new file mode 100644 index 0000000..901250f --- /dev/null +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java @@ -0,0 +1,52 @@ +package com.ljsw.router.compiler.utils; + +/** + *

Package: com.ljsw.router.compiler.utils

+ *

Project: DDComponentForAndroid

+ *

Classname: Constants

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public interface Constants { + + String ANNO_FACADE_PKG = "com.ljsw.router.facade"; + + + /////////////////////////////////////////////////////////////////////////// + // Options of processor + /////////////////////////////////////////////////////////////////////////// + String KEY_MODULE_NAME = "ModuleName"; + + String ANNOTATION_TYPE_ROUTE = ANNO_FACADE_PKG + ".annotation.Route"; + String ANNOTATION_TYPE_AUTOWIRED = ANNO_FACADE_PKG + ".annotation.Autowired"; + + String PREFIX_OF_LOGGER = "[Router-Anno-Compiler]-- "; + + + // System interface + String ACTIVITY = "android.app.Activity"; + String FRAGMENT = "android.app.Fragment"; + String FRAGMENT_V4 = "android.support.v4.app.Fragment"; + String SERVICE = "android.app.Service"; + String PARCELABLE = "android.os.Parcelable"; + + // Java type + String LANG = "java.lang"; + String BYTE = LANG + ".Byte"; + String SHORT = LANG + ".Short"; + String INTEGER = LANG + ".Integer"; + String LONG = LANG + ".Long"; + String FLOAT = LANG + ".Float"; + String DOUBEL = LANG + ".Double"; + String BOOLEAN = LANG + ".Boolean"; + String STRING = LANG + ".String"; + + String TEMPLATE_PACKAGE = ".template"; + +// "com.mrzhang.component.componentlib.router.facade.ISyringe" + String ISYRINGE = "com.mrzhang.component.componentlib.router.facade.ISyringe"; + + String JSON_SERVICE = "com.mrzhang.componentservice.json.JsonService"; + +} diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Logger.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Logger.java new file mode 100644 index 0000000..05c6c1a --- /dev/null +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Logger.java @@ -0,0 +1,61 @@ +package com.ljsw.router.compiler.utils; + +import javax.annotation.processing.Messager; +import javax.tools.Diagnostic; + +/** + *

Package: com.ljsw.router.compiler.utils

+ *

Project: DDComponentForAndroid

+ *

Classname: Logger

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public class Logger { + private Messager msg; + + public Logger(Messager messager) { + msg = messager; + } + + /** + * Print info log. + */ + public void info(CharSequence info) { + if (isNotEmpty(info)) { + msg.printMessage(Diagnostic.Kind.NOTE, Constants.PREFIX_OF_LOGGER + info); + } + } + + public void error(CharSequence error) { + if (isNotEmpty(error)) { + msg.printMessage(Diagnostic.Kind.ERROR, Constants.PREFIX_OF_LOGGER + "An exception is encountered, [" + error + "]"); + } + } + + public void error(Throwable error) { + if (null != error) { + msg.printMessage(Diagnostic.Kind.ERROR, Constants.PREFIX_OF_LOGGER + "An exception is encountered, [" + error.getMessage() + "]" + "\n" + formatStackTrace(error.getStackTrace())); + } + } + + public void warning(CharSequence warning) { + if (isNotEmpty(warning)) { + msg.printMessage(Diagnostic.Kind.WARNING, Constants.PREFIX_OF_LOGGER + warning); + } + } + + private String formatStackTrace(StackTraceElement[] stackTrace) { + StringBuilder sb = new StringBuilder(); + for (StackTraceElement element : stackTrace) { + sb.append(" at ").append(element.toString()); + sb.append("\n"); + } + return sb.toString(); + } + + private static boolean isNotEmpty(final CharSequence cs) { + boolean isEmpty = cs == null || cs.length() == 0; + return !isEmpty; + } +} diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/TypeUtils.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/TypeUtils.java new file mode 100644 index 0000000..7aaddd1 --- /dev/null +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/TypeUtils.java @@ -0,0 +1,71 @@ +package com.ljsw.router.compiler.utils; + +import com.ljsw.router.facade.enums.Type; + +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; + +import static com.ljsw.router.compiler.utils.Constants.PARCELABLE; + +/** + *

Package: com.ljsw.router.compiler.utils

+ *

Project: DDComponentForAndroid

+ *

Classname: TypeUtils

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public class TypeUtils { + private Types types; + private Elements elements; + private TypeMirror parcelableType; + + public TypeUtils(Types types, Elements elements) { + this.types = types; + this.elements = elements; + + parcelableType = this.elements.getTypeElement(PARCELABLE).asType(); + } + + /** + * Diagnostics out the true java type + * + * @param element Raw type + * @return Type class of java + */ + public int typeExchange(Element element) { + TypeMirror typeMirror = element.asType(); + + // Primitive + if (typeMirror.getKind().isPrimitive()) { + return element.asType().getKind().ordinal(); + } + + switch (typeMirror.toString()) { + case Constants.BYTE: + return Type.BYTE.ordinal(); + case Constants.SHORT: + return Type.SHORT.ordinal(); + case Constants.INTEGER: + return Type.INT.ordinal(); + case Constants.LONG: + return Type.LONG.ordinal(); + case Constants.FLOAT: + return Type.FLOAT.ordinal(); + case Constants.DOUBEL: + return Type.DOUBLE.ordinal(); + case Constants.BOOLEAN: + return Type.BOOLEAN.ordinal(); + case Constants.STRING: + return Type.STRING.ordinal(); + default: // Other side, maybe the PARCELABLE or OBJECT. + if (types.isSubtype(typeMirror, parcelableType)) { // PARCELABLE + return Type.PARCELABLE.ordinal(); + } else { // For others + return Type.OBJECT.ordinal(); + } + } + } +} diff --git a/router-annotation/build.gradle b/router-annotation/build.gradle index 49df001..8da8bb0 100644 --- a/router-annotation/build.gradle +++ b/router-annotation/build.gradle @@ -4,5 +4,7 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } -sourceCompatibility = "1.7" -targetCompatibility = "1.7" +compileJava { + sourceCompatibility = '1.7' + targetCompatibility = '1.7' +} \ No newline at end of file diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/enums/Type.java b/router-annotation/src/main/java/com/ljsw/router/facade/enums/Type.java new file mode 100644 index 0000000..18a3c09 --- /dev/null +++ b/router-annotation/src/main/java/com/ljsw/router/facade/enums/Type.java @@ -0,0 +1,33 @@ +package com.ljsw.router.facade.enums; + +/** + *

Package: com.ljsw.router.facade.enums

+ *

Project: DDComponentForAndroid

+ *

Classname: Type

+ *

Description: TODO

+ * Created by leobert on 2017/9/18. + */ + +public enum Type { + + /////////////////////////////////////////////// + // Base type + /////////////////////////////////////////////// + + BOOLEAN, + BYTE, + SHORT, + INT, + LONG, + CHAR, + FLOAT, + DOUBLE, + + /////////////////////////////////////////////// + // Other type + /////////////////////////////////////////////// + + STRING, + PARCELABLE, + OBJECT; +} diff --git a/settings.gradle b/settings.gradle index 1fe50f0..17438d4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -include ':app', ':jsoncompnent', ':dicomponent', +include ':app', ':jsoncomponent', ':dicomponent', ':componentlib', ':readercomponent', ':sharecomponent', diff --git a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java index 6fd9621..0215cf0 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java @@ -7,9 +7,7 @@ import com.ljsw.router.facade.annotation.Autowired; import com.mrzhang.component.componentlib.router.Router; -import com.mrzhang.component.componentlib.router.ui.UIRouter; import com.mrzhang.componentservice.di.AutowiredService; -import com.mrzhang.componentservice.readerbook.ReadBookService; /** * Created by mrzhang on 2017/6/20. diff --git a/sharecomponent/src/main/res/layout/share_activity_share.xml b/sharecomponent/src/main/res/layout/share_activity_share.xml index 7206758..6f6fd3d 100644 --- a/sharecomponent/src/main/res/layout/share_activity_share.xml +++ b/sharecomponent/src/main/res/layout/share_activity_share.xml @@ -8,7 +8,7 @@ android:id="@+id/share_tv_tag" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="这是分享组件" + android:text="这是share组件" android:textSize="21sp" android:layout_centerInParent="true" /> From be25e046538741b7575c13a65a95f3a4ef9ccf0d Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Tue, 19 Sep 2017 10:09:56 +0800 Subject: [PATCH 030/103] [anno] [add missing doc] --- .../componentlib/router/RouterConstants.java | 2 +- .../componentlib/router/facade/ISyringe.java | 7 ++++++- .../componentservice/json/JsonService.java | 14 +++++++++++--- .../component/di/applike/DepInjectAppLike.java | 6 +----- .../di/serviceimpl/AutowiredServiceImpl.java | 3 ++- .../di/runalone/application/DIApplication.java | 2 +- .../component/json/applike/JsonAppLike.java | 6 +----- .../json/serviceimpl/JsonServiceImpl.java | 17 +++++++++++++---- .../runalone/application/JsonApplication.java | 2 +- .../ljsw/router/compiler/utils/Constants.java | 8 +++++--- .../com/ljsw/router/compiler/utils/Logger.java | 2 +- .../ljsw/router/compiler/utils/TypeUtils.java | 2 +- .../java/com/ljsw/router/facade/enums/Type.java | 4 ++-- 13 files changed, 46 insertions(+), 29 deletions(-) diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java index 3a59f10..709307a 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java @@ -4,7 +4,7 @@ *

Package: com.mrzhang.component.componentlib.router

*

Project: DDComponentForAndroid

*

Classname: RouterConstants

- *

Description: TODO

+ *

Description: Constants use by apt for Router

* Created by leobert on 2017/9/18. */ diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade/ISyringe.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade/ISyringe.java index 65ea0bc..a67d916 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade/ISyringe.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade/ISyringe.java @@ -4,10 +4,15 @@ *

Package: com.mrzhang.component.componentlib.router.facade

*

Project: DDComponentForAndroid

*

Classname: ISyringe

- *

Description: TODO

+ *

Description: desc the function of Syringe, one that used to inject + * sth. to a container

* Created by leobert on 2017/9/18. */ public interface ISyringe { + /** + * @param self the container itself, members to be inject into have been annotated + * with one annotation called Autowired + */ void inject(Object self); } diff --git a/componentservice/src/main/java/com/mrzhang/componentservice/json/JsonService.java b/componentservice/src/main/java/com/mrzhang/componentservice/json/JsonService.java index ec6ecda..24f2255 100644 --- a/componentservice/src/main/java/com/mrzhang/componentservice/json/JsonService.java +++ b/componentservice/src/main/java/com/mrzhang/componentservice/json/JsonService.java @@ -1,17 +1,25 @@ package com.mrzhang.componentservice.json; +import java.util.List; + /** *

Package: com.mrzhang.componentservice.json

*

Project: DDComponentForAndroid

*

Classname: JsonService

- *

Description: TODO

+ *

Description: APIs provided by the JsonComponent. + * you can implement it via fast-json,gson,jackson etc. + * + * currently only basic functions contains! + *

* Created by leobert on 2017/9/18. */ public interface JsonService { - T json2Object(String text, Class clazz); + T parseObject(String text, Class clazz); + + List parseArray(String text, Class clazz); - String object2Json(Object instance); + String toJsonString(Object instance); } diff --git a/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java b/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java index 2485135..04348b5 100644 --- a/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java +++ b/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java @@ -3,23 +3,19 @@ import com.ljsw.component.di.serviceimpl.AutowiredServiceImpl; import com.mrzhang.component.componentlib.applicationlike.IApplicationLike; import com.mrzhang.component.componentlib.router.Router; -import com.mrzhang.component.componentlib.router.ui.UIRouter; import com.mrzhang.componentservice.di.AutowiredService; /** *

Package: com.ljsw.component.di.applike

*

Project: DDComponentForAndroid

*

Classname: DepInjectAppLike

- *

Description: TODO

+ *

Description: component mount/dismount delegate

* Created by leobert on 2017/9/18. */ public class DepInjectAppLike implements IApplicationLike { - UIRouter uiRouter = UIRouter.getInstance(); Router router = Router.getInstance(); - //no ui-router for register - @Override public void onCreate() { router.addService(AutowiredService.class.getSimpleName(),new AutowiredServiceImpl()); diff --git a/dicomponent/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java b/dicomponent/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java index f116849..73a6eba 100644 --- a/dicomponent/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java +++ b/dicomponent/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java @@ -14,7 +14,8 @@ *

Package: com.ljsw.component.di.serviceimpl

*

Project: DDComponentForAndroid

*

Classname: DepInjectServiceImpl

- *

Description: TODO

+ *

Description: implement of {@link AutowiredService},used to fetch + * data from bundles in the intent

* Created by leobert on 2017/9/18. */ diff --git a/dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java b/dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java index 76bef15..e546da9 100644 --- a/dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java +++ b/dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java @@ -6,7 +6,7 @@ *

Package: com.ljsw.component.json.runalone.application

*

Project: DDComponentForAndroid

*

Classname: JsonApplication

- *

Description: TODO

+ *

Description: dependency inject component runalone application

* Created by leobert on 2017/9/18. */ diff --git a/jsoncomponent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java b/jsoncomponent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java index 57a7642..8afec69 100644 --- a/jsoncomponent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java +++ b/jsoncomponent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java @@ -3,24 +3,20 @@ import com.ljsw.component.json.serviceimpl.JsonServiceImpl; import com.mrzhang.component.componentlib.applicationlike.IApplicationLike; import com.mrzhang.component.componentlib.router.Router; -import com.mrzhang.component.componentlib.router.ui.UIRouter; import com.mrzhang.componentservice.json.JsonService; /** *

Package: com.ljsw.component.json.applike

*

Project: DDComponentForAndroid

*

Classname: JsonAppLike

- *

Description: TODO

+ *

Description: component mount/dismount delegate

* Created by leobert on 2017/9/18. */ public class JsonAppLike implements IApplicationLike { - UIRouter uiRouter = UIRouter.getInstance(); Router router = Router.getInstance(); - //no ui-router for register - @Override public void onCreate() { router.addService(JsonService.class.getSimpleName(),new JsonServiceImpl()); diff --git a/jsoncomponent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java b/jsoncomponent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java index 90b61f6..69f6bba 100644 --- a/jsoncomponent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java +++ b/jsoncomponent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java @@ -3,22 +3,31 @@ import com.alibaba.fastjson.JSON; import com.mrzhang.componentservice.json.JsonService; +import java.util.List; + /** *

Package: com.ljsw.component.json.serviceimpl

*

Project: DDComponentForAndroid

*

Classname: JsonServiceImpl

- *

Description: TODO

+ *

Description: implement of {@link JsonService}, in this, + * base on fast-json + *

* Created by leobert on 2017/9/18. */ public class JsonServiceImpl implements JsonService { @Override - public T json2Object(String text, Class clazz) { - return JSON.parseObject(text,clazz); + public T parseObject(String text, Class clazz) { + return JSON.parseObject(text, clazz); + } + + @Override + public List parseArray(String text, Class clazz) { + return JSON.parseArray(text, clazz); } @Override - public String object2Json(Object instance) { + public String toJsonString(Object instance) { return JSON.toJSONString(instance); } } diff --git a/jsoncomponent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java b/jsoncomponent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java index 0c32062..52768ac 100644 --- a/jsoncomponent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java +++ b/jsoncomponent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java @@ -6,7 +6,7 @@ *

Package: com.ljsw.component.json.runalone.application

*

Project: DDComponentForAndroid

*

Classname: JsonApplication

- *

Description: TODO

+ *

Description: json component runalone application

* Created by leobert on 2017/9/18. */ diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java index 901250f..b984a4e 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java @@ -4,7 +4,7 @@ *

Package: com.ljsw.router.compiler.utils

*

Project: DDComponentForAndroid

*

Classname: Constants

- *

Description: TODO

+ *

Description: Constants used by apt

* Created by leobert on 2017/9/18. */ @@ -42,9 +42,11 @@ public interface Constants { String BOOLEAN = LANG + ".Boolean"; String STRING = LANG + ".String"; - String TEMPLATE_PACKAGE = ".template"; +// String TEMPLATE_PACKAGE = ".template"; -// "com.mrzhang.component.componentlib.router.facade.ISyringe" +// /** +// * see at {@link com.mrzhang.component.componentlib.router.facade.ISyringe} +// */ String ISYRINGE = "com.mrzhang.component.componentlib.router.facade.ISyringe"; String JSON_SERVICE = "com.mrzhang.componentservice.json.JsonService"; diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Logger.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Logger.java index 05c6c1a..002e969 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Logger.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Logger.java @@ -7,7 +7,7 @@ *

Package: com.ljsw.router.compiler.utils

*

Project: DDComponentForAndroid

*

Classname: Logger

- *

Description: TODO

+ *

Description: logger for apt

* Created by leobert on 2017/9/18. */ diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/TypeUtils.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/TypeUtils.java index 7aaddd1..36f55da 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/TypeUtils.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/TypeUtils.java @@ -13,7 +13,7 @@ *

Package: com.ljsw.router.compiler.utils

*

Project: DDComponentForAndroid

*

Classname: TypeUtils

- *

Description: TODO

+ *

Description: utils for type inference

* Created by leobert on 2017/9/18. */ diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/enums/Type.java b/router-annotation/src/main/java/com/ljsw/router/facade/enums/Type.java index 18a3c09..6683ab4 100644 --- a/router-annotation/src/main/java/com/ljsw/router/facade/enums/Type.java +++ b/router-annotation/src/main/java/com/ljsw/router/facade/enums/Type.java @@ -4,7 +4,7 @@ *

Package: com.ljsw.router.facade.enums

*

Project: DDComponentForAndroid

*

Classname: Type

- *

Description: TODO

+ *

Description: enums for java basic types and STRING,PARCELABLE,OBJECT

* Created by leobert on 2017/9/18. */ @@ -29,5 +29,5 @@ public enum Type { STRING, PARCELABLE, - OBJECT; + OBJECT } From 941c44de47e0317078f833531562f2e3b4a32a8e Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Tue, 19 Sep 2017 11:17:14 +0800 Subject: [PATCH 031/103] [anno] [optimize code in AutowiredProcessor] --- .../com/mrzhang/component/MainActivity.java | 2 - .../com/mrzhang/reader/ReaderFragment.java | 5 ++ .../processor/AutowiredProcessor.java | 81 +++++++++---------- .../java/com/mrzhang/share/ShareActivity.java | 23 ++++++ 4 files changed, 67 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/mrzhang/component/MainActivity.java b/app/src/main/java/com/mrzhang/component/MainActivity.java index a46d0b8..3cb49c7 100644 --- a/app/src/main/java/com/mrzhang/component/MainActivity.java +++ b/app/src/main/java/com/mrzhang/component/MainActivity.java @@ -4,12 +4,10 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; -import android.util.Log; import android.view.View; import android.widget.Button; import com.mrzhang.component.componentlib.router.Router; -import com.mrzhang.componentservice.json.JsonService; import com.mrzhang.componentservice.readerbook.ReadBookService; public class MainActivity extends AppCompatActivity implements View.OnClickListener { diff --git a/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java b/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java index 82dcfd4..28ade30 100644 --- a/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java +++ b/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java @@ -25,12 +25,17 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, if (rootView == null) { rootView = inflater.inflate(R.layout.readerbook_fragment_reader, container, false); + + + rootView.findViewById(R.id.tv_content).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bundle bundle = new Bundle(); + final String _dto = "{\"s\":\"sss\"}"; bundle.putString("bookName","testBookName"); + bundle.putString("testDto",_dto); UIRouter.getInstance().openUri(getActivity(), "componentdemo://share", bundle); } }); diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java index 58d42cb..7123d7f 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java @@ -119,8 +119,6 @@ private void generateHelper() throws IOException, IllegalAccessException { TypeElement type_JsonService = elements.getTypeElement(Constants.JSON_SERVICE); -// TypeMirror iProvider = elements.getTypeElement(Constants.IPROVIDER).asType(); - TypeMirror activityTm = elements.getTypeElement(Constants.ACTIVITY).asType(); TypeMirror fragmentTm = elements.getTypeElement(Constants.FRAGMENT).asType(); TypeMirror fragmentTmV4 = elements.getTypeElement(Constants.FRAGMENT_V4).asType(); @@ -152,52 +150,53 @@ private void generateHelper() throws IOException, IllegalAccessException { .addModifiers(PUBLIC); FieldSpec jsonServiceField = FieldSpec.builder(TypeName.get(type_JsonService.asType()), - "JsonService", Modifier.PRIVATE).build(); + "jsonService", Modifier.PRIVATE).build(); helper.addField(jsonServiceField); - // JsonService service = (JsonService) router.getService(JsonService.class.getSimpleName()); -// -// + /* + * Router router = Router.getInstance(); + if (router.getService(JsonService.class.getSimpleName()) != null) { + JsonService jsonService = (JsonService) router.getService(JsonService.class.getSimpleName()); + } else { + throw new IllegalStateException("JsonService not found in Router"); + } + * */ + +// String _statement = +// " $T router = $T.getInstance();\n" + +// " if (router.getService($T.class.getSimpleName()) != null) {\n" + +// " jsonService = ($T) router.getService($T.class.getSimpleName());\n" + +// " }"; + logger.info("======== inject jsonservice"); - injectMethodBuilder.addStatement("JsonService = ($T) $T.getInstance().getService($T.class.getSimpleName())", - ClassName.get(type_JsonService), + + injectMethodBuilder.addStatement("$T router = $T.getInstance()", RouterClass, + RouterClass); + + injectMethodBuilder.beginControlFlow("if (router.getService($T.class.getSimpleName()) != null)", + ClassName.get(type_JsonService)); + + injectMethodBuilder.addStatement("jsonService = ($T) router.getService($T.class.getSimpleName())", + ClassName.get(type_JsonService), ClassName.get(type_JsonService)); + + injectMethodBuilder.endControlFlow(); + +// injectMethodBuilder.addStatement(_statement, +// RouterClass, +// RouterClass, +// ClassName.get(type_JsonService), +// ClassName.get(type_JsonService), +// ClassName.get(type_JsonService)); + injectMethodBuilder.addStatement("$T substitute = ($T)target", ClassName.get(parent), ClassName.get(parent)); // Generate method body, start inject. for (Element element : childs) { Autowired fieldConfig = element.getAnnotation(Autowired.class); String fieldName = element.getSimpleName().toString(); -// if (types.isSubtype(element.asType(), iProvider)) { // It's provider -// if ("".equals(fieldConfig.name())) { // User has not set service path, then use byType. -// -// // Getter -// injectMethodBuilder.addStatement( -// "substitute." + fieldName + " = $T.getInstance().navigation($T.class)", -// ARouterClass, -// ClassName.get(element.asType()) -// ); -// } else { // use byName -// // Getter -// injectMethodBuilder.addStatement( -// "substitute." + fieldName + " = ($T)$T.getInstance().build($S).navigation();", -// ClassName.get(element.asType()), -// ARouterClass, -// fieldConfig.name() -// ); -// } -// -// // Validater -// if (fieldConfig.required()) { -// injectMethodBuilder.beginControlFlow("if (substitute." + fieldName + " == null)"); -// injectMethodBuilder.addStatement( -// "throw new RuntimeException(\"The field '" + fieldName + "' is null, in class '\" + $T.class.getName() + \"!\")", ClassName.get(parent)); -// injectMethodBuilder.endControlFlow(); -// } -// } -// else { // It's normal intent value String originalValue = "substitute." + fieldName; String statment = "substitute." + fieldName + " = substitute."; boolean isActivity = false; @@ -213,8 +212,8 @@ private void generateHelper() throws IOException, IllegalAccessException { } statment = buildStatement(originalValue, statment, typeUtils.typeExchange(element), isActivity); - if (statment.startsWith("serializationService.")) { // Not mortals - injectMethodBuilder.beginControlFlow("if (null != serializationService)"); + if (statment.startsWith("jsonService.")) { // Not mortals + injectMethodBuilder.beginControlFlow("if (null != jsonService)"); injectMethodBuilder.addStatement( "substitute." + fieldName + " = " + statment, (StringUtils.isEmpty(fieldConfig.name()) ? fieldName : fieldConfig.name()), @@ -224,8 +223,7 @@ private void generateHelper() throws IOException, IllegalAccessException { injectMethodBuilder.addStatement( "$T.e(\"" + TAG + "\", \"You want automatic inject the field '" + fieldName + "' in class '$T' ," + - " then you should implement 'SerializationService' to support " + - "object auto inject!\")", AndroidLog, ClassName.get(parent)); + " but JsonService not found in Router\")", AndroidLog, ClassName.get(parent)); injectMethodBuilder.endControlFlow(); } else { @@ -240,7 +238,6 @@ private void generateHelper() throws IOException, IllegalAccessException { injectMethodBuilder.endControlFlow(); } } -// } helper.addMethod(injectMethodBuilder.build()); @@ -286,7 +283,7 @@ private String buildStatement(String originalValue, String statement, int type, } else if (type == Type.PARCELABLE.ordinal()) { statement += (isActivity ? ("getParcelableExtra($S)") : ("getParcelable($S)")); } else if (type == Type.OBJECT.ordinal()) { - statement = "serializationService.json2Object(substitute." + + statement = "jsonService.parseObject(substitute." + (isActivity ? "getIntent()." : "getArguments().") + (isActivity ? "getStringExtra($S)" : "getString($S)") + ", $T.class)"; } diff --git a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java index 0215cf0..85e0cbd 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java @@ -3,11 +3,13 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; +import android.util.Log; import android.widget.TextView; import com.ljsw.router.facade.annotation.Autowired; import com.mrzhang.component.componentlib.router.Router; import com.mrzhang.componentservice.di.AutowiredService; +import com.mrzhang.componentservice.json.JsonService; /** * Created by mrzhang on 2017/6/20. @@ -15,9 +17,26 @@ public class ShareActivity extends AppCompatActivity { + private static final String TAG = ShareActivity.class.getSimpleName(); + + static class TestDto { + String s; + + public String getS() { + return s; + } + + public void setS(String s) { + this.s = s; + } + } + @Autowired String bookName; + @Autowired + TestDto testDto; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -34,6 +53,10 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { TextView textView = (TextView) findViewById(R.id.share_tv_tag); textView.setText("share: " + bookName); + Log.d(TAG,"dto:\r"+((JsonService)Router.getInstance() + .getService(JsonService.class.getSimpleName())) + .toJsonString(testDto)); + } } From d9b22006a55eac35f1185d1063b0a634278351c1 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Tue, 19 Sep 2017 19:56:09 +0800 Subject: [PATCH 032/103] [anno] [add auto-complete mapper config for UiRoute, but isn't graceful] --- .../componentlib/router/RouterConstants.java | 12 - .../processor/RouterDefProcessor.java | 12 - .../compiler/processor/RouterProcessor.java | 219 ++++++++++++++++++ .../ljsw/router/compiler/utils/Constants.java | 12 +- .../ljsw/router/facade/IUiRouterLoader.java | 15 ++ .../router/facade/UiRouterMapperUtils.java | 34 +++ .../{RouteDef.java => RouteNode.java} | 21 +- .../ljsw/router/facade/annotation/Router.java | 20 ++ .../ljsw/router/facade/enums/NodeType.java | 51 ++++ .../com/ljsw/router/facade/model/Node.java | 61 +++++ .../java/com/mrzhang/share/ShareActivity.java | 3 +- .../share/compouirouter/ShareUIRouter.java | 29 ++- 12 files changed, 431 insertions(+), 58 deletions(-) delete mode 100644 router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterDefProcessor.java create mode 100644 router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java create mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java create mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java rename router-annotation/src/main/java/com/ljsw/router/facade/annotation/{RouteDef.java => RouteNode.java} (69%) create mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java create mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/enums/NodeType.java create mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/model/Node.java diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java index 709307a..7ab9ed4 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java @@ -10,19 +10,7 @@ public class RouterConstants { public static final String SDK_NAME = "Router"; - public static final String TAG = SDK_NAME + "::"; public static final String SEPARATOR = "$$"; - public static final String SUFFIX_ROOT = "Root"; - public static final String SUFFIX_INTERCEPTORS = "Interceptors"; - public static final String SUFFIX_PROVIDERS = "Providers"; public static final String SUFFIX_AUTOWIRED = SEPARATOR + SDK_NAME + SEPARATOR + "Autowired"; - public static final String DOT = "."; -// public static final String ROUTE_ROOT_PAKCAGE = "com.alibaba.android.arouter.routes"; -// -// public static final String AROUTER_SP_CACHE_KEY = "SP_AROUTER_CACHE"; -// public static final String AROUTER_SP_KEY_MAP = "ROUTER_MAP"; -// -// public static final String LAST_VERSION_NAME = "LAST_VERSION_NAME"; -// public static final String LAST_VERSION_CODE = "LAST_VERSION_CODE"; } diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterDefProcessor.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterDefProcessor.java deleted file mode 100644 index e017b52..0000000 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterDefProcessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ljsw.router.compiler.processor; - -/** - *

Package: com.ljsw.router.compiler.processor

- *

Project: DDComponentForAndroid

- *

Classname: RouterDefProcessor

- *

Description: TODO

- * Created by leobert on 2017/9/18. - */ - -public class RouterDefProcessor { -} diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java new file mode 100644 index 0000000..0078cb4 --- /dev/null +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java @@ -0,0 +1,219 @@ +package com.ljsw.router.compiler.processor; + +import com.google.auto.service.AutoService; +import com.ljsw.router.compiler.utils.Logger; +import com.ljsw.router.facade.annotation.RouteNode; +import com.ljsw.router.facade.annotation.Router; +import com.ljsw.router.facade.enums.NodeType; +import com.ljsw.router.facade.model.Node; +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.JavaFile; +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.ParameterSpec; +import com.squareup.javapoet.ParameterizedTypeName; +import com.squareup.javapoet.TypeSpec; + +import org.apache.commons.collections4.CollectionUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.Filer; +import javax.annotation.processing.ProcessingEnvironment; +import javax.annotation.processing.Processor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedOptions; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.MirroredTypeException; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; + +import static com.ljsw.router.compiler.utils.Constants.ACTIVITY; +import static com.ljsw.router.compiler.utils.Constants.ANNOTATION_TYPE_ROUTER; +import static com.ljsw.router.compiler.utils.Constants.ANNOTATION_TYPE_ROUTE_NODE; +import static com.ljsw.router.compiler.utils.Constants.KEY_MODULE_NAME; +import static com.ljsw.router.compiler.utils.Constants.ROUTER_UTIL_METHOD_ADDTO; +import static com.ljsw.router.compiler.utils.Constants.TYPE_UIROUTER_LOADER; +import static javax.lang.model.element.Modifier.PUBLIC; + +/** + *

Package: com.ljsw.router.compiler.processor

+ *

Project: DDComponentForAndroid

+ *

Classname: RouterProcessor

+ *

Description: generate RouterLoader class for 'Router' annotated class, + * parse 'RouteNode' annotated Activities to mapper + *

+ * Created by leobert on 2017/9/18. + */ +@AutoService(Processor.class) +@SupportedOptions(KEY_MODULE_NAME) +@SupportedSourceVersion(SourceVersion.RELEASE_7) +@SupportedAnnotationTypes({ANNOTATION_TYPE_ROUTE_NODE, ANNOTATION_TYPE_ROUTER}) +public class RouterProcessor extends AbstractProcessor { + private Logger logger; + + private Filer mFiler; // File util, write class file into disk. + private Types types; + private Elements elements; + + private Map routers; + private Map> routerNodes; + + @Override + public synchronized void init(ProcessingEnvironment processingEnv) { + super.init(processingEnv); + + routers = new HashMap<>(); + routerNodes = new HashMap<>(); + + mFiler = processingEnv.getFiler(); // Generate class. + types = processingEnv.getTypeUtils(); // Get type utils. + elements = processingEnv.getElementUtils(); // Get class meta. + + logger = new Logger(processingEnv.getMessager()); // Package the log utils. + + logger.info(">>> RouteProcessor init. <<<"); + } + + @Override + public boolean process(Set set, RoundEnvironment roundEnvironment) { + if (CollectionUtils.isNotEmpty(set)) { + Set routeService = + roundEnvironment.getElementsAnnotatedWith(Router.class); + try { + logger.info(">>> Found routeService <<<"); + this.foundRouters(routeService); + } catch (Exception e) { + logger.error(e); + } + + + Set routeNodes = roundEnvironment.getElementsAnnotatedWith(RouteNode.class); + try { + logger.info(">>> Found routes, start... <<<"); + this.parseRouteNodes(routeNodes); + } catch (Exception e) { + logger.error(e); + } + + this.write2Util(); + + return true; + } + + return false; + } + + private void write2Util() { + Set groups = routers.keySet(); + + ClassName type_UiRouterLoader = ClassName.get(elements.getTypeElement(TYPE_UIROUTER_LOADER)); + for (String group : groups) { + logger.info(">>> write for group:" + group); + + TypeMirror value = routers.get(group); + String path = value.toString(); + + String pkg = path.substring(0, path.lastIndexOf(".")); + String cn = path.substring(path.lastIndexOf(".") + 1) + "Loader"; + + ParameterizedTypeName inputMapTypeOfGroup = ParameterizedTypeName.get( + ClassName.get(Map.class), + ClassName.get(String.class), + ClassName.get(Class.class) + ); + + ParameterSpec groupParamSpec = + ParameterSpec.builder(inputMapTypeOfGroup, "mapper").build(); + + + MethodSpec.Builder loadIntoMethodOfRootBuilder = + MethodSpec.methodBuilder(ROUTER_UTIL_METHOD_ADDTO) + .addParameter(groupParamSpec) + .addAnnotation(Override.class) + .addModifiers(PUBLIC); + + List nodes = routerNodes.get(group); + for (Node node : nodes) { + loadIntoMethodOfRootBuilder.addStatement( + "mapper.put($S,$T.class)", + node.getPath(), + ClassName.get((TypeElement) node.getRawType())); + } + + + try { + JavaFile.builder(pkg, TypeSpec.classBuilder(cn) + .addModifiers(PUBLIC) + .addSuperinterface(type_UiRouterLoader) + .addMethod(loadIntoMethodOfRootBuilder.build()) + .build() + ).build().writeTo(mFiler); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private void parseRouteNodes(Set routeElements) { + + TypeMirror type_Activity = elements.getTypeElement(ACTIVITY).asType(); + + for (Element element : routeElements) { + TypeMirror tm = element.asType(); + RouteNode route = element.getAnnotation(RouteNode.class); + + if (types.isSubtype(tm, type_Activity)) { // Activity + logger.info(">>> Found activity route: " + tm.toString() + " <<<"); + + String group = route.group(); + + Node node = new Node(); + node.setPath(route.path()); + node.setPriority(route.priority()); + node.setNodeType(NodeType.ACTIVITY); + node.setRawType(element); + + if (routerNodes.containsKey(group)) { + routerNodes.get(group).add(node); + } else { + ArrayList nodes = new ArrayList<>(); + nodes.add(node); + routerNodes.put(group, nodes); + } + } else { + throw new IllegalStateException("only activity can be annotated by RouteNode"); + } + } + } + + private void foundRouters(Set routers) { + for (Element element : routers) { + Router router = element.getAnnotation(Router.class); + String group = router.group(); + if (this.routers.containsKey(group)) + throw new IllegalStateException("duplicated group at annotation," + + "please check group:" + group); + + //use exception to get path + TypeMirror value = null; + try { + router.classPath(); + } catch (MirroredTypeException mte) { + value = mte.getTypeMirror(); + } + + this.routers.put(group, value); + } + } +} diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java index b984a4e..bd344b2 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java @@ -18,7 +18,8 @@ public interface Constants { /////////////////////////////////////////////////////////////////////////// String KEY_MODULE_NAME = "ModuleName"; - String ANNOTATION_TYPE_ROUTE = ANNO_FACADE_PKG + ".annotation.Route"; + String ANNOTATION_TYPE_ROUTE_NODE = ANNO_FACADE_PKG + ".annotation.RouteNode"; + String ANNOTATION_TYPE_ROUTER = ANNO_FACADE_PKG + ".annotation.Router"; String ANNOTATION_TYPE_AUTOWIRED = ANNO_FACADE_PKG + ".annotation.Autowired"; String PREFIX_OF_LOGGER = "[Router-Anno-Compiler]-- "; @@ -42,13 +43,12 @@ public interface Constants { String BOOLEAN = LANG + ".Boolean"; String STRING = LANG + ".String"; -// String TEMPLATE_PACKAGE = ".template"; - -// /** -// * see at {@link com.mrzhang.component.componentlib.router.facade.ISyringe} -// */ String ISYRINGE = "com.mrzhang.component.componentlib.router.facade.ISyringe"; String JSON_SERVICE = "com.mrzhang.componentservice.json.JsonService"; + + String ROUTER_UTIL_METHOD_ADDTO = "addTo"; + + String TYPE_UIROUTER_LOADER = "com.ljsw.router.facade.IUiRouterLoader"; } diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java b/router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java new file mode 100644 index 0000000..3938174 --- /dev/null +++ b/router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java @@ -0,0 +1,15 @@ +package com.ljsw.router.facade; + +import java.util.Map; + +/** + *

Package: com.ljsw.router.facade

+ *

Project: DDComponentForAndroid

+ *

Classname: IUiRouterUtil

+ *

Description: used to add route mapper

+ * Created by leobert on 2017/9/19. + */ + +public interface IUiRouterLoader { + void addTo(Map atlas); +} diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java b/router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java new file mode 100644 index 0000000..531d4f9 --- /dev/null +++ b/router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java @@ -0,0 +1,34 @@ +package com.ljsw.router.facade; + +import java.util.Map; + +/** + *

Package: com.ljsw.router.facade

+ *

Project: DDComponentForAndroid

+ *

Classname: UiRouterMapperUtils

+ *

Description: used to fetch mapper from generated XXLoader class for XX

+ * Created by leobert on 2017/9/19. + */ + +public class UiRouterMapperUtils { + public static void fetchRouteForMe(Class clz, Map mapper) { + if (clz == null) + throw new IllegalArgumentException("give me your component-uirouter class"); + if (mapper == null) + throw new IllegalArgumentException("mapper cannot be null!"); + + String name = clz.getName() + "Loader"; + try { + Class util = Class.forName(name); + IUiRouterLoader instance = (IUiRouterLoader) util.newInstance(); + instance.addTo(mapper); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + } +} diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/annotation/RouteDef.java b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/RouteNode.java similarity index 69% rename from router-annotation/src/main/java/com/ljsw/router/facade/annotation/RouteDef.java rename to router-annotation/src/main/java/com/ljsw/router/facade/annotation/RouteNode.java index cc31935..7b7446d 100644 --- a/router-annotation/src/main/java/com/ljsw/router/facade/annotation/RouteDef.java +++ b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/RouteNode.java @@ -9,12 +9,12 @@ *

Package: com.ljsw.router.facade.annotation

*

Project: DDComponentForAndroid

*

Classname: RouteDef

- *

Description: used to decline a route

+ *

Description: used to decline a route node

* Created by leobert on 2017/9/18. */ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.CLASS) -public @interface RouteDef { +public @interface RouteNode { /** * path of one route */ @@ -26,18 +26,15 @@ * e.g. * '/user/login' and '/user/register' can be merger into group 'user' * + * we have departed the whole system to different component,thus it is useless + * to define group for merge router + * + * it will be removed when route develop complete. + * + * emmm.... 暂时留存该设计 */ - String group() default ""; - - /** - * Name of route, used to generate javadoc. - */ - String name() default "undefined"; + String group() default "default"; - /** - * Extra data, can be set by user. - */ - int extras() default Integer.MIN_VALUE; /** * The priority of route. diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java new file mode 100644 index 0000000..98674ae --- /dev/null +++ b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java @@ -0,0 +1,20 @@ +package com.ljsw.router.facade.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

Package: com.ljsw.router.facade.annotation

+ *

Project: DDComponentForAndroid

+ *

Classname: Routes

+ *

Description: use to def the router which dispatches requests

+ * Created by leobert on 2017/9/19. + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.CLASS) +public @interface Router { + Class classPath(); + String group() default "default"; +} diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/enums/NodeType.java b/router-annotation/src/main/java/com/ljsw/router/facade/enums/NodeType.java new file mode 100644 index 0000000..122e4f2 --- /dev/null +++ b/router-annotation/src/main/java/com/ljsw/router/facade/enums/NodeType.java @@ -0,0 +1,51 @@ +package com.ljsw.router.facade.enums; + +/** + *

Package: com.ljsw.router.facade.enums

+ *

Project: DDComponentForAndroid

+ *

Classname: NodeType

+ *

Description: TODO

+ * Created by leobert on 2017/9/19. + */ + +public enum NodeType { + ACTIVITY(0, "android.app.Activity"), + INVALID(-1,"invalid node type, currently only activity allowed"); + + int id; + String className; + + NodeType(int id, String className) { + this.id = id; + this.className = className; + } + + public int getId() { + return id; + } + + public NodeType setId(int id) { + this.id = id; + return this; + } + + public String getClassName() { + return className; + } + + public NodeType setClassName(String className) { + this.className = className; + return this; + } + + public static NodeType parse(String name) { + for (NodeType nodeType : NodeType.values()) { + if (nodeType.getClassName().equals(name)) { + return nodeType; + } + } + + return INVALID; + } + +} diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/model/Node.java b/router-annotation/src/main/java/com/ljsw/router/facade/model/Node.java new file mode 100644 index 0000000..1fa9035 --- /dev/null +++ b/router-annotation/src/main/java/com/ljsw/router/facade/model/Node.java @@ -0,0 +1,61 @@ +package com.ljsw.router.facade.model; + +import com.ljsw.router.facade.enums.NodeType; + +import javax.lang.model.element.Element; + +/** + *

Package: com.ljsw.router.facade.model

+ *

Project: DDComponentForAndroid

+ *

Classname: Node

+ *

Description: TODO

+ * Created by leobert on 2017/9/19. + */ + +public class Node { + private NodeType nodeType; + private Element rawType; // Raw type of route + private Class destination; // Destination + private String path; // Path of route + private int priority = -1; // The smaller the number, the higher the priority + + public NodeType getNodeType() { + return nodeType; + } + + public void setNodeType(NodeType nodeType) { + this.nodeType = nodeType; + } + + public Element getRawType() { + return rawType; + } + + public void setRawType(Element rawType) { + this.rawType = rawType; + } + + public Class getDestination() { + return destination; + } + + public void setDestination(Class destination) { + this.destination = destination; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public int getPriority() { + return priority; + } + + public void setPriority(int priority) { + this.priority = priority; + } +} diff --git a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java index 85e0cbd..500bb35 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java @@ -7,6 +7,7 @@ import android.widget.TextView; import com.ljsw.router.facade.annotation.Autowired; +import com.ljsw.router.facade.annotation.RouteNode; import com.mrzhang.component.componentlib.router.Router; import com.mrzhang.componentservice.di.AutowiredService; import com.mrzhang.componentservice.json.JsonService; @@ -14,7 +15,7 @@ /** * Created by mrzhang on 2017/6/20. */ - +@RouteNode(path = "share") public class ShareActivity extends AppCompatActivity { private static final String TAG = ShareActivity.class.getSimpleName(); diff --git a/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java b/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java index 90742c1..59c7f8c 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java @@ -6,25 +6,27 @@ import android.os.Bundle; import android.text.TextUtils; +import com.ljsw.router.facade.UiRouterMapperUtils; +import com.ljsw.router.facade.annotation.Router; import com.mrzhang.component.componentlib.router.ui.IComponentRouter; -import com.mrzhang.share.ShareActivity; + +import java.util.HashMap; +import java.util.Map; /** * Created by mrzhang on 2017/6/20. */ - +@Router(classPath = ShareUIRouter.class) public class ShareUIRouter implements IComponentRouter { - private static final String SCHME = "componentdemo"; + private static final String SCHEME = "componentdemo"; - private static final String SHAREHOST = "share"; - - private static String[] HOSTS = new String[]{SHAREHOST}; + private Map activitiesRouterMap = new HashMap<>(); private static ShareUIRouter instance = new ShareUIRouter(); private ShareUIRouter() { - + UiRouterMapperUtils.fetchRouteForMe(getClass(), activitiesRouterMap); } public static ShareUIRouter getInstance() { @@ -45,8 +47,9 @@ public boolean openUri(Context context, Uri uri, Bundle bundle) { return true; } String host = uri.getHost(); - if (SHAREHOST.equals(host)) { - Intent intent = new Intent(context, ShareActivity.class); + if (activitiesRouterMap.containsKey(host)) { + Class target = activitiesRouterMap.get(host); + Intent intent = new Intent(context, target); intent.putExtras(bundle == null ? new Bundle() : bundle); context.startActivity(intent); return true; @@ -58,12 +61,8 @@ public boolean openUri(Context context, Uri uri, Bundle bundle) { public boolean verifyUri(Uri uri) { String scheme = uri.getScheme(); String host = uri.getHost(); - if (SCHME.equals(scheme)) { - for (String str : HOSTS) { - if (str.equals(host)) { - return true; - } - } + if (SCHEME.equals(scheme)) { + return activitiesRouterMap.containsKey(host); } return false; } From d1ad8aba54739d5b9ed304f17d9f9456a5087bee Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Wed, 20 Sep 2017 20:04:57 +0800 Subject: [PATCH 033/103] [anno] [change jsonComponent to jsonlib. Currently still use Router to fetch JsonService] --- app/build.gradle | 2 ++ app/gradle.properties | 7 ++--- .../component/application/AppApplication.java | 6 ++++ componentservice/build.gradle | 3 +- .../component/json/applike/JsonAppLike.java | 29 ------------------- .../src/main/runalone/AndroidManifest.xml | 13 --------- .../runalone/application/JsonApplication.java | 14 --------- .../src/main/runalone/res/values/strings.xml | 2 -- {jsoncomponent => jsonlib}/.gitignore | 0 {jsoncomponent => jsonlib}/build.gradle | 21 +++++--------- {jsoncomponent => jsonlib}/gradle.properties | 0 {jsoncomponent => jsonlib}/proguard-rules.pro | 0 .../json/ExampleInstrumentedTest.java | 0 .../src/main/AndroidManifest.xml | 0 .../json/serviceimpl/JsonServiceImpl.java | 0 .../src/main/res/values/strings.xml | 0 .../ljsw/component/json/ExampleUnitTest.java | 0 settings.gradle | 2 +- 18 files changed, 20 insertions(+), 79 deletions(-) delete mode 100644 jsoncomponent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java delete mode 100644 jsoncomponent/src/main/runalone/AndroidManifest.xml delete mode 100644 jsoncomponent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java delete mode 100644 jsoncomponent/src/main/runalone/res/values/strings.xml rename {jsoncomponent => jsonlib}/.gitignore (100%) rename {jsoncomponent => jsonlib}/build.gradle (67%) rename {jsoncomponent => jsonlib}/gradle.properties (100%) rename {jsoncomponent => jsonlib}/proguard-rules.pro (100%) rename {jsoncomponent => jsonlib}/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java (100%) rename {jsoncomponent => jsonlib}/src/main/AndroidManifest.xml (100%) rename {jsoncomponent => jsonlib}/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java (100%) rename {jsoncomponent => jsonlib}/src/main/res/values/strings.xml (100%) rename {jsoncomponent => jsonlib}/src/test/java/com/ljsw/component/json/ExampleUnitTest.java (100%) diff --git a/app/build.gradle b/app/build.gradle index b605485..92256a3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,6 +27,8 @@ android { dependencies { compile project(':componentservice') + compile project(':jsonlib') + // annotationProcessor project(':router-anno-compiler') } diff --git a/app/gradle.properties b/app/gradle.properties index 448440a..332a56d 100644 --- a/app/gradle.properties +++ b/app/gradle.properties @@ -12,9 +12,8 @@ org.gradle.jvmargs=-Xmx1536m # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true isRunAlone=true -debugComponent=readercomponent,sharecomponent,jsoncomponent,dicomponent -#debugComponent=readercomponent,com.mrzhang.share:sharecomponent,jsoncomponent,dicomponent - -compileComponent=readercomponent,sharecomponent,jsoncomponent,dicomponent +debugComponent=readercomponent,sharecomponent +#debugComponent=readercomponent,com.mrzhang.share:sharecomponent +compileComponent=readercomponent,sharecomponent diff --git a/app/src/main/java/com/mrzhang/component/application/AppApplication.java b/app/src/main/java/com/mrzhang/component/application/AppApplication.java index 2fc73df..7a81c95 100644 --- a/app/src/main/java/com/mrzhang/component/application/AppApplication.java +++ b/app/src/main/java/com/mrzhang/component/application/AppApplication.java @@ -2,6 +2,10 @@ import android.app.Application; +import com.ljsw.component.json.serviceimpl.JsonServiceImpl; +import com.mrzhang.component.componentlib.router.Router; +import com.mrzhang.componentservice.json.JsonService; + /** * Created by mrzhang on 2017/6/15. */ @@ -16,6 +20,8 @@ public void onCreate() { // Router.registerComponent("com.mrzhang.reader.applike.ReaderAppLike"); // Router.registerComponent("com.mrzhang.share.applike.ShareApplike"); + // register jsonService + Router.getInstance().addService(JsonService.class.getSimpleName(), new JsonServiceImpl()); } diff --git a/componentservice/build.gradle b/componentservice/build.gradle index 5af7151..bdb2b49 100644 --- a/componentservice/build.gradle +++ b/componentservice/build.gradle @@ -24,8 +24,7 @@ android { dependencies { compile project(':componentlib') compile project(':basicres') - compile fileTree(dir: 'libs', include: ['*.jar']) - + compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) diff --git a/jsoncomponent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java b/jsoncomponent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java deleted file mode 100644 index 8afec69..0000000 --- a/jsoncomponent/src/main/java/com/ljsw/component/json/applike/JsonAppLike.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.ljsw.component.json.applike; - -import com.ljsw.component.json.serviceimpl.JsonServiceImpl; -import com.mrzhang.component.componentlib.applicationlike.IApplicationLike; -import com.mrzhang.component.componentlib.router.Router; -import com.mrzhang.componentservice.json.JsonService; - -/** - *

Package: com.ljsw.component.json.applike

- *

Project: DDComponentForAndroid

- *

Classname: JsonAppLike

- *

Description: component mount/dismount delegate

- * Created by leobert on 2017/9/18. - */ - -public class JsonAppLike implements IApplicationLike { - - Router router = Router.getInstance(); - - @Override - public void onCreate() { - router.addService(JsonService.class.getSimpleName(),new JsonServiceImpl()); - } - - @Override - public void onStop() { - router.removeService(JsonService.class.getSimpleName()); - } -} diff --git a/jsoncomponent/src/main/runalone/AndroidManifest.xml b/jsoncomponent/src/main/runalone/AndroidManifest.xml deleted file mode 100644 index 2d455bf..0000000 --- a/jsoncomponent/src/main/runalone/AndroidManifest.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - diff --git a/jsoncomponent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java b/jsoncomponent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java deleted file mode 100644 index 52768ac..0000000 --- a/jsoncomponent/src/main/runalone/java/com/ljsw/component/json/runalone/application/JsonApplication.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.ljsw.component.json.runalone.application; - -import android.app.Application; - -/** - *

Package: com.ljsw.component.json.runalone.application

- *

Project: DDComponentForAndroid

- *

Classname: JsonApplication

- *

Description: json component runalone application

- * Created by leobert on 2017/9/18. - */ - -public class JsonApplication extends Application { -} diff --git a/jsoncomponent/src/main/runalone/res/values/strings.xml b/jsoncomponent/src/main/runalone/res/values/strings.xml deleted file mode 100644 index 8542005..0000000 --- a/jsoncomponent/src/main/runalone/res/values/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/jsoncomponent/.gitignore b/jsonlib/.gitignore similarity index 100% rename from jsoncomponent/.gitignore rename to jsonlib/.gitignore diff --git a/jsoncomponent/build.gradle b/jsonlib/build.gradle similarity index 67% rename from jsoncomponent/build.gradle rename to jsonlib/build.gradle index b135185..8a247aa 100644 --- a/jsoncomponent/build.gradle +++ b/jsonlib/build.gradle @@ -1,26 +1,24 @@ -apply plugin: 'com.dd.comgradle' +apply plugin: 'com.android.library' android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" + compileSdkVersion 26 + buildToolsVersion "26.0.0" + defaultConfig { minSdkVersion 15 - targetSdkVersion 14 + targetSdkVersion 26 versionCode 1 versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } + } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } - debug { - minifyEnabled false - } } - resourcePrefix "json_" } dependencies { @@ -31,9 +29,4 @@ dependencies { exclude group: 'com.android.support', module: 'support-annotations' }) testCompile 'junit:junit:4.12' -} - -combuild { - applicatonName = 'com.ljsw.component.json.runalone.application.JsonApplication' - isRegisterCompoAuto = true } \ No newline at end of file diff --git a/jsoncomponent/gradle.properties b/jsonlib/gradle.properties similarity index 100% rename from jsoncomponent/gradle.properties rename to jsonlib/gradle.properties diff --git a/jsoncomponent/proguard-rules.pro b/jsonlib/proguard-rules.pro similarity index 100% rename from jsoncomponent/proguard-rules.pro rename to jsonlib/proguard-rules.pro diff --git a/jsoncomponent/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java b/jsonlib/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java similarity index 100% rename from jsoncomponent/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java rename to jsonlib/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java diff --git a/jsoncomponent/src/main/AndroidManifest.xml b/jsonlib/src/main/AndroidManifest.xml similarity index 100% rename from jsoncomponent/src/main/AndroidManifest.xml rename to jsonlib/src/main/AndroidManifest.xml diff --git a/jsoncomponent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java b/jsonlib/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java similarity index 100% rename from jsoncomponent/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java rename to jsonlib/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java diff --git a/jsoncomponent/src/main/res/values/strings.xml b/jsonlib/src/main/res/values/strings.xml similarity index 100% rename from jsoncomponent/src/main/res/values/strings.xml rename to jsonlib/src/main/res/values/strings.xml diff --git a/jsoncomponent/src/test/java/com/ljsw/component/json/ExampleUnitTest.java b/jsonlib/src/test/java/com/ljsw/component/json/ExampleUnitTest.java similarity index 100% rename from jsoncomponent/src/test/java/com/ljsw/component/json/ExampleUnitTest.java rename to jsonlib/src/test/java/com/ljsw/component/json/ExampleUnitTest.java diff --git a/settings.gradle b/settings.gradle index 17438d4..7d12134 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -include ':app', ':jsoncomponent', ':dicomponent', +include ':app', ':jsonlib', ':dicomponent', ':componentlib', ':readercomponent', ':sharecomponent', From 2b9763cac280733a49fc394851201d67cd0b124b Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Wed, 20 Sep 2017 20:16:47 +0800 Subject: [PATCH 034/103] [anno] [change dicomponent to dilib, but still use Router for fetch] --- app/build.gradle | 2 ++ .../component/application/AppApplication.java | 9 +++++++- .../src/main/runalone/AndroidManifest.xml | 13 ------------ .../runalone/application/DIApplication.java | 14 ------------- .../src/main/runalone/res/values/strings.xml | 2 -- {dicomponent => dilib}/.gitignore | 0 {dicomponent => dilib}/build.gradle | 21 +++++++------------ {dicomponent => dilib}/gradle.properties | 0 {dicomponent => dilib}/proguard-rules.pro | 0 .../component/di/ExampleInstrumentedTest.java | 0 .../src/main/AndroidManifest.xml | 0 .../di/applike/DepInjectAppLike.java | 0 .../di/serviceimpl/AutowiredServiceImpl.java | 0 .../src/main/res/values/strings.xml | 0 .../ljsw/component/di/ExampleUnitTest.java | 0 settings.gradle | 2 +- 16 files changed, 18 insertions(+), 45 deletions(-) delete mode 100644 dicomponent/src/main/runalone/AndroidManifest.xml delete mode 100644 dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java delete mode 100644 dicomponent/src/main/runalone/res/values/strings.xml rename {dicomponent => dilib}/.gitignore (100%) rename {dicomponent => dilib}/build.gradle (66%) rename {dicomponent => dilib}/gradle.properties (100%) rename {dicomponent => dilib}/proguard-rules.pro (100%) rename {dicomponent => dilib}/src/androidTest/java/com/ljsw/component/di/ExampleInstrumentedTest.java (100%) rename {dicomponent => dilib}/src/main/AndroidManifest.xml (100%) rename {dicomponent => dilib}/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java (100%) rename {dicomponent => dilib}/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java (100%) rename {dicomponent => dilib}/src/main/res/values/strings.xml (100%) rename {dicomponent => dilib}/src/test/java/com/ljsw/component/di/ExampleUnitTest.java (100%) diff --git a/app/build.gradle b/app/build.gradle index 92256a3..2a49596 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,6 +29,8 @@ dependencies { compile project(':jsonlib') + compile project(':dilib') + // annotationProcessor project(':router-anno-compiler') } diff --git a/app/src/main/java/com/mrzhang/component/application/AppApplication.java b/app/src/main/java/com/mrzhang/component/application/AppApplication.java index 7a81c95..0d31493 100644 --- a/app/src/main/java/com/mrzhang/component/application/AppApplication.java +++ b/app/src/main/java/com/mrzhang/component/application/AppApplication.java @@ -2,8 +2,10 @@ import android.app.Application; +import com.ljsw.component.di.serviceimpl.AutowiredServiceImpl; import com.ljsw.component.json.serviceimpl.JsonServiceImpl; import com.mrzhang.component.componentlib.router.Router; +import com.mrzhang.componentservice.di.AutowiredService; import com.mrzhang.componentservice.json.JsonService; /** @@ -21,7 +23,12 @@ public void onCreate() { // Router.registerComponent("com.mrzhang.share.applike.ShareApplike"); // register jsonService - Router.getInstance().addService(JsonService.class.getSimpleName(), new JsonServiceImpl()); + Router.getInstance().addService(JsonService.class.getSimpleName(), + new JsonServiceImpl()); + + // register DI-AutowiredService + Router.getInstance().addService(AutowiredService.class.getSimpleName(), + new AutowiredServiceImpl()); } diff --git a/dicomponent/src/main/runalone/AndroidManifest.xml b/dicomponent/src/main/runalone/AndroidManifest.xml deleted file mode 100644 index 0514864..0000000 --- a/dicomponent/src/main/runalone/AndroidManifest.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - diff --git a/dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java b/dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java deleted file mode 100644 index e546da9..0000000 --- a/dicomponent/src/main/runalone/java/com/ljsw/component/di/runalone/application/DIApplication.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.ljsw.component.di.runalone.application; - -import android.app.Application; - -/** - *

Package: com.ljsw.component.json.runalone.application

- *

Project: DDComponentForAndroid

- *

Classname: JsonApplication

- *

Description: dependency inject component runalone application

- * Created by leobert on 2017/9/18. - */ - -public class DIApplication extends Application { -} diff --git a/dicomponent/src/main/runalone/res/values/strings.xml b/dicomponent/src/main/runalone/res/values/strings.xml deleted file mode 100644 index 8542005..0000000 --- a/dicomponent/src/main/runalone/res/values/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/dicomponent/.gitignore b/dilib/.gitignore similarity index 100% rename from dicomponent/.gitignore rename to dilib/.gitignore diff --git a/dicomponent/build.gradle b/dilib/build.gradle similarity index 66% rename from dicomponent/build.gradle rename to dilib/build.gradle index c6e94f2..bc4ebc4 100644 --- a/dicomponent/build.gradle +++ b/dilib/build.gradle @@ -1,26 +1,24 @@ -apply plugin: 'com.dd.comgradle' +apply plugin: 'com.android.library' android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" + compileSdkVersion 26 + buildToolsVersion "26.0.0" + defaultConfig { minSdkVersion 15 - targetSdkVersion 14 + targetSdkVersion 26 versionCode 1 versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } + } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } - debug { - minifyEnabled false - } } - resourcePrefix "di_" } dependencies { @@ -31,8 +29,3 @@ dependencies { }) testCompile 'junit:junit:4.12' } - -combuild { - applicatonName = 'com.ljsw.component.di.runalone.application.DIApplication' - isRegisterCompoAuto = true -} \ No newline at end of file diff --git a/dicomponent/gradle.properties b/dilib/gradle.properties similarity index 100% rename from dicomponent/gradle.properties rename to dilib/gradle.properties diff --git a/dicomponent/proguard-rules.pro b/dilib/proguard-rules.pro similarity index 100% rename from dicomponent/proguard-rules.pro rename to dilib/proguard-rules.pro diff --git a/dicomponent/src/androidTest/java/com/ljsw/component/di/ExampleInstrumentedTest.java b/dilib/src/androidTest/java/com/ljsw/component/di/ExampleInstrumentedTest.java similarity index 100% rename from dicomponent/src/androidTest/java/com/ljsw/component/di/ExampleInstrumentedTest.java rename to dilib/src/androidTest/java/com/ljsw/component/di/ExampleInstrumentedTest.java diff --git a/dicomponent/src/main/AndroidManifest.xml b/dilib/src/main/AndroidManifest.xml similarity index 100% rename from dicomponent/src/main/AndroidManifest.xml rename to dilib/src/main/AndroidManifest.xml diff --git a/dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java b/dilib/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java similarity index 100% rename from dicomponent/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java rename to dilib/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java diff --git a/dicomponent/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java b/dilib/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java similarity index 100% rename from dicomponent/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java rename to dilib/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java diff --git a/dicomponent/src/main/res/values/strings.xml b/dilib/src/main/res/values/strings.xml similarity index 100% rename from dicomponent/src/main/res/values/strings.xml rename to dilib/src/main/res/values/strings.xml diff --git a/dicomponent/src/test/java/com/ljsw/component/di/ExampleUnitTest.java b/dilib/src/test/java/com/ljsw/component/di/ExampleUnitTest.java similarity index 100% rename from dicomponent/src/test/java/com/ljsw/component/di/ExampleUnitTest.java rename to dilib/src/test/java/com/ljsw/component/di/ExampleUnitTest.java diff --git a/settings.gradle b/settings.gradle index 7d12134..d9db8b5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -include ':app', ':jsonlib', ':dicomponent', +include ':app', ':jsonlib', ':dilib', ':componentlib', ':readercomponent', ':sharecomponent', From 20e7b338fedafa3cf39e1b5ecc6443cf8b49ce20 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Wed, 20 Sep 2017 20:59:29 +0800 Subject: [PATCH 035/103] [anno] [remove unused applike] --- .../di/applike/DepInjectAppLike.java | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 dilib/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java diff --git a/dilib/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java b/dilib/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java deleted file mode 100644 index 04348b5..0000000 --- a/dilib/src/main/java/com/ljsw/component/di/applike/DepInjectAppLike.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.ljsw.component.di.applike; - -import com.ljsw.component.di.serviceimpl.AutowiredServiceImpl; -import com.mrzhang.component.componentlib.applicationlike.IApplicationLike; -import com.mrzhang.component.componentlib.router.Router; -import com.mrzhang.componentservice.di.AutowiredService; - -/** - *

Package: com.ljsw.component.di.applike

- *

Project: DDComponentForAndroid

- *

Classname: DepInjectAppLike

- *

Description: component mount/dismount delegate

- * Created by leobert on 2017/9/18. - */ - -public class DepInjectAppLike implements IApplicationLike { - Router router = Router.getInstance(); - - @Override - public void onCreate() { - router.addService(AutowiredService.class.getSimpleName(),new AutowiredServiceImpl()); - } - - @Override - public void onStop() { - router.removeService(AutowiredService.class.getSimpleName()); - } -} From 6ed700e468ada68d4505fd48fec36006f140ef2c Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Wed, 20 Sep 2017 22:03:17 +0800 Subject: [PATCH 036/103] [anno] [change di&json to basicLib] --- app/build.gradle | 5 --- .../component/application/AppApplication.java | 14 -------- .../componentlib/router/RouterConstants.java | 16 --------- componentservice/build.gradle | 2 ++ .../componentservice/di/AutowiredService.java | 18 ---------- dilib/build.gradle | 2 -- .../ljsw/component/di/AutowiredService.java | 36 +++++++++++++++++++ .../ljsw/component/di/route}/ISyringe.java | 4 +-- .../di/serviceimpl/AutowiredServiceImpl.java | 7 ++-- jsonlib/build.gradle | 1 - .../com/ljsw/component}/json/JsonService.java | 21 +++++++++-- .../json/serviceimpl/JsonServiceImpl.java | 2 +- .../processor/AutowiredProcessor.java | 11 ++---- .../java/com/mrzhang/share/ShareActivity.java | 18 +++++----- 14 files changed, 75 insertions(+), 82 deletions(-) delete mode 100644 componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java delete mode 100644 componentservice/src/main/java/com/mrzhang/componentservice/di/AutowiredService.java create mode 100644 dilib/src/main/java/com/ljsw/component/di/AutowiredService.java rename {componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade => dilib/src/main/java/com/ljsw/component/di/route}/ISyringe.java (77%) rename {componentservice/src/main/java/com/mrzhang/componentservice => jsonlib/src/main/java/com/ljsw/component}/json/JsonService.java (52%) diff --git a/app/build.gradle b/app/build.gradle index 2a49596..0287571 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,11 +26,6 @@ android { dependencies { compile project(':componentservice') - - compile project(':jsonlib') - - compile project(':dilib') - // annotationProcessor project(':router-anno-compiler') } diff --git a/app/src/main/java/com/mrzhang/component/application/AppApplication.java b/app/src/main/java/com/mrzhang/component/application/AppApplication.java index 0d31493..9d7644d 100644 --- a/app/src/main/java/com/mrzhang/component/application/AppApplication.java +++ b/app/src/main/java/com/mrzhang/component/application/AppApplication.java @@ -2,12 +2,6 @@ import android.app.Application; -import com.ljsw.component.di.serviceimpl.AutowiredServiceImpl; -import com.ljsw.component.json.serviceimpl.JsonServiceImpl; -import com.mrzhang.component.componentlib.router.Router; -import com.mrzhang.componentservice.di.AutowiredService; -import com.mrzhang.componentservice.json.JsonService; - /** * Created by mrzhang on 2017/6/15. */ @@ -21,14 +15,6 @@ public void onCreate() { //如果isRegisterCompoAuto为false,则需要通过反射加载组件 // Router.registerComponent("com.mrzhang.reader.applike.ReaderAppLike"); // Router.registerComponent("com.mrzhang.share.applike.ShareApplike"); - - // register jsonService - Router.getInstance().addService(JsonService.class.getSimpleName(), - new JsonServiceImpl()); - - // register DI-AutowiredService - Router.getInstance().addService(AutowiredService.class.getSimpleName(), - new AutowiredServiceImpl()); } diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java deleted file mode 100644 index 7ab9ed4..0000000 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/RouterConstants.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mrzhang.component.componentlib.router; - -/** - *

Package: com.mrzhang.component.componentlib.router

- *

Project: DDComponentForAndroid

- *

Classname: RouterConstants

- *

Description: Constants use by apt for Router

- * Created by leobert on 2017/9/18. - */ - -public class RouterConstants { - public static final String SDK_NAME = "Router"; - public static final String SEPARATOR = "$$"; - public static final String SUFFIX_AUTOWIRED = SEPARATOR + SDK_NAME + SEPARATOR + "Autowired"; - -} diff --git a/componentservice/build.gradle b/componentservice/build.gradle index bdb2b49..af97573 100644 --- a/componentservice/build.gradle +++ b/componentservice/build.gradle @@ -24,6 +24,8 @@ android { dependencies { compile project(':componentlib') compile project(':basicres') + compile project(':jsonlib') + compile project(':dilib') compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' diff --git a/componentservice/src/main/java/com/mrzhang/componentservice/di/AutowiredService.java b/componentservice/src/main/java/com/mrzhang/componentservice/di/AutowiredService.java deleted file mode 100644 index 1b38d16..0000000 --- a/componentservice/src/main/java/com/mrzhang/componentservice/di/AutowiredService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.mrzhang.componentservice.di; - -/** - *

Package: com.mrzhang.componentservice.di

- *

Project: DDComponentForAndroid

- *

Classname: AutowiredService

- *

Description: Autowired Dependency inject

- * Created by leobert on 2017/9/18. - */ - -public interface AutowiredService { - - /** - * Autowired core. - * @param instance the instance who need autowired. - */ - void autowire(Object instance); -} diff --git a/dilib/build.gradle b/dilib/build.gradle index bc4ebc4..be05aa3 100644 --- a/dilib/build.gradle +++ b/dilib/build.gradle @@ -22,8 +22,6 @@ android { } dependencies { - compile project(':componentservice') - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) diff --git a/dilib/src/main/java/com/ljsw/component/di/AutowiredService.java b/dilib/src/main/java/com/ljsw/component/di/AutowiredService.java new file mode 100644 index 0000000..472b188 --- /dev/null +++ b/dilib/src/main/java/com/ljsw/component/di/AutowiredService.java @@ -0,0 +1,36 @@ +package com.ljsw.component.di; + +import com.ljsw.component.di.serviceimpl.AutowiredServiceImpl; + +/** + *

Package: com.ljsw.component.di

+ *

Project: DDComponentForAndroid

+ *

Classname: AutowiredService

+ *

Description: Autowired Dependency inject

+ * Created by leobert on 2017/9/18. + */ + +public interface AutowiredService { + + /** + * Autowired core. + * @param instance the instance who need autowired. + */ + void autowire(Object instance); + + + class Factory { + private static Factory instance; + + public static Factory getInstance() { + if (instance == null) { + instance = new Factory(); + } + return instance; + } + + public AutowiredService create() { + return new AutowiredServiceImpl(); + } + } +} diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade/ISyringe.java b/dilib/src/main/java/com/ljsw/component/di/route/ISyringe.java similarity index 77% rename from componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade/ISyringe.java rename to dilib/src/main/java/com/ljsw/component/di/route/ISyringe.java index a67d916..628e4ab 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/facade/ISyringe.java +++ b/dilib/src/main/java/com/ljsw/component/di/route/ISyringe.java @@ -1,7 +1,7 @@ -package com.mrzhang.component.componentlib.router.facade; +package com.ljsw.component.di.route; /** - *

Package: com.mrzhang.component.componentlib.router.facade

+ *

Package: com.ljsw.component.di.route

*

Project: DDComponentForAndroid

*

Classname: ISyringe

*

Description: desc the function of Syringe, one that used to inject diff --git a/dilib/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java b/dilib/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java index 73a6eba..dc01908 100644 --- a/dilib/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java +++ b/dilib/src/main/java/com/ljsw/component/di/serviceimpl/AutowiredServiceImpl.java @@ -2,13 +2,12 @@ import android.util.LruCache; -import com.mrzhang.component.componentlib.router.facade.ISyringe; -import com.mrzhang.componentservice.di.AutowiredService; +import com.ljsw.component.di.AutowiredService; +import com.ljsw.component.di.route.ISyringe; import java.util.ArrayList; import java.util.List; -import static com.mrzhang.component.componentlib.router.RouterConstants.SUFFIX_AUTOWIRED; /** *

Package: com.ljsw.component.di.serviceimpl

@@ -24,6 +23,8 @@ public class AutowiredServiceImpl implements AutowiredService { private LruCache classCache = new LruCache<>(50); private List blackList = new ArrayList<>(); + //attention! make sure this keeps same with the one in AutowiredProcessor + private static final String SUFFIX_AUTOWIRED = "$$Router$$Autowired"; @Override public void autowire(Object instance) { diff --git a/jsonlib/build.gradle b/jsonlib/build.gradle index 8a247aa..2f29b69 100644 --- a/jsonlib/build.gradle +++ b/jsonlib/build.gradle @@ -22,7 +22,6 @@ android { } dependencies { - compile project(':componentservice') compile 'com.alibaba:fastjson:1.1.63.android' androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { diff --git a/componentservice/src/main/java/com/mrzhang/componentservice/json/JsonService.java b/jsonlib/src/main/java/com/ljsw/component/json/JsonService.java similarity index 52% rename from componentservice/src/main/java/com/mrzhang/componentservice/json/JsonService.java rename to jsonlib/src/main/java/com/ljsw/component/json/JsonService.java index 24f2255..9b8e4cd 100644 --- a/componentservice/src/main/java/com/mrzhang/componentservice/json/JsonService.java +++ b/jsonlib/src/main/java/com/ljsw/component/json/JsonService.java @@ -1,9 +1,11 @@ -package com.mrzhang.componentservice.json; +package com.ljsw.component.json; + +import com.ljsw.component.json.serviceimpl.JsonServiceImpl; import java.util.List; /** - *

Package: com.mrzhang.componentservice.json

+ *

Package: com.ljsw.component.json

*

Project: DDComponentForAndroid

*

Classname: JsonService

*

Description: APIs provided by the JsonComponent. @@ -22,4 +24,19 @@ public interface JsonService { String toJsonString(Object instance); + class Factory { + private static Factory instance; + + public static Factory getInstance() { + if (instance == null) { + instance = new Factory(); + } + return instance; + } + + public JsonService create() { + return new JsonServiceImpl(); + } + } + } diff --git a/jsonlib/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java b/jsonlib/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java index 69f6bba..ef65753 100644 --- a/jsonlib/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java +++ b/jsonlib/src/main/java/com/ljsw/component/json/serviceimpl/JsonServiceImpl.java @@ -1,7 +1,7 @@ package com.ljsw.component.json.serviceimpl; import com.alibaba.fastjson.JSON; -import com.mrzhang.componentservice.json.JsonService; +import com.ljsw.component.json.JsonService; import java.util.List; diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java index 7123d7f..15bd1a4 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java @@ -81,6 +81,7 @@ public class AutowiredProcessor extends AbstractProcessor { // private static final ClassName ARouterClass = ClassName.get("com.alibaba.android.arouter.launcher", "ARouter"); private static final ClassName AndroidLog = ClassName.get("android.util", "Log"); + private static final String SUFFIX_AUTOWIRED = "$$Router$$Autowired"; @Override public synchronized void init(ProcessingEnvironment processingEnvironment) { @@ -140,7 +141,7 @@ private void generateHelper() throws IOException, IllegalAccessException { String qualifiedName = parent.getQualifiedName().toString(); String packageName = qualifiedName.substring(0, qualifiedName.lastIndexOf(".")); - String fileName = parent.getSimpleName() + "$$Router$$" + "Autowired"; + String fileName = parent.getSimpleName() + SUFFIX_AUTOWIRED; logger.info(">>> Start process " + childs.size() + " field in " + parent.getSimpleName() + " ... <<<"); @@ -153,14 +154,6 @@ private void generateHelper() throws IOException, IllegalAccessException { "jsonService", Modifier.PRIVATE).build(); helper.addField(jsonServiceField); - /* - * Router router = Router.getInstance(); - if (router.getService(JsonService.class.getSimpleName()) != null) { - JsonService jsonService = (JsonService) router.getService(JsonService.class.getSimpleName()); - } else { - throw new IllegalStateException("JsonService not found in Router"); - } - * */ // String _statement = // " $T router = $T.getInstance();\n" + diff --git a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java index 500bb35..df8c247 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java @@ -6,11 +6,11 @@ import android.util.Log; import android.widget.TextView; +import com.ljsw.component.di.AutowiredService; +import com.ljsw.component.json.JsonService; import com.ljsw.router.facade.annotation.Autowired; import com.ljsw.router.facade.annotation.RouteNode; import com.mrzhang.component.componentlib.router.Router; -import com.mrzhang.componentservice.di.AutowiredService; -import com.mrzhang.componentservice.json.JsonService; /** * Created by mrzhang on 2017/6/20. @@ -38,6 +38,8 @@ public void setS(String s) { @Autowired TestDto testDto; + private JsonService jsonService = JsonService.Factory.getInstance().create(); + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -45,18 +47,16 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { // UIRouter.getInstance().inject Router router = Router.getInstance(); - if (router.getService(AutowiredService.class.getSimpleName()) != null) { - AutowiredService service = (AutowiredService) router.getService(AutowiredService.class.getSimpleName()); - service.autowire(this); - } +// if (router.getService(AutowiredService.class.getSimpleName()) != null) { +// AutowiredService service = (AutowiredService) router.getService(AutowiredService.class.getSimpleName()); +// service.autowire(this); +// } TextView textView = (TextView) findViewById(R.id.share_tv_tag); textView.setText("share: " + bookName); - Log.d(TAG,"dto:\r"+((JsonService)Router.getInstance() - .getService(JsonService.class.getSimpleName())) - .toJsonString(testDto)); + Log.d(TAG,"dto:\r"+(jsonService.toJsonString(testDto)); } From 190fe5123b04171dab18b961bc11ab377543373b Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Wed, 20 Sep 2017 22:18:17 +0800 Subject: [PATCH 037/103] [anno] [change error with Json&di in apt ] --- .../processor/AutowiredProcessor.java | 38 ++++++++----------- .../ljsw/router/compiler/utils/Constants.java | 4 +- .../java/com/mrzhang/share/ShareActivity.java | 12 ++---- 3 files changed, 21 insertions(+), 33 deletions(-) diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java index 15bd1a4..4a8107d 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java @@ -71,12 +71,14 @@ public class AutowiredProcessor extends AbstractProcessor { */ private Map> parentAndChild = new HashMap<>(); - //UIRouter:com.mrzhang.component.componentlib.router.ui.UIRouter - private static final ClassName UIRouterClass = - ClassName.get("com.mrzhang.component.componentlib.router.ui", "UIRouter"); +// private static final ClassName UIRouterClass = +// ClassName.get("com.mrzhang.component.componentlib.router.ui", "UIRouter"); +// +// private static final ClassName RouterClass = +// ClassName.get("com.mrzhang.component.componentlib.router", "Router"); - private static final ClassName RouterClass = - ClassName.get("com.mrzhang.component.componentlib.router", "Router"); + private static final ClassName JsonServiceInterface = + ClassName.get("com.ljsw.component.json","JsonService"); // private static final ClassName ARouterClass = ClassName.get("com.alibaba.android.arouter.launcher", "ARouter"); private static final ClassName AndroidLog = ClassName.get("android.util", "Log"); @@ -163,26 +165,18 @@ private void generateHelper() throws IOException, IllegalAccessException { logger.info("======== inject jsonservice"); - injectMethodBuilder.addStatement("$T router = $T.getInstance()", - RouterClass, - RouterClass); - - injectMethodBuilder.beginControlFlow("if (router.getService($T.class.getSimpleName()) != null)", - ClassName.get(type_JsonService)); - - injectMethodBuilder.addStatement("jsonService = ($T) router.getService($T.class.getSimpleName())", - ClassName.get(type_JsonService), - ClassName.get(type_JsonService)); - - - injectMethodBuilder.endControlFlow(); - -// injectMethodBuilder.addStatement(_statement, -// RouterClass, +// injectMethodBuilder.addStatement("$T router = $T.getInstance()", // RouterClass, -// ClassName.get(type_JsonService), +// RouterClass); +// injectMethodBuilder.beginControlFlow("if (router.getService($T.class.getSimpleName()) != null)", +// ClassName.get(type_JsonService)); +// injectMethodBuilder.addStatement("jsonService = ($T) router.getService($T.class.getSimpleName())", // ClassName.get(type_JsonService), // ClassName.get(type_JsonService)); +// injectMethodBuilder.endControlFlow(); + + injectMethodBuilder.addStatement("jsonService = $T.Factory.getInstance().create()", + ClassName.get(type_JsonService)); injectMethodBuilder.addStatement("$T substitute = ($T)target", ClassName.get(parent), ClassName.get(parent)); diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java index bd344b2..7453e1f 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java @@ -43,9 +43,9 @@ public interface Constants { String BOOLEAN = LANG + ".Boolean"; String STRING = LANG + ".String"; - String ISYRINGE = "com.mrzhang.component.componentlib.router.facade.ISyringe"; + String ISYRINGE = "com.ljsw.component.di.route.ISyringe"; - String JSON_SERVICE = "com.mrzhang.componentservice.json.JsonService"; + String JSON_SERVICE = "com.ljsw.component.json.JsonService"; String ROUTER_UTIL_METHOD_ADDTO = "addTo"; diff --git a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java index df8c247..ef1dab3 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java @@ -10,7 +10,6 @@ import com.ljsw.component.json.JsonService; import com.ljsw.router.facade.annotation.Autowired; import com.ljsw.router.facade.annotation.RouteNode; -import com.mrzhang.component.componentlib.router.Router; /** * Created by mrzhang on 2017/6/20. @@ -39,24 +38,19 @@ public void setS(String s) { TestDto testDto; private JsonService jsonService = JsonService.Factory.getInstance().create(); + private AutowiredService autowiredService = AutowiredService.Factory.getInstance().create(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.share_activity_share); -// UIRouter.getInstance().inject - - Router router = Router.getInstance(); -// if (router.getService(AutowiredService.class.getSimpleName()) != null) { -// AutowiredService service = (AutowiredService) router.getService(AutowiredService.class.getSimpleName()); -// service.autowire(this); -// } + autowiredService.autowire(this); TextView textView = (TextView) findViewById(R.id.share_tv_tag); textView.setText("share: " + bookName); - Log.d(TAG,"dto:\r"+(jsonService.toJsonString(testDto)); + Log.d(TAG, "dto:\r" + (jsonService.toJsonString(testDto))); } From 9639fa29e5c5920ac41220690ff6b8d52e229e24 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Wed, 20 Sep 2017 22:19:15 +0800 Subject: [PATCH 038/103] [anno] [remove useless comment] --- .../compiler/processor/AutowiredProcessor.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java index 4a8107d..1eb8caf 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/AutowiredProcessor.java @@ -156,25 +156,8 @@ private void generateHelper() throws IOException, IllegalAccessException { "jsonService", Modifier.PRIVATE).build(); helper.addField(jsonServiceField); - -// String _statement = -// " $T router = $T.getInstance();\n" + -// " if (router.getService($T.class.getSimpleName()) != null) {\n" + -// " jsonService = ($T) router.getService($T.class.getSimpleName());\n" + -// " }"; - logger.info("======== inject jsonservice"); -// injectMethodBuilder.addStatement("$T router = $T.getInstance()", -// RouterClass, -// RouterClass); -// injectMethodBuilder.beginControlFlow("if (router.getService($T.class.getSimpleName()) != null)", -// ClassName.get(type_JsonService)); -// injectMethodBuilder.addStatement("jsonService = ($T) router.getService($T.class.getSimpleName())", -// ClassName.get(type_JsonService), -// ClassName.get(type_JsonService)); -// injectMethodBuilder.endControlFlow(); - injectMethodBuilder.addStatement("jsonService = $T.Factory.getInstance().create()", ClassName.get(type_JsonService)); From f7daa7b4ff139052f8965e169414f885791da20d Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Sat, 23 Sep 2017 21:48:18 +0800 Subject: [PATCH 039/103] [anno] [add design of URI use in router] --- "URI\350\256\276\350\256\241.md" | 54 ++++++++++++++ .../componentlib/router/UiActivityUri.java | 74 +++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 "URI\350\256\276\350\256\241.md" create mode 100644 componentlib/src/main/java/com/mrzhang/component/componentlib/router/UiActivityUri.java diff --git "a/URI\350\256\276\350\256\241.md" "b/URI\350\256\276\350\256\241.md" new file mode 100644 index 0000000..86c164a --- /dev/null +++ "b/URI\350\256\276\350\256\241.md" @@ -0,0 +1,54 @@ +# URI设计 +By Leobert + +## 为什么要有这一篇 +DDComponent设计的初衷应当是注重于实现组件化,得到的几位大牛也提供了非常优秀的解决方案。但是组件化的代码边界带来了一个问题:UI跳转的时候没那么方便了,以往常见的做法: + +* 耦合非常高的直接构造Intent并启动 +* 将所需的参数、参数组装等都在目标Activity中进行方法封装,暴露静态方法供调用 +* 实现Factory进行Intent的构造、实现启动器 + +都不行了。所以DDComponent中有了Router部分,使用路由进行UI跳转(通过路由寻找组件的内容本篇略过)。而DDComponent中的UIRouter部分是比较轻量级的,本人也有幸和得到的大牛进行了一定的讨论,对router部分略尽了绵薄之力。但是当前的Router部分使用还是没那么轻松的,而本人也对这些问题进行了思考,幸有所得。鉴于接下来一段时间我都比较忙,现将设计思路记录于此,倘若有同行有兴趣提供一臂自力也是非常感激的。 + +PS:格竹子君给我开了一个anno分支,本身我命这个名字是Feature/anno 使用注解实现路由定义的功能分支。 + +## URI的基础格式 +> 协议://域名:port/目录a/目录b/文件c?key1=value1&key2=v2#author + +除了这些还有query部分,author部分(URL中也有人称hash部分) +而‘目录a/目录b/文件c’这段也有人称为path。 + +**在当前的实现中,参数传递暂使用Bundle,不支持使用queryString**。 + +我们可以看到demo中有这样一段: + +``` +UIRouter.getInstance().openUri(getActivity(), "componentdemo://share", bundle); +``` + +这里使用的URI尚未经过精心设计,而且直接使用hardcode形式也是不利于维护的(当然这里只是demo,当我们将框架完善后这些问题就解决了) + +## 设计构想 +### 协议部分 +有一些朋友提过issue:runalone时的传值问题。参考一些服务端的同事在一些非敏感接口同时兼容了query传值和表单传值的做法,我觉得Router部分兼容query传值和Intent的bundle传值是可取的。考虑到可能控制不住的场面。通过协议部分区分两种形式。 + +* dunq: DDUiNavigation-QueryString 使用queryString传值 +* dunb: DDUiNavigation-Bundle 使用Bundle传值 + +### host部分 +我们可以将Component认为是不同的主机,给定不同的域名 + +### port部分 +我有在项目中提过一个issue,intent的FLAG问题,当前是没有支持的,可以使用port来做一些手脚,也可以直接在Router中将方法原型扩展一下。*我还要再细想想哪种好* + +### path部分 +当前的anno分支实现中,在对path提出了group的概念,可以针对group分一下Router,但是除了看起来有点噱头其实没啥大用,因为路由表都是按照注解自动生成的,最多就是路由器命名的时候贴切一些。 + +但潜意识告诉我这个group迟早会有用 233333 + +计划中会按照注解的path生成一些常量,减少hardcode。这个时候group可能会有用哦。 + +### query部分 +计划中需要支持使用query进行传值 + + diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/UiActivityUri.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/UiActivityUri.java new file mode 100644 index 0000000..47757e6 --- /dev/null +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/UiActivityUri.java @@ -0,0 +1,74 @@ +package com.mrzhang.component.componentlib.router; + +import android.support.annotation.StringDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import static com.mrzhang.component.componentlib.router.UiActivityUri.Scheme.DUNB; +import static com.mrzhang.component.componentlib.router.UiActivityUri.Scheme.DUNQ; + +/** + *

Package: com.mrzhang.component.componentlib.router

+ *

Project: DDComponentForAndroid

+ *

Classname: Path

+ *

Description: TODO

+ * Created by leobert on 2017/9/23. + */ + +public final class UiActivityUri { + + @StringDef({DUNQ,DUNB}) + @Retention(RetentionPolicy.CLASS) + public @interface Scheme { + String DUNQ = "dunp:"; + + String DUNB = "dunb:"; + } + + @Scheme + private String scheme; + + private final String host; + + private final String path; + + private String queryString; + + public UiActivityUri(String host, String path) { + this.host = host; + this.path = path; + } + + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public String getHost() { + return host; + } + + public String getPath() { + return path; + } + + public void setQueryString(String queryString) { + this.queryString = queryString; + } + + public String getQueryString() { + return queryString; + } + + + + // public String getUri() { +// +// } + +} From 9e5b3555cd1bd19601d437c3d27262e2d59bcbc6 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Mon, 25 Sep 2017 17:54:11 +0800 Subject: [PATCH 040/103] [anno] [use apt to generate Router class] --- componentlib/build.gradle | 4 +- .../componentlib/router/UiActivityUri.java | 22 +- .../componentlib/router/ui/UIRouter.java | 34 ++ .../com/mrzhang/reader/ReaderFragment.java | 3 +- router-anno-compiler/build.gradle | 2 +- .../ljsw/router/compiler/model/HostInfo.java | 30 ++ .../router/compiler/model/MethodInfo.java | 98 +++++ .../compiler/processor/RouterProcessor.java | 365 ++++++++++++++++-- .../ljsw/router/compiler/utils/AnnoUtils.java | 96 +++++ .../ljsw/router/compiler/utils/Constants.java | 3 + .../ljsw/router/facade/IUiRouterLoader.java | 5 +- .../router/facade/UiRouterMapperUtils.java | 5 +- .../ljsw/router/facade/annotation/Router.java | 1 + .../java/com/mrzhang/share/ShareActivity.java | 2 +- .../mrzhang/share/applike/ShareApplike.java | 9 +- .../share/compouirouter/DemoUiRouter.java | 15 + .../share/compouirouter/ShareUIRouter.java | 37 +- 17 files changed, 678 insertions(+), 53 deletions(-) create mode 100644 router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/HostInfo.java create mode 100644 router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/MethodInfo.java create mode 100644 router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/AnnoUtils.java create mode 100644 sharecomponent/src/main/java/com/mrzhang/share/compouirouter/DemoUiRouter.java diff --git a/componentlib/build.gradle b/componentlib/build.gradle index 54e48f9..d07d9f0 100644 --- a/componentlib/build.gradle +++ b/componentlib/build.gradle @@ -25,13 +25,13 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) + compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:26.+' - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) testCompile 'junit:junit:4.12' + compile project(':router-annotation') } diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/UiActivityUri.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/UiActivityUri.java index 47757e6..a38139a 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/UiActivityUri.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/UiActivityUri.java @@ -5,9 +5,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import static com.mrzhang.component.componentlib.router.UiActivityUri.Scheme.DUNB; -import static com.mrzhang.component.componentlib.router.UiActivityUri.Scheme.DUNQ; - /** *

Package: com.mrzhang.component.componentlib.router

*

Project: DDComponentForAndroid

@@ -18,15 +15,19 @@ public final class UiActivityUri { - @StringDef({DUNQ,DUNB}) - @Retention(RetentionPolicy.CLASS) - public @interface Scheme { - String DUNQ = "dunp:"; + @Retention(RetentionPolicy.SOURCE) + @StringDef({Scheme.DUNQ,Scheme.DUNB}) + public @interface SchemeDef { + + } + + public static final class Scheme { + public static final String DUNQ = "dunp:"; - String DUNB = "dunb:"; + public static final String DUNB = "dunb:"; } - @Scheme + @SchemeDef private String scheme; private final String host; @@ -41,11 +42,12 @@ public UiActivityUri(String host, String path) { } + @SchemeDef public String getScheme() { return scheme; } - public void setScheme(String scheme) { + public void setScheme(@SchemeDef String scheme) { this.scheme = scheme; } diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java index cd2168a..8fe6096 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java @@ -3,12 +3,17 @@ import android.content.Context; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.NonNull; import android.text.TextUtils; +import com.ljsw.router.facade.annotation.Router; + +import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; /** * Singleton implement of {@link IUIRouter} @@ -18,6 +23,7 @@ */ public class UIRouter implements IUIRouter { + private static Map routerInstanceCache = new HashMap<>(); private List uiRouters = new ArrayList<>(); private HashMap priorities = new HashMap<>(); @@ -124,4 +130,32 @@ private void removeOldUIRouter(IComponentRouter router) { } } } + + public static IComponentRouter fetch(@NonNull Class clz) { + if (!clz.isInterface()) + throw new IllegalArgumentException("need a interface, but this isn't a interface:" + clz.getName()); + + Annotation router = clz.getAnnotation(Router.class); + if (router == null) + throw new IllegalArgumentException("not annotated with Router:" + clz.getName()); + + String path = clz.getName() + "Impl"; + if (routerInstanceCache.containsKey(path)) + return routerInstanceCache.get(path); + + try { + Class cla = Class.forName(path); + IComponentRouter instance = (IComponentRouter) cla.newInstance(); + routerInstanceCache.put(path, instance); + return instance; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + return null; + } } diff --git a/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java b/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java index 28ade30..c944b73 100644 --- a/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java +++ b/readercomponent/src/main/java/com/mrzhang/reader/ReaderFragment.java @@ -36,7 +36,8 @@ public void onClick(View v) { final String _dto = "{\"s\":\"sss\"}"; bundle.putString("bookName","testBookName"); bundle.putString("testDto",_dto); - UIRouter.getInstance().openUri(getActivity(), "componentdemo://share", bundle); + UIRouter.getInstance().openUri(getActivity(), "dunb://shareComponent/share", bundle); +// "componentdemo://share" } }); diff --git a/router-anno-compiler/build.gradle b/router-anno-compiler/build.gradle index 55f9fbf..dad3c21 100644 --- a/router-anno-compiler/build.gradle +++ b/router-anno-compiler/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'java' dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.google.auto.service:auto-service:1.0-rc2' - compile 'com.squareup:javapoet:1.7.0' + compile 'com.squareup:javapoet:1.9.0' compile 'org.apache.commons:commons-lang3:3.4' diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/HostInfo.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/HostInfo.java new file mode 100644 index 0000000..3595c39 --- /dev/null +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/HostInfo.java @@ -0,0 +1,30 @@ +package com.ljsw.router.compiler.model; + +import javax.lang.model.type.TypeMirror; + +/** + *

Package: com.ljsw.router.compiler.model

+ *

Project: DDComponentForAndroid

+ *

Classname: HostInfo

+ *

Description: TODO

+ * Created by leobert on 2017/9/25. + */ + +public class HostInfo { + private String host; + private TypeMirror interfaceTypeMirror; + + public HostInfo(String host, TypeMirror interfaceTypeMirror) { + this.host = host; + this.interfaceTypeMirror = interfaceTypeMirror; + } + + public String getHost() { + return host; + } + + + public TypeMirror getInterfaceTypeMirror() { + return interfaceTypeMirror; + } +} diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/MethodInfo.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/MethodInfo.java new file mode 100644 index 0000000..ff3da88 --- /dev/null +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/MethodInfo.java @@ -0,0 +1,98 @@ +/* + * MIT License + * + * Copyright (c) 2017 leobert-lan + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package com.ljsw.router.compiler.model; + +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.ParameterSpec; +import com.squareup.javapoet.TypeName; + +import java.util.ArrayList; +import java.util.List; + +import javax.lang.model.element.Modifier; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeMirror; + +/** + * Description: Helper class to record method info needed by Processor + */ +public class MethodInfo { + private String methodName; + private List methodModifiers; + private List methodParameters; + private TypeMirror methodReturnType; + + public MethodInfo() { + } + + public MethodInfo setMethodName(String methodName) { + this.methodName = methodName; + return this; + } + + public MethodInfo setMethodModifiers(List methodModifiers) { + this.methodModifiers = methodModifiers; + return this; + } + + public MethodInfo setMethodParameters(List methodParameters) { + this.methodParameters = methodParameters; + return this; + } + + public MethodInfo setMethodReturnType(TypeMirror methodReturnType) { + this.methodReturnType = methodReturnType; + return this; + } + + public String getMethodName() { + return methodName; + } + + public List getMethodModifiers() { + return methodModifiers; + } + + public List getMethodParameters() { + List parameterSpecs = new ArrayList<>(); + for (VariableElement variableElement : methodParameters) { + parameterSpecs.add(ParameterSpec.get(variableElement)); + } + return parameterSpecs; + } + + public List getMethodParametersSimple() { + List params = new ArrayList<>(); + for (VariableElement methodParameter : methodParameters) { + params.add(methodParameter.getSimpleName().toString()); + } + return params; + } + + public TypeName getTypeName() { + return ClassName.get(methodReturnType); + } +} diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java index 0078cb4..f11e54a 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java @@ -1,16 +1,21 @@ package com.ljsw.router.compiler.processor; import com.google.auto.service.AutoService; +import com.ljsw.router.compiler.model.HostInfo; +import com.ljsw.router.compiler.utils.AnnoUtils; import com.ljsw.router.compiler.utils.Logger; import com.ljsw.router.facade.annotation.RouteNode; import com.ljsw.router.facade.annotation.Router; import com.ljsw.router.facade.enums.NodeType; import com.ljsw.router.facade.model.Node; import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.CodeBlock; +import com.squareup.javapoet.FieldSpec; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.ParameterSpec; import com.squareup.javapoet.ParameterizedTypeName; +import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; import org.apache.commons.collections4.CollectionUtils; @@ -32,6 +37,7 @@ import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; +import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.lang.model.type.MirroredTypeException; import javax.lang.model.type.TypeMirror; @@ -42,8 +48,7 @@ import static com.ljsw.router.compiler.utils.Constants.ANNOTATION_TYPE_ROUTER; import static com.ljsw.router.compiler.utils.Constants.ANNOTATION_TYPE_ROUTE_NODE; import static com.ljsw.router.compiler.utils.Constants.KEY_MODULE_NAME; -import static com.ljsw.router.compiler.utils.Constants.ROUTER_UTIL_METHOD_ADDTO; -import static com.ljsw.router.compiler.utils.Constants.TYPE_UIROUTER_LOADER; +import static javax.lang.model.element.Modifier.FINAL; import static javax.lang.model.element.Modifier.PUBLIC; /** @@ -66,9 +71,19 @@ public class RouterProcessor extends AbstractProcessor { private Types types; private Elements elements; - private Map routers; + private Map routers; private Map> routerNodes; + private TypeMirror type_TextUtils; + // private TypeMirror type_List; + private TypeMirror type_String; + private TypeMirror type_Context; + private TypeMirror type_Bundle; + private TypeMirror type_Uri; + + private TypeName tn_ListString; + + @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); @@ -82,6 +97,18 @@ public synchronized void init(ProcessingEnvironment processingEnv) { logger = new Logger(processingEnv.getMessager()); // Package the log utils. + + type_TextUtils = elements.getTypeElement("android.text.TextUtils").asType(); +// type_List = elements.getTypeElement("java.util.List").asType(); + type_String = elements.getTypeElement("java.lang.String").asType(); + type_Context = elements.getTypeElement("android.content.Context").asType(); + type_Bundle = elements.getTypeElement("android.os.Bundle").asType(); + type_Uri = elements.getTypeElement("android.net.Uri").asType(); + + ClassName string = ClassName.get("java.lang", "String"); + ClassName list = ClassName.get("java.util", "List"); + tn_ListString = ParameterizedTypeName.get(list, string); + logger.info(">>> RouteProcessor init. <<<"); } @@ -106,7 +133,7 @@ public boolean process(Set set, RoundEnvironment roundEnv logger.error(e); } - this.write2Util(); + this.generateRouterImpl(); return true; } @@ -114,49 +141,108 @@ public boolean process(Set set, RoundEnvironment roundEnv return false; } - private void write2Util() { +// @Deprecated +// private void write2Util() { +// Set groups = routers.keySet(); +// +// ClassName type_UiRouterLoader = ClassName.get(elements.getTypeElement(TYPE_UIROUTER_LOADER)); +// for (String group : groups) { +// logger.info(">>> write for group:" + group); +// +// TypeMirror value = routers.get(group); +// String path = value.toString(); +// +// String pkg = path.substring(0, path.lastIndexOf(".")); +// String cn = path.substring(path.lastIndexOf(".") + 1) + "Loader"; +// +// ParameterizedTypeName inputMapTypeOfGroup = ParameterizedTypeName.get( +// ClassName.get(Map.class), +// ClassName.get(String.class), +// ClassName.get(Class.class) +// ); +// +// ParameterSpec groupParamSpec = +// ParameterSpec.builder(inputMapTypeOfGroup, "mapper").build(); +// +// +// MethodSpec.Builder loadIntoMethodOfRootBuilder = +// MethodSpec.methodBuilder(ROUTER_UTIL_METHOD_ADDTO) +// .addParameter(groupParamSpec) +// .addAnnotation(Override.class) +// .addModifiers(PUBLIC); +// +// List nodes = routerNodes.get(group); +// for (Node node : nodes) { +// loadIntoMethodOfRootBuilder.addStatement( +// "mapper.put($S,$T.class)", +// node.getPath(), +// ClassName.get((TypeElement) node.getRawType())); +// } +// +// +// try { +// JavaFile.builder(pkg, TypeSpec.classBuilder(cn) +// .addModifiers(PUBLIC) +// .addSuperinterface(type_UiRouterLoader) +// .addMethod(loadIntoMethodOfRootBuilder.build()) +// .build() +// ).build().writeTo(mFiler); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } + + private void generateRouterImpl() { Set groups = routers.keySet(); - ClassName type_UiRouterLoader = ClassName.get(elements.getTypeElement(TYPE_UIROUTER_LOADER)); for (String group : groups) { logger.info(">>> write for group:" + group); + HostInfo hostInfo = routers.get(group); + String path = hostInfo.getInterfaceTypeMirror().toString(); - TypeMirror value = routers.get(group); - String path = value.toString(); + String claName = path + "Impl"; + //pkg + String pkg = claName.substring(0, claName.lastIndexOf(".")); + //simpleName + String cn = claName.substring(claName.lastIndexOf(".") + 1); + // superInterface ClassName + ClassName superInterface = ClassName.get(elements.getTypeElement(path)); - String pkg = path.substring(0, path.lastIndexOf(".")); - String cn = path.substring(path.lastIndexOf(".") + 1) + "Loader"; - ParameterizedTypeName inputMapTypeOfGroup = ParameterizedTypeName.get( - ClassName.get(Map.class), - ClassName.get(String.class), - ClassName.get(Class.class) - ); + // private static Map routeMapper = new HashMap(); + FieldSpec routeMapperField = generateRouteMapperFieldSpec(); + //private static final String HOST = "xxx" + FieldSpec hostField = generateHostFieldSpec(hostInfo.getHost()); - ParameterSpec groupParamSpec = - ParameterSpec.builder(inputMapTypeOfGroup, "mapper").build(); + /* + * static { + * routeMapper.put(...,...); + * //... + * } + * */ + CodeBlock initBlock = generateInitCodeBlock(group); - MethodSpec.Builder loadIntoMethodOfRootBuilder = - MethodSpec.methodBuilder(ROUTER_UTIL_METHOD_ADDTO) - .addParameter(groupParamSpec) - .addAnnotation(Override.class) - .addModifiers(PUBLIC); - List nodes = routerNodes.get(group); - for (Node node : nodes) { - loadIntoMethodOfRootBuilder.addStatement( - "mapper.put($S,$T.class)", - node.getPath(), - ClassName.get((TypeElement) node.getRawType())); - } + MethodSpec openUrl = generateOpenUri1(); + logger.info(">>> :tag:"); + MethodSpec openUri = generateOpenUri2(); + MethodSpec verify = generateVerify(); + logger.info(">>>onWrite :group:" + group); + //generate class file try { JavaFile.builder(pkg, TypeSpec.classBuilder(cn) .addModifiers(PUBLIC) - .addSuperinterface(type_UiRouterLoader) - .addMethod(loadIntoMethodOfRootBuilder.build()) + .addSuperinterface(superInterface) + .addField(routeMapperField) + .addField(hostField) + .addStaticBlock(initBlock) + .addMethod(openUrl) + .addMethod(openUri) + .addMethod(verify) .build() ).build().writeTo(mFiler); } catch (IOException e) { @@ -201,6 +287,7 @@ private void foundRouters(Set routers) { for (Element element : routers) { Router router = element.getAnnotation(Router.class); String group = router.group(); + String host = router.host(); if (this.routers.containsKey(group)) throw new IllegalStateException("duplicated group at annotation," + "please check group:" + group); @@ -213,7 +300,221 @@ private void foundRouters(Set routers) { value = mte.getTypeMirror(); } - this.routers.put(group, value); + this.routers.put(group, new HostInfo(host, value)); } } + + private static final String mRouteMapperFieldName = "routeMapper"; + + private FieldSpec generateRouteMapperFieldSpec() { + ParameterizedTypeName routeMapperFieldTypeName = ParameterizedTypeName.get( + ClassName.get(Map.class), + ClassName.get(String.class), + ClassName.get(Class.class) + ); + + ParameterizedTypeName routeMapperFieldInitializeTypeName = + ParameterizedTypeName.get(HashMap.class, String.class, + Class.class); + + return FieldSpec + .builder(routeMapperFieldTypeName, mRouteMapperFieldName, Modifier.PRIVATE, Modifier.STATIC) + .initializer("new $T()", routeMapperFieldInitializeTypeName) + .build(); + } + + private FieldSpec generateHostFieldSpec(String host) { + return FieldSpec + .builder(String.class, "HOST", Modifier.PRIVATE, Modifier.STATIC, FINAL) + .initializer("$S", host) + .build(); + } + + + private CodeBlock generateInitCodeBlock(String group) { + CodeBlock.Builder initBlockBuilder = CodeBlock.builder(); + + List nodes = routerNodes.get(group); + if (nodes == null) { + logger.error("No RouterNode defined for group:" + group); + return initBlockBuilder.build(); + } + + + for (Node node : nodes) { + initBlockBuilder.addStatement( + mRouteMapperFieldName + ".put($S,$T.class)", + node.getPath(), + ClassName.get((TypeElement) node.getRawType())); + } + + return initBlockBuilder.build(); + } + + /** + * public boolean openUri(Context context, String url, Bundle bundle) { + * if (TextUtils.isEmpty(url) || context == null) { + * return true; + * } + * return openUri(context, Uri.parse(url), bundle); + * } + * + * @return + */ + private MethodSpec generateOpenUri1() { + TypeName returnType = TypeName.BOOLEAN; + String returnStatement = "return openUri(context, Uri.parse(url), bundle)"; + + ParameterSpec contextSpec = + AnnoUtils.generateMethodParameterSpec(type_Context, "context"); + + ParameterSpec urlSpec = + AnnoUtils.generateMethodParameterSpec(type_String, "url"); + + ParameterSpec bundleSpec = + AnnoUtils.generateMethodParameterSpec(type_Bundle, "bundle"); + + MethodSpec.Builder openUriMethodSpecBuilder = MethodSpec.methodBuilder("openUri") + .returns(returnType) + .addAnnotation(Override.class) + .addModifiers(Modifier.PUBLIC); + + openUriMethodSpecBuilder.addParameter(contextSpec) + .addParameter(urlSpec) + .addParameter(bundleSpec); + + openUriMethodSpecBuilder.beginControlFlow("if ($T.isEmpty(url) || context == null)", + type_TextUtils); + openUriMethodSpecBuilder.addStatement("return true"); + openUriMethodSpecBuilder.endControlFlow(); + + openUriMethodSpecBuilder.addStatement(returnStatement); + + return openUriMethodSpecBuilder.build(); + } + + + /** + * //@Override + * public boolean openUri(Context context, Uri uri, Bundle bundle) { + * 1 + * if (uri == null || context == null) { + * return true; + * } + *

+ * 2 + * String scheme = uri.getScheme(); + * String host = uri.getHost(); + *

+ * 3 + * if (!HOST.equals(host)) { + * return false; + * } + *

+ * 4 + * List pathSegments = uri.getPathSegments(); + * String path = AnnoUtils.join(pathSegments,"/"); + *

+ * 5 + * if (routeMapper.containsKey(path)) { + * Class target = routeMapper.get(path); + * Intent intent = new Intent(context, target); + * intent.putExtras(bundle == null ? new Bundle() : bundle); + * //暂未支持startActivityForResult + * context.startActivity(intent); + * return true; + * } + *

+ * return false; + * } + */ + private MethodSpec generateOpenUri2() { + TypeName returnType = TypeName.BOOLEAN; + + ParameterSpec contextSpec = + AnnoUtils.generateMethodParameterSpec(type_Context, "context"); + + ParameterSpec uriSpec = + AnnoUtils.generateMethodParameterSpec(type_Uri, "uri"); + + ParameterSpec bundleSpec = + AnnoUtils.generateMethodParameterSpec(type_Bundle, "bundle"); + + MethodSpec.Builder openUriMethodSpecBuilder = MethodSpec.methodBuilder("openUri") + .returns(returnType) + .addAnnotation(Override.class) + .addModifiers(Modifier.PUBLIC); + + openUriMethodSpecBuilder.addParameter(contextSpec) + .addParameter(uriSpec) + .addParameter(bundleSpec); + + //1 + openUriMethodSpecBuilder.beginControlFlow("if (uri == null || context == null)"); + openUriMethodSpecBuilder.addStatement("return true"); + openUriMethodSpecBuilder.endControlFlow(); + + //2 + openUriMethodSpecBuilder.addStatement("$T scheme = uri.getScheme()", type_String); + openUriMethodSpecBuilder.addStatement("$T host = uri.getHost()", type_String); + + //3 + openUriMethodSpecBuilder.beginControlFlow("if (!HOST.equals(host))"); + openUriMethodSpecBuilder.addStatement("return false"); + openUriMethodSpecBuilder.endControlFlow(); + + //4 + openUriMethodSpecBuilder.addStatement("$T pathSegments = uri.getPathSegments()", tn_ListString); + openUriMethodSpecBuilder.addStatement("$T path = \"/\" + $T.join(\"/\",pathSegments)", type_String, type_TextUtils); + + TypeMirror type_Intent = + elements.getTypeElement("android.content.Intent").asType(); + + //5 + openUriMethodSpecBuilder.beginControlFlow("if (routeMapper.containsKey(path))"); + openUriMethodSpecBuilder.addStatement("Class target = routeMapper.get(path)"); + openUriMethodSpecBuilder.addStatement("$T intent = new $T(context, target)", type_Intent, type_Intent); + openUriMethodSpecBuilder.addStatement("intent.putExtras(bundle == null ? new Bundle() : bundle)"); + openUriMethodSpecBuilder.addStatement("context.startActivity(intent)"); + openUriMethodSpecBuilder.addStatement("return true"); + openUriMethodSpecBuilder.endControlFlow(); + + //6 + openUriMethodSpecBuilder.addStatement("return false"); + + return openUriMethodSpecBuilder.build(); + } + + /** + * //@Override + * public boolean verifyUri(Uri uri) { + * String host = uri.getHost(); + * List pathSegments = uri.getPathSegments(); + * String path = TextUtils.join("/",pathSegments); + * return HOST.equals(host) && routeMapper.containsKey(path); + * } + */ + private MethodSpec generateVerify() { + TypeName returnType = TypeName.BOOLEAN; + + ParameterSpec uriSpec = + AnnoUtils.generateMethodParameterSpec(type_Uri, "uri"); + + + MethodSpec.Builder openUriMethodSpecBuilder = MethodSpec.methodBuilder("verifyUri") + .returns(returnType) + .addAnnotation(Override.class) + .addModifiers(Modifier.PUBLIC); + + openUriMethodSpecBuilder.addParameter(uriSpec); + + //4 + openUriMethodSpecBuilder.addStatement("$T host = uri.getHost()", type_String); + openUriMethodSpecBuilder.addStatement("$T pathSegments = uri.getPathSegments()", tn_ListString); + openUriMethodSpecBuilder.addStatement("$T path = \"/\" + $T.join(\"/\",pathSegments)", type_String, type_TextUtils); + openUriMethodSpecBuilder.addStatement("return HOST.equals(host) && routeMapper.containsKey(path)"); + + return openUriMethodSpecBuilder.build(); + } + } diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/AnnoUtils.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/AnnoUtils.java new file mode 100644 index 0000000..24cf0e4 --- /dev/null +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/AnnoUtils.java @@ -0,0 +1,96 @@ +package com.ljsw.router.compiler.utils; + +import com.ljsw.router.compiler.model.MethodInfo; +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.ParameterSpec; +import com.squareup.javapoet.ParameterizedTypeName; +import com.squareup.javapoet.TypeName; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeMirror; + +/** + *

Package: com.ljsw.router.compiler.utils

+ *

Project: DDComponentForAndroid

+ *

Classname: AnnoUtils

+ *

Description: TODO

+ * Created by leobert on 2017/9/25. + */ + +public class AnnoUtils { + public static MethodInfo generateMethodInfo(ExecutableElement methodElement) { + //modifiers + ArrayList methodModifiers = new ArrayList<>(); + methodModifiers.add(Modifier.PUBLIC); + //name + String methodName = getSimpleName(methodElement); + //params + List methodParams = new ArrayList<>(); + for (VariableElement typeParameterElement : methodElement.getParameters()) { + methodParams.add(typeParameterElement); + } + //return type + TypeMirror methodReturnType = methodElement.getReturnType(); + return new MethodInfo().setMethodName(methodName) + .setMethodModifiers(methodModifiers) + .setMethodParameters(methodParams) + .setMethodReturnType(methodReturnType); + } + + public static String getSimpleName(Element element) { + return element.getSimpleName().toString(); + } + +// public static ParameterSpec generateMethodParameterSpec(String clzPkg, +// String clzSimpleName, +// String paramName) { +// ClassName cn = ClassName.get(clzPkg, clzSimpleName); +// +// ParameterizedTypeName ptn = +// ParameterizedTypeName.get(cn); +// +// return ParameterSpec.builder(ptn, paramName).build(); +// } + + public static ParameterSpec generateMethodParameterSpec(TypeMirror typeMirror, + String paramName) { + TypeName tn = + ParameterizedTypeName.get(typeMirror); + + return ParameterSpec.builder(tn, paramName).build(); + } + +// public static ParameterSpec generateMethodParameterSpec(Class clz, +// String paramName) { +// ClassName cn = ClassName.get(clz); +// +// ParameterizedTypeName ptn = +// ParameterizedTypeName.get(cn); +// +// return ParameterSpec.builder(ptn, paramName).build(); +// } + +// public static String join(Iterator iterator, String separator) { +// if (separator == null) { +// separator = ""; +// } +// +// StringBuilder buf = new StringBuilder(256); +// +// while (iterator.hasNext()) { +// buf.append(iterator.next()); +// if (iterator.hasNext()) { +// buf.append(separator); +// } +// } +// +// return buf.toString(); +// } +} diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java index 7453e1f..ac2f835 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/Constants.java @@ -50,5 +50,8 @@ public interface Constants { String ROUTER_UTIL_METHOD_ADDTO = "addTo"; String TYPE_UIROUTER_LOADER = "com.ljsw.router.facade.IUiRouterLoader"; + + String TYPE_COMPO_UIROTER_INTERFACE= + "com.mrzhang.component.componentlib.router.ui.IComponentRouter"; } diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java b/router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java index 3938174..ccbffc6 100644 --- a/router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java +++ b/router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java @@ -7,9 +7,12 @@ *

Project: DDComponentForAndroid

*

Classname: IUiRouterUtil

*

Description: used to add route mapper

+ * + * will removed, no more need + * * Created by leobert on 2017/9/19. */ - +@Deprecated public interface IUiRouterLoader { void addTo(Map atlas); } diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java b/router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java index 531d4f9..d924bd2 100644 --- a/router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java +++ b/router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java @@ -7,9 +7,12 @@ *

Project: DDComponentForAndroid

*

Classname: UiRouterMapperUtils

*

Description: used to fetch mapper from generated XXLoader class for XX

+ * + * will removed, because the auto generated RouterClass can fetch Route + * * Created by leobert on 2017/9/19. */ - +@Deprecated public class UiRouterMapperUtils { public static void fetchRouteForMe(Class clz, Map mapper) { if (clz == null) diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java index 98674ae..a11fced 100644 --- a/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java +++ b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java @@ -16,5 +16,6 @@ @Retention(RetentionPolicy.CLASS) public @interface Router { Class classPath(); + String host(); String group() default "default"; } diff --git a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java index ef1dab3..41226f5 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/ShareActivity.java @@ -14,7 +14,7 @@ /** * Created by mrzhang on 2017/6/20. */ -@RouteNode(path = "share") +@RouteNode(path = "/share",group = "share") public class ShareActivity extends AppCompatActivity { private static final String TAG = ShareActivity.class.getSimpleName(); diff --git a/sharecomponent/src/main/java/com/mrzhang/share/applike/ShareApplike.java b/sharecomponent/src/main/java/com/mrzhang/share/applike/ShareApplike.java index 4bf6ba5..8b932bb 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/applike/ShareApplike.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/applike/ShareApplike.java @@ -1,7 +1,9 @@ package com.mrzhang.share.applike; import com.mrzhang.component.componentlib.applicationlike.IApplicationLike; +import com.mrzhang.component.componentlib.router.ui.IComponentRouter; import com.mrzhang.component.componentlib.router.ui.UIRouter; +import com.mrzhang.share.compouirouter.DemoUiRouter; import com.mrzhang.share.compouirouter.ShareUIRouter; /** @@ -11,15 +13,16 @@ public class ShareApplike implements IApplicationLike { UIRouter uiRouter = UIRouter.getInstance(); - ShareUIRouter shareUIRouter = ShareUIRouter.getInstance(); +// ShareUIRouter shareUIRouter = ShareUIRouter.getInstance(); + IComponentRouter demoUiRouter = UIRouter.fetch(DemoUiRouter.class); @Override public void onCreate() { - uiRouter.registerUI(shareUIRouter); + uiRouter.registerUI(demoUiRouter); } @Override public void onStop() { - uiRouter.unregisterUI(shareUIRouter); + uiRouter.unregisterUI(demoUiRouter); } } diff --git a/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/DemoUiRouter.java b/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/DemoUiRouter.java new file mode 100644 index 0000000..3028665 --- /dev/null +++ b/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/DemoUiRouter.java @@ -0,0 +1,15 @@ +package com.mrzhang.share.compouirouter; + +import com.ljsw.router.facade.annotation.Router; +import com.mrzhang.component.componentlib.router.ui.IComponentRouter; + +/** + *

Package: com.mrzhang.share.compouirouter

+ *

Project: DDComponentForAndroid

+ *

Classname: DemoUiRouter

+ *

Description: TODO

+ * Created by leobert on 2017/9/25. + */ +@Router(classPath = DemoUiRouter.class,host = "shareComponent",group = "share") +public interface DemoUiRouter extends IComponentRouter { +} diff --git a/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java b/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java index 59c7f8c..4a220a5 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java @@ -11,18 +11,24 @@ import com.mrzhang.component.componentlib.router.ui.IComponentRouter; import java.util.HashMap; +import java.util.List; import java.util.Map; /** * Created by mrzhang on 2017/6/20. + * + * will use interface, auto generate implement of it */ -@Router(classPath = ShareUIRouter.class) +//@Router(classPath = ShareUIRouter.class) +@Deprecated public class ShareUIRouter implements IComponentRouter { private static final String SCHEME = "componentdemo"; private Map activitiesRouterMap = new HashMap<>(); + private static final String HOST = "shareComponent"; + private static ShareUIRouter instance = new ShareUIRouter(); private ShareUIRouter() { @@ -57,6 +63,28 @@ public boolean openUri(Context context, Uri uri, Bundle bundle) { return false; } +// private boolean temp(Context context, Uri uri, Bundle bundle) { +// if (uri == null || context == null) { +// return true; +// } +// String scheme = uri.getScheme(); +// String host = uri.getHost(); +// if (HOST.equals(host)) { +// List pathSegments = uri.getPathSegments(); +// String path = AnnoUtils.join(pathSegments,"/"); +// +// if (activitiesRouterMap.containsKey(path)) { +// Class target = activitiesRouterMap.get(path); +// Intent intent = new Intent(context, target); +// intent.putExtras(bundle == null ? new Bundle() : bundle); +// //暂未支持startActivityForResult +// context.startActivity(intent); +// return true; +// } +// } +// return false; +// } + @Override public boolean verifyUri(Uri uri) { String scheme = uri.getScheme(); @@ -66,4 +94,11 @@ public boolean verifyUri(Uri uri) { } return false; } + +// boolean dummy(Uri uri) { +// String host = uri.getHost(); +// List pathSegments = uri.getPathSegments(); +// String path = TextUtils.join("/",pathSegments); +// return HOST.equals(host) && routerMap.containsKey(path); +// } } From 188e3a7a5f1b01f6de4398f84e807f55a719b40b Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Mon, 25 Sep 2017 18:02:14 +0800 Subject: [PATCH 041/103] [anno] [removed useless classes] --- .../ljsw/router/facade/IUiRouterLoader.java | 18 --- .../router/facade/UiRouterMapperUtils.java | 37 ------- .../ljsw/router/facade/annotation/Router.java | 5 + .../mrzhang/share/applike/ShareApplike.java | 5 +- .../share/compouirouter/ShareUIRouter.java | 104 ------------------ .../{DemoUiRouter.java => ShareUiRouter.java} | 4 +- 6 files changed, 9 insertions(+), 164 deletions(-) delete mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java delete mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java delete mode 100644 sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java rename sharecomponent/src/main/java/com/mrzhang/share/compouirouter/{DemoUiRouter.java => ShareUiRouter.java} (73%) diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java b/router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java deleted file mode 100644 index ccbffc6..0000000 --- a/router-annotation/src/main/java/com/ljsw/router/facade/IUiRouterLoader.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.ljsw.router.facade; - -import java.util.Map; - -/** - *

Package: com.ljsw.router.facade

- *

Project: DDComponentForAndroid

- *

Classname: IUiRouterUtil

- *

Description: used to add route mapper

- * - * will removed, no more need - * - * Created by leobert on 2017/9/19. - */ -@Deprecated -public interface IUiRouterLoader { - void addTo(Map atlas); -} diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java b/router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java deleted file mode 100644 index d924bd2..0000000 --- a/router-annotation/src/main/java/com/ljsw/router/facade/UiRouterMapperUtils.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.ljsw.router.facade; - -import java.util.Map; - -/** - *

Package: com.ljsw.router.facade

- *

Project: DDComponentForAndroid

- *

Classname: UiRouterMapperUtils

- *

Description: used to fetch mapper from generated XXLoader class for XX

- * - * will removed, because the auto generated RouterClass can fetch Route - * - * Created by leobert on 2017/9/19. - */ -@Deprecated -public class UiRouterMapperUtils { - public static void fetchRouteForMe(Class clz, Map mapper) { - if (clz == null) - throw new IllegalArgumentException("give me your component-uirouter class"); - if (mapper == null) - throw new IllegalArgumentException("mapper cannot be null!"); - - String name = clz.getName() + "Loader"; - try { - Class util = Class.forName(name); - IUiRouterLoader instance = (IUiRouterLoader) util.newInstance(); - instance.addTo(mapper); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - - } -} diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java index a11fced..934d13b 100644 --- a/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java +++ b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java @@ -15,6 +15,11 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.CLASS) public @interface Router { + /** + * will removed, it is too heavy and confusing + * @return the interface class annotated with Router + */ + @Deprecated Class classPath(); String host(); String group() default "default"; diff --git a/sharecomponent/src/main/java/com/mrzhang/share/applike/ShareApplike.java b/sharecomponent/src/main/java/com/mrzhang/share/applike/ShareApplike.java index 8b932bb..9d77b2f 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/applike/ShareApplike.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/applike/ShareApplike.java @@ -3,8 +3,7 @@ import com.mrzhang.component.componentlib.applicationlike.IApplicationLike; import com.mrzhang.component.componentlib.router.ui.IComponentRouter; import com.mrzhang.component.componentlib.router.ui.UIRouter; -import com.mrzhang.share.compouirouter.DemoUiRouter; -import com.mrzhang.share.compouirouter.ShareUIRouter; +import com.mrzhang.share.compouirouter.ShareUiRouter; /** * Created by mrzhang on 2017/6/15. @@ -14,7 +13,7 @@ public class ShareApplike implements IApplicationLike { UIRouter uiRouter = UIRouter.getInstance(); // ShareUIRouter shareUIRouter = ShareUIRouter.getInstance(); - IComponentRouter demoUiRouter = UIRouter.fetch(DemoUiRouter.class); + IComponentRouter demoUiRouter = UIRouter.fetch(ShareUiRouter.class); @Override public void onCreate() { diff --git a/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java b/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java deleted file mode 100644 index 4a220a5..0000000 --- a/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUIRouter.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.mrzhang.share.compouirouter; - -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.text.TextUtils; - -import com.ljsw.router.facade.UiRouterMapperUtils; -import com.ljsw.router.facade.annotation.Router; -import com.mrzhang.component.componentlib.router.ui.IComponentRouter; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by mrzhang on 2017/6/20. - * - * will use interface, auto generate implement of it - */ -//@Router(classPath = ShareUIRouter.class) -@Deprecated -public class ShareUIRouter implements IComponentRouter { - - private static final String SCHEME = "componentdemo"; - - private Map activitiesRouterMap = new HashMap<>(); - - private static final String HOST = "shareComponent"; - - private static ShareUIRouter instance = new ShareUIRouter(); - - private ShareUIRouter() { - UiRouterMapperUtils.fetchRouteForMe(getClass(), activitiesRouterMap); - } - - public static ShareUIRouter getInstance() { - return instance; - } - - @Override - public boolean openUri(Context context, String url, Bundle bundle) { - if (TextUtils.isEmpty(url) || context == null) { - return true; - } - return openUri(context, Uri.parse(url), bundle); - } - - @Override - public boolean openUri(Context context, Uri uri, Bundle bundle) { - if (uri == null || context == null) { - return true; - } - String host = uri.getHost(); - if (activitiesRouterMap.containsKey(host)) { - Class target = activitiesRouterMap.get(host); - Intent intent = new Intent(context, target); - intent.putExtras(bundle == null ? new Bundle() : bundle); - context.startActivity(intent); - return true; - } - return false; - } - -// private boolean temp(Context context, Uri uri, Bundle bundle) { -// if (uri == null || context == null) { -// return true; -// } -// String scheme = uri.getScheme(); -// String host = uri.getHost(); -// if (HOST.equals(host)) { -// List pathSegments = uri.getPathSegments(); -// String path = AnnoUtils.join(pathSegments,"/"); -// -// if (activitiesRouterMap.containsKey(path)) { -// Class target = activitiesRouterMap.get(path); -// Intent intent = new Intent(context, target); -// intent.putExtras(bundle == null ? new Bundle() : bundle); -// //暂未支持startActivityForResult -// context.startActivity(intent); -// return true; -// } -// } -// return false; -// } - - @Override - public boolean verifyUri(Uri uri) { - String scheme = uri.getScheme(); - String host = uri.getHost(); - if (SCHEME.equals(scheme)) { - return activitiesRouterMap.containsKey(host); - } - return false; - } - -// boolean dummy(Uri uri) { -// String host = uri.getHost(); -// List pathSegments = uri.getPathSegments(); -// String path = TextUtils.join("/",pathSegments); -// return HOST.equals(host) && routerMap.containsKey(path); -// } -} diff --git a/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/DemoUiRouter.java b/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUiRouter.java similarity index 73% rename from sharecomponent/src/main/java/com/mrzhang/share/compouirouter/DemoUiRouter.java rename to sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUiRouter.java index 3028665..aa1c867 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/DemoUiRouter.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUiRouter.java @@ -10,6 +10,6 @@ *

Description: TODO

* Created by leobert on 2017/9/25. */ -@Router(classPath = DemoUiRouter.class,host = "shareComponent",group = "share") -public interface DemoUiRouter extends IComponentRouter { +@Router(classPath = ShareUiRouter.class,host = "shareComponent",group = "share") +public interface ShareUiRouter extends IComponentRouter { } From 6624553543c71e71fa373b867dbec715dfd2a5e7 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Mon, 25 Sep 2017 22:05:10 +0800 Subject: [PATCH 042/103] [anno] [add check logic for path] --- .../compiler/processor/RouterProcessor.java | 92 ++++++++----------- .../ljsw/router/compiler/utils/AnnoUtils.java | 38 -------- 2 files changed, 39 insertions(+), 91 deletions(-) diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java index f11e54a..797567a 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java @@ -71,7 +71,13 @@ public class RouterProcessor extends AbstractProcessor { private Types types; private Elements elements; + /** + * (group,hostInfo) + */ private Map routers; + /** + * (group,List(Node)) + */ private Map> routerNodes; private TypeMirror type_TextUtils; @@ -141,58 +147,6 @@ public boolean process(Set set, RoundEnvironment roundEnv return false; } -// @Deprecated -// private void write2Util() { -// Set groups = routers.keySet(); -// -// ClassName type_UiRouterLoader = ClassName.get(elements.getTypeElement(TYPE_UIROUTER_LOADER)); -// for (String group : groups) { -// logger.info(">>> write for group:" + group); -// -// TypeMirror value = routers.get(group); -// String path = value.toString(); -// -// String pkg = path.substring(0, path.lastIndexOf(".")); -// String cn = path.substring(path.lastIndexOf(".") + 1) + "Loader"; -// -// ParameterizedTypeName inputMapTypeOfGroup = ParameterizedTypeName.get( -// ClassName.get(Map.class), -// ClassName.get(String.class), -// ClassName.get(Class.class) -// ); -// -// ParameterSpec groupParamSpec = -// ParameterSpec.builder(inputMapTypeOfGroup, "mapper").build(); -// -// -// MethodSpec.Builder loadIntoMethodOfRootBuilder = -// MethodSpec.methodBuilder(ROUTER_UTIL_METHOD_ADDTO) -// .addParameter(groupParamSpec) -// .addAnnotation(Override.class) -// .addModifiers(PUBLIC); -// -// List nodes = routerNodes.get(group); -// for (Node node : nodes) { -// loadIntoMethodOfRootBuilder.addStatement( -// "mapper.put($S,$T.class)", -// node.getPath(), -// ClassName.get((TypeElement) node.getRawType())); -// } -// -// -// try { -// JavaFile.builder(pkg, TypeSpec.classBuilder(cn) -// .addModifiers(PUBLIC) -// .addSuperinterface(type_UiRouterLoader) -// .addMethod(loadIntoMethodOfRootBuilder.build()) -// .build() -// ).build().writeTo(mFiler); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// } - private void generateRouterImpl() { Set groups = routers.keySet(); @@ -255,6 +209,8 @@ private void parseRouteNodes(Set routeElements) { TypeMirror type_Activity = elements.getTypeElement(ACTIVITY).asType(); + Map> cacheForConflictCheck = new HashMap<>(); + for (Element element : routeElements) { TypeMirror tm = element.asType(); RouteNode route = element.getAnnotation(RouteNode.class); @@ -263,9 +219,23 @@ private void parseRouteNodes(Set routeElements) { logger.info(">>> Found activity route: " + tm.toString() + " <<<"); String group = route.group(); + List groupPaths; + + if (cacheForConflictCheck.containsKey(group)) { + groupPaths = cacheForConflictCheck.get(group); + } else { + groupPaths = new ArrayList<>(); + cacheForConflictCheck.put(group, groupPaths); + } Node node = new Node(); - node.setPath(route.path()); + String path = route.path(); + + checkPath(group, path, groupPaths); + + groupPaths.add(path); + + node.setPath(path); node.setPriority(route.priority()); node.setNodeType(NodeType.ACTIVITY); node.setRawType(element); @@ -283,6 +253,21 @@ private void parseRouteNodes(Set routeElements) { } } + private void checkPath(String group, String path, List groupPaths) { + if (groupPaths.contains(path)) + throw new IllegalStateException("conflict path in group:" + group + ",path is:" + path); + + if (path == null || path.isEmpty() || !path.startsWith("/")) + throw new IllegalArgumentException("path cannot be null or empty,and should start with /,this is:" + path); + + if (path.contains("//") || path.contains("&") || path.contains("?")) + throw new IllegalArgumentException("path should not contain // ,& or ?,this is:" + path); + + if (path.endsWith("/")) + throw new IllegalArgumentException("path should not endWith /,this is:" + path + + ";or append a token:index"); + } + private void foundRouters(Set routers) { for (Element element : routers) { Router router = element.getAnnotation(Router.class); @@ -517,4 +502,5 @@ private MethodSpec generateVerify() { return openUriMethodSpecBuilder.build(); } + } diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/AnnoUtils.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/AnnoUtils.java index 24cf0e4..c684ffb 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/AnnoUtils.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/utils/AnnoUtils.java @@ -1,13 +1,11 @@ package com.ljsw.router.compiler.utils; import com.ljsw.router.compiler.model.MethodInfo; -import com.squareup.javapoet.ClassName; import com.squareup.javapoet.ParameterSpec; import com.squareup.javapoet.ParameterizedTypeName; import com.squareup.javapoet.TypeName; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import javax.lang.model.element.Element; @@ -48,17 +46,6 @@ public static String getSimpleName(Element element) { return element.getSimpleName().toString(); } -// public static ParameterSpec generateMethodParameterSpec(String clzPkg, -// String clzSimpleName, -// String paramName) { -// ClassName cn = ClassName.get(clzPkg, clzSimpleName); -// -// ParameterizedTypeName ptn = -// ParameterizedTypeName.get(cn); -// -// return ParameterSpec.builder(ptn, paramName).build(); -// } - public static ParameterSpec generateMethodParameterSpec(TypeMirror typeMirror, String paramName) { TypeName tn = @@ -67,30 +54,5 @@ public static ParameterSpec generateMethodParameterSpec(TypeMirror typeMirror, return ParameterSpec.builder(tn, paramName).build(); } -// public static ParameterSpec generateMethodParameterSpec(Class clz, -// String paramName) { -// ClassName cn = ClassName.get(clz); -// -// ParameterizedTypeName ptn = -// ParameterizedTypeName.get(cn); -// -// return ParameterSpec.builder(ptn, paramName).build(); -// } -// public static String join(Iterator iterator, String separator) { -// if (separator == null) { -// separator = ""; -// } -// -// StringBuilder buf = new StringBuilder(256); -// -// while (iterator.hasNext()) { -// buf.append(iterator.next()); -// if (iterator.hasNext()) { -// buf.append(separator); -// } -// } -// -// return buf.toString(); -// } } From 7465d20c8781c49cad1f7dbb038136285fc21114 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Mon, 25 Sep 2017 22:35:01 +0800 Subject: [PATCH 043/103] [anno] [change output path of the generated Router to com.ljsw.gen.router.{group}.{interfaceName}Impl] --- .../componentlib/router/ui/UIRouter.java | 6 ++-- .../model/{HostInfo.java => GroupInfo.java} | 17 ++++++---- .../compiler/processor/RouterProcessor.java | 32 ++++++++----------- .../com/ljsw/router/facade/Constants.java | 14 ++++++++ .../ljsw/router/facade/annotation/Router.java | 12 +++---- .../share/compouirouter/ShareUiRouter.java | 2 +- 6 files changed, 49 insertions(+), 34 deletions(-) rename router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/{HostInfo.java => GroupInfo.java} (52%) create mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/Constants.java diff --git a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java index 8fe6096..1fcec75 100644 --- a/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java +++ b/componentlib/src/main/java/com/mrzhang/component/componentlib/router/ui/UIRouter.java @@ -6,6 +6,7 @@ import android.support.annotation.NonNull; import android.text.TextUtils; +import com.ljsw.router.facade.Constants; import com.ljsw.router.facade.annotation.Router; import java.lang.annotation.Annotation; @@ -135,11 +136,12 @@ public static IComponentRouter fetch(@NonNull Class if (!clz.isInterface()) throw new IllegalArgumentException("need a interface, but this isn't a interface:" + clz.getName()); - Annotation router = clz.getAnnotation(Router.class); + Router router = clz.getAnnotation(Router.class); if (router == null) throw new IllegalArgumentException("not annotated with Router:" + clz.getName()); - String path = clz.getName() + "Impl"; + String path = Constants.ROUTERIMPL_OUTPUT_PKG + + Constants.DOT + router.group() + Constants.DOT + clz.getSimpleName() + "Impl"; if (routerInstanceCache.containsKey(path)) return routerInstanceCache.get(path); diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/HostInfo.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/GroupInfo.java similarity index 52% rename from router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/HostInfo.java rename to router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/GroupInfo.java index 3595c39..f4d6dcf 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/HostInfo.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/GroupInfo.java @@ -10,21 +10,26 @@ * Created by leobert on 2017/9/25. */ -public class HostInfo { +public class GroupInfo { private String host; - private TypeMirror interfaceTypeMirror; + private String outPutPath; + private String interfacePath; - public HostInfo(String host, TypeMirror interfaceTypeMirror) { + public GroupInfo(String host, String outPutPath, String interfacePath) { this.host = host; - this.interfaceTypeMirror = interfaceTypeMirror; + this.outPutPath = outPutPath; + this.interfacePath = interfacePath; } public String getHost() { return host; } + public String getOutPutPath() { + return outPutPath; + } - public TypeMirror getInterfaceTypeMirror() { - return interfaceTypeMirror; + public String getInterfacePath() { + return interfacePath; } } diff --git a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java index 797567a..977cbbd 100644 --- a/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java +++ b/router-anno-compiler/src/main/java/com/ljsw/router/compiler/processor/RouterProcessor.java @@ -1,9 +1,10 @@ package com.ljsw.router.compiler.processor; import com.google.auto.service.AutoService; -import com.ljsw.router.compiler.model.HostInfo; +import com.ljsw.router.compiler.model.GroupInfo; import com.ljsw.router.compiler.utils.AnnoUtils; import com.ljsw.router.compiler.utils.Logger; +import com.ljsw.router.facade.Constants; import com.ljsw.router.facade.annotation.RouteNode; import com.ljsw.router.facade.annotation.Router; import com.ljsw.router.facade.enums.NodeType; @@ -39,7 +40,6 @@ import javax.lang.model.element.Element; import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; -import javax.lang.model.type.MirroredTypeException; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; @@ -74,7 +74,7 @@ public class RouterProcessor extends AbstractProcessor { /** * (group,hostInfo) */ - private Map routers; + private Map routers; /** * (group,List(Node)) */ @@ -152,22 +152,21 @@ private void generateRouterImpl() { for (String group : groups) { logger.info(">>> write for group:" + group); - HostInfo hostInfo = routers.get(group); - String path = hostInfo.getInterfaceTypeMirror().toString(); + GroupInfo groupInfo = routers.get(group); - String claName = path + "Impl"; + String claName = groupInfo.getOutPutPath() ; //pkg String pkg = claName.substring(0, claName.lastIndexOf(".")); //simpleName String cn = claName.substring(claName.lastIndexOf(".") + 1); // superInterface ClassName - ClassName superInterface = ClassName.get(elements.getTypeElement(path)); - + ClassName superInterface = ClassName.get(elements.getTypeElement(groupInfo.getInterfacePath())); + logger.info(">>> :tag:"); // private static Map routeMapper = new HashMap(); FieldSpec routeMapperField = generateRouteMapperFieldSpec(); //private static final String HOST = "xxx" - FieldSpec hostField = generateHostFieldSpec(hostInfo.getHost()); + FieldSpec hostField = generateHostFieldSpec(groupInfo.getHost()); /* @@ -180,7 +179,7 @@ private void generateRouterImpl() { MethodSpec openUrl = generateOpenUri1(); - logger.info(">>> :tag:"); + MethodSpec openUri = generateOpenUri2(); MethodSpec verify = generateVerify(); @@ -277,15 +276,11 @@ private void foundRouters(Set routers) { throw new IllegalStateException("duplicated group at annotation," + "please check group:" + group); - //use exception to get path - TypeMirror value = null; - try { - router.classPath(); - } catch (MirroredTypeException mte) { - value = mte.getTypeMirror(); - } + String outPutPath = Constants.ROUTERIMPL_OUTPUT_PKG + + Constants.DOT + group + Constants.DOT + element.getSimpleName() + "Impl"; - this.routers.put(group, new HostInfo(host, value)); + String interfacePath = ((TypeElement) element).getQualifiedName().toString(); + this.routers.put(group, new GroupInfo(host, outPutPath,interfacePath)); } } @@ -315,7 +310,6 @@ private FieldSpec generateHostFieldSpec(String host) { .build(); } - private CodeBlock generateInitCodeBlock(String group) { CodeBlock.Builder initBlockBuilder = CodeBlock.builder(); diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/Constants.java b/router-annotation/src/main/java/com/ljsw/router/facade/Constants.java new file mode 100644 index 0000000..0a0869d --- /dev/null +++ b/router-annotation/src/main/java/com/ljsw/router/facade/Constants.java @@ -0,0 +1,14 @@ +package com.ljsw.router.facade; + +/** + *

Package: com.ljsw.router.facade

+ *

Project: DDComponentForAndroid

+ *

Classname: Constants

+ *

Description: Constants

+ * Created by leobert on 2017/9/25. + */ + +public class Constants { + public static final String ROUTERIMPL_OUTPUT_PKG = "com.ljsw.gen.router"; + public static final String DOT = "."; +} diff --git a/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java index 934d13b..0a88f03 100644 --- a/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java +++ b/router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java @@ -15,12 +15,12 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.CLASS) public @interface Router { - /** - * will removed, it is too heavy and confusing - * @return the interface class annotated with Router - */ - @Deprecated - Class classPath(); +// /** +// * will removed, it is too heavy and confusing +// * @return the interface class annotated with Router +// */ +// @Deprecated +// Class classPath(); String host(); String group() default "default"; } diff --git a/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUiRouter.java b/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUiRouter.java index aa1c867..517ccb9 100644 --- a/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUiRouter.java +++ b/sharecomponent/src/main/java/com/mrzhang/share/compouirouter/ShareUiRouter.java @@ -10,6 +10,6 @@ *

Description: TODO

* Created by leobert on 2017/9/25. */ -@Router(classPath = ShareUiRouter.class,host = "shareComponent",group = "share") +@Router(host = "shareComponent",group = "share") public interface ShareUiRouter extends IComponentRouter { } From ecd95d1bffa52093ba7af83c4f0341abd1e2da59 Mon Sep 17 00:00:00 2001 From: leobert-lan <774057695@qq.com> Date: Tue, 26 Sep 2017 13:45:49 +0800 Subject: [PATCH 044/103] =?UTF-8?q?[master]=20[add=20usage=20about=20branc?= =?UTF-8?q?hes=20and=20the=20principles=20of=20'pull-request'=E3=80=81repo?= =?UTF-8?q?=20management=20etc.=20into=20Readme.md=20]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/README.md b/README.md index f59ef3d..b9b9c3d 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,26 @@ demo解读请参考文章[Android彻底组件化demo发布](http://www.jianshu.com/p/59822a7b2fad) +### 分支说明: +常驻分支: + +* master +* dev +* release + +功能性分支: + +* feature/xxxxx + +其中: +master分支作为版本主干,控制release标签 + +**dev分支作为开发主干分支**,feature类型分支从dev迁出,相关功能开发完成后合并到dev,版本功能开发完成后,从dev迁出合并到release分支,“测试”通过后合并到master,发布标签,再从master合并到dev继续迭代。 + +**注意:** 发现项目的bug、优化建议可以建立issue,如果提交bug的修复代码,**pull-request朝dev分支提交**,带上issue号。 + +原则上:分支合并操作由仓库主负责人操作。 + ### 实现功能: - 组件可以单独调试 - 组件之间通过接口+实现的方式进行数据传输 @@ -14,12 +34,14 @@ demo解读请参考文章[Android彻底组件化demo发布](http://www.jianshu.c ### 使用指南 #### 1、主项目引用编译脚本 在根目录的gradle.properties文件中,增加属性: + ```ini mainmodulename=app ``` 其中mainmodulename是项目中的host工程,一般为app 在根目录的build.gradle中增加配置 + ```gradle buildscript { repositories { @@ -36,6 +58,7 @@ buildscript { #### 2、拆分组件为module工程 在每个组件的工程目录下新建文件gradle.properties文件,增加以下配置: + ```ini isRunAlone=true debugComponent=sharecomponent @@ -45,12 +68,15 @@ compileComponent=com.mrzhang.share:sharecomponent #### 3、应用组件化编译脚本 在组件和host的build.gradle都增加配置: + ```gradle apply plugin: 'com.dd.comgradle' ``` + 不需要在引用com.android.application或者com.android.library 同时增加以下extension配置: + ```gradle combuild { applicatonName = 'com.mrzhang.reader.runalone.application.ReaderApplication' From 1031ac6a9025eb4c3ed589bb1c1b3711daa91d2c Mon Sep 17 00:00:00 2001 From: mqzhangw Date: Thu, 28 Sep 2017 18:06:30 +0800 Subject: [PATCH 045/103] Update README.md --- README.md | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/README.md b/README.md index b9b9c3d..636c3a4 100644 --- a/README.md +++ b/README.md @@ -3,26 +3,6 @@ demo解读请参考文章[Android彻底组件化demo发布](http://www.jianshu.com/p/59822a7b2fad) -### 分支说明: -常驻分支: - -* master -* dev -* release - -功能性分支: - -* feature/xxxxx - -其中: -master分支作为版本主干,控制release标签 - -**dev分支作为开发主干分支**,feature类型分支从dev迁出,相关功能开发完成后合并到dev,版本功能开发完成后,从dev迁出合并到release分支,“测试”通过后合并到master,发布标签,再从master合并到dev继续迭代。 - -**注意:** 发现项目的bug、优化建议可以建立issue,如果提交bug的修复代码,**pull-request朝dev分支提交**,带上issue号。 - -原则上:分支合并操作由仓库主负责人操作。 - ### 实现功能: - 组件可以单独调试 - 组件之间通过接口+实现的方式进行数据传输 From d13382066607e268b2805a594b18b7352a4d8038 Mon Sep 17 00:00:00 2001 From: ooeoo Date: Thu, 12 Oct 2017 22:30:35 +0800 Subject: [PATCH 046/103] fix spelling error of 'applicaton' and update plugin --- README.md | 2 +- app/build.gradle | 2 +- build-gradle/.gitignore | 1 + componentrelease/readercomponent-release.aar | Bin 18121 -> 18121 bytes componentrelease/sharecomponent-release.aar | Bin 17960 -> 17960 bytes readercomponent/build.gradle | 2 +- .../build-gradle/0.0.2/build-gradle-0.0.2.jar | Bin 48536 -> 48529 bytes .../0.0.2/build-gradle-0.0.2.jar.md5 | 2 +- .../0.0.2/build-gradle-0.0.2.jar.sha1 | 2 +- .../build-gradle/maven-metadata.xml | 2 +- .../build-gradle/maven-metadata.xml.md5 | 2 +- .../build-gradle/maven-metadata.xml.sha1 | 2 +- sharecomponent/build.gradle | 2 +- 13 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 build-gradle/.gitignore diff --git a/README.md b/README.md index 636c3a4..7f01df2 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ apply plugin: 'com.dd.comgradle' ```gradle combuild { - applicatonName = 'com.mrzhang.reader.runalone.application.ReaderApplication' + applicationName = 'com.mrzhang.reader.runalone.application.ReaderApplication' isRegisterCompoAuto = false } ``` diff --git a/app/build.gradle b/app/build.gradle index ee009a6..cec66d7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,7 +29,7 @@ dependencies { } combuild { - applicatonName = 'com.mrzhang.component.application.AppApplication' + applicationName = 'com.mrzhang.component.application.AppApplication' isRegisterCompoAuto = true } diff --git a/build-gradle/.gitignore b/build-gradle/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/build-gradle/.gitignore @@ -0,0 +1 @@ +/build diff --git a/componentrelease/readercomponent-release.aar b/componentrelease/readercomponent-release.aar index f0431aa8bb945f57bda7ecd45e503de7473eb832..a2ac06d7d241068d86814b8f7cd7675dac47cfe4 100644 GIT binary patch delta 219 zcmX@v%XqSvkvG7bnT3mifrEoVX0y*mUTa2XAidd}@hdl&;mo_&7{r*&?5GH))g3j! z5p=Kdh#U~5it8DR8Gk?1kA5=g{a-+>Hs#QAE;KqO%yDr;bsKYuMejC-K+p#yhGps diff --git a/componentrelease/sharecomponent-release.aar b/componentrelease/sharecomponent-release.aar index 0bfd9b2efd5c22b8196fd84ab685da03836d61c5..7cef895924bd6386f84e86394cfdff63084d4827 100644 GIT binary patch delta 223 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 ZOa18o^Fr{n(frd>mD*%*hid<|`acZaTkik> delta 7136 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.0.1 0.0.2 - 20170913021630 + 20171012142404 diff --git a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 index 83f73e9..42bb9fd 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 +++ b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 @@ -1 +1 @@ -2f7f7b5520212ff931f60ba115aa8ccc \ No newline at end of file +5c112f4a9bc4bfed3c259d56da49ea1f \ No newline at end of file diff --git a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 index 2edd313..398f6b1 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 +++ b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 @@ -1 +1 @@ -b72cdc76b0766b2d5e59e22f1ca6f91c5382c6c8 \ No newline at end of file +ad28b21fd949ca5df36676adddf2eda578830ce6 \ No newline at end of file diff --git a/sharecomponent/build.gradle b/sharecomponent/build.gradle index a404f20..4ce32f6 100644 --- a/sharecomponent/build.gradle +++ b/sharecomponent/build.gradle @@ -29,6 +29,6 @@ dependencies { } combuild { - applicatonName = 'com.mrzhang.share.runalone.application.ShareApplication' + applicationName = 'com.mrzhang.share.runalone.application.ShareApplication' isRegisterCompoAuto = true } From 9ce01bae7df57d5923c14a9f34f3e96d59f0eb36 Mon Sep 17 00:00:00 2001 From: mrzhang Date: Fri, 13 Oct 2017 08:15:17 +0800 Subject: [PATCH 047/103] fix spelling error --- README.md | 2 +- app/build.gradle | 2 +- .../ComCodeTransform.groovy | 2 +- .../exten/ComExtension.groovy | 2 +- readercomponent/build.gradle | 2 +- .../build-gradle/0.0.2/build-gradle-0.0.2.jar | Bin 48536 -> 48529 bytes .../0.0.2/build-gradle-0.0.2.jar.md5 | 2 +- .../0.0.2/build-gradle-0.0.2.jar.sha1 | 2 +- .../build-gradle/maven-metadata.xml | 2 +- .../build-gradle/maven-metadata.xml.md5 | 2 +- .../build-gradle/maven-metadata.xml.sha1 | 2 +- sharecomponent/build.gradle | 2 +- 12 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 026645c..1a0c364 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ apply plugin: 'com.dd.comgradle' 同时增加以下extension配置: ```gradle combuild { - applicatonName = 'com.mrzhang.reader.runalone.application.ReaderApplication' + applicationName = 'com.mrzhang.reader.runalone.application.ReaderApplication' isRegisterCompoAuto = false } ``` diff --git a/app/build.gradle b/app/build.gradle index ee009a6..cec66d7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,7 +29,7 @@ dependencies { } combuild { - applicatonName = 'com.mrzhang.component.application.AppApplication' + applicationName = 'com.mrzhang.component.application.AppApplication' isRegisterCompoAuto = true } diff --git a/build-gradle/src/main/groovy/com.dd.buildgradle/ComCodeTransform.groovy b/build-gradle/src/main/groovy/com.dd.buildgradle/ComCodeTransform.groovy index 8997ccc..81b891e 100644 --- a/build-gradle/src/main/groovy/com.dd.buildgradle/ComCodeTransform.groovy +++ b/build-gradle/src/main/groovy/com.dd.buildgradle/ComCodeTransform.groovy @@ -92,7 +92,7 @@ public class ComCodeTransform extends Transform { private void getRealApplicationName(Collection inputs) { - applicationName = project.extensions.combuild.applicatonName + applicationName = project.extensions.combuild.applicationName if (applicationName == null || applicationName.isEmpty()) { throw new RuntimeException("you should set applicationName in combuild") } diff --git a/build-gradle/src/main/groovy/com.dd.buildgradle/exten/ComExtension.groovy b/build-gradle/src/main/groovy/com.dd.buildgradle/exten/ComExtension.groovy index f96025d..0b69148 100644 --- a/build-gradle/src/main/groovy/com.dd.buildgradle/exten/ComExtension.groovy +++ b/build-gradle/src/main/groovy/com.dd.buildgradle/exten/ComExtension.groovy @@ -12,7 +12,7 @@ public class ComExtension { * 当前组件的applicatonName,用于字节码插入。 * 当isRegisterCompoAuto==true的时候是必须的 */ - String applicatonName + String applicationName } \ No newline at end of file diff --git a/readercomponent/build.gradle b/readercomponent/build.gradle index d38d0e0..a1f01fc 100644 --- a/readercomponent/build.gradle +++ b/readercomponent/build.gradle @@ -35,6 +35,6 @@ dependencies { } combuild { - applicatonName = 'com.mrzhang.reader.runalone.application.ReaderApplication' + applicationName = 'com.mrzhang.reader.runalone.application.ReaderApplication' isRegisterCompoAuto = false } \ No newline at end of file diff --git a/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar b/repo/com/mrzhang/andcomponent/build-gradle/0.0.2/build-gradle-0.0.2.jar index 62a24ef34e6fbb2b4b4a51419ef5d1579b05b169..cc1ef9a14b0900f6dfb3d43a5be77f084814bfc5 100644 GIT binary patch delta 7117 zcmZ9RXFQy3*X~CbVG_}MkQsf5=ma5pH+t_i(R&*;I*Bnlql+Gb=rwv9MD$Ly5QeD1 zzHfQ<`|fAYm;btsbFJgNKCNqhYo%Rdez?XYQdh#lCIA5N@d1ceDj$fzSpPym@g8A} z_b7RGk1?Kq@fic74Cg+m!d=C_4?a9R`>VtdQ{vt$MHKpYf0G&N|0+!&&|hVZGl%m2 zC{!l;Zxv8U9{*m^hqnF=D2-k{xL1s<2XTr2xl}2W*7hYcDF8sr1pu(Y-^+mEMsL_* zG|phb!2v7q$l@#4YEg*i%FdKQ`D8DZ$3SM7ZX+xs+4@kmrS-vz^0cq;kOgT3C|^7~g(e27D!Kl`9&`BFNLvUW{4Vz5HB=!r5(fvvvb zG5NUA+K)vZyFP=!z-XTlxAju1@@dBxR56p&A4e7X;Y&|xbm6X&B+v@3!75THtj$0O z_qSig8}QG!&)#~2K8X}YoYbw(%r7vSTfZQ24z*}&uq?Iz`P{%R6w&nHNDC6jvN6U~ zY+v7VP~-Fx>ic%-3ZRm!5QLtvDn904YM6Qhdh*t_-y})ZkVm($;jnIU&jzmAIs@#N zL}COA^*271oaUQWv*wE*B>nJq2nOK5()bsFYB3``ZN*@|GWYP)-$2W}}61(uY8+^aQ$BV-D$t4iwPPZ8_0z#Rsn>G7de+P4go<+1l~Pig4@;7$ zShC}VOFe>BT@eN(PbK1?{4(O;9m2W5*78winFmUhjjM_-VAf4oOVtY7U;~Y&as*-i zoF9g)rp}DwRc$kFj-P995+i?4QGKggggp~0I&hBuPFGv0SS+nnmIGUi;i__9kB*aV zP)^UFVus&iYUV!;MumhPRGvIpeEK@K|0iZ*bkq_D%)bEiiR9%evfiuA4?Xm-mnT zA6q`qsy=$)m5NXiN_qx6!8??hj!+H(`sBO?&45HTw+Ts(P-u&*EF>gf$?A7-@C0Tb zJ|%})R`4-vGET3%VPB2LkLnaQtQI!b`YssC(ku-5EVd`?eA5_QX5gMiEb4KmZq?xlq zsI4L01FflT)cZbopgtb(dFg51Q>zUHjpkKK5bg;m4>lW--@EJHrM}TzLQ5Ka>uR8| z)&*=4&H1()Da8*3%q!5j+b_7i$qrh#USFKw(e&5MroK^@cf=lf;)2cOd~~JMD>P|; zYs6|JjkPF(3eW#c;3Pwc>t6otJI?sjE`^kKtXS$`KK?jWno;f)Y{)1(*bife`w}zz z)-Z<#2NsS!VopH*(E$W!!?Um8&S4c>xFehV6g-Zf#_^QNEGL*5hZeMIhheu?OceD- zMR*uGXJu}B0h8G_<~hFW7B}sz!PF{=B+1dZddxegH!^1RK3gKVt!+d@GJKUXU{RSY zFok44WR0u8#^R+?WnBE;VJ?1iWVj8l$mve!0L-N{eL{_w4F9Gr#@fD&WV+5TD$Ey; zuzPnRv1T%K@we;y4?Ip!UAYEDO6`XBPT7G_m4nr`6nR>U@d(TWl27uT78v~x_3|@9 zK8J}Urt0!_Sl4@ss7V6Z&>TATwfa>xVF*e(?uNTUO-8*h3Vw2e9Oet`&v7muBb=qPgR#+3a(Vww9BiI$>G>(49(ckV~B>Fw8o`g?>YwLe^LQ& zsCKagze|#FOH0ID>}H8It;9!BQpaWtaHKoPT@lMz3dd%Z9kQftI7HeR3ZkodF~lQg zE`0gFG=-j&;rh^xzK{MLcG%}j5U+*|(a2%&k4>60el&EC;j@OvEQG2D2ldu)UmG!f?3-v3) zZ3ibD>Yy|kZBfQYc-ff7_FSkYId5j0IyysMrM>5odYbqK3&X~lP%&8N&j)9}5K^H4 zSR>c;7U?nrc>1f>8taw7thnyvFZ&`=)b761nR+Ql!HF*``9ntwtQD{W`ECG)A|igT z@-)r|U&Z&-fzV6Y?8J#(n7;_lQ_#vF`Yr2~-P4~|vQ>N{D;Up@M{1YF zZ8OJ2k0$NCi=b3d-9&H11iVAz%McBsOQ>&`PNn>Vgo`c;6dqHT^x5U8>-?Zug%KE) zKuCfx`Z`a&8nlI#O0#ra^+;qx6YA+j-C~%K^4eCfwsy)ZIlDc?){vd+o4=4QjP{dO zDj7++7*jn%P~M59rm{|bmGSrHhBo2m!b+8GmQ|^@qvbl>j;8Gp>bItCHq(Q{88dsW zcv~O89rMx|iz+M99_AEZXuUEZS#|fxEX;D|l>wSW^{G9Iu@YoVITcup^X)*MAAiAW zMU1DQkLap>>H3QJZ>x~Vf(@)i*tl9u$_ji2e2Pe^pkHM`jj`hg5PMdBJ+DkEAf{Y7 zK*q5;p`w55h(OMf^_Z)-8d}TW-#ABRpUKL8SyLCRuDfdWhP8{nR`}=;>&?Q2=a#OM z+&%~qOH+E;?b5}Bpw>xPm8$=QJ(!>Lr6Pp$>cI$zCI^b^{Q}uq0$sg<9al9jm0sNx zLO0BJ6F(6`J)%ZXT@SU56Q685D_KuHCySL|;~Ff?KC699_pYTW@o`e&nnDTtr8tMF z0a@Qxwq2GfHTmiRUqT<2Dbt;e~S{hzGZ~N^htmx`Si`g=Mx}7NTV`8^NN}{P^HZ$vM_swfa&TG&QR z=L=$jPg)o#%Nn$28XeXTD0NQ$W#;@jDiont%WuUQ_boDRgDJknelW=4uq1_dFSXB0 zdcZE8vi!QVGA^0D9Kl{LgYZ-bSyd#4#}Qp*Qu(#c)eHdSwGX}v761uZ)HSYTBRjYY$cVv z;%jC)(Ab*h;x^C-W74c70=LFz{$bo0YK^kcmeo!~Yw5GAMU(~av!}WGe{GbVFpL|}1N(!I33H_#Q45Cvh zhT9Rm&9nF57|ms2m9IuAf8TYpjB+tU}|n>jI1dXwq4$_?U>Byhs>}=1jouBU(cH7>j2V9l7#h^ZT z@SR8^MBTGB~2qaG48)>C~Bu! za9qc8T8^c;Typ7^RQ*Ra17-I!mU2a)eM)VGtK{Ys_NP4ro>o{vf37N((=NAip43BW zw=aDdjY{`m*B>Ic96V>N^deFZ63hG(GxVZbYUJT5mbbL^ueDE@Lc=d--z(yC%K}V> zn&8LGGYmXuZiTOQImRUt_$Vc;$#(lVhDb~`h!ab7iK`{6W%g*aU3{zhr-;$w8^5ED z-_aa7!&n;xwQ?=jRT|rmhyPe~B+c9nb=*={OLnl4$9z~JSi0LZg;Cf8{seyY!P(&& zVT-3p&W8{m6lP|6jI_UeO|nV$;kaMkQ#%CwYhXVZ4D04VAtUY36nQkL&1yw>M^nb1 zmrT(PAHmuxL7i@YJQP6Jl2_yM(yZK@rZ`|2Ol@rI=1)^VS}ZhvZ?GFF!TLwwMw-WV z*EoW^`-9wc-SDPg-D3Dp4aN=heq{>9+UDo6*VZ)O#Da^WFU#83oB}!|zF*3*9dug|Ck< z9&6KgdU0r-GN(bQ4?^xplCOGN>Wm9utQSr=ygeu4-1H_r)iF0tVxP1Y72{S)Fc&v9 z!j=m8!<#pIlsiSU0#d5pOBL0g`uVbtz$T?6M4n*Ml3@Jvr`_nQ71r$6E})eIoW;+_ zP2)!pAQ{TU$ZaWaFeh`3j?}A8nryrL=29&pBI{V2U2fj)mL^uIS*1o7o;NugAzw$K z!C|Z{h$+u3#2b>2Xp z9rCbr^hhDm(ax+$16DO0aZsGOo-M@XHSI>7R6zooE*|V*(HkcE=qE+2PN+jp?aqfB znZzr~SSFT7H6J5{0#ii*f*i31sOWDktD_$9?ubJlwdMSCAM(mVpg6Ufz}BaB#|1^} zh0?U+iP4Lt(9cbXvD^j88myaMBO|bVsTjo;dwb-3)+Hr8F^~qP ztz>x?ECNycfoZZ+k4eL*VWmouP6TGa>w)O>o1vcwGn?>wq}xlU%n5%Qsas#Y5>7D` z`RO)_bZWwjG(IHa^v1M)8C!Y8DWH?WaT>9X!yd_bG|-8OSjOB4Ky!DCbt$z4j#RCT zvQSx{!%aF;3tH&6zT5Sj@af2&qvv7q6a9_#=7P?%Al~Ewc6OQ*jCAU1`hIlucR0m6 zz6mSdCnF>A;~$)7-d)8vx~(;Xn6dt-SIca~n=OAW@f~?rqHG1_AYc37@OtQMHyYXy~jW`POOm+(exmo_)q>X~PnL#%avV4uVMtlWCw zMA`$^4yl6Kn_6s$nXTDtbd|}#GSYITdsp-4O%t81O93r!N95(JDBh< zSjIMJe#z9#04@~S;Q|6O2-60`=dlB`Y- z;7093dNRQ)c&8i`H}f(bt_nf>?Kfkac)>x=Xx-pt-b+VG=a!!^n1{l$>jcv1)Hd~o z`*6Y3_^hMpC(L{9&K?~mdB=Onn0szixuR=O0Mn?QsAR>;d#DkLiez2LB|AP6dXzb& zx5J4-$ST8?nv=}Z?mdo95o7`AMY z1;@cHmzOtYddFf^{+HJrIqTa3p}!;gFXpcLFN^X|dDpP03y#G%y9GhaNqrqhOzVW| zH;+TT0e4XsEB`gFRB8!B4wK;n08Nhpp9_QC|4t97qv!t49M2M6{*Dpt(_jBpJ|P?a z2KL3d_W_)+Qh?~+0b_<1$~_eu0N8}9Rr0|Mb!oIoZ&jaA;`eYZIx8Ylj0mJ1D`g-A zH8P61h^Lh5u4!4}AFd3Eg>SF6{z}o@W z3)c(&$iR#94vAY_mxqazRSvQ`3SdNAXpTa$3V-?<0nF+o>j{6YcW-17jqroGybYM- zOHD*vh7!l4Ghm~Q(h=`ziAs-nr zvw>=UIzYU@u}tNNpMRJNvj+Obb>W-)E){|GNbQ3HnHOc&T-%yfbO}^81`~15R&*bx ztiQHKYrV5z6xhO6I-5L%Jg<Xh)KM}d46JeBDn}4?3y$pxFXh-C;Yw%niVz?5 zL_*$;)$n~OZ~&9cylpqjU@vWOP{BP;xva5@^=_xK&oa8#U^2Y!k-Rlr%hs?A1?l6J;dfd>lKrpBAFeZCtq z?q8P5106#y8%*i0qu)->)-5w1ewET3g|>m>Uev|B(NT!OwybaChnia9n@fa74ZNRV zf33=c&21R)fFR6BL(eI@X;t_`-mo`3j;3+9pH!Tc1R2i0A+3?XwrI2CO2)hfoYQL+ zp$O{|>6Xq6pLUn)V=Uo|g?cc4)PM?7>#oFJC||TIwO2ZkdcvBKfXY+ZdqD(I`ap;dYKd~~yH)bZWQfmwC|)cFkY)27vfVQqvAnxN7>!>7KI zrQZF8f0~;ipHA?%MJ{Z+AEHHNc%fLRW=YvB*@3NClv<`~_zs?+Y`Kz1>OuA3P3(r3 z9{jrOcK5Z8nL8nogK#X=85R_>c^vpcfv40y-wF&-4RgsXD=qh@YGc)~)7uAcE!sBZT)UFLvzdoGGK)5o z?b=UOUp^t>p}wVC>fcH9-G0~8(qZo6!|{jqSA|LxLjj4QnxYIh3I;9yl2}#E;ghJ> zJM*chUfzh_FA=^~AG~eL7m?`Nc0mfS8Q`dkowi(5{F-CVi>75DQ%aUQE#z%zlT8gT z1%kmfJtdE63cO7(bmPD#-MWheEUc^q@)cS0f}vbWY2b~-=NpuGS!UEd#NDw+udY9* zxu4<5hudxG5IBm{!kTU|ABvOG%`)W!E0B_*vXCB=)tqze`tb4nq{<6*v_deY4xJuL zTSP7{0qlsv*8gDr0MExqb>i`KN%t+zcjFPkn6b0eSr4TFSz*SY3G~>ld}%=x_|pkR zyZ$9fOLTB#vqkle2lR6+~Q^{lUL>PF>7>3a0z^7%F?kmMkryhS_Xjbt8 zaTpXY5Iv7vi`1M^yuFd(PDG_dKLQ|6X5eP`)SU7rT3=esQ}eVPn8OV;k?E zlbY=A8|(jUZs49xickM-wf|4k2B-o4_g5Ga5e)wzLjjkJW`{p*roDHQXr{r$i~f(y z1Hbt~c<;eqM4kBf0RVt{0szSTuLYnmWFzrE$!zdPEhG&8Ug&$Y13JV304j+90MY+S z)`7ojxnFg`6Iy66vyuNPWq@lpk=)-?lXTr>h6?~-JOThf|6N-ApJW0!f9sR`cU5eq z!Mv>aM<#>wRN``~D`8-gV*Sr$$ z=}+Q4?hETef$3=aS>AOQdrU_J;&7}SuXwomQRzbtaF2H|alnPKa{0i(r3qFcqnu@CT3Y8+&K$P?T9k(&9P%Ifd}}(r8M=RSHUzD|>3n{3_0>-mBG}Of zfe4PX?EWNu?yws3Z5KU`c;7XMTG%iuX_NNgmas%Ys@1<5@kW`{NMyx^K*wy$MeYRn zsxD(6`WExgZyUM(sQ2y!1-#ZZ9x9jnR%f56PNxMU5E1L;el~JG!p{*I80>aF)K-_R1^`W}@6`^dO&cP5dbeSpN%^FcIBik6ekLrD zx8G$I&(^^xr8Z)~f8-ERwO_xvAbqy+={Z2d!xSxYP zdJRUW?9s!xKtGx#lm(-1PnMe2sO#%l`}yGF!0GYt^mUqhuO%Z)PR2 z?Os;BO_henyjjusAWv3cHCtkYBF?#YqR+$dGMBQPerIMFKj&;J6w8F%*~-#fCVm$S zsUs0}`USw`V6wc;SFBkilZU}*`6+2N)jyG2*c6=Kn0oY~aP+(1Pqcb1{89|KTA^Jz zKk+(JKCgah%|hgYi8CSio@XjU7 z1JbQOoHB>>ZPR6gIyrR54}43Se$iQiu_$K3X>rx;l-m|`A2U;ypeQMIUO{;el)a2u zrDTaNY3$jp84VD3a)V$OgQmv(8)&X1bCCVXcQpWyI#_i&CG+YFV;C@Ywz3G9h2HlG z>R`m9*XtjdvtFvC+7{b`cJfox2e!xb(eXO=%-rt=rzN$Z5!zW6ENsI1LX3G^qb|{J z5@SE~w{|h6CQ3eyjw+^08nK-19>=Tvl!*%M|qKtB~ z0_yRc3kISb{5lC)8;cdZu1}tDru7x?G%;rlN?vr?mwn+<+%EAewQRc42n5Y8Qdi15 zn5StyPB&73Hqn_|Y+`g|m@oAvSb1z)Xs4ewV#&ALd=j++iKsbO?(Lcf~SPs*igt*&N9)CO*lJ;G*!GN`Q%+yAZq} z3R@?IYC|F~BCxEAR~1c+BQjBuQm=N2UR&GP(aLv3e{(Dk6tF_WSLuQ!aB}{hM5{U~oj5>c*+GyTCcfn4i6wN}pbYo#AV4!ku z*+CYJGlTo`3AN|IDMqTxjSS}qS7E!PcN+z@TQsd@-XYfuR|k(Q0D*ckl!# zUbcbrcXr;3k(^M=06CS9$y$a4e3Oltf_&czhO<4vj**CLBWVoN*C`!uy&RT!-blU2 zLCHEI8fp5d)6AyOl6%!VnkClCG zNYvs+H(%!U`0L*116-}5Q#vEr0-irWjZ#Fr76Z^Qxs8$f^(nclse$gMI!w_?p`6q? z>g@y}oO_8;bz$i^Bi5&I^s-6s>nr?5|6C%qXLNJ1jHDYTs7ey6(ovD9GWsB4m>N~K zglLm;$<5m)Ijm#sVe7-sa#tA-WQd`JMDQ+JLA`Mhk0JTU6YB^1f%P|Bg|=8Zl%l4} zsvjR<^%BeKd_2G&?$l;mEnv4R!fX1mdY8*~PI={NioXFSb$r{HwHP_`DMTn) zwmX{y@7+C{VrEoU!{O^cVJBJOp{(xkMvl^_KR=7IWTG$f+#pJBqZ#0V@ zz4wG2C3>24)*IUq?^6lP??aNIFJi+TvC~Op>0H3`Ws#zR@4;Vb(S9d{!4euG+I(Z7 zXzzC$bz(RfFwZDjt_5_Z38!22ck214#6oLSLWJHzlV?HFlLhR(0luF#yXy&MEk6<$ zJGtBHc%5TA{NBA^lVwEhaq-cRb3yExo`hIQ(MLIb(yfY4&EriV9-83@v-F&9kcWi8uUJikdGx345-yB+j~$aF~%f4*3O$aD9AErDlIW z?p@g~FC6Cj+Sy#@uv#2TF>>;EkW@p{%U@;qfoy|sV~!(tdxD4)hHzo35Dw^?|EBjn z{NL`L?4McA3<+y?BYRfl7K7^4Kk|70qN;GQ7Q~-Bs^WQ~hXNM- zisqvyakIl&Ar1%$|tOM_Q+8vg|szX;YGQiEb72m8eO~iwu>2)x82ZQ>{k^6@idA8Nu$7^oGT?e}~a!Q0Xzec8Z zeUJF$lt_uP>I+Cu`LaEr{B3$(rd3aEP{KeSr{G6Oth(Bg!sZHB%a#g%j}SkIrg`SK zmSsba!EzH3H|us`W)JH&r}6Cp{mVfp&E!TTic47-k4cu)PLQ>bg)J*!$u} z!>kQ9q1Zolc}9nO4T!GlCa6v+pkiF~D2?Z<8jCqLkrQUfufwLK&`({NaQAwhb)v4` zu&gIjjXrOE4sEwoO(=DZd(JCF;EOOxZJ!Z-@XlOu#rG3u8qg$h=~dl(+`jyj$*KtS zIn`Hg`CJM71{ro}TZzQd)j?I`JW3d#S<=%rB5KQ2yhVw~>tZOIxy$`+F}=UoUVuJ% z)I3E~ey50AjyS`go#UQn7fi?a@RNyRn?U^R1B`43MD*jV3u^*FyTvt9rRTHZdKc|) z-eFa{Fea~^rSiAt)>n6sH5rLd%sMh(R_2|bl(;xKtEj-B)ick=eiohM7;)JrjJJ~| zl~;EwrB~a6vh4X({njEyvQ@b^a=!2y2ue^9zfZ**w*PSG4`;*KkYGN+Tx#!xIDY~O zPBV+stAAJN(M;}{N3Q{-P7T3K$Ka9{4hOV){P@+Fi8?54{Lh=;FIP$}KJoZb5B}x1 z_%S85gexc{-5dL7fuHn*y>8C;5_rlelUVa3_2(F78?#B>&GS-JelxaYCYO5k(*X^X zzrlT}Oo4Ks*rLqOR+CDPB_0I__ZTBnzG-#!WCvtfS^4?)gJStoaJH~A+N!WvnEE`9 z>v+6*=7&}D3OSNlyei(vRDjJ;oTGp50b0qy!WgP0d*8u=4K;yJv+zy(`mK+)mFfq9 zg0ja!WrArXkBmS13w>==u(PQC$sq3ehB1eXNk+ZwY9YubdQN=E+wiW#T&ihqAObU9 z@M|Dm*b3i5#vWmgpWY;8H%Bk-nPfx&5~LAVr1&mE%8HbmW|N(Et^CmJOEJHl5(`cT zW;}qJ+vU60ZKhb%$L{8fbZH;Nm$YDcEpKiCAr!6GMD20yvD2V)G3!UCE1Ct9TfWUn zyS!OLc{;~yn_j`XSnE>*%VYLS=l+riodSMzbTP(5GBUgPZrdXXvyy@!f$@D-^M>vKOGGRh93 zvug)0`pFob+#v^s*Um+fp`!M$2tQKz?mAq4IVOm2qjk|c@BcNBjK9iT!8sqO7PJBs zSP?sx=mrj#C!ed+S!Dk>fJC(p1qwm!T6gg;f5h(i(`~^6ajLv7#XF`l56^SXCast0 zwkAJ65<6tcyV$$@;l)K3-Vw)G4QPwLU*r>MFvgvq1#yEVPB*-Ee%ZnlbD!8QAvr^FrFP=>E&!KTY#pEdfnqW#%-^k2=6{4+M%%1Fi&1D}5@ z-#_wF^ZfS4^XIA$$+cwd@NebUSfK1Ssjf@Lfp75C{%|1DAP7$zB4+Rx$v&tr}MGq$> zMge+N0X@Ww3}Vv&X`lBvh?%vRJJ}YgO?w3EsTyAf7*k9FFxQtH6Xk^vT}7$6g2Y4& z(tXnvUd_s*Tb}yEkifQ7GJuGBr)Uh6fzgIUi`xjLvF8UFp-ABdsMX_$)SwfNZD=== zKwsHPun}1x*ge zssc(|o}s8@*YIa_HBDJsioQ0dSL+n8)5Wkrc#=-x=QrUz%AXDwfQxkpJb_}Z?J{1i zx#u!uItzh`;d&UU_2`g2vZ253$ zL1=FQQPz`#{ckD+-T7&`$P&Teif5Qr#qRtseJX;k96F0d2trW5~j zT5Agn9v9RDhIN7V*E8?VaA7eoSeW#|_9t)UgmpKtt+wj0Svd3^bQln1JUO_qwigW0 zV737vwt%LMq=vb!F5y%BbouC-?9V2F^en&uy7NZ|*l8;CfuS}LAg>4?#WP;J?4_aw zMW@NVjnVj;3ytc<0gR=tw;Ou-ZbBNStu?^@NYm3}YLF!$hLpP|w!bG-xwxmi_d{sy z@me&8wj?4RSHf>KZf&+MFN~|oqR|uD_XVId=7tI6g3BD3-KkyXH#A!W1iRD`{(4qm z?7vz5f#Z0OJ$Hil2MhDX^dUw#sUp(;&NMA$3_Kh>F=V+OROY$MWHRLh2P4w%e`>pf znA>+yq4Pz|tZVb$HwLZy-#=+@EoZ1X-JELhZl(=^diFBS@xA`Kw_G8=mq7u2xEqRy z7E%tKZVtB3>tjHVv+yE9sr1VGG60n_XX3eJJl5op;yzPse`KhXUIVyky6C4Lh8|Xp z*F3ehqil){RTwtrSp-1pE&>w3zLkABcr%`d+R8HUP?F&Uo<(8^4D4GA_KgGkmVdOSLO4K_=ah~tXwEx# zHf;@=NZMYdBy@TluD*<1_^l6mKwSG+X@G?y=x`H$S-AAR_qE_LdMW76;)gqnK6lt# zpCv6h!7gTfcTY(7e$Dw5pUXvlcRQTSDN+Ew1!m9o5=b*U9*6v9@r*xPXRi)E8mtO2 z*rB+~YbEs;3`bc6sv6D0tk`==c!3!`Xeu00HA|JOgHjhX(} zi`-B0CL;gaf(+W<;@i@azi*s)WF#JmC+peRw z_@ogW7XVoP(>4YE*@hn0+R6ycGVw5EF{Takq<%sO26bL!8WcHd5`*0;)vRdk;!>4? z4@GlVYMO{hG^KZir^1dimAbvcaw|EIG;xfG;CGH^w1P=Vv5*w=0T@{4Ca!*sSzcovyP3KakbljSz#Pe>z_vk)ykr%rC7k)*j_AYEHZbfMr@zema5X3XG*=72^xQ(yb_TumTU%fRE z+#t2|``Ve3zDb(gjhZa9XNvxbt0wL&kF?)9c;__xE1H!5F->urvA@J%L!E-Te`HM{ z&*QweUdOoL^N|f6vnTOT3CWG7f;3gqtQe3$TrYO#q%JdF7s6>D*i|mx`39Ft8K@E{ zI*`?vKEO@(dgw{I`kE(y7t6w@pLDETL&jPA(#zxapNW`uwg@|4>oAcyyB9Wi_NRzu z3sPA=NT@Mqs-h~1w>lyMUWr%bsyzwH;8=2JDU?oaG|G!{kIXfKo{WRqbw;5-*I$ql zpHDJ+TB%B)%+)c77c1Toa7{NgfrcoKS5C=;#2_(l{rRUfb(-W{%uz4lq)dY^*9aqh zr&qvwOl$V9)+Z1K-;!C|LuL9JW6U4MFGtoa!}J_O`TE6P$&>D6JKUS&X3I3)$bXD_ z7#f)NUfp(aZXMkO^(bcA71*SBZOSv`5yO*LdM9x0N=T?5-p#Ac*jqxXof`c(-E1vg zrFXgc@!LE2Wm9AEJ)@_BiZtze$zClZr^D;ist7jdtkJM6ysLHpIy^5DJ`|E5jbxFW zn<1MuoUxtMBjNkO*(i$0LLuWko+TEu_Ei$<~p&S3&MSA_yRMyI6T@wuh1;80m$;Jm0n=?pm zbH!ltA^ zvq2M#3i1UVc6X1dBO>dZV_)WncYi~LDNMCS`50U?(p33&lNBp6bF~t(-^=Mv1@7@s z=ci@zLo2qOfA)}k#r0n5bfS80Yl%zkv?l%&Z}&o1&+m6@@rP&tNRjC6$9xi!QA5hI zg8h&%pU+^1IQA9Hef2h@9Qz;EHq$CE)<4ogV~ne#DpF~vX@&OsFTiYSPMj>z<;-ZM z4~W>`rNDY}3%;u#K6yTzz}$X`LTgT~9~=SK9KzAjrf*m|9`_??QOKd>Vw;~5X`Ueo zZ&i1O_Ek`BMK@Ugb5_FGYoz|(rNB&Uptqc^k-Q~kt0.0.1 0.0.2 - 20170913021630 + 20171013001244 diff --git a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 index 83f73e9..9c0c6d6 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 +++ b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.md5 @@ -1 +1 @@ -2f7f7b5520212ff931f60ba115aa8ccc \ No newline at end of file +f003340b43e849bf09eec50cc682f880 \ No newline at end of file diff --git a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 index 2edd313..18c9793 100644 --- a/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 +++ b/repo/com/mrzhang/andcomponent/build-gradle/maven-metadata.xml.sha1 @@ -1 +1 @@ -b72cdc76b0766b2d5e59e22f1ca6f91c5382c6c8 \ No newline at end of file +ce42b20d262be1d8896771ecf856dbc096c71f56 \ No newline at end of file diff --git a/sharecomponent/build.gradle b/sharecomponent/build.gradle index a404f20..4ce32f6 100644 --- a/sharecomponent/build.gradle +++ b/sharecomponent/build.gradle @@ -29,6 +29,6 @@ dependencies { } combuild { - applicatonName = 'com.mrzhang.share.runalone.application.ShareApplication' + applicationName = 'com.mrzhang.share.runalone.application.ShareApplication' isRegisterCompoAuto = true } From 93948a3c97b8152e031e1fef9be781f0954ff7e3 Mon Sep 17 00:00:00 2001 From: mqzhangw Date: Wed, 25 Oct 2017 07:44:02 -0500 Subject: [PATCH 048/103] Update README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 7f01df2..31ea6a7 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,13 @@ combuild { ``` 有关isRegisterCompoAuto的解释请参见上文第二篇文章 +#### 4、混淆 +在混淆文件中增加如下配置 +``` +-keep class com.mrzhang.component.componentlib.** {*;} +-keep class * implements com.mrzhang.component.componentlib.applicationlike.IApplicationLike {*;} +``` + 关于如何定制化,请参看 [Wiki](https://github.com/luojilab/DDComponentForAndroid/wiki) ### License From 075a4ddd00d915fbc1168ec70a5f5ee9b57be497 Mon Sep 17 00:00:00 2001 From: mqzhangw Date: Tue, 21 Nov 2017 03:49:16 -0600 Subject: [PATCH 049/103] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 31ea6a7..9cbc250 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,9 @@ combuild { #### 4、混淆 在混淆文件中增加如下配置 ``` +-keep interface * { + ; +} -keep class com.mrzhang.component.componentlib.** {*;} -keep class * implements com.mrzhang.component.componentlib.applicationlike.IApplicationLike {*;} ``` From 498adae51e513cb1281989b5ee3cfcd6953088cf Mon Sep 17 00:00:00 2001 From: mrzhang Date: Thu, 14 Dec 2017 19:45:31 +0800 Subject: [PATCH 050/103] UI router by Uri --- app/build.gradle | 5 + app/src/main/res/layout/activity_main.xml | 69 ++-- componentlib/build.gradle | 4 +- .../componentlib/router/ui/IUIRouter.java | 6 + .../componentlib/router/ui/UIRouter.java | 37 +- componentrelease/readercomponent-release.aar | Bin 18121 -> 0 bytes componentrelease/sharecomponent-release.aar | Bin 17960 -> 0 bytes componentservice/build.gradle | 2 - .../componentservice/share/bean/Author.java | 35 ++ dilib/build.gradle | 29 -- jsonlib/.gitignore | 1 - jsonlib/gradle.properties | 18 - jsonlib/proguard-rules.pro | 25 -- .../json/ExampleInstrumentedTest.java | 26 -- jsonlib/src/main/AndroidManifest.xml | 12 - jsonlib/src/main/res/values/strings.xml | 3 - .../ljsw/component/json/ExampleUnitTest.java | 17 - .../com/mrzhang/reader/ReaderFragment.java | 23 +- .../ljsw/router/compiler/model/GroupInfo.java | 35 -- .../processor/AutowiredProcessor.java | 4 +- .../compiler/processor/RouterProcessor.java | 318 ++++++++---------- .../ljsw/router/compiler/utils/Constants.java | 10 +- .../com/ljsw/router/facade/Constants.java | 1 + .../router/facade/annotation/RouteNode.java | 15 +- .../ljsw/router/facade/annotation/Router.java | 26 -- .../com/ljsw/router/facade/model/Node.java | 11 + {dilib => router-di-lib}/.gitignore | 0 {jsonlib => router-di-lib}/build.gradle | 6 +- {dilib => router-di-lib}/gradle.properties | 0 {dilib => router-di-lib}/proguard-rules.pro | 0 .../component/di/ExampleInstrumentedTest.java | 0 .../src/main/AndroidManifest.xml | 0 .../com/ljsw/component/di/route/ISyringe.java | 0 .../com/ljsw/component/di/utils/UriUtils.java | 135 ++++++++ .../component/service}/AutowiredService.java | 4 +- .../service}/AutowiredServiceImpl.java | 4 +- .../ljsw/component/service}/JsonService.java | 4 +- .../component/service}/JsonServiceImpl.java | 11 +- .../src/main/res/values/strings.xml | 0 .../ljsw/component/di/ExampleUnitTest.java | 0 settings.gradle | 2 +- sharecomponent/build.gradle | 12 +- .../java/com/mrzhang/share/ShareActivity.java | 44 +-- .../mrzhang/share/applike/ShareApplike.java | 8 +- .../share/compouirouter/ShareUiRouter.java | 2 - .../main/res/layout/share_activity_share.xml | 50 ++- 46 files changed, 496 insertions(+), 518 deletions(-) delete mode 100644 componentrelease/readercomponent-release.aar delete mode 100644 componentrelease/sharecomponent-release.aar create mode 100644 componentservice/src/main/java/com/mrzhang/componentservice/share/bean/Author.java delete mode 100644 dilib/build.gradle delete mode 100644 jsonlib/.gitignore delete mode 100644 jsonlib/gradle.properties delete mode 100644 jsonlib/proguard-rules.pro delete mode 100644 jsonlib/src/androidTest/java/com/ljsw/component/json/ExampleInstrumentedTest.java delete mode 100644 jsonlib/src/main/AndroidManifest.xml delete mode 100644 jsonlib/src/main/res/values/strings.xml delete mode 100644 jsonlib/src/test/java/com/ljsw/component/json/ExampleUnitTest.java delete mode 100644 router-anno-compiler/src/main/java/com/ljsw/router/compiler/model/GroupInfo.java delete mode 100644 router-annotation/src/main/java/com/ljsw/router/facade/annotation/Router.java rename {dilib => router-di-lib}/.gitignore (100%) rename {jsonlib => router-di-lib}/build.gradle (94%) rename {dilib => router-di-lib}/gradle.properties (100%) rename {dilib => router-di-lib}/proguard-rules.pro (100%) rename {dilib => router-di-lib}/src/androidTest/java/com/ljsw/component/di/ExampleInstrumentedTest.java (100%) rename {dilib => router-di-lib}/src/main/AndroidManifest.xml (100%) rename {dilib => router-di-lib}/src/main/java/com/ljsw/component/di/route/ISyringe.java (100%) create mode 100644 router-di-lib/src/main/java/com/ljsw/component/di/utils/UriUtils.java rename {dilib/src/main/java/com/ljsw/component/di => router-di-lib/src/main/java/com/ljsw/component/service}/AutowiredService.java (88%) rename {dilib/src/main/java/com/ljsw/component/di/serviceimpl => router-di-lib/src/main/java/com/ljsw/component/service}/AutowiredServiceImpl.java (94%) rename {jsonlib/src/main/java/com/ljsw/component/json => router-di-lib/src/main/java/com/ljsw/component/service}/JsonService.java (90%) rename {jsonlib/src/main/java/com/ljsw/component/json/serviceimpl => router-di-lib/src/main/java/com/ljsw/component/service}/JsonServiceImpl.java (83%) rename {dilib => router-di-lib}/src/main/res/values/strings.xml (100%) rename {dilib => router-di-lib}/src/test/java/com/ljsw/component/di/ExampleUnitTest.java (100%) diff --git a/app/build.gradle b/app/build.gradle index 988b6a9..3f03fd5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,6 +10,11 @@ android { versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + dataBinding { + enabled = true + } + } buildTypes { release { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fb57783..19e8032 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,41 +1,46 @@ - + - + android:layout_height="match_parent" + android:orientation="vertical"> -