From 739d2abc04705f33029a0551362c57fc79338d33 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 24 May 2016 15:20:04 +0200 Subject: [PATCH 1/6] Prepare annotation plugin --- annotation/.gitignore | 1 + annotation/annotation.iml | 32 +++ annotation/build.gradle | 20 ++ .../annotation/DataBindable.java | 8 + build.gradle | 2 +- lib/build.gradle | 1 - lib/lib.iml | 122 +++++++++- .../activity/ActivityBase.java | 6 +- .../fragment/FragmentBase.java | 6 +- plugin/.gitignore | 1 + plugin/build.gradle | 35 +++ plugin/plugin.iml | 225 ++++++++++++++++++ .../plugin/ByteManipulationPlugin.java | 27 +++ .../plugin/ClassTransformer.java | 54 +++++ ...ydatabinding.plugin.test-plugin.properties | 1 + .../gradle-plugins/test-plugin.properties | 1 + sample/build.gradle | 2 + sample/sample.iml | 122 +++++++++- sample/src/main/AndroidManifest.xml | 11 +- .../sample/annotations/Test.java | 15 -- .../sample/annotations/TestExample.java | 30 --- .../sample/annotations/TesterInfo.java | 24 -- settings.gradle | 2 +- 23 files changed, 663 insertions(+), 85 deletions(-) create mode 100644 annotation/.gitignore create mode 100644 annotation/annotation.iml create mode 100644 annotation/build.gradle create mode 100644 annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java create mode 100644 plugin/.gitignore create mode 100644 plugin/build.gradle create mode 100644 plugin/plugin.iml create mode 100644 plugin/src/main/java/com/joxad/easydatabinding/plugin/ByteManipulationPlugin.java create mode 100644 plugin/src/main/java/com/joxad/easydatabinding/plugin/ClassTransformer.java create mode 100644 plugin/src/main/resources/META-INF/gradle-plugins/com.joxad.easydatabinding.plugin.test-plugin.properties create mode 100644 plugin/src/main/resources/META-INF/gradle-plugins/test-plugin.properties delete mode 100644 sample/src/main/java/joxad/easydatabinding/sample/annotations/Test.java delete mode 100644 sample/src/main/java/joxad/easydatabinding/sample/annotations/TestExample.java delete mode 100644 sample/src/main/java/joxad/easydatabinding/sample/annotations/TesterInfo.java diff --git a/annotation/.gitignore b/annotation/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/annotation/.gitignore @@ -0,0 +1 @@ +/build diff --git a/annotation/annotation.iml b/annotation/annotation.iml new file mode 100644 index 0000000..af786c3 --- /dev/null +++ b/annotation/annotation.iml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/annotation/build.gradle b/annotation/build.gradle new file mode 100644 index 0000000..daaffef --- /dev/null +++ b/annotation/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'java' + +apply plugin: 'maven' + +// This is important for publishing, even if Android Studio claims it isn't +// used. Android can't interpret Java 8 byte code. +sourceCompatibility = JavaVersion.VERSION_1_7 +targetCompatibility = JavaVersion.VERSION_1_7 + +group = 'com.joxad.easydatabinding' +version = '1.0-SNAPSHOT' +// The following code is optional. If you don't specify this, the repository location +// will be something like "/Users/brianattwell/.m2/repositories/". +uploadArchives { + repositories { + mavenDeployer { + repository(url: uri('../repo')) + } + } +} diff --git a/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java b/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java new file mode 100644 index 0000000..8f688c9 --- /dev/null +++ b/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java @@ -0,0 +1,8 @@ +package com.joxad.easydatabinding.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(value = ElementType.TYPE) +public @interface DataBindable { +} diff --git a/build.gradle b/build.gradle index 2d3b9c8..8d7f989 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:2.1.0' - + classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' } diff --git a/lib/build.gradle b/lib/build.gradle index 1c2f2cc..3b9d4b1 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -25,6 +25,5 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile libs.appCompat - provided libs.lombok } apply from: '../gradle/tasks/bintray_upload.gradle' diff --git a/lib/lib.iml b/lib/lib.iml index 19dbd15..cb07f83 100644 --- a/lib/lib.iml +++ b/lib/lib.iml @@ -1,6 +1,124 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java b/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java index 73d2f77..1b96714 100644 --- a/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java +++ b/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java @@ -9,8 +9,6 @@ import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; -import lombok.Getter; - /** * {@link ActivityBase} will allow you to generate a basic activity that put your view model {@link B} and its {@link VM} */ @@ -19,12 +17,12 @@ public abstract class ActivityBase + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugin/src/main/java/com/joxad/easydatabinding/plugin/ByteManipulationPlugin.java b/plugin/src/main/java/com/joxad/easydatabinding/plugin/ByteManipulationPlugin.java new file mode 100644 index 0000000..2c15450 --- /dev/null +++ b/plugin/src/main/java/com/joxad/easydatabinding/plugin/ByteManipulationPlugin.java @@ -0,0 +1,27 @@ +package com.joxad.easydatabinding.plugin; + +import com.github.stephanenicolas.morpheus.AbstractMorpheusPlugin; + +import org.gradle.api.Project; + +import javassist.build.IClassTransformer; + +/** + * Java class that we export via META-INF. This is the plugin's entry point. + */ +public class ByteManipulationPlugin extends AbstractMorpheusPlugin { + @Override + protected Class getPluginExtension() { + return null; + } + + @Override + protected String getExtension() { + return null; + } + + @Override + public IClassTransformer[] getTransformers(Project project) { + return new IClassTransformer[]{new ClassTransformer()}; + } +} diff --git a/plugin/src/main/java/com/joxad/easydatabinding/plugin/ClassTransformer.java b/plugin/src/main/java/com/joxad/easydatabinding/plugin/ClassTransformer.java new file mode 100644 index 0000000..c13ae65 --- /dev/null +++ b/plugin/src/main/java/com/joxad/easydatabinding/plugin/ClassTransformer.java @@ -0,0 +1,54 @@ +package com.joxad.easydatabinding.plugin; + +import com.joxad.easydatabinding.annotation.DataBindable; + +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import javassist.NotFoundException; +import javassist.build.IClassTransformer; +import javassist.build.JavassistBuildException; +import static com.github.stephanenicolas.morpheus.commons.JavassistUtils.isActivity; + +public class ClassTransformer implements IClassTransformer { + + @Override + public void applyTransformations(CtClass ctClass) throws JavassistBuildException { + System.out.println(":plugin:applyTransformations on " + ctClass.getName()); + try { + CtMethod[] methods = getOnCreateMethod(ctClass); + for (CtMethod method : methods) { + method.insertAfter("android.util.Log.d(\"MOO\", \"I am inserted code!\");"); + } + } catch (Exception e) { + throw new JavassistBuildException(e); + } + } + + @Override + public boolean shouldTransform(CtClass candidateClass) throws JavassistBuildException { + try { + return candidateClass.hasAnnotation(DataBindable.class) + && isAnActivity(candidateClass); + } catch (Exception e) { + throw new JavassistBuildException(e); + } + } + + private static boolean isAnActivity(CtClass candidateClass) throws NotFoundException { + // TODO: handle support activity + return isActivity(candidateClass); + } + + private CtMethod[] getOnCreateMethod(CtClass ctClass) + throws NotFoundException { + String className = ctClass.getName(); + ClassPool pool = ctClass.getClassPool(); + + CtMethod c1 = pool.get(className).getMethod("onCreate", + "(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V"); + CtMethod c2 = pool.get(className).getMethod("onCreate", + "(Landroid/os/Bundle;)V"); + return new CtMethod[] {c1, c2}; + } +} \ No newline at end of file diff --git a/plugin/src/main/resources/META-INF/gradle-plugins/com.joxad.easydatabinding.plugin.test-plugin.properties b/plugin/src/main/resources/META-INF/gradle-plugins/com.joxad.easydatabinding.plugin.test-plugin.properties new file mode 100644 index 0000000..ca4a245 --- /dev/null +++ b/plugin/src/main/resources/META-INF/gradle-plugins/com.joxad.easydatabinding.plugin.test-plugin.properties @@ -0,0 +1 @@ +implementation-class=com.joxad.easydatabinding.plugin.ByteManipulationPlugin \ No newline at end of file diff --git a/plugin/src/main/resources/META-INF/gradle-plugins/test-plugin.properties b/plugin/src/main/resources/META-INF/gradle-plugins/test-plugin.properties new file mode 100644 index 0000000..ca4a245 --- /dev/null +++ b/plugin/src/main/resources/META-INF/gradle-plugins/test-plugin.properties @@ -0,0 +1 @@ +implementation-class=com.joxad.easydatabinding.plugin.ByteManipulationPlugin \ No newline at end of file diff --git a/sample/build.gradle b/sample/build.gradle index 968de8c..32796b6 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'com.android.application' +apply plugin: 'android-apt' android { compileSdkVersion 23 @@ -27,4 +28,5 @@ dependencies { compile libs.recyclerViewDataBinding compile libs.recyclerViewAdapter + } diff --git a/sample/sample.iml b/sample/sample.iml index 19dbd15..14630c6 100644 --- a/sample/sample.iml +++ b/sample/sample.iml @@ -1,6 +1,124 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 3349a54..f5ee70e 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -4,7 +4,16 @@ + android:supportsRtl="true" + android:theme="@style/AppTheme"> + + + + + + + + \ No newline at end of file diff --git a/sample/src/main/java/joxad/easydatabinding/sample/annotations/Test.java b/sample/src/main/java/joxad/easydatabinding/sample/annotations/Test.java deleted file mode 100644 index 0e4dc69..0000000 --- a/sample/src/main/java/joxad/easydatabinding/sample/annotations/Test.java +++ /dev/null @@ -1,15 +0,0 @@ -package joxad.easydatabinding.sample.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) //can use in method only. -public @interface Test { - - //should ignore this test? - public boolean enabled() default true; - -} \ No newline at end of file diff --git a/sample/src/main/java/joxad/easydatabinding/sample/annotations/TestExample.java b/sample/src/main/java/joxad/easydatabinding/sample/annotations/TestExample.java deleted file mode 100644 index e6ad9c1..0000000 --- a/sample/src/main/java/joxad/easydatabinding/sample/annotations/TestExample.java +++ /dev/null @@ -1,30 +0,0 @@ -package joxad.easydatabinding.sample.annotations; - - -@TesterInfo( - priority = TesterInfo.Priority.HIGH, - createdBy = "mkyong.com", - tags = {"sales","test" } -) -public class TestExample { - - @Test - void testA() { - if (true) - throw new RuntimeException("This test always failed"); - } - - @Test(enabled = false) - void testB() { - if (false) - throw new RuntimeException("This test always passed"); - } - - @Test(enabled = true) - void testC() { - if (10 > 1) { - // do nothing, this test always passed. - } - } - -} diff --git a/sample/src/main/java/joxad/easydatabinding/sample/annotations/TesterInfo.java b/sample/src/main/java/joxad/easydatabinding/sample/annotations/TesterInfo.java deleted file mode 100644 index 54da6d2..0000000 --- a/sample/src/main/java/joxad/easydatabinding/sample/annotations/TesterInfo.java +++ /dev/null @@ -1,24 +0,0 @@ -package joxad.easydatabinding.sample.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) //on class level -public @interface TesterInfo { - - public enum Priority { - LOW, MEDIUM, HIGH - } - - Priority priority() default Priority.MEDIUM; - - String[] tags() default ""; - - String createdBy() default "Mkyong"; - - String lastModified() default "03/01/2014"; - -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 47470a4..1a4a75a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':lib', ':sample' +include ':lib', ':sample', ':annotation', ':plugin' From a5a4cf36c92f87285448900d802259673db8bba6 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 24 May 2016 15:26:40 +0200 Subject: [PATCH 2/6] Add test actiivty --- lib/lib.iml | 18 ++++++++------- plugin/plugin.iml | 1 + sample/build.gradle | 22 +++++++++++++++++++ sample/sample.iml | 5 ++++- sample/src/main/AndroidManifest.xml | 6 +++++ .../sample/ActivitySample.java | 16 ++++++++++++++ 6 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 sample/src/main/java/joxad/easydatabinding/sample/ActivitySample.java diff --git a/lib/lib.iml b/lib/lib.iml index cb07f83..93f3017 100644 --- a/lib/lib.iml +++ b/lib/lib.iml @@ -64,14 +64,6 @@ - - - - - - - - @@ -80,6 +72,14 @@ + + + + + + + + @@ -103,6 +103,8 @@ + + diff --git a/plugin/plugin.iml b/plugin/plugin.iml index 207a5f8..4864a10 100644 --- a/plugin/plugin.iml +++ b/plugin/plugin.iml @@ -221,5 +221,6 @@ + \ No newline at end of file diff --git a/sample/build.gradle b/sample/build.gradle index 32796b6..d4adf38 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -25,8 +25,30 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile project(':lib') + compile project(':annotation') compile libs.recyclerViewDataBinding compile libs.recyclerViewAdapter } + + +// Import the custom gradle plugin. Note that we import it as a build dependency. Not +// as a compilation dependency. FYI: You must execute "$ ./gradlew uploadArchives" at +// least once before the following dependencies will work. + +buildscript { + repositories { + maven { + url uri('../repo') + } + jcenter() // Needed for plugin's dependencies + } + dependencies { + classpath group: 'com.joxad.easydatabinding', + name: 'plugin', + version: '1.0-SNAPSHOT' + + } +} + diff --git a/sample/sample.iml b/sample/sample.iml index 14630c6..dfa665d 100644 --- a/sample/sample.iml +++ b/sample/sample.iml @@ -34,13 +34,13 @@ + - @@ -101,7 +101,9 @@ + + @@ -120,5 +122,6 @@ + \ No newline at end of file diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index f5ee70e..c9165db 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -7,7 +7,13 @@ android:supportsRtl="true" android:theme="@style/AppTheme"> + + + + + + diff --git a/sample/src/main/java/joxad/easydatabinding/sample/ActivitySample.java b/sample/src/main/java/joxad/easydatabinding/sample/ActivitySample.java new file mode 100644 index 0000000..6277eea --- /dev/null +++ b/sample/src/main/java/joxad/easydatabinding/sample/ActivitySample.java @@ -0,0 +1,16 @@ +package joxad.easydatabinding.sample; + +import android.app.Activity; +import android.os.Bundle; + +/** + * Created by josh on 24/05/16. + */ +public class ActivitySample extends Activity { + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } +} From f86c352555b265e85dba5059d05e3ac208a1805a Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 24 May 2016 18:08:41 +0200 Subject: [PATCH 3/6] Test to add annotation with processor --- .../annotation/DataBindable.java | 2 +- {plugin => compiler}/.gitignore | 0 compiler/build.gradle | 10 + compiler/compiler.iml | 36 +++ .../compiler/AnnotatedClass.java | 22 ++ .../compiler/ClassValidator.java | 15 ++ .../compiler/CodeGenerator.java | 46 ++++ .../compiler/DataBindableProcessor.java | 121 ++++++++++ .../compiler/NoPackageNameException.java | 10 + .../joxad/easydatabinding/compiler/Utils.java | 21 ++ lib/lib.iml | 20 +- plugin/build.gradle | 35 --- plugin/plugin.iml | 226 ------------------ .../plugin/ByteManipulationPlugin.java | 27 --- .../plugin/ClassTransformer.java | 54 ----- ...ydatabinding.plugin.test-plugin.properties | 1 - .../gradle-plugins/test-plugin.properties | 1 - sample/build.gradle | 23 +- sample/sample.iml | 20 +- settings.gradle | 2 +- 20 files changed, 304 insertions(+), 388 deletions(-) rename {plugin => compiler}/.gitignore (100%) create mode 100644 compiler/build.gradle create mode 100644 compiler/compiler.iml create mode 100644 compiler/src/main/java/com/joxad/easydatabinding/compiler/AnnotatedClass.java create mode 100644 compiler/src/main/java/com/joxad/easydatabinding/compiler/ClassValidator.java create mode 100644 compiler/src/main/java/com/joxad/easydatabinding/compiler/CodeGenerator.java create mode 100644 compiler/src/main/java/com/joxad/easydatabinding/compiler/DataBindableProcessor.java create mode 100644 compiler/src/main/java/com/joxad/easydatabinding/compiler/NoPackageNameException.java create mode 100644 compiler/src/main/java/com/joxad/easydatabinding/compiler/Utils.java delete mode 100644 plugin/build.gradle delete mode 100644 plugin/plugin.iml delete mode 100644 plugin/src/main/java/com/joxad/easydatabinding/plugin/ByteManipulationPlugin.java delete mode 100644 plugin/src/main/java/com/joxad/easydatabinding/plugin/ClassTransformer.java delete mode 100644 plugin/src/main/resources/META-INF/gradle-plugins/com.joxad.easydatabinding.plugin.test-plugin.properties delete mode 100644 plugin/src/main/resources/META-INF/gradle-plugins/test-plugin.properties diff --git a/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java b/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java index 8f688c9..05f6c1f 100644 --- a/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java +++ b/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java @@ -3,6 +3,6 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Target; -@Target(value = ElementType.TYPE) +@Target(value = ElementType.FIELD) public @interface DataBindable { } diff --git a/plugin/.gitignore b/compiler/.gitignore similarity index 100% rename from plugin/.gitignore rename to compiler/.gitignore diff --git a/compiler/build.gradle b/compiler/build.gradle new file mode 100644 index 0000000..6ece946 --- /dev/null +++ b/compiler/build.gradle @@ -0,0 +1,10 @@ +apply plugin: 'java' + +sourceCompatibility = JavaVersion.VERSION_1_7 +targetCompatibility = JavaVersion.VERSION_1_7 + +dependencies { + compile project (':annotation') + compile 'com.google.auto.service:auto-service:1.0-rc2' + compile 'com.squareup:javapoet:1.0.0' +} \ No newline at end of file diff --git a/compiler/compiler.iml b/compiler/compiler.iml new file mode 100644 index 0000000..700732d --- /dev/null +++ b/compiler/compiler.iml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/AnnotatedClass.java b/compiler/src/main/java/com/joxad/easydatabinding/compiler/AnnotatedClass.java new file mode 100644 index 0000000..cc557cf --- /dev/null +++ b/compiler/src/main/java/com/joxad/easydatabinding/compiler/AnnotatedClass.java @@ -0,0 +1,22 @@ +package com.joxad.easydatabinding.compiler; + +import java.util.List; + +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; + +class AnnotatedClass { + public final String annotatedClassName; + public final List variableNames; + public final TypeElement typeElement; + + public AnnotatedClass(TypeElement typeElement, List variableNames) { + this.annotatedClassName = typeElement.getSimpleName().toString(); + this.variableNames = variableNames; + this.typeElement = typeElement; + } + + public TypeMirror getType() { + return typeElement.asType(); + } +} \ No newline at end of file diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/ClassValidator.java b/compiler/src/main/java/com/joxad/easydatabinding/compiler/ClassValidator.java new file mode 100644 index 0000000..7940a45 --- /dev/null +++ b/compiler/src/main/java/com/joxad/easydatabinding/compiler/ClassValidator.java @@ -0,0 +1,15 @@ +package com.joxad.easydatabinding.compiler; + +import javax.lang.model.element.TypeElement; + +import static javax.lang.model.element.Modifier.ABSTRACT; +import static javax.lang.model.element.Modifier.PUBLIC; +final class ClassValidator { + static boolean isPublic(TypeElement annotatedClass) { + return annotatedClass.getModifiers().contains(PUBLIC); + } + + static boolean isAbstract(TypeElement annotatedClass) { + return annotatedClass.getModifiers().contains(ABSTRACT); + } +} \ No newline at end of file diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/CodeGenerator.java b/compiler/src/main/java/com/joxad/easydatabinding/compiler/CodeGenerator.java new file mode 100644 index 0000000..08e5cb8 --- /dev/null +++ b/compiler/src/main/java/com/joxad/easydatabinding/compiler/CodeGenerator.java @@ -0,0 +1,46 @@ +package com.joxad.easydatabinding.compiler; + +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.TypeSpec; + +import java.util.List; + +import static com.squareup.javapoet.MethodSpec.methodBuilder; +import static com.squareup.javapoet.TypeName.get; +import static com.squareup.javapoet.TypeSpec.classBuilder; +import static javax.lang.model.element.Modifier.STATIC; +import static javax.lang.model.element.Modifier.FINAL; +import static javax.lang.model.element.Modifier.PUBLIC; +final class CodeGenerator { + + private static final String CLASS_NAME = "StringUtil"; + + public static TypeSpec generateClass(List classes) { + TypeSpec.Builder builder = classBuilder(CLASS_NAME) + .addModifiers(PUBLIC, FINAL); + for (AnnotatedClass anno : classes) { + builder.addMethod(makeCreateStringMethod(anno)); + } + return builder.build(); + } + + /** + * @return a createString() method that takes annotatedClass's type as an input. + */ + private static MethodSpec makeCreateStringMethod(AnnotatedClass annotatedClass) { + StringBuilder builder = new StringBuilder(); + builder.append(String.format("return \"%s{\" + ", annotatedClass.annotatedClassName)); + for (String variableName : annotatedClass.variableNames) { + builder.append(String.format(" \"%s='\" + String.valueOf(instance.%s) + \"',\" + ", + variableName, variableName)); + } + builder.append("\"}\""); + return methodBuilder("createString") + .addJavadoc("@return string suitable for {@param instance}'s toString()") + .addModifiers(PUBLIC, STATIC) + .addParameter(get(annotatedClass.getType()), "instance") + .addStatement(builder.toString()) + .returns(String.class) + .build(); + } +} \ No newline at end of file diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/DataBindableProcessor.java b/compiler/src/main/java/com/joxad/easydatabinding/compiler/DataBindableProcessor.java new file mode 100644 index 0000000..244cf43 --- /dev/null +++ b/compiler/src/main/java/com/joxad/easydatabinding/compiler/DataBindableProcessor.java @@ -0,0 +1,121 @@ +package com.joxad.easydatabinding.compiler; + +import com.google.auto.service.AutoService; +import com.joxad.easydatabinding.annotation.DataBindable; +import com.squareup.javapoet.JavaFile; +import com.squareup.javapoet.TypeSpec; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.Messager; +import javax.annotation.processing.ProcessingEnvironment; +import javax.annotation.processing.Processor; +import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; + +import static com.joxad.easydatabinding.compiler.Utils.getPackageName; +import static com.squareup.javapoet.JavaFile.builder; +import static java.util.Collections.singleton; +import static javax.lang.model.SourceVersion.latestSupported; +import static javax.tools.Diagnostic.Kind.ERROR; + +@AutoService(Processor.class) +public class DataBindableProcessor extends AbstractProcessor { + + private static final String ANNOTATION = "@" + DataBindableProcessor.class.getSimpleName(); + + private Messager messager; + + @Override + public synchronized void init(ProcessingEnvironment processingEnv) { + super.init(processingEnv); + messager = processingEnv.getMessager(); + } + + @Override + public Set getSupportedAnnotationTypes() { + return singleton(DataBindableProcessor.class.getCanonicalName()); + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return latestSupported(); + } + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + ArrayList annotatedClasses = new ArrayList<>(); + for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(DataBindable.class)) { + // Our annotation is defined with @Target(value=TYPE). Therefore, we can assume that + // this annotatedElement is a TypeElement. + TypeElement annotatedClass = (TypeElement) annotatedElement; + if (!isValidClass(annotatedClass)) { + return true; + } + try { + annotatedClasses.add(buildAnnotatedClass(annotatedClass)); + } catch (NoPackageNameException | IOException e) { + String message = String.format("Couldn't process class %s: %s", annotatedClass, + e.getMessage()); + messager.printMessage(ERROR, message, annotatedElement); + } + } + try { + generate(annotatedClasses); + } catch (NoPackageNameException | IOException e) { + messager.printMessage(ERROR, "Couldn't generate class"); + } + return true; + } + + private boolean isValidClass(TypeElement annotatedClass) { + + if (!ClassValidator.isPublic(annotatedClass)) { + String message = String.format("Classes annotated with %s must be public.", + ANNOTATION); + messager.printMessage(ERROR, message, annotatedClass); + return false; + } + + if (ClassValidator.isAbstract(annotatedClass)) { + String message = String.format("Classes annotated with %s must not be abstract.", + ANNOTATION); + messager.printMessage(ERROR, message, annotatedClass); + return false; + } + + return true; + } + + private AnnotatedClass buildAnnotatedClass(TypeElement annotatedClass) + throws NoPackageNameException, IOException { + ArrayList variableNames = new ArrayList<>(); + for (Element element : annotatedClass.getEnclosedElements()) { + if (!(element instanceof VariableElement)) { + continue; + } + VariableElement variableElement = (VariableElement) element; + variableNames.add(variableElement.getSimpleName().toString()); + } + return new AnnotatedClass(annotatedClass, variableNames); + } + + private void generate(List annos) throws NoPackageNameException, IOException { + if (annos.size() == 0) { + return; + } + String packageName = getPackageName(processingEnv.getElementUtils(), + annos.get(0).typeElement); + TypeSpec generatedClass = CodeGenerator.generateClass(annos); + + JavaFile javaFile = builder(packageName, generatedClass).build(); + javaFile.writeTo(processingEnv.getFiler()); + } +} diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/NoPackageNameException.java b/compiler/src/main/java/com/joxad/easydatabinding/compiler/NoPackageNameException.java new file mode 100644 index 0000000..313e71e --- /dev/null +++ b/compiler/src/main/java/com/joxad/easydatabinding/compiler/NoPackageNameException.java @@ -0,0 +1,10 @@ +package com.joxad.easydatabinding.compiler; + +import javax.lang.model.element.TypeElement; + +class NoPackageNameException extends Exception { + + public NoPackageNameException(TypeElement typeElement) { + super("The package of " + typeElement.getSimpleName() + " has no name"); + } +} \ No newline at end of file diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/Utils.java b/compiler/src/main/java/com/joxad/easydatabinding/compiler/Utils.java new file mode 100644 index 0000000..3d57b1c --- /dev/null +++ b/compiler/src/main/java/com/joxad/easydatabinding/compiler/Utils.java @@ -0,0 +1,21 @@ +package com.joxad.easydatabinding.compiler; + +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.util.Elements; + +final class Utils { + + private Utils() { + // no instances + } + + static String getPackageName(Elements elementUtils, TypeElement type) + throws NoPackageNameException { + PackageElement pkg = elementUtils.getPackageOf(type); + if (pkg.isUnnamed()) { + throw new NoPackageNameException(type); + } + return pkg.getQualifiedName().toString(); + } +} \ No newline at end of file diff --git a/lib/lib.iml b/lib/lib.iml index 93f3017..3d214e4 100644 --- a/lib/lib.iml +++ b/lib/lib.iml @@ -64,14 +64,6 @@ - - - - - - - - @@ -80,6 +72,14 @@ + + + + + + + + @@ -103,8 +103,6 @@ - - @@ -114,8 +112,8 @@ - + diff --git a/plugin/build.gradle b/plugin/build.gradle deleted file mode 100644 index 4a7f85c..0000000 --- a/plugin/build.gradle +++ /dev/null @@ -1,35 +0,0 @@ -apply plugin: 'java' -apply plugin: 'maven' - -// This is important for publishing, even if Android Studio claims it isn't -// used. Android can't interpret Java 8 byte code. -sourceCompatibility = JavaVersion.VERSION_1_7 -targetCompatibility = JavaVersion.VERSION_1_7 - -repositories { - jcenter() -} - -dependencies { - // needed to perform byte code generation - compile 'com.github.stephanenicolas.javassist:javassist-build-plugin-api:1.0.0' - // needed to create a plugin - compile 'com.github.stephanenicolas.morpheus:morpheus-plugin:1.0.7' - compile 'com.github.stephanenicolas.morpheus:morpheus-commons:1.0.7' - - compile project (':annotation') - compile gradleApi() -} - -group = 'com.joxad.easydatabinding' -version = '1.0-SNAPSHOT' - -// The following code is optional. If you don't specify this, the repository location -// will be something like "/Users/brianattwell/.m2/repositories/". -uploadArchives { - repositories { - mavenDeployer { - repository(url: uri('../repo')) - } - } -} diff --git a/plugin/plugin.iml b/plugin/plugin.iml deleted file mode 100644 index 4864a10..0000000 --- a/plugin/plugin.iml +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/plugin/src/main/java/com/joxad/easydatabinding/plugin/ByteManipulationPlugin.java b/plugin/src/main/java/com/joxad/easydatabinding/plugin/ByteManipulationPlugin.java deleted file mode 100644 index 2c15450..0000000 --- a/plugin/src/main/java/com/joxad/easydatabinding/plugin/ByteManipulationPlugin.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.joxad.easydatabinding.plugin; - -import com.github.stephanenicolas.morpheus.AbstractMorpheusPlugin; - -import org.gradle.api.Project; - -import javassist.build.IClassTransformer; - -/** - * Java class that we export via META-INF. This is the plugin's entry point. - */ -public class ByteManipulationPlugin extends AbstractMorpheusPlugin { - @Override - protected Class getPluginExtension() { - return null; - } - - @Override - protected String getExtension() { - return null; - } - - @Override - public IClassTransformer[] getTransformers(Project project) { - return new IClassTransformer[]{new ClassTransformer()}; - } -} diff --git a/plugin/src/main/java/com/joxad/easydatabinding/plugin/ClassTransformer.java b/plugin/src/main/java/com/joxad/easydatabinding/plugin/ClassTransformer.java deleted file mode 100644 index c13ae65..0000000 --- a/plugin/src/main/java/com/joxad/easydatabinding/plugin/ClassTransformer.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.joxad.easydatabinding.plugin; - -import com.joxad.easydatabinding.annotation.DataBindable; - -import javassist.ClassPool; -import javassist.CtClass; -import javassist.CtMethod; -import javassist.NotFoundException; -import javassist.build.IClassTransformer; -import javassist.build.JavassistBuildException; -import static com.github.stephanenicolas.morpheus.commons.JavassistUtils.isActivity; - -public class ClassTransformer implements IClassTransformer { - - @Override - public void applyTransformations(CtClass ctClass) throws JavassistBuildException { - System.out.println(":plugin:applyTransformations on " + ctClass.getName()); - try { - CtMethod[] methods = getOnCreateMethod(ctClass); - for (CtMethod method : methods) { - method.insertAfter("android.util.Log.d(\"MOO\", \"I am inserted code!\");"); - } - } catch (Exception e) { - throw new JavassistBuildException(e); - } - } - - @Override - public boolean shouldTransform(CtClass candidateClass) throws JavassistBuildException { - try { - return candidateClass.hasAnnotation(DataBindable.class) - && isAnActivity(candidateClass); - } catch (Exception e) { - throw new JavassistBuildException(e); - } - } - - private static boolean isAnActivity(CtClass candidateClass) throws NotFoundException { - // TODO: handle support activity - return isActivity(candidateClass); - } - - private CtMethod[] getOnCreateMethod(CtClass ctClass) - throws NotFoundException { - String className = ctClass.getName(); - ClassPool pool = ctClass.getClassPool(); - - CtMethod c1 = pool.get(className).getMethod("onCreate", - "(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V"); - CtMethod c2 = pool.get(className).getMethod("onCreate", - "(Landroid/os/Bundle;)V"); - return new CtMethod[] {c1, c2}; - } -} \ No newline at end of file diff --git a/plugin/src/main/resources/META-INF/gradle-plugins/com.joxad.easydatabinding.plugin.test-plugin.properties b/plugin/src/main/resources/META-INF/gradle-plugins/com.joxad.easydatabinding.plugin.test-plugin.properties deleted file mode 100644 index ca4a245..0000000 --- a/plugin/src/main/resources/META-INF/gradle-plugins/com.joxad.easydatabinding.plugin.test-plugin.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=com.joxad.easydatabinding.plugin.ByteManipulationPlugin \ No newline at end of file diff --git a/plugin/src/main/resources/META-INF/gradle-plugins/test-plugin.properties b/plugin/src/main/resources/META-INF/gradle-plugins/test-plugin.properties deleted file mode 100644 index ca4a245..0000000 --- a/plugin/src/main/resources/META-INF/gradle-plugins/test-plugin.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=com.joxad.easydatabinding.plugin.ByteManipulationPlugin \ No newline at end of file diff --git a/sample/build.gradle b/sample/build.gradle index d4adf38..983b2f2 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -27,28 +27,11 @@ dependencies { compile project(':lib') compile project(':annotation') - compile libs.recyclerViewDataBinding - compile libs.recyclerViewAdapter - -} - -// Import the custom gradle plugin. Note that we import it as a build dependency. Not -// as a compilation dependency. FYI: You must execute "$ ./gradlew uploadArchives" at -// least once before the following dependencies will work. + apt project(':compiler') -buildscript { - repositories { - maven { - url uri('../repo') - } - jcenter() // Needed for plugin's dependencies - } - dependencies { - classpath group: 'com.joxad.easydatabinding', - name: 'plugin', - version: '1.0-SNAPSHOT' + compile libs.recyclerViewDataBinding + compile libs.recyclerViewAdapter - } } diff --git a/sample/sample.iml b/sample/sample.iml index dfa665d..ced602e 100644 --- a/sample/sample.iml +++ b/sample/sample.iml @@ -34,13 +34,13 @@ - + @@ -65,14 +65,6 @@ - - - - - - - - @@ -81,6 +73,14 @@ + + + + + + + + @@ -101,9 +101,7 @@ - - diff --git a/settings.gradle b/settings.gradle index 1a4a75a..87e6138 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':lib', ':sample', ':annotation', ':plugin' +include ':lib', ':sample', ':annotation', ':compiler' From a7a697fd0d23143cdc55bfef4ccec3a7d79847a3 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 24 May 2016 18:26:08 +0200 Subject: [PATCH 4/6] Test to add annotation with processor --- .../easydatabinding/annotation/DataBindable.java | 2 +- .../easydatabinding/compiler/CodeGenerator.java | 7 ++++--- .../compiler/DataBindableProcessor.java | 13 +++++-------- .../java/joxad/easydatabinding/sample/User.java | 8 ++++++++ 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java b/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java index 05f6c1f..8f688c9 100644 --- a/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java +++ b/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java @@ -3,6 +3,6 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Target; -@Target(value = ElementType.FIELD) +@Target(value = ElementType.TYPE) public @interface DataBindable { } diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/CodeGenerator.java b/compiler/src/main/java/com/joxad/easydatabinding/compiler/CodeGenerator.java index 08e5cb8..f43d06f 100644 --- a/compiler/src/main/java/com/joxad/easydatabinding/compiler/CodeGenerator.java +++ b/compiler/src/main/java/com/joxad/easydatabinding/compiler/CodeGenerator.java @@ -5,15 +5,16 @@ import java.util.List; +import static com.squareup.javapoet.ClassName.get; import static com.squareup.javapoet.MethodSpec.methodBuilder; -import static com.squareup.javapoet.TypeName.get; import static com.squareup.javapoet.TypeSpec.classBuilder; -import static javax.lang.model.element.Modifier.STATIC; import static javax.lang.model.element.Modifier.FINAL; import static javax.lang.model.element.Modifier.PUBLIC; +import static javax.lang.model.element.Modifier.STATIC; + final class CodeGenerator { - private static final String CLASS_NAME = "StringUtil"; + private static final String CLASS_NAME = "DataBindableUtil"; public static TypeSpec generateClass(List classes) { TypeSpec.Builder builder = classBuilder(CLASS_NAME) diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/DataBindableProcessor.java b/compiler/src/main/java/com/joxad/easydatabinding/compiler/DataBindableProcessor.java index 244cf43..316d2fe 100644 --- a/compiler/src/main/java/com/joxad/easydatabinding/compiler/DataBindableProcessor.java +++ b/compiler/src/main/java/com/joxad/easydatabinding/compiler/DataBindableProcessor.java @@ -10,26 +10,23 @@ import java.util.List; import java.util.Set; -import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.*; import javax.annotation.processing.Messager; -import javax.annotation.processing.ProcessingEnvironment; -import javax.annotation.processing.Processor; -import javax.annotation.processing.RoundEnvironment; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; -import static com.joxad.easydatabinding.compiler.Utils.getPackageName; import static com.squareup.javapoet.JavaFile.builder; import static java.util.Collections.singleton; import static javax.lang.model.SourceVersion.latestSupported; -import static javax.tools.Diagnostic.Kind.ERROR; +import static javax.tools.Diagnostic.Kind.*; + @AutoService(Processor.class) public class DataBindableProcessor extends AbstractProcessor { - private static final String ANNOTATION = "@" + DataBindableProcessor.class.getSimpleName(); + private static final String ANNOTATION = "@" + DataBindable.class.getSimpleName(); private Messager messager; @@ -111,7 +108,7 @@ private void generate(List annos) throws NoPackageNameException, if (annos.size() == 0) { return; } - String packageName = getPackageName(processingEnv.getElementUtils(), + String packageName = Utils.getPackageName(processingEnv.getElementUtils(), annos.get(0).typeElement); TypeSpec generatedClass = CodeGenerator.generateClass(annos); diff --git a/sample/src/main/java/joxad/easydatabinding/sample/User.java b/sample/src/main/java/joxad/easydatabinding/sample/User.java index 2e21cf1..95d5fe4 100644 --- a/sample/src/main/java/joxad/easydatabinding/sample/User.java +++ b/sample/src/main/java/joxad/easydatabinding/sample/User.java @@ -1,8 +1,11 @@ package joxad.easydatabinding.sample; +import com.joxad.easydatabinding.annotation.DataBindable; + /** * Created by josh on 13/04/16. */ +@DataBindable public class User { public String name; @@ -10,4 +13,9 @@ public class User { public User(String s) { name = s; } + + @Override + public String toString() { + return ""; + } } From 9310af5488a9aa70a264f2adc6eb464ef1fc7db5 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 8 Jun 2016 14:40:45 +0200 Subject: [PATCH 5/6] Test to add annotation with processor --- annotation/build.gradle | 13 ------------- .../{annotation => }/DataBindable.java | 2 +- build.gradle | 2 +- .../{compiler => }/AnnotatedClass.java | 2 +- .../{compiler => }/ClassValidator.java | 2 +- .../{compiler => }/CodeGenerator.java | 2 +- .../{compiler => }/DataBindableProcessor.java | 13 ++++++------- .../{compiler => }/NoPackageNameException.java | 2 +- .../easydatabinding/{compiler => }/Utils.java | 2 +- .../easydatabinding/activity/ActivityBase.java | 3 +++ sample/build.gradle | 3 +-- .../java/joxad/easydatabinding/sample/User.java | 4 ++-- .../easydatabinding/sample/ExampleUnitTest.java | 15 --------------- settings.gradle | 2 +- 14 files changed, 20 insertions(+), 47 deletions(-) rename annotation/src/main/java/com/joxad/easydatabinding/{annotation => }/DataBindable.java (76%) rename compiler/src/main/java/com/joxad/easydatabinding/{compiler => }/AnnotatedClass.java (93%) rename compiler/src/main/java/com/joxad/easydatabinding/{compiler => }/ClassValidator.java (91%) rename compiler/src/main/java/com/joxad/easydatabinding/{compiler => }/CodeGenerator.java (97%) rename compiler/src/main/java/com/joxad/easydatabinding/{compiler => }/DataBindableProcessor.java (87%) rename compiler/src/main/java/com/joxad/easydatabinding/{compiler => }/NoPackageNameException.java (84%) rename compiler/src/main/java/com/joxad/easydatabinding/{compiler => }/Utils.java (91%) delete mode 100644 sample/src/test/java/joxad/easydatabinding/sample/ExampleUnitTest.java diff --git a/annotation/build.gradle b/annotation/build.gradle index daaffef..2a04e25 100644 --- a/annotation/build.gradle +++ b/annotation/build.gradle @@ -1,20 +1,7 @@ apply plugin: 'java' - apply plugin: 'maven' // This is important for publishing, even if Android Studio claims it isn't // used. Android can't interpret Java 8 byte code. sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7 - -group = 'com.joxad.easydatabinding' -version = '1.0-SNAPSHOT' -// The following code is optional. If you don't specify this, the repository location -// will be something like "/Users/brianattwell/.m2/repositories/". -uploadArchives { - repositories { - mavenDeployer { - repository(url: uri('../repo')) - } - } -} diff --git a/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java b/annotation/src/main/java/com/joxad/easydatabinding/DataBindable.java similarity index 76% rename from annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java rename to annotation/src/main/java/com/joxad/easydatabinding/DataBindable.java index 8f688c9..71b10a0 100644 --- a/annotation/src/main/java/com/joxad/easydatabinding/annotation/DataBindable.java +++ b/annotation/src/main/java/com/joxad/easydatabinding/DataBindable.java @@ -1,4 +1,4 @@ -package com.joxad.easydatabinding.annotation; +package com.joxad.easydatabinding; import java.lang.annotation.ElementType; import java.lang.annotation.Target; diff --git a/build.gradle b/build.gradle index 8d7f989..2e9b4df 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:2.1.2' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/AnnotatedClass.java b/compiler/src/main/java/com/joxad/easydatabinding/AnnotatedClass.java similarity index 93% rename from compiler/src/main/java/com/joxad/easydatabinding/compiler/AnnotatedClass.java rename to compiler/src/main/java/com/joxad/easydatabinding/AnnotatedClass.java index cc557cf..ea74f62 100644 --- a/compiler/src/main/java/com/joxad/easydatabinding/compiler/AnnotatedClass.java +++ b/compiler/src/main/java/com/joxad/easydatabinding/AnnotatedClass.java @@ -1,4 +1,4 @@ -package com.joxad.easydatabinding.compiler; +package com.joxad.easydatabinding; import java.util.List; diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/ClassValidator.java b/compiler/src/main/java/com/joxad/easydatabinding/ClassValidator.java similarity index 91% rename from compiler/src/main/java/com/joxad/easydatabinding/compiler/ClassValidator.java rename to compiler/src/main/java/com/joxad/easydatabinding/ClassValidator.java index 7940a45..13a3355 100644 --- a/compiler/src/main/java/com/joxad/easydatabinding/compiler/ClassValidator.java +++ b/compiler/src/main/java/com/joxad/easydatabinding/ClassValidator.java @@ -1,4 +1,4 @@ -package com.joxad.easydatabinding.compiler; +package com.joxad.easydatabinding; import javax.lang.model.element.TypeElement; diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/CodeGenerator.java b/compiler/src/main/java/com/joxad/easydatabinding/CodeGenerator.java similarity index 97% rename from compiler/src/main/java/com/joxad/easydatabinding/compiler/CodeGenerator.java rename to compiler/src/main/java/com/joxad/easydatabinding/CodeGenerator.java index f43d06f..7f9a0e0 100644 --- a/compiler/src/main/java/com/joxad/easydatabinding/compiler/CodeGenerator.java +++ b/compiler/src/main/java/com/joxad/easydatabinding/CodeGenerator.java @@ -1,4 +1,4 @@ -package com.joxad.easydatabinding.compiler; +package com.joxad.easydatabinding; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeSpec; diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/DataBindableProcessor.java b/compiler/src/main/java/com/joxad/easydatabinding/DataBindableProcessor.java similarity index 87% rename from compiler/src/main/java/com/joxad/easydatabinding/compiler/DataBindableProcessor.java rename to compiler/src/main/java/com/joxad/easydatabinding/DataBindableProcessor.java index 316d2fe..69840a2 100644 --- a/compiler/src/main/java/com/joxad/easydatabinding/compiler/DataBindableProcessor.java +++ b/compiler/src/main/java/com/joxad/easydatabinding/DataBindableProcessor.java @@ -1,7 +1,6 @@ -package com.joxad.easydatabinding.compiler; +package com.joxad.easydatabinding; import com.google.auto.service.AutoService; -import com.joxad.easydatabinding.annotation.DataBindable; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.TypeSpec; @@ -48,7 +47,7 @@ public SourceVersion getSupportedSourceVersion() { @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { - ArrayList annotatedClasses = new ArrayList<>(); + ArrayList annotatedClasses = new ArrayList<>(); for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(DataBindable.class)) { // Our annotation is defined with @Target(value=TYPE). Therefore, we can assume that // this annotatedElement is a TypeElement. @@ -91,7 +90,7 @@ private boolean isValidClass(TypeElement annotatedClass) { return true; } - private AnnotatedClass buildAnnotatedClass(TypeElement annotatedClass) + private com.joxad.easydatabinding.AnnotatedClass buildAnnotatedClass(TypeElement annotatedClass) throws NoPackageNameException, IOException { ArrayList variableNames = new ArrayList<>(); for (Element element : annotatedClass.getEnclosedElements()) { @@ -101,16 +100,16 @@ private AnnotatedClass buildAnnotatedClass(TypeElement annotatedClass) VariableElement variableElement = (VariableElement) element; variableNames.add(variableElement.getSimpleName().toString()); } - return new AnnotatedClass(annotatedClass, variableNames); + return new com.joxad.easydatabinding.AnnotatedClass(annotatedClass, variableNames); } - private void generate(List annos) throws NoPackageNameException, IOException { + private void generate(List annos) throws NoPackageNameException, IOException { if (annos.size() == 0) { return; } String packageName = Utils.getPackageName(processingEnv.getElementUtils(), annos.get(0).typeElement); - TypeSpec generatedClass = CodeGenerator.generateClass(annos); + TypeSpec generatedClass = com.joxad.easydatabinding.CodeGenerator.generateClass(annos); JavaFile javaFile = builder(packageName, generatedClass).build(); javaFile.writeTo(processingEnv.getFiler()); diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/NoPackageNameException.java b/compiler/src/main/java/com/joxad/easydatabinding/NoPackageNameException.java similarity index 84% rename from compiler/src/main/java/com/joxad/easydatabinding/compiler/NoPackageNameException.java rename to compiler/src/main/java/com/joxad/easydatabinding/NoPackageNameException.java index 313e71e..99188c5 100644 --- a/compiler/src/main/java/com/joxad/easydatabinding/compiler/NoPackageNameException.java +++ b/compiler/src/main/java/com/joxad/easydatabinding/NoPackageNameException.java @@ -1,4 +1,4 @@ -package com.joxad.easydatabinding.compiler; +package com.joxad.easydatabinding; import javax.lang.model.element.TypeElement; diff --git a/compiler/src/main/java/com/joxad/easydatabinding/compiler/Utils.java b/compiler/src/main/java/com/joxad/easydatabinding/Utils.java similarity index 91% rename from compiler/src/main/java/com/joxad/easydatabinding/compiler/Utils.java rename to compiler/src/main/java/com/joxad/easydatabinding/Utils.java index 3d57b1c..a2bc897 100644 --- a/compiler/src/main/java/com/joxad/easydatabinding/compiler/Utils.java +++ b/compiler/src/main/java/com/joxad/easydatabinding/Utils.java @@ -1,4 +1,4 @@ -package com.joxad.easydatabinding.compiler; +package com.joxad.easydatabinding; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; diff --git a/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java b/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java index 1b96714..6a9303d 100644 --- a/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java +++ b/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java @@ -111,4 +111,7 @@ protected void onNewIntent(Intent intent) { if (vm instanceof INewIntent) ((INewIntent) vm).onNewIntent(intent); } + + + } diff --git a/sample/build.gradle b/sample/build.gradle index 983b2f2..dfc63e5 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,5 +1,5 @@ apply plugin: 'com.android.application' -apply plugin: 'android-apt' +apply plugin: 'com.neenbedankt.android-apt' android { compileSdkVersion 23 @@ -23,7 +23,6 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' compile project(':lib') compile project(':annotation') diff --git a/sample/src/main/java/joxad/easydatabinding/sample/User.java b/sample/src/main/java/joxad/easydatabinding/sample/User.java index 95d5fe4..767b667 100644 --- a/sample/src/main/java/joxad/easydatabinding/sample/User.java +++ b/sample/src/main/java/joxad/easydatabinding/sample/User.java @@ -1,6 +1,6 @@ package joxad.easydatabinding.sample; -import com.joxad.easydatabinding.annotation.DataBindable; +import com.joxad.easydatabinding.DataBindable; /** * Created by josh on 13/04/16. @@ -16,6 +16,6 @@ public User(String s) { @Override public String toString() { - return ""; + return "";//DataBindableUtil.createString(this); } } diff --git a/sample/src/test/java/joxad/easydatabinding/sample/ExampleUnitTest.java b/sample/src/test/java/joxad/easydatabinding/sample/ExampleUnitTest.java deleted file mode 100644 index 3dfbfcf..0000000 --- a/sample/src/test/java/joxad/easydatabinding/sample/ExampleUnitTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package joxad.easydatabinding.sample; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * To work on unit tests, switch the Test Artifact in the Build Variants view. - */ -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 87e6138..7c69d03 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':lib', ':sample', ':annotation', ':compiler' +include ':annotation', ':compiler', ':sample',':lib' From 33f36c7257634811892e10a8ec5f6f4aa02fbb62 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 9 Aug 2016 16:24:17 +0200 Subject: [PATCH 6/6] 0.6.0 Add DialogFragmentBase/VM Update Badge android Arsenal --- README.md | 5 +- annotation/annotation.iml | 4 +- compiler/compiler.iml | 1 + gradle.properties | 4 +- lib/lib.iml | 38 +++++-- .../activity/ActivityBase.java | 16 +++ .../activity/ActivityBaseVM.java | 20 ++++ .../easydatabinding/activity/INewIntent.java | 2 +- .../easydatabinding/activity/IPermission.java | 2 +- .../easydatabinding/activity/IResult.java | 2 +- .../fragment/DialogFragmentBase.java | 104 ++++++++++++++++++ .../fragment/DialogFragmentBaseVM.java | 48 ++++++++ lib/src/main/res/values/colors.xml | 6 +- lib/src/main/res/values/strings.xml | 2 +- lib/src/main/res/values/styles.xml | 8 +- sample/sample.iml | 25 +++-- sample/src/main/AndroidManifest.xml | 8 +- .../easydatabinding/sample/ActivityMain.java | 3 + .../sample/ActivitySample.java | 16 --- sample/src/main/res/values/strings.xml | 2 +- sample/src/main/res/values/styles.xml | 8 +- 21 files changed, 261 insertions(+), 63 deletions(-) create mode 100644 lib/src/main/java/com/joxad/easydatabinding/fragment/DialogFragmentBase.java create mode 100644 lib/src/main/java/com/joxad/easydatabinding/fragment/DialogFragmentBaseVM.java delete mode 100644 sample/src/main/java/joxad/easydatabinding/sample/ActivitySample.java diff --git a/README.md b/README.md index 3f30ca2..e09bd47 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,11 @@ + +[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-easydatabinding-green.svg?style=true)](https://android-arsenal.com/details/1/4106) + # easydatabinding This project goal is to create activity fragment and views, with less code to be more efficient on the view models -# Version : 0.4.5 +# Version : 0.6.0 # Goal I used DataBinding for a few weeks since Google allows us to use it. diff --git a/annotation/annotation.iml b/annotation/annotation.iml index af786c3..65131f9 100644 --- a/annotation/annotation.iml +++ b/annotation/annotation.iml @@ -1,5 +1,5 @@ - + @@ -27,6 +27,6 @@ - + \ No newline at end of file diff --git a/compiler/compiler.iml b/compiler/compiler.iml index 700732d..ae0fd9b 100644 --- a/compiler/compiler.iml +++ b/compiler/compiler.iml @@ -32,5 +32,6 @@ + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index f894c80..9d5c6b6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,12 +12,12 @@ # Default value: -Xmx10248m -XX:MaxPermSize=256m # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -# When configured, Gradle will run in incubating parallel mode. +# When configured, Gradle will run 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 -VERSION_NAME=0.4.5 +VERSION_NAME=0.6.0 POM_GROUP=com.joxad.easydatabinding POM_NAME=easydatabinding diff --git a/lib/lib.iml b/lib/lib.iml index 3d214e4..93a84e5 100644 --- a/lib/lib.iml +++ b/lib/lib.iml @@ -1,5 +1,5 @@ - + @@ -64,14 +64,6 @@ - - - - - - - - @@ -80,6 +72,14 @@ + + + + + + + + @@ -103,19 +103,33 @@ + + - - + + + + + + + + + + + + + + - + diff --git a/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java b/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java index 6a9303d..fd4f29d 100644 --- a/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java +++ b/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBase.java @@ -8,6 +8,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; +import android.view.MenuItem; /** * {@link ActivityBase} will allow you to generate a basic activity that put your view model {@link B} and its {@link VM} @@ -33,6 +34,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { binding.setVariable(data(), vm); } + @Override public void onBackPressed() { if (vm.onBackPressed() ) super.onBackPressed(); @@ -51,6 +53,20 @@ protected void onPause() { vm.onPause(); } + @Override + protected void onPostCreate(@Nullable Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + vm.onPostCreate(savedInstanceState); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (vm.onOptionsItemSelected(item)) { + return true; + } + return super.onOptionsItemSelected(item); + } + /** * The int value found in the {@link com.joxad.easydatabinding.BR} class generated by DataBinding * diff --git a/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBaseVM.java b/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBaseVM.java index 1c1c0ad..99fe065 100644 --- a/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBaseVM.java +++ b/lib/src/main/java/com/joxad/easydatabinding/activity/ActivityBaseVM.java @@ -3,6 +3,8 @@ import android.databinding.BaseObservable; import android.databinding.ViewDataBinding; +import android.os.Bundle; +import android.view.MenuItem; import com.joxad.easydatabinding.base.IVM; @@ -52,4 +54,22 @@ protected void onPause() { protected boolean onBackPressed() { return true; } + + /** + * PostCreate + * + * @param savedInstanceState + */ + public void onPostCreate(Bundle savedInstanceState) { + } + + /** + * Manage item + * + * @param item + * @return + */ + public boolean onOptionsItemSelected(MenuItem item) { + return false; + } } \ No newline at end of file diff --git a/lib/src/main/java/com/joxad/easydatabinding/activity/INewIntent.java b/lib/src/main/java/com/joxad/easydatabinding/activity/INewIntent.java index a050ba2..b06a86c 100644 --- a/lib/src/main/java/com/joxad/easydatabinding/activity/INewIntent.java +++ b/lib/src/main/java/com/joxad/easydatabinding/activity/INewIntent.java @@ -3,7 +3,7 @@ import android.content.Intent; /** - * Created by josh on 13/04/16. + * {@link INewIntent} is used for the activity VM that needs to handle newIntent from the activity */ public interface INewIntent { /** diff --git a/lib/src/main/java/com/joxad/easydatabinding/activity/IPermission.java b/lib/src/main/java/com/joxad/easydatabinding/activity/IPermission.java index 9f132df..49cd8d1 100644 --- a/lib/src/main/java/com/joxad/easydatabinding/activity/IPermission.java +++ b/lib/src/main/java/com/joxad/easydatabinding/activity/IPermission.java @@ -3,7 +3,7 @@ import android.support.annotation.NonNull; /** - * Created by josh on 13/04/16. + * {@link IPermission} will handle the permission result from the activity */ public interface IPermission { /*** diff --git a/lib/src/main/java/com/joxad/easydatabinding/activity/IResult.java b/lib/src/main/java/com/joxad/easydatabinding/activity/IResult.java index f3d65bf..037ce38 100644 --- a/lib/src/main/java/com/joxad/easydatabinding/activity/IResult.java +++ b/lib/src/main/java/com/joxad/easydatabinding/activity/IResult.java @@ -3,7 +3,7 @@ import android.content.Intent; /** - * + * {@link IResult} will handle the onActivityResult from the activity */ public interface IResult { diff --git a/lib/src/main/java/com/joxad/easydatabinding/fragment/DialogFragmentBase.java b/lib/src/main/java/com/joxad/easydatabinding/fragment/DialogFragmentBase.java new file mode 100644 index 0000000..d4020f4 --- /dev/null +++ b/lib/src/main/java/com/joxad/easydatabinding/fragment/DialogFragmentBase.java @@ -0,0 +1,104 @@ + +package com.joxad.easydatabinding.fragment; + +import android.content.Intent; +import android.databinding.DataBindingUtil; +import android.databinding.ViewDataBinding; +import android.os.Bundle; +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.joxad.easydatabinding.activity.IPermission; +import com.joxad.easydatabinding.activity.IResult; + +/** + * Created by josh on 13/04/16. + */ +public abstract class DialogFragmentBase extends DialogFragment { + + /*** + * FragmentBinding used in this view + */ + + protected B binding; + /*** + * The view model that will be used to handle this fragment + */ + + protected VM vm; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + binding = DataBindingUtil.inflate(inflater, layoutResources(), container, false); + vm = baseFragmentVM(binding); + binding.setVariable(data(), vm); + return binding.getRoot(); + } + + + @Override + public void onResume() { + super.onResume(); + vm.onResume(); + } + + @Override + public void onPause() { + super.onPause(); + vm.onPause(); + } + + + /*** + * Handle the permission and give it to the activity + * + * @param requestCode + * @param permissions + * @param grantResults + */ + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (vm instanceof IPermission) + ((IPermission) vm).onRequestPermissionsResult(requestCode, permissions, grantResults); + } + + /*** + * Handle the activity result if you need to use it inside the vm of the fragment + * + * @param requestCode + * @param resultCode + * @param data + */ + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (vm instanceof IResult) + ((IResult) vm).onActivityResult(requestCode, resultCode, data); + } + + /** + * The int value found in the {@link com.joxad.easydatabinding.BR} class generated by DataBinding + * + * @return + */ + public abstract int data(); + + /*** + * @return your layout resources + */ + @LayoutRes + public abstract int layoutResources(); + + /*** + * @param binding + * @return the {@link VM} you want to use in this activity + */ + public abstract VM baseFragmentVM(B binding); +} diff --git a/lib/src/main/java/com/joxad/easydatabinding/fragment/DialogFragmentBaseVM.java b/lib/src/main/java/com/joxad/easydatabinding/fragment/DialogFragmentBaseVM.java new file mode 100644 index 0000000..d252c64 --- /dev/null +++ b/lib/src/main/java/com/joxad/easydatabinding/fragment/DialogFragmentBaseVM.java @@ -0,0 +1,48 @@ +package com.joxad.easydatabinding.fragment; + +import android.databinding.BaseObservable; +import android.databinding.ViewDataBinding; + +import com.joxad.easydatabinding.base.IVM; + + +/** + * Created by josh on 13/04/16. + */ +public abstract class DialogFragmentBaseVM extends BaseObservable implements IVM { + + /*** + * {@link F} is the fragment that use the current VM + */ + protected F fragment; + /** + * {@link B} will be used to find the views inside the fragment + */ + protected B binding; + + /*** + * @param + * @param binding + */ + public DialogFragmentBaseVM(F fragment, B binding) { + this.fragment = fragment; + this.binding = binding; + init(); + } + + /*** + * LifeCycle of the Fragment + */ + protected void onResume() { + + } + + /*** + * LifeCycle of the fragment + */ + protected void onPause() { + + } + + public abstract void init(); +} \ No newline at end of file diff --git a/lib/src/main/res/values/colors.xml b/lib/src/main/res/values/colors.xml index 3ab3e9c..b98d9bb 100644 --- a/lib/src/main/res/values/colors.xml +++ b/lib/src/main/res/values/colors.xml @@ -1,6 +1,6 @@ - #3F51B5 - #303F9F - #FF4081 + #3F51B5 + #303F9F + #FF4081 diff --git a/lib/src/main/res/values/strings.xml b/lib/src/main/res/values/strings.xml index e512455..1a05954 100644 --- a/lib/src/main/res/values/strings.xml +++ b/lib/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - Easydatabinding + Easydatabinding diff --git a/lib/src/main/res/values/styles.xml b/lib/src/main/res/values/styles.xml index 5885930..42743bc 100644 --- a/lib/src/main/res/values/styles.xml +++ b/lib/src/main/res/values/styles.xml @@ -1,11 +1,11 @@ - diff --git a/sample/sample.iml b/sample/sample.iml index ced602e..944669a 100644 --- a/sample/sample.iml +++ b/sample/sample.iml @@ -40,7 +40,6 @@ - @@ -107,18 +106,28 @@ + + + + + + + + + - + + - + - + + + - - - + + - diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index c9165db..c50b682 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -5,21 +5,17 @@ + android:theme="@style/EasyTheme"> - - - - - + \ No newline at end of file diff --git a/sample/src/main/java/joxad/easydatabinding/sample/ActivityMain.java b/sample/src/main/java/joxad/easydatabinding/sample/ActivityMain.java index ed06d8a..0ce5a29 100644 --- a/sample/src/main/java/joxad/easydatabinding/sample/ActivityMain.java +++ b/sample/src/main/java/joxad/easydatabinding/sample/ActivityMain.java @@ -1,6 +1,7 @@ package joxad.easydatabinding.sample; import android.os.Bundle; +import android.support.annotation.Nullable; import com.joxad.easydatabinding.activity.ActivityBase; @@ -27,4 +28,6 @@ public int layoutResources() { public ActivityMainVM baseActivityVM(ActivityMainBinding binding, Bundle savedInstanceState) { return new ActivityMainVM(this, binding); } + + } diff --git a/sample/src/main/java/joxad/easydatabinding/sample/ActivitySample.java b/sample/src/main/java/joxad/easydatabinding/sample/ActivitySample.java deleted file mode 100644 index 6277eea..0000000 --- a/sample/src/main/java/joxad/easydatabinding/sample/ActivitySample.java +++ /dev/null @@ -1,16 +0,0 @@ -package joxad.easydatabinding.sample; - -import android.app.Activity; -import android.os.Bundle; - -/** - * Created by josh on 24/05/16. - */ -public class ActivitySample extends Activity { - - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } -} diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index 1ad8c29..a136c02 100644 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - Sample + Sample diff --git a/sample/src/main/res/values/styles.xml b/sample/src/main/res/values/styles.xml index 5885930..42743bc 100644 --- a/sample/src/main/res/values/styles.xml +++ b/sample/src/main/res/values/styles.xml @@ -1,11 +1,11 @@ -