From 5a012453b1072b984bafe6b6d890df005ee817a4 Mon Sep 17 00:00:00 2001 From: Robert Keazor Date: Tue, 9 Apr 2019 11:44:06 -0400 Subject: [PATCH 01/11] Add SimpleKombindAnnotation Created a annotation for use when a simple RecyclerViewAdapter, through Kombind. This will eliminate the need of creating the adapter boilerplate yourself. The annotation should be attached to a ObservableList field --- anontation/.gitignore | 29 +++++++ anontation/build.gradle | 10 +++ .../anontation/SimpleKombindAdapter.kt | 5 ++ app/build.gradle | 6 ++ .../kombindsample/ui/main/MainActivity.kt | 2 + .../kombindsample/ui/main/MainViewModel.kt | 8 +- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- processor/.gitignore | 29 +++++++ processor/build.gradle | 37 +++++++++ .../kombind/processor/AdapterProcessor.kt | 76 +++++++++++++++++++ settings.gradle | 2 +- 12 files changed, 204 insertions(+), 6 deletions(-) create mode 100644 anontation/.gitignore create mode 100644 anontation/build.gradle create mode 100644 anontation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt create mode 100644 processor/.gitignore create mode 100644 processor/build.gradle create mode 100644 processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt diff --git a/anontation/.gitignore b/anontation/.gitignore new file mode 100644 index 0000000..ed53c05 --- /dev/null +++ b/anontation/.gitignore @@ -0,0 +1,29 @@ +/build +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Intellij +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/dictionaries +.idea/libraries + +# Freeline +freeline.py +freeline/ +freeline_project_description.json +.idea/misc.xml +.idea/runConfigurations.xml +.idea/vcs.xml +.idea/modules.xml \ No newline at end of file diff --git a/anontation/build.gradle b/anontation/build.gradle new file mode 100644 index 0000000..3e82836 --- /dev/null +++ b/anontation/build.gradle @@ -0,0 +1,10 @@ +apply plugin: 'java-library' +apply plugin: 'kotlin' + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" +} + +sourceCompatibility = "7" +targetCompatibility = "7" diff --git a/anontation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt b/anontation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt new file mode 100644 index 0000000..b9155fc --- /dev/null +++ b/anontation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt @@ -0,0 +1,5 @@ +package com.umairjavid.kombind.anontation + +@Retention(AnnotationRetention.SOURCE) +@Target(AnnotationTarget.FIELD) +annotation class SimpleKombindAdapter(val layoutRes: Int) diff --git a/app/build.gradle b/app/build.gradle index abfed1a..9ecad9b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,6 +36,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + kapt { + generateStubs = true + } dataBinding { enabled = true } @@ -44,6 +47,9 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation project(':kombind') + compileOnly project(':anontation') + kapt project(':processor') + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.legacy:legacy-support-v4:$androidx_legacy_support_library_version" implementation "androidx.appcompat:appcompat:$androidx_appcompat" diff --git a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt index a35ad05..2b715f4 100644 --- a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt +++ b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt @@ -2,11 +2,13 @@ package com.umairjavid.kombindsample.ui.main import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager +import com.umairjavid.kombind.anontation.SimpleKombindAdapter import com.umairjavid.kombind.ui.KombindActivity import com.umairjavid.kombindsample.R import com.umairjavid.kombindsample.repo.SimpleItemRepository import kotlinx.android.synthetic.main.activity_main.* + class MainActivity : KombindActivity() { override val viewModelClass = MainViewModel::class.java override val layoutResId = R.layout.activity_main diff --git a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt index 9b92ea8..9f79068 100644 --- a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt @@ -3,16 +3,20 @@ package com.umairjavid.kombindsample.ui.main import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.umairjavid.kombind.anontation.SimpleKombindAdapter +import com.umairjavid.kombind.model.MutableLiveArrayList import com.umairjavid.kombind.ui.KombindViewModel +import com.umairjavid.kombindsample.R import com.umairjavid.kombindsample.model.SimpleHeader import com.umairjavid.kombindsample.model.SimpleItem import com.umairjavid.kombindsample.repo.SimpleItemRepository +import kotlinx.android.synthetic.main.activity_main.view.simple_item_list class MainViewModel(application: Application, private val simpleItemRepository: SimpleItemRepository) : KombindViewModel(application), SimpleItemAdapter.HeaderActionHandler, SimpleItemAdapter.ItemActionHandler { - val state = MainState() - + val state = MainState() + @SimpleKombindAdapter(R.id.simple_item_list) val data: MutableLiveArrayList = MutableLiveArrayList(mutableListOf()) init { loadItems() } diff --git a/build.gradle b/build.gradle index c6004e0..d9ae9f2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.android_plugin_version = '3.2.1' + ext.android_plugin_version = '3.3.2' ext.kotlin_version = '1.3.0' repositories { google() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5e54eca..6f42a4f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Nov 10 09:57:43 EST 2018 +#Thu Apr 04 16:49:20 EDT 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/processor/.gitignore b/processor/.gitignore new file mode 100644 index 0000000..8cdebca --- /dev/null +++ b/processor/.gitignore @@ -0,0 +1,29 @@ +/build +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Intellij +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/dictionaries +.idea/libraries + +# Freeline +freeline.py +freeline/ +freeline_project_description.json +.idea/misc.xml +.idea/runConfigurations.xml +.idea/vcs.xml +.idea/modules.xml diff --git a/processor/build.gradle b/processor/build.gradle new file mode 100644 index 0000000..16f8b64 --- /dev/null +++ b/processor/build.gradle @@ -0,0 +1,37 @@ +apply plugin: 'java-library' +apply plugin: 'kotlin' +apply plugin: 'kotlin-kapt' + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + kapt 'com.google.auto.service:auto-service:1.0-rc2' + implementation 'com.google.auto.service:auto-service:1.0-rc2' + implementation project(':anontation') + implementation 'com.squareup:kotlinpoet:1.2.0' +} + +sourceCompatibility = "7" +targetCompatibility = "7" +buildscript { + ext.kotlin_version = '1.3.21' + repositories { + mavenCentral() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} +repositories { + mavenCentral() +} +compileKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} +compileTestKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} diff --git a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt new file mode 100644 index 0000000..2142287 --- /dev/null +++ b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt @@ -0,0 +1,76 @@ +package com.umairjavid.kombind.processor + +import com.google.auto.service.AutoService +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.CodeBlock +import com.squareup.kotlinpoet.FileSpec +import com.squareup.kotlinpoet.FunSpec +import com.squareup.kotlinpoet.KModifier +import com.squareup.kotlinpoet.ParameterSpec +import com.squareup.kotlinpoet.TypeName +import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.TypeVariableName +import com.squareup.kotlinpoet.asTypeName +import com.umairjavid.kombind.anontation.SimpleKombindAdapter +import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy + +import java.io.File +import javax.annotation.processing.AbstractProcessor +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 javax.lang.model.util.ElementFilter + +@AutoService(Processor::class) +class AdapterProcessor : AbstractProcessor() { + override fun getSupportedAnnotationTypes() = mutableSetOf(SimpleKombindAdapter::class.java.name) + + override fun getSupportedSourceVersion() = SourceVersion.latestSupported() + + override fun process(typeElemnts: MutableSet?, roundEnv: RoundEnvironment?): Boolean { + val env = roundEnv!!.getElementsAnnotatedWith(SimpleKombindAdapter::class.java) + env.forEach { + val layoutRes = it.getAnnotation(SimpleKombindAdapter::class.java).layoutRes + if (it is VariableElement) + generateAdapterClass(it, layoutRes) + } + return false + } + + fun generateAdapterClass(element: VariableElement, layoutRes: Int) { + val kombindPackage = "com.umairjavid.kombind.ui" + val appPackageName = processingEnv.elementUtils.getPackageOf(element).simpleName.toString() + val kombindAdapterName = "KombindAdapter" + val viewHolder = "KombindAdapter.ViewHolder" + val fileName = element.simpleName + val className = "Gen_${fileName}_Adapter" + + val file = FileSpec.builder(appPackageName, className) + .addType(TypeSpec.classBuilder(className) + .primaryConstructor(FunSpec.constructorBuilder() + .addParameter("items", element.asType().asTypeName()).build() + ) + .addSuperclassConstructorParameter("items") + .addFunction(FunSpec.builder("getLayout") + .addModifiers(KModifier.OVERRIDE) + .addParameter(ParameterSpec.builder("position", Int::class).build()) + .addStatement("return $layoutRes") + .returns(Int::class) + .build()) + .superclass(ClassName(kombindPackage, kombindAdapterName).parameterizedBy(ClassName(kombindPackage, viewHolder)) + + ) + .build()) + .build() + val kaptKotlnGenDir = processingEnv.options[KAPT_KOTLIN_GENERATED_OPTION_NAME] + file.writeTo(File(kaptKotlnGenDir, "Gen$className")) + } + + companion object { + const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated" + } +} diff --git a/settings.gradle b/settings.gradle index d0f092e..c631396 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':kombind' +include ':app', ':kombind', ':processor', ':anontation' From ca18557b9f3661109f9df62c4674b4529d425f4e Mon Sep 17 00:00:00 2001 From: Robert Keazor Date: Sun, 14 Apr 2019 11:57:31 -0400 Subject: [PATCH 02/11] Fix Generated Adapter and add constructor parameters and overriden methods --- .../kombindsample/ui/main/MainActivity.kt | 4 +- .../kombindsample/ui/main/MainViewModel.kt | 1 - .../kombind/processor/AdapterProcessor.kt | 37 +++++++++++-------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt index 2b715f4..f0af909 100644 --- a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt +++ b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt @@ -2,12 +2,10 @@ package com.umairjavid.kombindsample.ui.main import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager -import com.umairjavid.kombind.anontation.SimpleKombindAdapter import com.umairjavid.kombind.ui.KombindActivity import com.umairjavid.kombindsample.R import com.umairjavid.kombindsample.repo.SimpleItemRepository -import kotlinx.android.synthetic.main.activity_main.* - +import kotlinx.android.synthetic.main.activity_main.simple_item_list class MainActivity : KombindActivity() { override val viewModelClass = MainViewModel::class.java diff --git a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt index 9f79068..c015397 100644 --- a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt @@ -10,7 +10,6 @@ import com.umairjavid.kombindsample.R import com.umairjavid.kombindsample.model.SimpleHeader import com.umairjavid.kombindsample.model.SimpleItem import com.umairjavid.kombindsample.repo.SimpleItemRepository -import kotlinx.android.synthetic.main.activity_main.view.simple_item_list class MainViewModel(application: Application, private val simpleItemRepository: SimpleItemRepository) : KombindViewModel(application), SimpleItemAdapter.HeaderActionHandler, diff --git a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt index 2142287..a7926f4 100644 --- a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt +++ b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt @@ -2,28 +2,24 @@ package com.umairjavid.kombind.processor import com.google.auto.service.AutoService import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.FileSpec import com.squareup.kotlinpoet.FunSpec import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.ParameterSpec +import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy +import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec -import com.squareup.kotlinpoet.TypeVariableName import com.squareup.kotlinpoet.asTypeName import com.umairjavid.kombind.anontation.SimpleKombindAdapter -import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy - import java.io.File import javax.annotation.processing.AbstractProcessor -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 javax.lang.model.util.ElementFilter + @AutoService(Processor::class) class AdapterProcessor : AbstractProcessor() { @@ -47,14 +43,25 @@ class AdapterProcessor : AbstractProcessor() { val kombindAdapterName = "KombindAdapter" val viewHolder = "KombindAdapter.ViewHolder" val fileName = element.simpleName - val className = "Gen_${fileName}_Adapter" + val className = "Kombind_${fileName}_Adapter" val file = FileSpec.builder(appPackageName, className) .addType(TypeSpec.classBuilder(className) .primaryConstructor(FunSpec.constructorBuilder() - .addParameter("items", element.asType().asTypeName()).build() + .addParameter("items", element.asType().asTypeName().checkForAnyType()) + .addParameter("handler", Any::class).build()) + .addProperty(PropertySpec.builder("handler", Any::class ) + .initializer("handler") + .addModifiers(KModifier.PRIVATE) + .build() ) .addSuperclassConstructorParameter("items") + .addFunction(FunSpec.builder("getHandler") + .addModifiers(KModifier.OVERRIDE) + .addParameter(ParameterSpec.builder("position", Int::class).build()) + .addStatement("return handler") + .build() + ) .addFunction(FunSpec.builder("getLayout") .addModifiers(KModifier.OVERRIDE) .addParameter(ParameterSpec.builder("position", Int::class).build()) @@ -62,15 +69,15 @@ class AdapterProcessor : AbstractProcessor() { .returns(Int::class) .build()) .superclass(ClassName(kombindPackage, kombindAdapterName).parameterizedBy(ClassName(kombindPackage, viewHolder)) - - ) - .build()) + ).build()) .build() val kaptKotlnGenDir = processingEnv.options[KAPT_KOTLIN_GENERATED_OPTION_NAME] file.writeTo(File(kaptKotlnGenDir, "Gen$className")) } - companion object { - const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated" - } + fun TypeName.checkForAnyType() = if (this.toString().equals("com.umairjavid.kombind.model.MutableLiveArrayList")) { + ClassName("com.umairjavid.kombind.model", "MutableLiveArrayList").parameterizedBy(ClassName("kotlin", "Any")) + } else this + + companion object { const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated" } } From 67c193060325cf11727bd97f264830d1d1327787 Mon Sep 17 00:00:00 2001 From: Robert Keazor Date: Sun, 14 Apr 2019 12:17:08 -0400 Subject: [PATCH 03/11] Fix Spacing --- .../java/com/umairjavid/kombind/processor/AdapterProcessor.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt index a7926f4..c7d9a30 100644 --- a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt +++ b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt @@ -76,8 +76,8 @@ class AdapterProcessor : AbstractProcessor() { } fun TypeName.checkForAnyType() = if (this.toString().equals("com.umairjavid.kombind.model.MutableLiveArrayList")) { - ClassName("com.umairjavid.kombind.model", "MutableLiveArrayList").parameterizedBy(ClassName("kotlin", "Any")) - } else this + ClassName("com.umairjavid.kombind.model", "MutableLiveArrayList").parameterizedBy(ClassName("kotlin", "Any")) + } else this companion object { const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated" } } From c21da9d7c36afc0fbe65b967fb1880ab4e583411 Mon Sep 17 00:00:00 2001 From: Robert Keazor Date: Sun, 14 Apr 2019 17:42:18 -0400 Subject: [PATCH 04/11] Remove unused MainViewModel.data, clean up Adapter Processor --- .../kombindsample/ui/main/MainViewModel.kt | 4 -- .../kombind/processor/AdapterProcessor.kt | 40 ++++++++++--------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt index c015397..ecd33b8 100644 --- a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainViewModel.kt @@ -3,10 +3,7 @@ package com.umairjavid.kombindsample.ui.main import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import com.umairjavid.kombind.anontation.SimpleKombindAdapter -import com.umairjavid.kombind.model.MutableLiveArrayList import com.umairjavid.kombind.ui.KombindViewModel -import com.umairjavid.kombindsample.R import com.umairjavid.kombindsample.model.SimpleHeader import com.umairjavid.kombindsample.model.SimpleItem import com.umairjavid.kombindsample.repo.SimpleItemRepository @@ -15,7 +12,6 @@ class MainViewModel(application: Application, private val simpleItemRepository: SimpleItemAdapter.HeaderActionHandler, SimpleItemAdapter.ItemActionHandler { val state = MainState() - @SimpleKombindAdapter(R.id.simple_item_list) val data: MutableLiveArrayList = MutableLiveArrayList(mutableListOf()) init { loadItems() } diff --git a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt index c7d9a30..e94b66c 100644 --- a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt +++ b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt @@ -19,7 +19,7 @@ import javax.annotation.processing.RoundEnvironment import javax.lang.model.SourceVersion import javax.lang.model.element.TypeElement import javax.lang.model.element.VariableElement - +import kotlin.reflect.KClass @AutoService(Processor::class) class AdapterProcessor : AbstractProcessor() { @@ -50,24 +50,10 @@ class AdapterProcessor : AbstractProcessor() { .primaryConstructor(FunSpec.constructorBuilder() .addParameter("items", element.asType().asTypeName().checkForAnyType()) .addParameter("handler", Any::class).build()) - .addProperty(PropertySpec.builder("handler", Any::class ) - .initializer("handler") - .addModifiers(KModifier.PRIVATE) - .build() - ) + .addProperty(generateConstructorProperty("handler", Any::class)) .addSuperclassConstructorParameter("items") - .addFunction(FunSpec.builder("getHandler") - .addModifiers(KModifier.OVERRIDE) - .addParameter(ParameterSpec.builder("position", Int::class).build()) - .addStatement("return handler") - .build() - ) - .addFunction(FunSpec.builder("getLayout") - .addModifiers(KModifier.OVERRIDE) - .addParameter(ParameterSpec.builder("position", Int::class).build()) - .addStatement("return $layoutRes") - .returns(Int::class) - .build()) + .addFunction(generateGetHandlerMethod()) + .addFunction(generateGetLayoutMethod(layoutRes)) .superclass(ClassName(kombindPackage, kombindAdapterName).parameterizedBy(ClassName(kombindPackage, viewHolder)) ).build()) .build() @@ -75,6 +61,24 @@ class AdapterProcessor : AbstractProcessor() { file.writeTo(File(kaptKotlnGenDir, "Gen$className")) } + private fun generateConstructorProperty(propertyName: String, propertyType: KClass<*>) = PropertySpec.builder(propertyName, propertyType) + .initializer(propertyName) + .addModifiers(KModifier.PRIVATE) + .build() + + private fun generateGetHandlerMethod() = FunSpec.builder("getHandler") + .addModifiers(KModifier.OVERRIDE) + .addParameter(ParameterSpec.builder("position", Int::class).build()) + .addStatement("return handler") + .build() + + private fun generateGetLayoutMethod(layoutRes: Int) = FunSpec.builder("getLayout") + .addModifiers(KModifier.OVERRIDE) + .addParameter(ParameterSpec.builder("position", Int::class).build()) + .addStatement("return $layoutRes") + .returns(Int::class) + .build() + fun TypeName.checkForAnyType() = if (this.toString().equals("com.umairjavid.kombind.model.MutableLiveArrayList")) { ClassName("com.umairjavid.kombind.model", "MutableLiveArrayList").parameterizedBy(ClassName("kotlin", "Any")) } else this From c5df267fa323a3b4962e944077eb9c66990ff388 Mon Sep 17 00:00:00 2001 From: Robert Keazor Date: Sun, 14 Apr 2019 20:53:31 -0400 Subject: [PATCH 05/11] Make Abstract when Layout Res is not specified with annotation. This is to allow the user to specify a multi layout Recyclerview adapter --- .../anontation/SimpleKombindAdapter.kt | 2 +- .../kombindsample/ui/main/MainActivity.kt | 11 ++++- .../kombindsample/ui/main/MainState.kt | 2 + .../kombind/processor/AdapterProcessor.kt | 47 +++++++++++++++---- 4 files changed, 49 insertions(+), 13 deletions(-) diff --git a/anontation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt b/anontation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt index b9155fc..5cfd3eb 100644 --- a/anontation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt +++ b/anontation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt @@ -2,4 +2,4 @@ package com.umairjavid.kombind.anontation @Retention(AnnotationRetention.SOURCE) @Target(AnnotationTarget.FIELD) -annotation class SimpleKombindAdapter(val layoutRes: Int) +annotation class SimpleKombindAdapter(val layoutRes: Int = 0) diff --git a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt index f0af909..0912aa4 100644 --- a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt +++ b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt @@ -4,8 +4,11 @@ import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager import com.umairjavid.kombind.ui.KombindActivity import com.umairjavid.kombindsample.R +import com.umairjavid.kombindsample.model.SimpleHeader import com.umairjavid.kombindsample.repo.SimpleItemRepository import kotlinx.android.synthetic.main.activity_main.simple_item_list +import main.Kombind_items_Adapter + class MainActivity : KombindActivity() { override val viewModelClass = MainViewModel::class.java @@ -21,8 +24,12 @@ class MainActivity : KombindActivity() { private fun setupSimpleItemList() { simple_item_list.apply { layoutManager = LinearLayoutManager(this@MainActivity) - adapter = SimpleItemAdapter(viewModel.state.items, viewModel) - .registerObserver(this@MainActivity) + adapter = object : Kombind_items_Adapter(viewModel.state.items, viewModel) { + override fun getLayout(position: Int) = when(items[position]) { + is SimpleHeader -> R.layout.item_simpleheader + else -> R.layout.item_simpleitem + } + } .registerObserver(this@MainActivity) } } } diff --git a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainState.kt b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainState.kt index 1c90a48..d65a6a3 100644 --- a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainState.kt +++ b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainState.kt @@ -1,10 +1,12 @@ package com.umairjavid.kombindsample.ui.main +import com.umairjavid.kombind.anontation.SimpleKombindAdapter import com.umairjavid.kombind.model.MutableLiveArrayList import com.umairjavid.kombind.model.MutableLiveField class MainState { val title = MutableLiveField("Items Loaded!") + @SimpleKombindAdapter val items = MutableLiveArrayList() operator fun invoke(func: MainState.() -> Unit) = func() diff --git a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt index e94b66c..2e8f56f 100644 --- a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt +++ b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt @@ -14,6 +14,8 @@ import com.squareup.kotlinpoet.asTypeName import com.umairjavid.kombind.anontation.SimpleKombindAdapter import java.io.File 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 @@ -23,6 +25,12 @@ import kotlin.reflect.KClass @AutoService(Processor::class) class AdapterProcessor : AbstractProcessor() { + lateinit var messenge: Messager + + override fun init(env: ProcessingEnvironment?) { + super.init(env) + messenge = env!!.messager + } override fun getSupportedAnnotationTypes() = mutableSetOf(SimpleKombindAdapter::class.java.name) override fun getSupportedSourceVersion() = SourceVersion.latestSupported() @@ -47,13 +55,15 @@ class AdapterProcessor : AbstractProcessor() { val file = FileSpec.builder(appPackageName, className) .addType(TypeSpec.classBuilder(className) + .makeAbstractIfTrue(layoutRes == 0) .primaryConstructor(FunSpec.constructorBuilder() + .addParameter("items", element.asType().asTypeName().checkForAnyType()) .addParameter("handler", Any::class).build()) .addProperty(generateConstructorProperty("handler", Any::class)) .addSuperclassConstructorParameter("items") .addFunction(generateGetHandlerMethod()) - .addFunction(generateGetLayoutMethod(layoutRes)) + .addFunction(if (layoutRes == 0) generateAbstractGetLayoutMethod() else generateGetLayoutMethod(layoutRes)) .superclass(ClassName(kombindPackage, kombindAdapterName).parameterizedBy(ClassName(kombindPackage, viewHolder)) ).build()) .build() @@ -62,26 +72,43 @@ class AdapterProcessor : AbstractProcessor() { } private fun generateConstructorProperty(propertyName: String, propertyType: KClass<*>) = PropertySpec.builder(propertyName, propertyType) - .initializer(propertyName) - .addModifiers(KModifier.PRIVATE) - .build() + .initializer(propertyName) + .addModifiers(KModifier.PRIVATE) + .build() private fun generateGetHandlerMethod() = FunSpec.builder("getHandler") - .addModifiers(KModifier.OVERRIDE) - .addParameter(ParameterSpec.builder("position", Int::class).build()) - .addStatement("return handler") - .build() + .addModifiers(KModifier.OVERRIDE) + .addParameter(ParameterSpec.builder("position", Int::class).build()) + .addStatement("return handler") + .build() - private fun generateGetLayoutMethod(layoutRes: Int) = FunSpec.builder("getLayout") + private fun generateGetLayoutMethod(layoutRes: Int): FunSpec { + return FunSpec.builder("getLayout") .addModifiers(KModifier.OVERRIDE) .addParameter(ParameterSpec.builder("position", Int::class).build()) .addStatement("return $layoutRes") .returns(Int::class) .build() + } + + private fun generateAbstractGetLayoutMethod() = + FunSpec.builder("getLayout") + .addModifiers(KModifier.OVERRIDE, KModifier.ABSTRACT) + .addParameter(ParameterSpec.builder("position", Int::class).build()) + .returns(Int::class) + .build() - fun TypeName.checkForAnyType() = if (this.toString().equals("com.umairjavid.kombind.model.MutableLiveArrayList")) { + + private fun TypeName.checkForAnyType() = if (this.toString().equals("com.umairjavid.kombind.model.MutableLiveArrayList")) { ClassName("com.umairjavid.kombind.model", "MutableLiveArrayList").parameterizedBy(ClassName("kotlin", "Any")) } else this + private fun TypeSpec.Builder.makeAbstractIfTrue(isAbstract: Boolean) = if (isAbstract) { + + this.addModifiers(KModifier.ABSTRACT) + } else this + + private fun TypeName.isKombindType() = this.toString().startsWith("com.umairjavid.kombind") + companion object { const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated" } } From 1ceeb52e8db4ce0bd9f87ff2b33197f19dcadc7a Mon Sep 17 00:00:00 2001 From: Robert Keazor Date: Fri, 19 Apr 2019 00:19:48 -0400 Subject: [PATCH 06/11] Add conidition to make sure that element is of type MutableLiveArrayList<*>.Update build.gradle --- build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 4 ++-- kombind/build.gradle | 6 ++---- .../umairjavid/kombind/ui/DialogFragmentBuilder.kt | 4 ++-- .../umairjavid/kombind/ui/KombindDialogFragment.kt | 14 +++++++------- .../kombind/processor/AdapterProcessor.kt | 10 +++++++--- 6 files changed, 22 insertions(+), 20 deletions(-) diff --git a/build.gradle b/build.gradle index d9ae9f2..98f7055 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.android_plugin_version = '3.3.2' - ext.kotlin_version = '1.3.0' + ext.android_plugin_version = '3.4.0' + ext.kotlin_version = '1.3.30' repositories { google() jcenter() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6f42a4f..277ee54 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Apr 04 16:49:20 EDT 2019 +#Thu Apr 18 00:03:04 EDT 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/kombind/build.gradle b/kombind/build.gradle index afd9684..1c8e559 100644 --- a/kombind/build.gradle +++ b/kombind/build.gradle @@ -8,7 +8,6 @@ group = 'com.github.ujavid' project.ext { compileSdkVersion = 28 - buildToolsVersion = '28.0.3' minSdkVersion = 14 targetSdkVersion = 28 versionCode = 1 @@ -16,7 +15,7 @@ project.ext { support_library_version = '27.1.1' androidx_appcompat = '1.0.2' - android_material = '1.1.0-alpha01' + android_material = '1.1.0-alpha05' lifecycle_version = '2.0.0' junit_version = '4.12' test_runner_version = '1.1.0' @@ -25,7 +24,6 @@ project.ext { android { compileSdkVersion project.ext.compileSdkVersion - buildToolsVersion project.ext.buildToolsVersion defaultConfig { minSdkVersion project.ext.minSdkVersion targetSdkVersion project.ext.targetSdkVersion @@ -54,7 +52,7 @@ dependencies { task sourcesJar(type: Jar) { from android.sourceSets.main.java.srcDirs - classifier 'sources' + archiveClassifier.set("sources") } artifacts { diff --git a/kombind/src/main/java/com/umairjavid/kombind/ui/DialogFragmentBuilder.kt b/kombind/src/main/java/com/umairjavid/kombind/ui/DialogFragmentBuilder.kt index a6dc133..a67ac2a 100644 --- a/kombind/src/main/java/com/umairjavid/kombind/ui/DialogFragmentBuilder.kt +++ b/kombind/src/main/java/com/umairjavid/kombind/ui/DialogFragmentBuilder.kt @@ -10,7 +10,7 @@ open class DialogFragmentBuilder(private val clazz: Class val fragment = clazz.newInstance() fragment.arguments = arguments return fragment - } catch (e: java.lang.InstantiationException) { + } catch (e: InstantiationException) { throw RuntimeException(e) } catch (e: IllegalAccessException) { throw RuntimeException(e) @@ -27,7 +27,7 @@ open class DialogFragmentBuilder(private val clazz: Class val fragment = fragmentManager.findFragmentByTag(fragmentTag) return if (fragment != null) { - clazz.cast(fragment) + clazz.cast(fragment)!! } else { forceShow(fragmentManager) } diff --git a/kombind/src/main/java/com/umairjavid/kombind/ui/KombindDialogFragment.kt b/kombind/src/main/java/com/umairjavid/kombind/ui/KombindDialogFragment.kt index 811bb90..41d6957 100644 --- a/kombind/src/main/java/com/umairjavid/kombind/ui/KombindDialogFragment.kt +++ b/kombind/src/main/java/com/umairjavid/kombind/ui/KombindDialogFragment.kt @@ -1,17 +1,17 @@ package com.umairjavid.kombind.ui import android.app.Dialog -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.ViewModelProviders -import androidx.databinding.DataBindingUtil -import androidx.databinding.ViewDataBinding import android.os.Bundle -import androidx.fragment.app.DialogFragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.Window +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding import androidx.databinding.library.baseAdapters.BR +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelProviders import com.umairjavid.kombind.ext.registerViewActionObserver abstract class KombindDialogFragment : DialogFragment() { @@ -28,7 +28,7 @@ abstract class KombindDialogFragment : DialogFragment() { viewModel.activityViewModel = (activity as KombindActivity<*>).viewModel viewBinding = DataBindingUtil.inflate(inflater, layoutResId, container, false) viewBinding.setVariable(BR.viewModel, viewModel) - viewBinding.setLifecycleOwner(this) + viewBinding.lifecycleOwner = this registerViewActionObserver(viewModel.viewAction) return viewBinding.root } @@ -43,7 +43,7 @@ abstract class KombindDialogFragment : DialogFragment() { super.onViewStateRestored(savedInstanceState) val width = resources.displayMetrics.widthPixels - dialog.window?.setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT) + dialog!!.window?.setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT) } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { diff --git a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt index 2e8f56f..d4079b4 100644 --- a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt +++ b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt @@ -21,6 +21,7 @@ import javax.annotation.processing.RoundEnvironment import javax.lang.model.SourceVersion import javax.lang.model.element.TypeElement import javax.lang.model.element.VariableElement +import javax.tools.Diagnostic import kotlin.reflect.KClass @AutoService(Processor::class) @@ -46,18 +47,21 @@ class AdapterProcessor : AbstractProcessor() { } fun generateAdapterClass(element: VariableElement, layoutRes: Int) { + if (!element.asType().asTypeName().isMutableLiveArraylist()) { + messenge.printMessage(Diagnostic.Kind.ERROR, "Needs to be of type MutableArrayList") + return + } + val kombindPackage = "com.umairjavid.kombind.ui" val appPackageName = processingEnv.elementUtils.getPackageOf(element).simpleName.toString() val kombindAdapterName = "KombindAdapter" val viewHolder = "KombindAdapter.ViewHolder" val fileName = element.simpleName val className = "Kombind_${fileName}_Adapter" - val file = FileSpec.builder(appPackageName, className) .addType(TypeSpec.classBuilder(className) .makeAbstractIfTrue(layoutRes == 0) .primaryConstructor(FunSpec.constructorBuilder() - .addParameter("items", element.asType().asTypeName().checkForAnyType()) .addParameter("handler", Any::class).build()) .addProperty(generateConstructorProperty("handler", Any::class)) @@ -108,7 +112,7 @@ class AdapterProcessor : AbstractProcessor() { this.addModifiers(KModifier.ABSTRACT) } else this - private fun TypeName.isKombindType() = this.toString().startsWith("com.umairjavid.kombind") + private fun TypeName.isMutableLiveArraylist() = this.toString().startsWith("com.umairjavid.kombind.model.MutableLiveArrayList") companion object { const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated" } } From 73044666def65bbb17360c672590e34fb31790ac Mon Sep 17 00:00:00 2001 From: Robert Keazor Date: Sat, 20 Apr 2019 01:45:06 -0400 Subject: [PATCH 07/11] 1.) Fix module misspelling (annotation module) 2.) Remove redundant build.gradle kotlin dependency 3.) Update generated class name --- .idea/caches/build_file_checksums.ser | Bin 0 -> 653 bytes .idea/encodings.xml | 6 ++++++ {anontation => annotation}/.gitignore | 0 {anontation => annotation}/build.gradle | 0 .../kombind/anontation/SimpleKombindAdapter.kt | 0 app/build.gradle | 2 +- .../kombindsample/ui/main/MainActivity.kt | 4 ++-- processor/build.gradle | 7 ++----- .../kombind/processor/AdapterProcessor.kt | 6 ++++-- settings.gradle | 2 +- 10 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 .idea/caches/build_file_checksums.ser create mode 100644 .idea/encodings.xml rename {anontation => annotation}/.gitignore (100%) rename {anontation => annotation}/build.gradle (100%) rename {anontation => annotation}/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt (100%) diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser new file mode 100644 index 0000000000000000000000000000000000000000..ed13fbfbf99bb678e37326c304b06687aab687f5 GIT binary patch literal 653 zcmZ4UmVvdnh`~NNKUXg?FQq6yGexf?KR>5fFEb@IQ7^qHF(oHeub?PDD>b=9F91S2 zm1gFoxMk*~I%lLNXBU^|7Q2L-Ts|(GuF1r}QPHR4k|6tb`5(ZuU(BjmhV*R50B%tE#)WoX%B7LYO`iSty zFzJeH&&_^@O)M`PIA^^1;Z#?`AfA|)mtT@tl9``}!>RYZ{(ioly4_^M#IiV!&Bk0M z3}Qe>CZ`q`1MS4_JG+LgxD&~F(?n;KEOwve=v~4fh{sX6Z_KB3Ic?@rRNk<`bMEDh ez_3UxD8ONKkK*a}+aKq?U3`@9_}vcOZxsMU8|!5N literal 0 HcmV?d00001 diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/anontation/.gitignore b/annotation/.gitignore similarity index 100% rename from anontation/.gitignore rename to annotation/.gitignore diff --git a/anontation/build.gradle b/annotation/build.gradle similarity index 100% rename from anontation/build.gradle rename to annotation/build.gradle diff --git a/anontation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt b/annotation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt similarity index 100% rename from anontation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt rename to annotation/src/main/java/com/umairjavid/kombind/anontation/SimpleKombindAdapter.kt diff --git a/app/build.gradle b/app/build.gradle index 9ecad9b..2a9aaee 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation project(':kombind') - compileOnly project(':anontation') + compileOnly project(':annotation') kapt project(':processor') implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" diff --git a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt index 0912aa4..18482ea 100644 --- a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt +++ b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt @@ -7,7 +7,7 @@ import com.umairjavid.kombindsample.R import com.umairjavid.kombindsample.model.SimpleHeader import com.umairjavid.kombindsample.repo.SimpleItemRepository import kotlinx.android.synthetic.main.activity_main.simple_item_list -import main.Kombind_items_Adapter +import main.KombindItemsAdapter class MainActivity : KombindActivity() { @@ -24,7 +24,7 @@ class MainActivity : KombindActivity() { private fun setupSimpleItemList() { simple_item_list.apply { layoutManager = LinearLayoutManager(this@MainActivity) - adapter = object : Kombind_items_Adapter(viewModel.state.items, viewModel) { + adapter = object : KombindItemsAdapter(viewModel.state.items, viewModel) { override fun getLayout(position: Int) = when(items[position]) { is SimpleHeader -> R.layout.item_simpleheader else -> R.layout.item_simpleitem diff --git a/processor/build.gradle b/processor/build.gradle index 16f8b64..b888386 100644 --- a/processor/build.gradle +++ b/processor/build.gradle @@ -7,20 +7,17 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" kapt 'com.google.auto.service:auto-service:1.0-rc2' implementation 'com.google.auto.service:auto-service:1.0-rc2' - implementation project(':anontation') + implementation project(':annotation') implementation 'com.squareup:kotlinpoet:1.2.0' } sourceCompatibility = "7" targetCompatibility = "7" buildscript { - ext.kotlin_version = '1.3.21' repositories { mavenCentral() } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } + } repositories { mavenCentral() diff --git a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt index d4079b4..6cb552c 100644 --- a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt +++ b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt @@ -56,8 +56,8 @@ class AdapterProcessor : AbstractProcessor() { val appPackageName = processingEnv.elementUtils.getPackageOf(element).simpleName.toString() val kombindAdapterName = "KombindAdapter" val viewHolder = "KombindAdapter.ViewHolder" - val fileName = element.simpleName - val className = "Kombind_${fileName}_Adapter" + val elementName = element.simpleName + val className = "Kombind${elementName.toString().capitalize()}Adapter" val file = FileSpec.builder(appPackageName, className) .addType(TypeSpec.classBuilder(className) .makeAbstractIfTrue(layoutRes == 0) @@ -102,6 +102,8 @@ class AdapterProcessor : AbstractProcessor() { .returns(Int::class) .build() + private fun String.capitalize() = this.substring(0..0).toUpperCase() + this.substring(1) + private fun TypeName.checkForAnyType() = if (this.toString().equals("com.umairjavid.kombind.model.MutableLiveArrayList")) { ClassName("com.umairjavid.kombind.model", "MutableLiveArrayList").parameterizedBy(ClassName("kotlin", "Any")) diff --git a/settings.gradle b/settings.gradle index c631396..5379f76 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':kombind', ':processor', ':anontation' +include ':app', ':kombind', ':processor', ':annotation' From 78d0e089e655cdc86d54f549b66c4c131d112dc8 Mon Sep 17 00:00:00 2001 From: Robert Keazor Date: Sat, 20 Apr 2019 08:24:25 -0400 Subject: [PATCH 08/11] Add enclosing class name as generated class signiture --- .../kombindsample/ui/main/MainActivity.kt | 4 +-- .../kombind/processor/AdapterProcessor.kt | 27 ++++++++++++------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt index 18482ea..2f8b9f8 100644 --- a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt +++ b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt @@ -7,7 +7,7 @@ import com.umairjavid.kombindsample.R import com.umairjavid.kombindsample.model.SimpleHeader import com.umairjavid.kombindsample.repo.SimpleItemRepository import kotlinx.android.synthetic.main.activity_main.simple_item_list -import main.KombindItemsAdapter +import main.KombindItemsAdapter_MainState class MainActivity : KombindActivity() { @@ -24,7 +24,7 @@ class MainActivity : KombindActivity() { private fun setupSimpleItemList() { simple_item_list.apply { layoutManager = LinearLayoutManager(this@MainActivity) - adapter = object : KombindItemsAdapter(viewModel.state.items, viewModel) { + adapter = object : KombindItemsAdapter_MainState(viewModel.state.items, viewModel) { override fun getLayout(position: Int) = when(items[position]) { is SimpleHeader -> R.layout.item_simpleheader else -> R.layout.item_simpleitem diff --git a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt index 6cb552c..2c8ffa0 100644 --- a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt +++ b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt @@ -26,11 +26,12 @@ import kotlin.reflect.KClass @AutoService(Processor::class) class AdapterProcessor : AbstractProcessor() { - lateinit var messenge: Messager + lateinit var messenger: Messager + val genaratedClassSet = mutableSetOf() override fun init(env: ProcessingEnvironment?) { super.init(env) - messenge = env!!.messager + messenger = env!!.messager } override fun getSupportedAnnotationTypes() = mutableSetOf(SimpleKombindAdapter::class.java.name) @@ -48,7 +49,7 @@ class AdapterProcessor : AbstractProcessor() { fun generateAdapterClass(element: VariableElement, layoutRes: Int) { if (!element.asType().asTypeName().isMutableLiveArraylist()) { - messenge.printMessage(Diagnostic.Kind.ERROR, "Needs to be of type MutableArrayList") + messenger.printMessage(Diagnostic.Kind.ERROR, "Needs to be of type MutableArrayList") return } @@ -57,7 +58,15 @@ class AdapterProcessor : AbstractProcessor() { val kombindAdapterName = "KombindAdapter" val viewHolder = "KombindAdapter.ViewHolder" val elementName = element.simpleName - val className = "Kombind${elementName.toString().capitalize()}Adapter" + val enclosingClassName = element.enclosingElement.simpleName + val className = "Kombind${elementName.toString().capitalize()}Adapter_${enclosingClassName}" + + if (genaratedClassSet.contains(className)) { + messenger.printMessage(Diagnostic.Kind.ERROR, "Properties with sig not allowed,consider combinding both types into one adapter") + return + } + genaratedClassSet.add(className) + val file = FileSpec.builder(appPackageName, className) .addType(TypeSpec.classBuilder(className) .makeAbstractIfTrue(layoutRes == 0) @@ -87,7 +96,7 @@ class AdapterProcessor : AbstractProcessor() { .build() private fun generateGetLayoutMethod(layoutRes: Int): FunSpec { - return FunSpec.builder("getLayout") + return FunSpec.builder("getLayout") .addModifiers(KModifier.OVERRIDE) .addParameter(ParameterSpec.builder("position", Int::class).build()) .addStatement("return $layoutRes") @@ -97,10 +106,10 @@ class AdapterProcessor : AbstractProcessor() { private fun generateAbstractGetLayoutMethod() = FunSpec.builder("getLayout") - .addModifiers(KModifier.OVERRIDE, KModifier.ABSTRACT) - .addParameter(ParameterSpec.builder("position", Int::class).build()) - .returns(Int::class) - .build() + .addModifiers(KModifier.OVERRIDE, KModifier.ABSTRACT) + .addParameter(ParameterSpec.builder("position", Int::class).build()) + .returns(Int::class) + .build() private fun String.capitalize() = this.substring(0..0).toUpperCase() + this.substring(1) From f7f701aa05b51e332cca350ddfaafc242de0ff6b Mon Sep 17 00:00:00 2001 From: Robert Keazor Date: Sun, 21 Apr 2019 12:19:27 -0400 Subject: [PATCH 09/11] Rename Generated class name to: KombindAdater_[EnclosingClass]_[VariableName] --- .idea/caches/build_file_checksums.ser | Bin 653 -> 653 bytes .../kombindsample/ui/main/MainActivity.kt | 5 ++--- .../kombind/processor/AdapterProcessor.kt | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index ed13fbfbf99bb678e37326c304b06687aab687f5..9a5e0fa422f919502ebd8e1a1c98fa88ce71f49b 100644 GIT binary patch delta 36 ucmV+<0NekK1&sxem;^wov$e6Dg#i%V`dF#+Tx*gPV8)I)Cx4xjF#=pJQVM`(`e(IRz?B4hOD>~$$8U6XOt{() { override val viewModelClass = MainViewModel::class.java @@ -24,7 +23,7 @@ class MainActivity : KombindActivity() { private fun setupSimpleItemList() { simple_item_list.apply { layoutManager = LinearLayoutManager(this@MainActivity) - adapter = object : KombindItemsAdapter_MainState(viewModel.state.items, viewModel) { + adapter = object : KombindAdapter_MainState_Items(viewModel.state.items, viewModel) { override fun getLayout(position: Int) = when(items[position]) { is SimpleHeader -> R.layout.item_simpleheader else -> R.layout.item_simpleitem diff --git a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt index 2c8ffa0..34b4b44 100644 --- a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt +++ b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt @@ -59,7 +59,7 @@ class AdapterProcessor : AbstractProcessor() { val viewHolder = "KombindAdapter.ViewHolder" val elementName = element.simpleName val enclosingClassName = element.enclosingElement.simpleName - val className = "Kombind${elementName.toString().capitalize()}Adapter_${enclosingClassName}" + val className = "KombindAdapter_${enclosingClassName.toString().capitalize()}_${elementName.toString().capitalize()}" if (genaratedClassSet.contains(className)) { messenger.printMessage(Diagnostic.Kind.ERROR, "Properties with sig not allowed,consider combinding both types into one adapter") From 257862210cae8278d74f920ed32368bc5dd84206 Mon Sep 17 00:00:00 2001 From: Robert Keazor Date: Sun, 21 Apr 2019 12:23:30 -0400 Subject: [PATCH 10/11] Revert "Rename Generated class name to: KombindAdater_[EnclosingClass]_[VariableName]" This reverts commit f7f701aa05b51e332cca350ddfaafc242de0ff6b. --- .idea/caches/build_file_checksums.ser | Bin 653 -> 653 bytes .../kombindsample/ui/main/MainActivity.kt | 5 +++-- .../kombind/processor/AdapterProcessor.kt | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 9a5e0fa422f919502ebd8e1a1c98fa88ce71f49b..ed13fbfbf99bb678e37326c304b06687aab687f5 100644 GIT binary patch delta 36 scmeBW?PZ-XgT>M`(`e(IRz?B4hOD>~$$8U6XOt{() { override val viewModelClass = MainViewModel::class.java @@ -23,7 +24,7 @@ class MainActivity : KombindActivity() { private fun setupSimpleItemList() { simple_item_list.apply { layoutManager = LinearLayoutManager(this@MainActivity) - adapter = object : KombindAdapter_MainState_Items(viewModel.state.items, viewModel) { + adapter = object : KombindItemsAdapter_MainState(viewModel.state.items, viewModel) { override fun getLayout(position: Int) = when(items[position]) { is SimpleHeader -> R.layout.item_simpleheader else -> R.layout.item_simpleitem diff --git a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt index 34b4b44..2c8ffa0 100644 --- a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt +++ b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt @@ -59,7 +59,7 @@ class AdapterProcessor : AbstractProcessor() { val viewHolder = "KombindAdapter.ViewHolder" val elementName = element.simpleName val enclosingClassName = element.enclosingElement.simpleName - val className = "KombindAdapter_${enclosingClassName.toString().capitalize()}_${elementName.toString().capitalize()}" + val className = "Kombind${elementName.toString().capitalize()}Adapter_${enclosingClassName}" if (genaratedClassSet.contains(className)) { messenger.printMessage(Diagnostic.Kind.ERROR, "Properties with sig not allowed,consider combinding both types into one adapter") From e19de55effd087c601adf431e5750cc9a9f385f0 Mon Sep 17 00:00:00 2001 From: Robert Keazor Date: Sun, 21 Apr 2019 12:32:09 -0400 Subject: [PATCH 11/11] Rename Generated class name to: KombindAdater_[EnclosingClass]_[VariableName] --- .../com/umairjavid/kombindsample/ui/main/MainActivity.kt | 5 ++--- .../com/umairjavid/kombind/processor/AdapterProcessor.kt | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt index 2f8b9f8..c8999bb 100644 --- a/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt +++ b/app/src/main/java/com/umairjavid/kombindsample/ui/main/MainActivity.kt @@ -7,8 +7,7 @@ import com.umairjavid.kombindsample.R import com.umairjavid.kombindsample.model.SimpleHeader import com.umairjavid.kombindsample.repo.SimpleItemRepository import kotlinx.android.synthetic.main.activity_main.simple_item_list -import main.KombindItemsAdapter_MainState - +import main.KombindAdapter_MainState_Items class MainActivity : KombindActivity() { override val viewModelClass = MainViewModel::class.java @@ -24,7 +23,7 @@ class MainActivity : KombindActivity() { private fun setupSimpleItemList() { simple_item_list.apply { layoutManager = LinearLayoutManager(this@MainActivity) - adapter = object : KombindItemsAdapter_MainState(viewModel.state.items, viewModel) { + adapter = object :KombindAdapter_MainState_Items(viewModel.state.items, viewModel) { override fun getLayout(position: Int) = when(items[position]) { is SimpleHeader -> R.layout.item_simpleheader else -> R.layout.item_simpleitem diff --git a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt index 2c8ffa0..34b4b44 100644 --- a/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt +++ b/processor/src/main/java/com/umairjavid/kombind/processor/AdapterProcessor.kt @@ -59,7 +59,7 @@ class AdapterProcessor : AbstractProcessor() { val viewHolder = "KombindAdapter.ViewHolder" val elementName = element.simpleName val enclosingClassName = element.enclosingElement.simpleName - val className = "Kombind${elementName.toString().capitalize()}Adapter_${enclosingClassName}" + val className = "KombindAdapter_${enclosingClassName.toString().capitalize()}_${elementName.toString().capitalize()}" if (genaratedClassSet.contains(className)) { messenger.printMessage(Diagnostic.Kind.ERROR, "Properties with sig not allowed,consider combinding both types into one adapter")