From 627ba17580486254e278b2d0aa23d9cbab0e21f5 Mon Sep 17 00:00:00 2001 From: Fitz Date: Wed, 9 Sep 2020 20:55:11 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=E5=87=86=E5=A4=87=202.0.0=20=E5=A4=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 12 +- .../simpletext/SimpleTextComponent.java | 2 +- flap-annotations/build.gradle | 2 +- .../flap/annotations/AutoRegister.java | 1 + .../me/yifeiyuan/flap/annotations/Proxy.java | 24 ++-- flap-compiler/build.gradle | 2 +- .../flap/compiler/FlapProcessor.java | 125 +++++++++--------- flap-gradle-plugin/build.gradle | 2 +- flap/build.gradle | 2 +- .../src/main/java/me/yifeiyuan/flap/Flap.java | 34 ++--- .../flap/plugin/1.0.0.1/plugin-1.0.0.1.jar | Bin 11270 -> 11327 bytes .../plugin/1.0.0.1/plugin-1.0.0.1.jar.md5 | 2 +- .../plugin/1.0.0.1/plugin-1.0.0.1.jar.sha1 | 2 +- .../yifeiyuan/flap/plugin/maven-metadata.xml | 5 +- .../flap/plugin/maven-metadata.xml.md5 | 2 +- .../flap/plugin/maven-metadata.xml.sha1 | 2 +- 16 files changed, 114 insertions(+), 105 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2c06c7e4..a9d2ea8f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -71,13 +71,13 @@ dependencies { implementation 'androidx.recyclerview:recyclerview:1.1.0' -// implementation project(':flap') -// implementation project(':flap-annotations') -// annotationProcessor project(':flap-compiler') + implementation project(':flap') + implementation project(':flap-annotations') + kapt project(':flap-compiler') - implementation 'me.yifeiyuan.flap:flap-annotations:1.6.1' - implementation 'me.yifeiyuan.flap:flap:1.6.1' - kapt 'me.yifeiyuan.flap:flap-compiler:1.6.1' +// implementation 'me.yifeiyuan.flap:flap-annotations:1.6.1' +// implementation 'me.yifeiyuan.flap:flap:1.6.1' +// kapt 'me.yifeiyuan.flap:flap-compiler:1.6.1' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/app/src/main/java/me/yifeiyuan/flapdev/components/simpletext/SimpleTextComponent.java b/app/src/main/java/me/yifeiyuan/flapdev/components/simpletext/SimpleTextComponent.java index 12a9c629..e1a884e7 100644 --- a/app/src/main/java/me/yifeiyuan/flapdev/components/simpletext/SimpleTextComponent.java +++ b/app/src/main/java/me/yifeiyuan/flapdev/components/simpletext/SimpleTextComponent.java @@ -12,7 +12,7 @@ /** * Created by 程序亦非猿 on 2018/12/4. */ -@Proxy(layoutId = R.layout.flap_item_simple_text, autoRegister = false) +@Proxy(layoutId = R.layout.flap_item_simple_text) public class SimpleTextComponent extends Component { private static final String TAG = "SimpleTextItem"; diff --git a/flap-annotations/build.gradle b/flap-annotations/build.gradle index dd535bd9..8810267c 100644 --- a/flap-annotations/build.gradle +++ b/flap-annotations/build.gradle @@ -14,7 +14,7 @@ publish { userOrg = 'alancheen' groupId = 'me.yifeiyuan.flap' artifactId = 'flap-annotations' - publishVersion = '1.6.1' + publishVersion = '2.0.0' desc = 'flap annotations' website = 'https://github.com/AlanCheen/Flap' } \ No newline at end of file diff --git a/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/AutoRegister.java b/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/AutoRegister.java index c061fe8f..36a194c2 100644 --- a/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/AutoRegister.java +++ b/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/AutoRegister.java @@ -12,5 +12,6 @@ */ @Retention(RetentionPolicy.SOURCE) @Target(ElementType.TYPE) +@Deprecated public @interface AutoRegister { } diff --git a/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java b/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java index 5e71ff8f..4978260c 100644 --- a/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java +++ b/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java @@ -6,7 +6,9 @@ import java.lang.annotation.Target; /** - * 标记一个类为组件,并配置组件的一些基本信息 + * 标记一个类为组件,并配置组件的一些基本信息。 + * + * 被 @Proxy 标记的组件,会生成一个 Proxy 类,并被自动注册到 Flap 中。 * * @author 程序亦非猿 * @since 1.1.0 @@ -23,14 +25,18 @@ */ int layoutId() default -1; - /** - * 标记一个组件是否需要自动注册,如果为 true 会自动注册到 Flap - * - * @return true then Flap will auto register this component. - * - * @since 1.1.0 - */ - boolean autoRegister() default true; +// /** +// * +// * 废弃:从 1.6.2 开始修改成了 ASM+Plugin 的方式,默认会自动注册组件,即便设置为 false。 +// * +// * 标记一个组件是否需要自动注册,如果为 true 会自动注册到 Flap +// * +// * @return true then Flap will auto register this component. +// * +// * @since 1.1.0 +// */ +// @Deprecated +// boolean autoRegister() default true; /** * 是否使用 DataBinding,假如使用 DataBinding,那么组件的构造方法需要做一定的修改 diff --git a/flap-compiler/build.gradle b/flap-compiler/build.gradle index bb5cef41..685dda39 100644 --- a/flap-compiler/build.gradle +++ b/flap-compiler/build.gradle @@ -16,7 +16,7 @@ publish { userOrg = 'alancheen' groupId = 'me.yifeiyuan.flap' artifactId = 'flap-compiler' - publishVersion = '1.6.1' + publishVersion = '2.0.0' desc = 'flap annotations' website = 'https://github.com/AlanCheen/Flap' } \ No newline at end of file diff --git a/flap-compiler/src/main/java/me/yifeiyuan/flap/compiler/FlapProcessor.java b/flap-compiler/src/main/java/me/yifeiyuan/flap/compiler/FlapProcessor.java index 2fa460d0..d58ed7e2 100644 --- a/flap-compiler/src/main/java/me/yifeiyuan/flap/compiler/FlapProcessor.java +++ b/flap-compiler/src/main/java/me/yifeiyuan/flap/compiler/FlapProcessor.java @@ -47,7 +47,7 @@ public class FlapProcessor extends AbstractProcessor { private final ClassName CLASS_FLAP = ClassName.bestGuess("me.yifeiyuan.flap.Flap"); private final ClassName CLASS_COMPONENT_PROXY = ClassName.bestGuess("me.yifeiyuan.flap.internal.ComponentProxy"); - private static final String KEY_OPTION_AUTO_REGISTER = "autoRegister"; +// private static final String KEY_OPTION_AUTO_REGISTER = "autoRegister"; private Filer filer; private Elements elements; @@ -57,7 +57,7 @@ public class FlapProcessor extends AbstractProcessor { /** * 是否自动注册 Factories */ - private boolean autoRegisterFactories = true; +// private boolean autoRegisterFactories = true; @Override public synchronized void init(final ProcessingEnvironment processingEnv) { @@ -68,10 +68,10 @@ public synchronized void init(final ProcessingEnvironment processingEnv) { messager = processingEnv.getMessager(); messager.printMessage(Diagnostic.Kind.NOTE, "FlapProcessor init"); - Map options = processingEnv.getOptions(); - if (options.containsKey(KEY_OPTION_AUTO_REGISTER)) { - autoRegisterFactories = Boolean.parseBoolean(options.get(KEY_OPTION_AUTO_REGISTER)); - } +// Map options = processingEnv.getOptions(); +// if (options.containsKey(KEY_OPTION_AUTO_REGISTER)) { +// autoRegisterFactories = Boolean.parseBoolean(options.get(KEY_OPTION_AUTO_REGISTER)); +// } } @Override @@ -81,9 +81,10 @@ public boolean process(final Set set, final RoundEnvironm if (Proxy.class.getCanonicalName().equals(typeElement.getQualifiedName().toString())) { processComponent(roundEnvironment, typeElement); - } else if (AutoRegister.class.getCanonicalName().equals(typeElement.getQualifiedName().toString())) { - processComponentProxyManager(roundEnvironment, typeElement); } +// else if (AutoRegister.class.getCanonicalName().equals(typeElement.getQualifiedName().toString())) { +// processComponentProxyManager(roundEnvironment, typeElement); +// } } return true; @@ -126,9 +127,9 @@ private TypeSpec createComponentProxyTypeSpec(final RoundEnvironment roundEnviro String targetClassName = flapComponentElement.getSimpleName().toString() + NAME_SUFFIX; int layoutId = componentProxy.layoutId(); - boolean autoRegister = componentProxy.autoRegister(); +// boolean autoRegister = componentProxy.autoRegister(); - boolean dataBinding = componentProxy.useDataBinding(); + boolean useDataBinding = componentProxy.useDataBinding(); DeclaredType declaredType = flapComponentElement.getSuperclass().accept(new FlapItemModelVisitor(), null); List args = declaredType.getTypeArguments(); @@ -147,7 +148,7 @@ private TypeSpec createComponentProxyTypeSpec(final RoundEnvironment roundEnviro .addParameter(TypeName.INT, "layoutId") .returns(flapItemClass); - if (dataBinding) { + if (useDataBinding) { onCreateViewHolderMethodBuilder.addStatement("return new $T(androidx.databinding.DataBindingUtil.inflate(inflater,layoutId,parent,false))",flapItemClass); } else { onCreateViewHolderMethodBuilder.addStatement("return new $T(inflater.inflate(layoutId,parent,false))", flapItemClass); @@ -181,60 +182,60 @@ private TypeSpec createComponentProxyTypeSpec(final RoundEnvironment roundEnviro .addMethod(getComponentModelClass) .addSuperinterface(name); - if (autoRegister) { - builder.addAnnotation(AutoRegister.class); - } +// if (autoRegister) { +// builder.addAnnotation(AutoRegister.class); +// } return builder.build(); } - /** - * 处理 AutoRegister 注解,把需要自动注册的组件处理一下。 - * - * @param roundEnvironment - * @param typeElement - */ - private void processComponentProxyManager(final RoundEnvironment roundEnvironment, final TypeElement typeElement) { - - if (!autoRegisterFactories) { - return; - } - List factories = new ArrayList<>(); - - Set elements = roundEnvironment.getElementsAnnotatedWith(AutoRegister.class); - - for (final Element element : elements) { - TypeElement flapItemFactory = (TypeElement) element; - ClassName factoryClass = ClassName.get(flapItemFactory); - factories.add(factoryClass); - } - - TypeSpec manager = TypeSpec.classBuilder("ComponentAutoRegister") - .addModifiers(Modifier.PUBLIC, Modifier.FINAL) - .addAnnotation(CLASS_KEEP) - .addMethod(createInjectMethod(factories)) - .build(); - - try { - JavaFile.builder(PKG_NAME_MANAGER, manager).build().writeTo(filer); - } catch (IOException e) { - e.printStackTrace(); - } - - } - - private MethodSpec createInjectMethod(final List factories) { - - MethodSpec.Builder builder = MethodSpec.methodBuilder("inject") - .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) - .returns(void.class) - .addParameter(CLASS_FLAP, "flap", Modifier.FINAL); - - for (final ClassName factory : factories) { - builder.addStatement("flap.register(new $T())", factory); - } - - return builder.build(); - } +// /** +// * 处理 AutoRegister 注解,把需要自动注册的组件处理一下。 +// * +// * @param roundEnvironment +// * @param typeElement +// */ +// private void processComponentProxyManager(final RoundEnvironment roundEnvironment, final TypeElement typeElement) { +// +// if (!autoRegisterFactories) { +// return; +// } +// List factories = new ArrayList<>(); +// +// Set elements = roundEnvironment.getElementsAnnotatedWith(AutoRegister.class); +// +// for (final Element element : elements) { +// TypeElement flapItemFactory = (TypeElement) element; +// ClassName factoryClass = ClassName.get(flapItemFactory); +// factories.add(factoryClass); +// } +// +// TypeSpec manager = TypeSpec.classBuilder("ComponentAutoRegister") +// .addModifiers(Modifier.PUBLIC, Modifier.FINAL) +// .addAnnotation(CLASS_KEEP) +// .addMethod(createInjectMethod(factories)) +// .build(); +// +// try { +// JavaFile.builder(PKG_NAME_MANAGER, manager).build().writeTo(filer); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// +// } + +// private MethodSpec createInjectMethod(final List factories) { +// +// MethodSpec.Builder builder = MethodSpec.methodBuilder("inject") +// .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) +// .returns(void.class) +// .addParameter(CLASS_FLAP, "flap", Modifier.FINAL); +// +// for (final ClassName factory : factories) { +// builder.addStatement("flap.register(new $T())", factory); +// } +// +// return builder.build(); +// } @Override public SourceVersion getSupportedSourceVersion() { diff --git a/flap-gradle-plugin/build.gradle b/flap-gradle-plugin/build.gradle index 5b8bce32..03533da4 100644 --- a/flap-gradle-plugin/build.gradle +++ b/flap-gradle-plugin/build.gradle @@ -41,7 +41,7 @@ apply plugin: 'com.novoda.bintray-release' publish { userOrg = 'alancheen' groupId = 'me.yifeiyuan.flap' - artifactId = 'flap-plugin' + artifactId = 'plugin' publishVersion = '1.0.0' desc = 'flap plugin' website = 'https://github.com/AlanCheen/Flap' diff --git a/flap/build.gradle b/flap/build.gradle index 09a9786b..4f621320 100644 --- a/flap/build.gradle +++ b/flap/build.gradle @@ -33,7 +33,7 @@ dependencies { apply plugin: "guru.stefma.bintrayrelease" -version = "1.6.1" +version = "2.0.0" group = "me.yifeiyuan.flap" androidArtifact { artifactId = "flap" diff --git a/flap/src/main/java/me/yifeiyuan/flap/Flap.java b/flap/src/main/java/me/yifeiyuan/flap/Flap.java index 31107bb0..56261386 100644 --- a/flap/src/main/java/me/yifeiyuan/flap/Flap.java +++ b/flap/src/main/java/me/yifeiyuan/flap/Flap.java @@ -82,7 +82,7 @@ private Flap(int typeCount) { componentProxyMap = new HashMap<>(typeCount); viewTypeProxyMapping = new SparseArray<>(typeCount); registerFlowListener(new ComponentPerformanceMonitor()); - injectFactories(this); +// injectFactories(this); injectProxiesByPlugin(this); } @@ -90,22 +90,22 @@ private void injectProxiesByPlugin(@NonNull final Flap flap) { } - private void injectFactories(@NonNull final Flap flap) { - try { - Class flapItemFactoryManager = Class.forName("me.yifeiyuan.flap.apt.manager.ComponentAutoRegister"); - Method method = flapItemFactoryManager.getMethod("inject", Flap.class); - method.setAccessible(true); - method.invoke(null, flap); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } +// private void injectFactories(@NonNull final Flap flap) { +// try { +// Class flapItemFactoryManager = Class.forName("me.yifeiyuan.flap.apt.manager.ComponentAutoRegister"); +// Method method = flapItemFactoryManager.getMethod("inject", Flap.class); +// method.setAccessible(true); +// method.invoke(null, flap); +// } catch (ClassNotFoundException e) { +// e.printStackTrace(); +// } catch (NoSuchMethodException e) { +// e.printStackTrace(); +// } catch (IllegalAccessException e) { +// e.printStackTrace(); +// } catch (InvocationTargetException e) { +// e.printStackTrace(); +// } +// } @Override public ComponentRegistry register(@NonNull final ComponentProxy itemFactory) { diff --git a/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar b/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar index 6af6d6b1851ed5d724ef232e0c6e8a1488a3f418..4b48ed5343bbd5e49cdaf730ad887935135e0e65 100644 GIT binary patch delta 8473 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 iJ43`@?*T7OnAsWt diff --git a/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.md5 b/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.md5 index 25798d64..e68c914a 100644 --- a/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.md5 +++ b/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.md5 @@ -1 +1 @@ -9ea1347996f0f6a962e8a4a2ec54e519 \ No newline at end of file +e5bfaa2b944120cc505e61cc8b2433c5 \ No newline at end of file diff --git a/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.sha1 b/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.sha1 index e0457f57..10daf698 100644 --- a/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.sha1 +++ b/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.sha1 @@ -1 +1 @@ -331282feda3dae173ba7ed181ef04907263d5e4b \ No newline at end of file +6b0e89b4878cfdd798e6a4b46f2227b4e88de09f \ No newline at end of file diff --git a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml index b5426669..192a1af9 100644 --- a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml +++ b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml @@ -3,11 +3,12 @@ me.yifeiyuan.flap plugin - 1.0.0.1 + 1.0.0 1.0.0.0 1.0.0.1 + 1.0.0 - 20200909033301 + 20200909124031 diff --git a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.md5 b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.md5 index 19afcfc2..8e48361a 100644 --- a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.md5 +++ b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.md5 @@ -1 +1 @@ -e860f7be3bf66323b3b3381a52b8eda1 \ No newline at end of file +490f98604db3578c5de585230ec51476 \ No newline at end of file diff --git a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.sha1 b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.sha1 index 58685316..83af0aaf 100644 --- a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.sha1 +++ b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.sha1 @@ -1 +1 @@ -e56237410e3cc9280f28a3f1255159d0d5454840 \ No newline at end of file +cb77bf98b9f5fce17afa86647e86c8e789fddbfb \ No newline at end of file From 6f10486c02bebebec6710f408efa469c5b89ad7c Mon Sep 17 00:00:00 2001 From: Fitz Date: Wed, 9 Sep 2020 21:21:19 +0800 Subject: [PATCH 2/4] feat:prepare v2 --- .../me/yifeiyuan/flap/annotations/Proxy.java | 4 ++-- flap-gradle-plugin/build.gradle | 2 +- .../java/me/yifeiyuan/flap/plugin/Log.java | 10 ++++++++-- .../flap/plugin/1.0.0.1/plugin-1.0.0.1.jar | Bin 11327 -> 11417 bytes .../plugin/1.0.0.1/plugin-1.0.0.1.jar.md5 | 2 +- .../plugin/1.0.0.1/plugin-1.0.0.1.jar.sha1 | 2 +- .../yifeiyuan/flap/plugin/maven-metadata.xml | 4 ++-- .../flap/plugin/maven-metadata.xml.md5 | 2 +- .../flap/plugin/maven-metadata.xml.sha1 | 2 +- 9 files changed, 17 insertions(+), 11 deletions(-) diff --git a/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java b/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java index 4978260c..3b553362 100644 --- a/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java +++ b/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java @@ -18,7 +18,7 @@ public @interface Proxy { /** - * 组件的布局 ID + * 组件的布局 ID,也会被当做组件的 itemViewType * @return the layout res id * * @since 1.1.0 @@ -27,7 +27,7 @@ // /** // * -// * 废弃:从 1.6.2 开始修改成了 ASM+Plugin 的方式,默认会自动注册组件,即便设置为 false。 +// * 废弃:从 2.0.0 开始修改成了 ASM+Plugin 的方式,默认会自动注册组件,即便设置为 false。 // * // * 标记一个组件是否需要自动注册,如果为 true 会自动注册到 Flap // * diff --git a/flap-gradle-plugin/build.gradle b/flap-gradle-plugin/build.gradle index 03533da4..a8925309 100644 --- a/flap-gradle-plugin/build.gradle +++ b/flap-gradle-plugin/build.gradle @@ -42,7 +42,7 @@ publish { userOrg = 'alancheen' groupId = 'me.yifeiyuan.flap' artifactId = 'plugin' - publishVersion = '1.0.0' + publishVersion = '1.0.1' desc = 'flap plugin' website = 'https://github.com/AlanCheen/Flap' } \ No newline at end of file diff --git a/flap-gradle-plugin/src/main/java/me/yifeiyuan/flap/plugin/Log.java b/flap-gradle-plugin/src/main/java/me/yifeiyuan/flap/plugin/Log.java index 210608e4..3ede6ea7 100644 --- a/flap-gradle-plugin/src/main/java/me/yifeiyuan/flap/plugin/Log.java +++ b/flap-gradle-plugin/src/main/java/me/yifeiyuan/flap/plugin/Log.java @@ -10,12 +10,16 @@ class Log { private static Logger logger; + private static boolean debug = false; + static void setup(Project project) { logger = project.getLogger(); } static void i(String info) { - logger.info("FlapPlugin:" + info); + if (debug) { + logger.info("FlapPlugin:" + info); + } } static void println(Object obj) { @@ -23,6 +27,8 @@ static void println(Object obj) { } static void println(String msg) { - System.out.println("FlapPlugin: " + msg); + if (debug) { + System.out.println("FlapPlugin: " + msg); + } } } diff --git a/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar b/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar index 4b48ed5343bbd5e49cdaf730ad887935135e0e65..be1cac96e418eaaa1f95713a054ca30b453d6e4d 100644 GIT binary patch delta 1149 zcmdlVF*A}Uz?+$ci-CcIgW=MOi9G5|K+@D(_0kH>Kn5US0ueyK48*yq`pgU{%9m<` zlwUFcl9O2&%>_ZaI1kGPTn1`8%F4i?H1VP6WPU;R$rCg=>sy1f{VxYd)bZ`!^7@o( z-lK-tfD)gDaRCz*H8d89sm@dkeB7R=z4^vg-|MqJ1pkqAVsaF&Z?Hf0W8S(A8x@zm zth`-(?{mz#%m4m;ek|Tlnd2pKAV;V;KsISo0Z;uv^wAZ+tcR2VHU9u z9!HesYkEZ-N@hIG6edysXj$y)mwL`_Tkp;aD&D$krS`03jhcfSvbv;9L?n|!_rAF< zafAKVwv>pr?Pml|p3gCMx&CI=xeM#1ru{p%etPNmxnX9RX#rccXYE|OldYa#eeu2Y z#Rn&Zz23Dc{mqMG^VUb6>RV~qmHf-)l%-{&^Y@zeM4S67b5CzA|JoJ)Gu3AL8CHhC!?!l>ys|E|?cSv2q5E>O{50mC;5lu)mT$}U zr@@wjyZ2O!>BKBqTGia=AG2!4!-t-#x68GE?K-&7)yVdE`ALa`D;m^|<|Tz5Q{_1& zame8CQ@_U5`x3({D^8YL?OFTajacfMhcoMYo=1p(a5^SZ#AKGT=ZH4j&b9idrQ^8+ zQhk(<8x#gg@i5PAlW;q4pV#K%`~Av?-KUSunG-)r_fkySleYYJGt+1@Y^Gx>OuW!(i0bLk0(EJ6i^XYiQo zx6EF8$goO+Pasp#Bg9ci$mPD%#0hR{4kwkw7u7haM9jYB{zdxI?~Xq%Z~h8CYCfcR zgz0X(hm7+pM)!V}7quadWsg!+-8FREGDlT1pW@8c?ut%5;IzfH7JoH$!$ zuS-$KK0jv7Cb|4(|A%a!8XI2*Gs`<)$w^39BpscTxc#*MRQSLr$`q*fu|X3bl1d5<+HuY|I3P;BQ}3y*5&}_hRw=6$5=r0Yk?Mi5M8KnmKj7l zs61o>(vy|d%|KMNdLM{-t!@gUlr$VbREmZ^h?=Tl38F4&*nubkO;=u&>@_(_(^&x| zGUKC^-xGEQhBy2S4BFt#3L%y>y0A=cR8XJ%MpFoA!Xzyjra~T|fX3u#9?8k^T09_Q zbAh6kfAws$E7=JyPsnKmfq?Nkf{I*L*PRI delta 1064 zcmbOkxj%v@z?+$ci-CcIgTb$OB9A%~kTmsH^()p4WB>vt5CH_tK%ASZ&&+_Le5p1_ z`6UA&IhlpgTo9y-c|rQyN}x7tRt5&8i4R35zgJ+d_sLJ!OU_9wE^eKi8+_S8;P`)c z?##;?5pudqMdY1DA2Dl1xv;t(KdE6{I^$!iSAT`itdvVfB<-eIFgKt3!T2YjuR2qJ zW9yz1cT?Z*-+y=S-rs+pAJ=E_u2`KUQN{Rq#nVE`a*;cs6ID-DlX!yn;jK1F?pG?Yg6lZK zC5?Xl5pyoPn_bwJ7`)?;^Od|$4<=tNIT2*CH}~|-O-zdag_F(xC|U7{Za&*}7uIJQusSys-??(mj*=hBTol>ID=n7&bT|L?;F^~aS3>X3g~H%_^0WURO5gMBUF7qW$=hzp&UVbL2;6Yi zyhX>>eX6e4$~Gl8QJc#F$Gh4DV-jchsBaMCT&^k|bYsEcn?2{-Z00409_HQ?^1My%hnu=Q-6|sb7M!A#QRGv?x}&@oF~?n z*-m{_IREz&i(AaiTDAuhtEOM6y%`n7d&yl^{j|hdo>?=uT;n^q?_v_eV-vok$874= zGOp}m@=5A?CbMqQ6bpUzb6IaWn0f9`v{YPS(%kf1^AD%%QIk`KscchQKFQ6jSih(L zjDL!~e9{Js5{9L2_Zf@aPw*?8)fGzrBC_3Q`+BM3=LNbC_j&JFTD#)-9jEE51-~;) zzjTFjRqiK|tu3#2ObpN#51xAOicsM4^8xwCb_yHa>6*IzKNE7|-5kK8%>hifn`?QF zv4Ch-!4`fHeOloxGl-t0@{kEgPp(xr15sPm`#_YdhAD`u(Qp7!`!w`H)O!s}5T&JQ z2cohxU3pP*!sI=g&L9a!Eg7a)%##yXbSL|0@qk34fFj~NKoRxH^R?6zK)TF6zP@Y2 z&%m%;k%2)6ocAEalE(W2K!wtiwB$pwNelTWJf xXa{&RGKnz5ayM#@mVlcr!0^^leDZ&7P~M-cp(DfS59CNsPS7!CyQ>aT1pvJZq7?uD diff --git a/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.md5 b/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.md5 index e68c914a..5dcf7523 100644 --- a/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.md5 +++ b/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.md5 @@ -1 +1 @@ -e5bfaa2b944120cc505e61cc8b2433c5 \ No newline at end of file +1b2c3f8ddc1e4292b769f6733ffc77b4 \ No newline at end of file diff --git a/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.sha1 b/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.sha1 index 10daf698..a5a29444 100644 --- a/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.sha1 +++ b/repos/me/yifeiyuan/flap/plugin/1.0.0.1/plugin-1.0.0.1.jar.sha1 @@ -1 +1 @@ -6b0e89b4878cfdd798e6a4b46f2227b4e88de09f \ No newline at end of file +6b9a6e7e843cb5a10c8fab952902e7bf6c7a225a \ No newline at end of file diff --git a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml index 192a1af9..9abe63df 100644 --- a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml +++ b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml @@ -3,12 +3,12 @@ me.yifeiyuan.flap plugin - 1.0.0 + 1.0.0.1 1.0.0.0 1.0.0.1 1.0.0 - 20200909124031 + 20200909130636 diff --git a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.md5 b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.md5 index 8e48361a..7cf87f33 100644 --- a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.md5 +++ b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.md5 @@ -1 +1 @@ -490f98604db3578c5de585230ec51476 \ No newline at end of file +58d0d446feb56e35c812b3b4fe87a10d \ No newline at end of file diff --git a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.sha1 b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.sha1 index 83af0aaf..2a0d1be5 100644 --- a/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.sha1 +++ b/repos/me/yifeiyuan/flap/plugin/maven-metadata.xml.sha1 @@ -1 +1 @@ -cb77bf98b9f5fce17afa86647e86c8e789fddbfb \ No newline at end of file +3bc50122a259f75517be3a135a8198700bb88c87 \ No newline at end of file From 0835301fa735ffb694734a74c06f5b035efec877 Mon Sep 17 00:00:00 2001 From: Fitz Date: Fri, 18 Sep 2020 16:48:52 +0800 Subject: [PATCH 3/4] feat:remove unused code --- .../flap/annotations/AutoRegister.java | 17 ---- .../me/yifeiyuan/flap/annotations/Proxy.java | 18 +---- .../flap/compiler/FlapProcessor.java | 77 +------------------ flap-gradle-plugin/build.gradle | 2 +- 4 files changed, 5 insertions(+), 109 deletions(-) delete mode 100644 flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/AutoRegister.java diff --git a/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/AutoRegister.java b/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/AutoRegister.java deleted file mode 100644 index 36a194c2..00000000 --- a/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/AutoRegister.java +++ /dev/null @@ -1,17 +0,0 @@ -package me.yifeiyuan.flap.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 标记自动注册组件 - * @author 程序亦非猿 - * @since 2019-03-26 - */ -@Retention(RetentionPolicy.SOURCE) -@Target(ElementType.TYPE) -@Deprecated -public @interface AutoRegister { -} diff --git a/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java b/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java index 3b553362..645d0686 100644 --- a/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java +++ b/flap-annotations/src/main/java/me/yifeiyuan/flap/annotations/Proxy.java @@ -7,7 +7,7 @@ /** * 标记一个类为组件,并配置组件的一些基本信息。 - * + *

* 被 @Proxy 标记的组件,会生成一个 Proxy 类,并被自动注册到 Flap 中。 * * @author 程序亦非猿 @@ -19,30 +19,16 @@ /** * 组件的布局 ID,也会被当做组件的 itemViewType - * @return the layout res id * + * @return the layout res id * @since 1.1.0 */ int layoutId() default -1; -// /** -// * -// * 废弃:从 2.0.0 开始修改成了 ASM+Plugin 的方式,默认会自动注册组件,即便设置为 false。 -// * -// * 标记一个组件是否需要自动注册,如果为 true 会自动注册到 Flap -// * -// * @return true then Flap will auto register this component. -// * -// * @since 1.1.0 -// */ -// @Deprecated -// boolean autoRegister() default true; - /** * 是否使用 DataBinding,假如使用 DataBinding,那么组件的构造方法需要做一定的修改 * * @return 如果要使用 DataBinding 则设置 true - * * @since 1.5.1 */ boolean useDataBinding() default false; diff --git a/flap-compiler/src/main/java/me/yifeiyuan/flap/compiler/FlapProcessor.java b/flap-compiler/src/main/java/me/yifeiyuan/flap/compiler/FlapProcessor.java index d58ed7e2..e3f3c0d4 100644 --- a/flap-compiler/src/main/java/me/yifeiyuan/flap/compiler/FlapProcessor.java +++ b/flap-compiler/src/main/java/me/yifeiyuan/flap/compiler/FlapProcessor.java @@ -9,10 +9,8 @@ import com.squareup.javapoet.TypeSpec; import java.io.IOException; -import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; import java.util.Set; import javax.annotation.processing.AbstractProcessor; @@ -32,14 +30,12 @@ import javax.lang.model.util.Types; import javax.tools.Diagnostic; -import me.yifeiyuan.flap.annotations.AutoRegister; import me.yifeiyuan.flap.annotations.Proxy; @AutoService(Processor.class) public class FlapProcessor extends AbstractProcessor { private static final String PKG_NAME_PROXIES = "me.yifeiyuan.flap.apt.proxies"; - private static final String PKG_NAME_MANAGER = "me.yifeiyuan.flap.apt.manager"; private static final String NAME_SUFFIX = "Proxy"; @@ -47,18 +43,11 @@ public class FlapProcessor extends AbstractProcessor { private final ClassName CLASS_FLAP = ClassName.bestGuess("me.yifeiyuan.flap.Flap"); private final ClassName CLASS_COMPONENT_PROXY = ClassName.bestGuess("me.yifeiyuan.flap.internal.ComponentProxy"); -// private static final String KEY_OPTION_AUTO_REGISTER = "autoRegister"; - private Filer filer; private Elements elements; private Types types; private Messager messager; - /** - * 是否自动注册 Factories - */ -// private boolean autoRegisterFactories = true; - @Override public synchronized void init(final ProcessingEnvironment processingEnv) { super.init(processingEnv); @@ -67,11 +56,6 @@ public synchronized void init(final ProcessingEnvironment processingEnv) { elements = processingEnv.getElementUtils(); // Get class meta. messager = processingEnv.getMessager(); messager.printMessage(Diagnostic.Kind.NOTE, "FlapProcessor init"); - -// Map options = processingEnv.getOptions(); -// if (options.containsKey(KEY_OPTION_AUTO_REGISTER)) { -// autoRegisterFactories = Boolean.parseBoolean(options.get(KEY_OPTION_AUTO_REGISTER)); -// } } @Override @@ -82,9 +66,7 @@ public boolean process(final Set set, final RoundEnvironm if (Proxy.class.getCanonicalName().equals(typeElement.getQualifiedName().toString())) { processComponent(roundEnvironment, typeElement); } -// else if (AutoRegister.class.getCanonicalName().equals(typeElement.getQualifiedName().toString())) { -// processComponentProxyManager(roundEnvironment, typeElement); -// } + } return true; @@ -116,7 +98,6 @@ private void processComponent(final RoundEnvironment roundEnvironment, final Typ * @param typeElement @Component * @param flapComponentElement 被 FlapComponent 注解了的那个类 * @param componentProxy 注解了目标类的 注解,可以获取值 - * * @return ComponentProxy TypeSpec */ private TypeSpec createComponentProxyTypeSpec(final RoundEnvironment roundEnvironment, final TypeElement typeElement, final TypeElement flapComponentElement, final Proxy componentProxy) { @@ -127,7 +108,6 @@ private TypeSpec createComponentProxyTypeSpec(final RoundEnvironment roundEnviro String targetClassName = flapComponentElement.getSimpleName().toString() + NAME_SUFFIX; int layoutId = componentProxy.layoutId(); -// boolean autoRegister = componentProxy.autoRegister(); boolean useDataBinding = componentProxy.useDataBinding(); @@ -149,7 +129,7 @@ private TypeSpec createComponentProxyTypeSpec(final RoundEnvironment roundEnviro .returns(flapItemClass); if (useDataBinding) { - onCreateViewHolderMethodBuilder.addStatement("return new $T(androidx.databinding.DataBindingUtil.inflate(inflater,layoutId,parent,false))",flapItemClass); + onCreateViewHolderMethodBuilder.addStatement("return new $T(androidx.databinding.DataBindingUtil.inflate(inflater,layoutId,parent,false))", flapItemClass); } else { onCreateViewHolderMethodBuilder.addStatement("return new $T(inflater.inflate(layoutId,parent,false))", flapItemClass); } @@ -182,61 +162,9 @@ private TypeSpec createComponentProxyTypeSpec(final RoundEnvironment roundEnviro .addMethod(getComponentModelClass) .addSuperinterface(name); -// if (autoRegister) { -// builder.addAnnotation(AutoRegister.class); -// } return builder.build(); } -// /** -// * 处理 AutoRegister 注解,把需要自动注册的组件处理一下。 -// * -// * @param roundEnvironment -// * @param typeElement -// */ -// private void processComponentProxyManager(final RoundEnvironment roundEnvironment, final TypeElement typeElement) { -// -// if (!autoRegisterFactories) { -// return; -// } -// List factories = new ArrayList<>(); -// -// Set elements = roundEnvironment.getElementsAnnotatedWith(AutoRegister.class); -// -// for (final Element element : elements) { -// TypeElement flapItemFactory = (TypeElement) element; -// ClassName factoryClass = ClassName.get(flapItemFactory); -// factories.add(factoryClass); -// } -// -// TypeSpec manager = TypeSpec.classBuilder("ComponentAutoRegister") -// .addModifiers(Modifier.PUBLIC, Modifier.FINAL) -// .addAnnotation(CLASS_KEEP) -// .addMethod(createInjectMethod(factories)) -// .build(); -// -// try { -// JavaFile.builder(PKG_NAME_MANAGER, manager).build().writeTo(filer); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// -// } - -// private MethodSpec createInjectMethod(final List factories) { -// -// MethodSpec.Builder builder = MethodSpec.methodBuilder("inject") -// .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) -// .returns(void.class) -// .addParameter(CLASS_FLAP, "flap", Modifier.FINAL); -// -// for (final ClassName factory : factories) { -// builder.addStatement("flap.register(new $T())", factory); -// } -// -// return builder.build(); -// } - @Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latestSupported(); @@ -246,7 +174,6 @@ public SourceVersion getSupportedSourceVersion() { public Set getSupportedAnnotationTypes() { Set annotationTypes = new LinkedHashSet<>(); annotationTypes.add(Proxy.class.getCanonicalName()); - annotationTypes.add(AutoRegister.class.getCanonicalName()); return annotationTypes; } diff --git a/flap-gradle-plugin/build.gradle b/flap-gradle-plugin/build.gradle index a8925309..ac0db94b 100644 --- a/flap-gradle-plugin/build.gradle +++ b/flap-gradle-plugin/build.gradle @@ -41,7 +41,7 @@ apply plugin: 'com.novoda.bintray-release' publish { userOrg = 'alancheen' groupId = 'me.yifeiyuan.flap' - artifactId = 'plugin' + artifactId = 'flap-plugin' publishVersion = '1.0.1' desc = 'flap plugin' website = 'https://github.com/AlanCheen/Flap' From 24779e6d6f3d829396a308b58e328a210938366c Mon Sep 17 00:00:00 2001 From: Fitz Date: Fri, 18 Sep 2020 19:11:02 +0800 Subject: [PATCH 4/4] update readme --- README.md | 48 ++++++++++++++++++++++++--------- flap-gradle-plugin/build.gradle | 2 +- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index bff9a114..5dd997bb 100644 --- a/README.md +++ b/README.md @@ -23,15 +23,16 @@ ### 集成 Flap -添加 `Flap` 的各个模块的最新版本到你的依赖: +1)添加 `Flap` 的各个模块的最新版本到你的依赖: ```groovy -dependencies { - implementation 'me.yifeiyuan.flap:flap:$lastest_version' - - implementation 'me.yifeiyuan.flap:flap-annotations:$lastest_version' - - annotationProcessor 'me.yifeiyuan.flap:flap-compiler:$lastest_version' +dependencies { + //recyclerview + implementation 'androidx.recyclerview:recyclerview:1.1.0' + + implementation "me.yifeiyuan.flap:flap:$lastest_version" + implementation "me.yifeiyuan.flap:flap-annotations:$lastest_version" + annotationProcessor "me.yifeiyuan.flap:flap-compiler:$lastest_version" } ``` @@ -44,14 +45,34 @@ dependencies { apply plugin: 'kotlin-kapt' dependencies { - implementation 'me.yifeiyuan.flap:flap:$lastest_version' - implementation 'me.yifeiyuan.flap:flap-annotations:$lastest_version' - kapt 'me.yifeiyuan.flap:flap-compiler:$lastest_version' - + implementation "me.yifeiyuan.flap:flap:$lastest_version" + implementation "me.yifeiyuan.flap:flap-annotations:$lastest_version" + kapt "me.yifeiyuan.flap:flap-compiler:$lastest_version" } ``` +2) 添加 flap-plugin +在你的项目 build.gradle 添加插件的 classpath : +``` +buildscript { + ext.kotlin_version = "1.4.0" + repositories { + google() + jcenter() + } + dependencies { + //添加插件 + classpath "me.yifeiyuan.flap:plugin:$lastest_version" + } +} + +``` + +在 app/build.gradle 中应用插件: +``` +apply plugin: 'me.yifeiyuan.flap.plugin' +``` ### Flap 基本使用教程 @@ -96,6 +117,7 @@ public class SimpleTextComponent extends Component { } ``` +注意:目前只能在 App 模块下使用,而在 Library 类型的 Module 中不能使用,因为使用了 R 文件,所以需要像 ButterKnife 那样针对 Module 做处理。 #### Step 3 : 创建你的 `FlapAdapter` 并设置 data @@ -239,12 +261,12 @@ protected final V findViewById(@IdRes int viewId) ## TODO +- [ ] P0 , 针对 Library 类型的 Module 处理,让 Flap 也能工作; - [ ] 【P2】Kotlin 改造; -- [ ] 【P1】迁移 AndroidX; - [ ] 【P1】做一个 FlapRecyclerView 封装 FlapAdapter,进一步降低使用成本; +- [x] 支持 gradle plugin 实现组件的自动注册; - [x] AndroidX 迁移; - [x] Component 注解支持使用 DataBinding; -- [x] APT 实现组件自动注册; - [x] 使用 APT 自动生成 Component 相关样板代码; - [x] 支持组件全局缓存; - [x] 支持组件监听生命周期事件,Lifecycle 接入; diff --git a/flap-gradle-plugin/build.gradle b/flap-gradle-plugin/build.gradle index ac0db94b..a8925309 100644 --- a/flap-gradle-plugin/build.gradle +++ b/flap-gradle-plugin/build.gradle @@ -41,7 +41,7 @@ apply plugin: 'com.novoda.bintray-release' publish { userOrg = 'alancheen' groupId = 'me.yifeiyuan.flap' - artifactId = 'flap-plugin' + artifactId = 'plugin' publishVersion = '1.0.1' desc = 'flap plugin' website = 'https://github.com/AlanCheen/Flap'