From bca5227b41345394609280a017f0a594c00e45ad Mon Sep 17 00:00:00 2001 From: Marcin Date: Mon, 1 Jan 2018 08:26:32 +0100 Subject: [PATCH] Introduce mechanism for saving state in Kotlin --- README.md | 6 +- .../compiler/generation/ActivityGeneration.kt | 45 ++++++--- .../compiler/generation/FragmentGeneration.kt | 37 +++++--- .../compiler/generation/IntentBinding.kt | 2 +- .../compiler/model/param/ArgumentModel.kt | 1 - .../compiler/model/param/FieldAccessType.kt | 8 ++ .../compiler/model/param/FieldAccessor.kt | 37 ++++---- .../compiler/processing/ArgumentFactory.kt | 2 +- .../java/activitystarter/ActivityStarter.java | 12 --- .../{GetterTest.kt => ByAccessorsTest.kt} | 7 +- .../activity/ConflictedOptional | 19 ++-- generationExamples/activity/EmptyAnnotated | 6 +- generationExamples/activity/MultipleOptional | 20 ++-- generationExamples/activity/Optional | 10 +- generationExamples/activity/SetterGetter | 14 ++- generationExamples/activity/Simple | 12 ++- .../activityForResult/ConflictedOptional | 18 ++-- .../activityForResult/EmptyAnnotated | 6 +- .../activityForResult/MultipleOptional | 18 ++-- generationExamples/activityForResult/Optional | 12 ++- .../activityForResult/SetterGetter | 12 ++- generationExamples/activityForResult/Simple | 12 ++- .../activityNonSavable/SetterGetter | 2 +- generationExamples/getter/GetterSetter | 95 +++++++++++++++++++ generationExamples/getter/Single | 1 - sample/app/src/main/AndroidManifest.xml | 2 +- .../fragment/TabbedPlaceholderFragment.java | 2 +- .../savetest/NonSavingActivity.java | 2 +- .../marcinmoskala/kotlinapp/BaseActivity.kt | 2 +- .../marcinmoskala/kotlinapp/MainActivity.kt | 6 ++ .../fragment/TabbedPlaceholderFragment.kt | 2 +- .../kotlinapp/savetest/NonSavingActivity.kt | 11 ++- .../kotlinapp/savetest/SavingActivity.kt | 19 ++-- .../src/main/res/layout/activity_main.xml | 7 ++ 34 files changed, 325 insertions(+), 142 deletions(-) create mode 100644 activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/FieldAccessType.kt rename activitystarter/src/test/java/activitystarter/generation/{GetterTest.kt => ByAccessorsTest.kt} (61%) create mode 100644 generationExamples/getter/GetterSetter diff --git a/README.md b/README.md index c209158..5d6a3f8 100755 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ public class MainActivity extends BaseActivity { } ``` -And `ActivityStarter.fill(this);` in BaseActivity: +And `ActivityStarter.fill(this, savedInstanceState);` in BaseActivity: ```java class BaseActivity extends AppCompatActivity { @@ -56,7 +56,7 @@ class BaseActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - ActivityStarter.fill(this); + ActivityStarter.fill(this, savedInstanceState); } @Override // This is optional, only when we want to keep arguments changes in case of rotation etc. @@ -120,7 +120,7 @@ class StudentDataActivity : BaseActivity() { } ``` -Values are taken lazily and kept as fields, but there are still saved if `ActivityStarter.save(this)` is called in`onSaveInstanceState`. When all properties are provided by delegate, then there is no need to call `ActivityStarter.fill(this)` in `onCreate`. +Values are taken lazily and kept as fields, but there are still saved if `ActivityStarter.save(this)` is called in`onSaveInstanceState`. When all properties are provided by delegate, then there is no need to call `ActivityStarter.fill(this, savedInstanceState)` in `onCreate`. ## Parceler diff --git a/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/ActivityGeneration.kt b/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/ActivityGeneration.kt index 4c1fd56..97b0775 100755 --- a/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/ActivityGeneration.kt +++ b/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/ActivityGeneration.kt @@ -2,6 +2,7 @@ package activitystarter.compiler.generation import activitystarter.compiler.model.classbinding.ClassModel import activitystarter.compiler.model.param.ArgumentModel +import activitystarter.compiler.model.param.FieldAccessType.* import activitystarter.compiler.utils.* import com.squareup.javapoet.MethodSpec import com.squareup.javapoet.TypeName @@ -26,26 +27,42 @@ internal class ActivityGeneration(classModel: ClassModel) : IntentBinding(classM override fun TypeSpec.Builder.addExtraToClass() = this .addMethod(createSaveMethod()) - .addNoSettersAccessors() + .addKotlinSettersAccessors() private fun MethodSpec.Builder.addFieldSettersCode() { - addStatement("\$T intent = activity.getIntent()", INTENT) if (classModel.savable) { - for (arg in classModel.argumentModels) { - arg.accessor.makeSetter("") ?: return - val bundleName = "savedInstanceState" - val bundlePredicate = getBundlePredicate(bundleName, arg.keyFieldName) - addCode("if($bundleName != null && $bundlePredicate) {\n") - addBundleSetter(arg, bundleName, "activity", false) - addCode("} else {") - addIntentSetter(arg, "activity") - addCode("}") + val bundleName = "savedInstanceState" + val settableArgs = classModel.argumentModels.filter { it.accessor.isSettable() } + val (fromGetterAccessors, byPropertyAccessors) = settableArgs.partition { it.accessor.fromGetter } + if (byPropertyAccessors.isNotEmpty()) { + addStatement("\$T intent = activity.getIntent()", INTENT) } + byPropertyAccessors.forEach { arg -> addArgumentAndSavedStateSetters(arg, bundleName) } + fromGetterAccessors.forEach { arg -> addSavedStateSetters(arg, bundleName) } } else { - addIntentSetters("activity") + addStatement("\$T intent = activity.getIntent()", INTENT) + classModel.argumentModels + .filter { !it.accessor.fromGetter } + .forEach { arg -> addIntentSetter(arg, "activity") } } } + private fun MethodSpec.Builder.addArgumentAndSavedStateSetters(arg: ArgumentModel, bundleName: String) { + val bundlePredicate = getBundlePredicate(bundleName, arg.keyFieldName) + addCode("if($bundleName != null && $bundlePredicate) {\n ") + addBundleSetter(arg, bundleName, "activity", false) + addCode("} else { \n ") + addIntentSetter(arg, "activity") + addCode("} \n") + } + + private fun MethodSpec.Builder.addSavedStateSetters(arg: ArgumentModel, bundleName: String) { + val bundlePredicate = getBundlePredicate(bundleName, arg.keyFieldName) + addCode("if($bundleName != null && $bundlePredicate) {\n ") + addBundleSetter(arg, bundleName, "activity", false) + addCode("} \n") + } + private fun createSaveMethod(): MethodSpec = this .builderWithCreationBasicFieldsNoContext("save") .addParameter(classModel.targetTypeName, "activity") @@ -84,8 +101,8 @@ internal class ActivityGeneration(classModel: ClassModel) : IntentBinding(classM .addStatement("context.startActivityForResult(intent, result)") .build() - private fun TypeSpec.Builder.addNoSettersAccessors(): TypeSpec.Builder = apply { - classModel.argumentModels.filter { it.noSetter }.forEach { arg -> + private fun TypeSpec.Builder.addKotlinSettersAccessors(): TypeSpec.Builder = apply { + classModel.argumentModels.filter { it.accessor.fromGetter }.forEach { arg -> addMethod(buildCheckValueMethod(arg)) addMethod(buildGetValueMethod(arg)) } diff --git a/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/FragmentGeneration.kt b/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/FragmentGeneration.kt index ceabbcf..65705b7 100755 --- a/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/FragmentGeneration.kt +++ b/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/FragmentGeneration.kt @@ -2,6 +2,7 @@ package activitystarter.compiler.generation import activitystarter.compiler.model.classbinding.ClassModel import activitystarter.compiler.model.param.ArgumentModel +import activitystarter.compiler.model.param.FieldAccessType import activitystarter.compiler.utils.BUNDLE import activitystarter.compiler.utils.doIf import com.squareup.javapoet.MethodSpec @@ -27,23 +28,37 @@ internal class FragmentGeneration(classModel: ClassModel) : ClassGeneration(clas .addNoSettersAccessors() private fun MethodSpec.Builder.addFieldSettersCode() { - addStatement("\$T arguments = fragment.getArguments()", BUNDLE) if (classModel.savable) { - for (arg in classModel.argumentModels) { - arg.accessor.makeSetter("") ?: return - val bundleName = "savedInstanceState" - val bundlePredicate = getBundlePredicate(bundleName, arg.keyFieldName) - addCode("if($bundleName != null && $bundlePredicate) {\n") - addBundleSetter(arg, bundleName, "fragment", false) - addCode("} else {") - addBundleSetter(arg, "arguments", "fragment", true) - addCode("}") + val bundleName = "savedInstanceState" + val settableArgs = classModel.argumentModels.filter { it.accessor.isSettable() } + val (fromGetterAccessors, byPropertyAccessors) = settableArgs.partition { it.accessor.fromGetter } + if(byPropertyAccessors.isNotEmpty()) { + addStatement("\$T arguments = fragment.getArguments()", BUNDLE) } + byPropertyAccessors.forEach { arg -> addArgumentAndSavedStateSetters(arg, bundleName) } + fromGetterAccessors.forEach { arg -> addSavedStateSetters(arg, bundleName) } } else { + addStatement("\$T arguments = fragment.getArguments()", BUNDLE) addBundleSetters("arguments", "fragment", true) } } + private fun MethodSpec.Builder.addArgumentAndSavedStateSetters(arg: ArgumentModel, bundleName: String) { + val bundlePredicate = getBundlePredicate(bundleName, arg.keyFieldName) + addCode("if($bundleName != null && $bundlePredicate) {\n") + addBundleSetter(arg, bundleName, "fragment", false) + addCode("} else {") + addBundleSetter(arg, "arguments", "fragment", true) + addCode("}") + } + + private fun MethodSpec.Builder.addSavedStateSetters(arg: ArgumentModel, bundleName: String) { + val bundlePredicate = getBundlePredicate(bundleName, arg.keyFieldName) + addCode("if($bundleName != null && $bundlePredicate) {\n") + addBundleSetter(arg, bundleName, "fragment", false) + addCode("}") + } + private fun createGetFragmentMethod(variant: List) = builderWithCreationBasicFieldsNoContext("newInstance") .addArgParameters(variant) .returns(classModel.targetTypeName) @@ -69,7 +84,7 @@ internal class FragmentGeneration(classModel: ClassModel) : ClassGeneration(clas .build() private fun TypeSpec.Builder.addNoSettersAccessors(): TypeSpec.Builder = apply { - classModel.argumentModels.filter { it.noSetter }.forEach { arg -> + classModel.argumentModels.filter { it.accessor.fromGetter }.forEach { arg -> addMethod(buildCheckValueMethod(arg)) addMethod(buildGetValueMethod(arg)) } diff --git a/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/IntentBinding.kt b/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/IntentBinding.kt index 732c54f..873f0e6 100755 --- a/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/IntentBinding.kt +++ b/activitystarter-compiler/src/main/java/activitystarter/compiler/generation/IntentBinding.kt @@ -30,7 +30,7 @@ internal abstract class IntentBinding(classModel: ClassModel) : ClassGeneration( } } - protected fun MethodSpec.Builder.addIntentSetters(targetParameterName: String) = apply { + private fun MethodSpec.Builder.addIntentSetters(targetParameterName: String) = apply { classModel.argumentModels.forEach { arg -> addIntentSetter(arg, targetParameterName) } } diff --git a/activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/ArgumentModel.kt b/activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/ArgumentModel.kt index b0ef397..aa37acb 100755 --- a/activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/ArgumentModel.kt +++ b/activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/ArgumentModel.kt @@ -19,7 +19,6 @@ class ArgumentModel( val parceler: Boolean ) { val keyFieldName: String by lazy { camelCaseToUppercaseUnderscore(name) + "_KEY" } - val noSetter = accessor.noSetter val accessorName = ActivityStarterNameConstruction.getterFieldAccessorName(name) val checkerName = ActivityStarterNameConstruction.getterFieldCheckerName(name) diff --git a/activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/FieldAccessType.kt b/activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/FieldAccessType.kt new file mode 100644 index 0000000..d9eb49c --- /dev/null +++ b/activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/FieldAccessType.kt @@ -0,0 +1,8 @@ +package activitystarter.compiler.model.param + +enum class FieldAccessType { + Accessible, + ByMethod, + ByNoIsMethod, + Inaccessible +} \ No newline at end of file diff --git a/activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/FieldAccessor.kt b/activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/FieldAccessor.kt index 2838ddb..f6368e2 100755 --- a/activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/FieldAccessor.kt +++ b/activitystarter-compiler/src/main/java/activitystarter/compiler/model/param/FieldAccessor.kt @@ -1,6 +1,7 @@ package activitystarter.compiler.model.param -import activitystarter.compiler.error.Errors +import activitystarter.compiler.model.param.FieldAccessor.Companion.hasNotPrivateMethodNamed +import com.sun.org.apache.xpath.internal.operations.Bool import javax.lang.model.element.Element import javax.lang.model.element.Modifier.PRIVATE import javax.lang.model.element.TypeElement @@ -9,10 +10,11 @@ import javax.lang.model.util.ElementFilter class FieldAccessor private constructor( val fieldName: String, private val setterType: FieldAccessType, - private val getterType: FieldAccessType + private val getterType: FieldAccessType, + val fromGetter: Boolean ) { - val noSetter = setterType == FieldAccessType.Inaccessible + fun isSettable() = setterType != FieldAccessType.Inaccessible fun isAccessible() = setterType != FieldAccessType.Inaccessible && getterType != FieldAccessType.Inaccessible @@ -32,32 +34,33 @@ class FieldAccessor private constructor( companion object { - fun fromGetter(name: String) = FieldAccessor(name, FieldAccessType.Inaccessible, FieldAccessType.ByMethod) + fun fromGetter(getterMethod: Element, name: String): FieldAccessor { + val enclosingElement = getterMethod.enclosingElement as TypeElement + val setterType = getPrivateFieldAccessType(enclosingElement, name, "set", "set") + return FieldAccessor(name, setterType, FieldAccessType.ByMethod, true) + } fun fromElement(element: Element): FieldAccessor { val enclosingElement = element.enclosingElement as TypeElement val fieldName = element.simpleName.toString() val setterType = getFieldAccessType(enclosingElement, fieldName, element, "set", "set") val getterType = getFieldAccessType(enclosingElement, fieldName, element, "get", "is") - return FieldAccessor(fieldName, setterType, getterType) + return FieldAccessor(fieldName, setterType, getterType, false) } private fun getFieldAccessType(enclosingElement: TypeElement, fieldName: String, element: Element, functionModifier: String, isFunctionModifier: String) = when { PRIVATE !in element.modifiers -> FieldAccessType.Accessible - hasNotPrivateMethodNamed(enclosingElement, functionModifier + fieldName.capitalize()) -> FieldAccessType.ByMethod - fieldName.substring(0, 2) == "is" && hasNotPrivateMethodNamed(enclosingElement, isFunctionModifier + fieldName.substring(2)) -> FieldAccessType.ByNoIsMethod - else -> FieldAccessType.Inaccessible + else -> getPrivateFieldAccessType(enclosingElement, fieldName, functionModifier, isFunctionModifier) } - private fun hasNotPrivateMethodNamed(enclosingElement: TypeElement, fieldName: String) = ElementFilter - .methodsIn(enclosingElement.enclosedElements) - .any { e -> e.simpleName.contentEquals(fieldName) && PRIVATE !in e.modifiers } - - private enum class FieldAccessType { - Accessible, - ByMethod, - ByNoIsMethod, - Inaccessible + private fun getPrivateFieldAccessType(enclosingElement: TypeElement, fieldName: String, functionModifier: String, isFunctionModifier: String) = when { + enclosingElement.hasNotPrivateMethodNamed(functionModifier + fieldName.capitalize()) -> FieldAccessType.ByMethod + fieldName.startsWith("is") && enclosingElement.hasNotPrivateMethodNamed(isFunctionModifier + fieldName.substring(2)) -> FieldAccessType.ByNoIsMethod + else -> FieldAccessType.Inaccessible } + + private fun TypeElement.hasNotPrivateMethodNamed(methodName: String) = ElementFilter + .methodsIn(enclosedElements) + .any { e -> e.simpleName.contentEquals(methodName) && PRIVATE !in e.modifiers } } } diff --git a/activitystarter-compiler/src/main/java/activitystarter/compiler/processing/ArgumentFactory.kt b/activitystarter-compiler/src/main/java/activitystarter/compiler/processing/ArgumentFactory.kt index 67bba08..ed48444 100755 --- a/activitystarter-compiler/src/main/java/activitystarter/compiler/processing/ArgumentFactory.kt +++ b/activitystarter-compiler/src/main/java/activitystarter/compiler/processing/ArgumentFactory.kt @@ -63,7 +63,7 @@ class ArgumentFactory(val enclosingElement: TypeElement, val config: ProjectConf val returnType: TypeMirror = getter.returnType val paramType = ParamType.fromType(returnType) - val accessor: FieldAccessor = FieldAccessor.fromGetter(name) + val accessor: FieldAccessor = FieldAccessor.fromGetter(getterElement, name) val error = getGetterError(knownClassType, paramType, accessor) if (error != null) { diff --git a/activitystarter/src/main/java/activitystarter/ActivityStarter.java b/activitystarter/src/main/java/activitystarter/ActivityStarter.java index 1eda9eb..8743839 100755 --- a/activitystarter/src/main/java/activitystarter/ActivityStarter.java +++ b/activitystarter/src/main/java/activitystarter/ActivityStarter.java @@ -14,26 +14,14 @@ public final class ActivityStarter { - public static void fill(@NonNull Activity target) { - innerFill(target, null, Bundle.class); - } - public static void fill(@NonNull Activity target, @Nullable Bundle savedInstanceState) { innerFill(target, savedInstanceState, Bundle.class); } - public static void fill(@NonNull Fragment target) { - innerFill(target, null, Bundle.class); - } - public static void fill(@NonNull Fragment target, @Nullable Bundle savedInstanceState) { innerFill(target, savedInstanceState, Bundle.class); } - public static void fill(@NonNull android.support.v4.app.Fragment target) { - innerFill(target, null, Bundle.class); - } - public static void fill(@NonNull android.support.v4.app.Fragment target, @Nullable Bundle savedInstanceState) { innerFill(target, savedInstanceState, Bundle.class); } diff --git a/activitystarter/src/test/java/activitystarter/generation/GetterTest.kt b/activitystarter/src/test/java/activitystarter/generation/ByAccessorsTest.kt similarity index 61% rename from activitystarter/src/test/java/activitystarter/generation/GetterTest.kt rename to activitystarter/src/test/java/activitystarter/generation/ByAccessorsTest.kt index cb57dbc..5569137 100755 --- a/activitystarter/src/test/java/activitystarter/generation/GetterTest.kt +++ b/activitystarter/src/test/java/activitystarter/generation/ByAccessorsTest.kt @@ -4,10 +4,15 @@ import activitystarter.compiler.error.Errors import org.junit.Test @Suppress("IllegalIdentifier") -class GetterTest: GenerationTest() { +class ByAccessorsTest : GenerationTest() { @Test fun singleGetterTest() { filePrecessingComparator("getter/Single") } + + @Test + fun getterSetterTest() { + filePrecessingComparator("getter/GetterSetter") + } } \ No newline at end of file diff --git a/generationExamples/activity/ConflictedOptional b/generationExamples/activity/ConflictedOptional index 7d8dc30..7e21942 100755 --- a/generationExamples/activity/ConflictedOptional +++ b/generationExamples/activity/ConflictedOptional @@ -17,21 +17,28 @@ import java.lang.String; public final class MainActivityStarter { private static final String NAME_KEY = "com.example.activitystarter.nameStarterKey"; + private static final String SURNAME_KEY = "com.example.activitystarter.surnameStarterKey"; - public static void fill(MainActivity activity) { + public static void fill(MainActivity activity, Bundle savedInstanceState) { Intent intent = activity.getIntent(); - if(intent.hasExtra(NAME_KEY)) + if(savedInstanceState != null && savedInstanceState.containsKey(NAME_KEY)) { + activity.name = savedInstanceState.getString(NAME_KEY); + } else { + if(intent.hasExtra(NAME_KEY)) activity.name = intent.getStringExtra(NAME_KEY); - if(intent.hasExtra(SURNAME_KEY)) + } + if(savedInstanceState != null && savedInstanceState.containsKey(SURNAME_KEY)) { + activity.surname = savedInstanceState.getString(SURNAME_KEY); + } else { + if(intent.hasExtra(SURNAME_KEY)) activity.surname = intent.getStringExtra(SURNAME_KEY); + } } - public static void save(MainActivity activity) { - Bundle bundle = new Bundle(); + public static void save(MainActivity activity, Bundle bundle) { bundle.putString(NAME_KEY, activity.name); bundle.putString(SURNAME_KEY, activity.surname); - activity.getIntent().putExtras(bundle); } public static Intent getIntent(Context context, String name, String surname) { diff --git a/generationExamples/activity/EmptyAnnotated b/generationExamples/activity/EmptyAnnotated index afccbe2..4281f01 100755 --- a/generationExamples/activity/EmptyAnnotated +++ b/generationExamples/activity/EmptyAnnotated @@ -15,12 +15,10 @@ import android.os.Bundle; public final class MainActivityStarter { - public static void fill(MainActivity activity) { + public static void fill(MainActivity activity, Bundle savedInstanceState) { } - public static void save(MainActivity activity) { - Bundle bundle = new Bundle(); - activity.getIntent().putExtras(bundle); + public static void save(MainActivity activity, Bundle bundle) { } public static Intent getIntent(Context context) { diff --git a/generationExamples/activity/MultipleOptional b/generationExamples/activity/MultipleOptional index 0e43b72..47985dd 100755 --- a/generationExamples/activity/MultipleOptional +++ b/generationExamples/activity/MultipleOptional @@ -16,23 +16,29 @@ import android.os.Bundle; import java.lang.String; public final class MainActivityStarter { - private static final String NAME_KEY = "com.example.activitystarter.nameStarterKey"; + private static final String ID_KEY = "com.example.activitystarter.idStarterKey"; - public static void fill(MainActivity activity) { + public static void fill(MainActivity activity, Bundle savedInstanceState) { Intent intent = activity.getIntent(); - if(intent.hasExtra(NAME_KEY)) + if(savedInstanceState != null && savedInstanceState.containsKey(NAME_KEY)) { + activity.name = savedInstanceState.getString(NAME_KEY); + } else { + if(intent.hasExtra(NAME_KEY)) activity.name = intent.getStringExtra(NAME_KEY); - if(intent.hasExtra(ID_KEY)) + } + if(savedInstanceState != null && savedInstanceState.containsKey(ID_KEY)) { + activity.id = savedInstanceState.getInt(ID_KEY); + } else { + if(intent.hasExtra(ID_KEY)) activity.id = intent.getIntExtra(ID_KEY, -1); + } } - public static void save(MainActivity activity) { - Bundle bundle = new Bundle(); + public static void save(MainActivity activity, Bundle bundle) { bundle.putString(NAME_KEY, activity.name); bundle.putInt(ID_KEY, activity.id); - activity.getIntent().putExtras(bundle); } public static Intent getIntent(Context context, String name, int id) { diff --git a/generationExamples/activity/Optional b/generationExamples/activity/Optional index 4c94fb4..23021ae 100755 --- a/generationExamples/activity/Optional +++ b/generationExamples/activity/Optional @@ -17,14 +17,18 @@ import java.lang.String; public final class MainActivityStarter { private static final String NAME_KEY = "com.example.activitystarter.nameStarterKey"; - public static void fill(MainActivity activity) { + public static void fill(MainActivity activity, Bundle savedInstanceState) { Intent intent = activity.getIntent(); - if(intent.hasExtra(NAME_KEY)) + if(savedInstanceState != null && savedInstanceState.containsKey(NAME_KEY)) { + activity.name = savedInstanceState.getString(NAME_KEY); + } else { + if(intent.hasExtra(NAME_KEY)) activity.name = intent.getStringExtra(NAME_KEY); + } } public static void save(MainActivity activity, Bundle bundle) { - bundle.putString("com.example.activitystarter.nameStarterKey", activity.name); + bundle.putString(NAME_KEY, activity.name); } public static Intent getIntent(Context context, String name) { diff --git a/generationExamples/activity/SetterGetter b/generationExamples/activity/SetterGetter index 4284483..7c4310d 100755 --- a/generationExamples/activity/SetterGetter +++ b/generationExamples/activity/SetterGetter @@ -25,16 +25,20 @@ import java.lang.String; public final class MainActivityStarter { private static final String NAME_KEY = "com.example.activitystarter.nameStarterKey"; - public static void fill(MainActivity activity) { + /** + * This is method used to fill fields. Use it by calling ActivityStarter.fill(this). */ + public static void fill(MainActivity activity, Bundle savedInstanceState) { Intent intent = activity.getIntent(); - if(intent.hasExtra(NAME_KEY)) + if(savedInstanceState != null && savedInstanceState.containsKey(NAME_KEY)) { + activity.setName(savedInstanceState.getString(NAME_KEY)); + } else { + if(intent.hasExtra(NAME_KEY)) activity.setName(intent.getStringExtra(NAME_KEY)); + } } - public static void save(MainActivity activity) { - Bundle bundle = new Bundle(); + public static void save(MainActivity activity, Bundle bundle) { bundle.putString(NAME_KEY, activity.getName()); - activity.getIntent().putExtras(bundle); } public static Intent getIntent(Context context, String name) { diff --git a/generationExamples/activity/Simple b/generationExamples/activity/Simple index c16f662..25937d0 100755 --- a/generationExamples/activity/Simple +++ b/generationExamples/activity/Simple @@ -17,16 +17,18 @@ import java.lang.String; public final class MainActivityStarter { private static final String NAME_KEY = "com.example.activitystarter.nameStarterKey"; - public static void fill(MainActivity activity) { + public static void fill(MainActivity activity, Bundle savedInstanceState) { Intent intent = activity.getIntent(); - if(intent.hasExtra(NAME_KEY)) + if(savedInstanceState != null && savedInstanceState.containsKey(NAME_KEY)) { + activity.name = savedInstanceState.getString(NAME_KEY); + } else { + if(intent.hasExtra(NAME_KEY)) activity.name = intent.getStringExtra(NAME_KEY); + } } - public static void save(MainActivity activity) { - Bundle bundle = new Bundle(); + public static void save(MainActivity activity, Bundle bundle) { bundle.putString(NAME_KEY, activity.name); - activity.getIntent().putExtras(bundle); } public static Intent getIntent(Context context, String name) { diff --git a/generationExamples/activityForResult/ConflictedOptional b/generationExamples/activityForResult/ConflictedOptional index 6287103..c6589b7 100755 --- a/generationExamples/activityForResult/ConflictedOptional +++ b/generationExamples/activityForResult/ConflictedOptional @@ -23,19 +23,25 @@ public final class MainActivityStarter { private static final String SURNAME_KEY = "com.example.activitystarter.surnameStarterKey"; - public static void fill(MainActivity activity) { + public static void fill(MainActivity activity, Bundle savedInstanceState) { Intent intent = activity.getIntent(); - if(intent.hasExtra(NAME_KEY)) + if(savedInstanceState != null && savedInstanceState.containsKey(NAME_KEY)) { + activity.name = savedInstanceState.getString(NAME_KEY); + } else { + if(intent.hasExtra(NAME_KEY)) activity.name = intent.getStringExtra(NAME_KEY); - if(intent.hasExtra(SURNAME_KEY)) + } + if(savedInstanceState != null && savedInstanceState.containsKey(SURNAME_KEY)) { + activity.surname = savedInstanceState.getString(SURNAME_KEY); + } else { + if(intent.hasExtra(SURNAME_KEY)) activity.surname = intent.getStringExtra(SURNAME_KEY); + } } - public static void save(MainActivity activity) { - Bundle bundle = new Bundle(); + public static void save(MainActivity activity, Bundle bundle) { bundle.putString(NAME_KEY, activity.name); bundle.putString(SURNAME_KEY, activity.surname); - activity.getIntent().putExtras(bundle); } public static Intent getIntent(Context context, String name, String surname) { diff --git a/generationExamples/activityForResult/EmptyAnnotated b/generationExamples/activityForResult/EmptyAnnotated index be067bc..14a3f87 100755 --- a/generationExamples/activityForResult/EmptyAnnotated +++ b/generationExamples/activityForResult/EmptyAnnotated @@ -16,12 +16,10 @@ import android.os.Bundle; public final class MainActivityStarter { - public static void fill(MainActivity activity) { + public static void fill(MainActivity activity, Bundle savedInstanceState) { } - public static void save(MainActivity activity) { - Bundle bundle = new Bundle(); - activity.getIntent().putExtras(bundle); + public static void save(MainActivity activity, Bundle bundle) { } public static Intent getIntent(Context context) { diff --git a/generationExamples/activityForResult/MultipleOptional b/generationExamples/activityForResult/MultipleOptional index 3cc763e..39abe97 100755 --- a/generationExamples/activityForResult/MultipleOptional +++ b/generationExamples/activityForResult/MultipleOptional @@ -22,19 +22,25 @@ public final class MainActivityStarter { private static final String NAME_KEY = "com.example.activitystarter.nameStarterKey"; private static final String ID_KEY = "com.example.activitystarter.idStarterKey"; - public static void fill(MainActivity activity) { + public static void fill(MainActivity activity, Bundle savedInstanceState) { Intent intent = activity.getIntent(); - if(intent.hasExtra(NAME_KEY)) + if(savedInstanceState != null && savedInstanceState.containsKey(NAME_KEY)) { + activity.name = savedInstanceState.getString(NAME_KEY); + } else { + if(intent.hasExtra(NAME_KEY)) activity.name = intent.getStringExtra(NAME_KEY); - if(intent.hasExtra(ID_KEY)) + } + if(savedInstanceState != null && savedInstanceState.containsKey(ID_KEY)) { + activity.id = savedInstanceState.getInt(ID_KEY); + } else { + if(intent.hasExtra(ID_KEY)) activity.id = intent.getIntExtra(ID_KEY, -1); + } } - public static void save(MainActivity activity) { - Bundle bundle = new Bundle(); + public static void save(MainActivity activity, Bundle bundle) { bundle.putString(NAME_KEY, activity.name); bundle.putInt(ID_KEY, activity.id); - activity.getIntent().putExtras(bundle); } public static Intent getIntent(Context context, String name, int id) { diff --git a/generationExamples/activityForResult/Optional b/generationExamples/activityForResult/Optional index e371356..c9143cd 100755 --- a/generationExamples/activityForResult/Optional +++ b/generationExamples/activityForResult/Optional @@ -20,16 +20,18 @@ import java.lang.String; public final class MainActivityStarter { private static final String NAME_KEY = "com.example.activitystarter.nameStarterKey"; - public static void fill(MainActivity activity) { + public static void fill(MainActivity activity, Bundle savedInstanceState) { Intent intent = activity.getIntent(); - if(intent.hasExtra(NAME_KEY)) + if(savedInstanceState != null && savedInstanceState.containsKey(NAME_KEY)) { + activity.name = savedInstanceState.getString(NAME_KEY); + } else { + if(intent.hasExtra(NAME_KEY)) activity.name = intent.getStringExtra(NAME_KEY); + } } - public static void save(MainActivity activity) { - Bundle bundle = new Bundle(); + public static void save(MainActivity activity, Bundle bundle) { bundle.putString(NAME_KEY, activity.name); - activity.getIntent().putExtras(bundle); } public static Intent getIntent(Context context, String name) { diff --git a/generationExamples/activityForResult/SetterGetter b/generationExamples/activityForResult/SetterGetter index 74972d2..e27b3cf 100755 --- a/generationExamples/activityForResult/SetterGetter +++ b/generationExamples/activityForResult/SetterGetter @@ -28,16 +28,18 @@ import java.lang.String; public final class MainActivityStarter { private static final String NAME_KEY = "com.example.activitystarter.nameStarterKey"; - public static void fill(MainActivity activity) { + public static void fill(MainActivity activity, Bundle savedInstanceState) { Intent intent = activity.getIntent(); - if(intent.hasExtra(NAME_KEY)) + if(savedInstanceState != null && savedInstanceState.containsKey(NAME_KEY)) { + activity.setName(savedInstanceState.getString(NAME_KEY)); + } else { + if(intent.hasExtra(NAME_KEY)) activity.setName(intent.getStringExtra(NAME_KEY)); + } } - public static void save(MainActivity activity) { - Bundle bundle = new Bundle(); + public static void save(MainActivity activity, Bundle bundle) { bundle.putString(NAME_KEY, activity.getName()); - activity.getIntent().putExtras(bundle); } public static Intent getIntent(Context context, String name) { diff --git a/generationExamples/activityForResult/Simple b/generationExamples/activityForResult/Simple index 6b8ac43..7743f90 100755 --- a/generationExamples/activityForResult/Simple +++ b/generationExamples/activityForResult/Simple @@ -20,16 +20,18 @@ import java.lang.String; public final class MainActivityStarter { private static final String NAME_KEY = "com.example.activitystarter.nameStarterKey"; - public static void fill(MainActivity activity) { + public static void fill(MainActivity activity, Bundle savedInstanceState) { Intent intent = activity.getIntent(); - if(intent.hasExtra(NAME_KEY)) + if(savedInstanceState != null && savedInstanceState.containsKey(NAME_KEY)) { + activity.name = savedInstanceState.getString(NAME_KEY); + } else { + if(intent.hasExtra(NAME_KEY)) activity.name = intent.getStringExtra(NAME_KEY); + } } - public static void save(MainActivity activity) { - Bundle bundle = new Bundle(); + public static void save(MainActivity activity, Bundle bundle) { bundle.putString(NAME_KEY, activity.name); - activity.getIntent().putExtras(bundle); } public static Intent getIntent(Context context, String name) { diff --git a/generationExamples/activityNonSavable/SetterGetter b/generationExamples/activityNonSavable/SetterGetter index 33dd489..11470e8 100755 --- a/generationExamples/activityNonSavable/SetterGetter +++ b/generationExamples/activityNonSavable/SetterGetter @@ -30,7 +30,7 @@ public final class MainActivityStarter { public static void fill(MainActivity activity, Bundle savedInstanceState) { Intent intent = activity.getIntent(); if(intent.hasExtra(NAME_KEY)) - activity.setName(intent.getStringExtra(NAME_KEY)); + activity.setName(intent.getStringExtra(NAME_KEY)); } public static void save(MainActivity activity, Bundle bundle) { diff --git a/generationExamples/getter/GetterSetter b/generationExamples/getter/GetterSetter new file mode 100644 index 0000000..6849cc7 --- /dev/null +++ b/generationExamples/getter/GetterSetter @@ -0,0 +1,95 @@ +********com.example.activitystarter.MainActivity******** +package com.example.activitystarter; + +import android.app.Activity; +import android.os.Bundle; + +import activitystarter.ActivityStarter; +import activitystarter.Arg; + +public final class MainActivity extends Activity { + private boolean b; + + @Arg(optional = true) + public final boolean getB() { + return b; + } + public final void setB(boolean b) { + this.b = b; + } + + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityStarter.fill(this, savedInstanceState); + } + + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + ActivityStarter.save(this, outState); + } +} + +********com.example.activitystarter.MainActivityStarter******** +package com.example.activitystarter; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import java.lang.String; + +public final class MainActivityStarter { + private static final String B_KEY = "com.example.activitystarter.bStarterKey"; + + public static void fill(MainActivity activity, Bundle savedInstanceState) { + if(savedInstanceState != null && savedInstanceState.containsKey(B_KEY)) { + activity.setB(savedInstanceState.getBoolean(B_KEY)); + } + } + + public static void save(MainActivity activity, Bundle bundle) { + bundle.putBoolean(B_KEY, activity.getB()); + } + + public static boolean isFilledValueOfBFrom(MainActivity activity) { + Intent intent = activity.getIntent(); + return intent.hasExtra(B_KEY); + } + + public static boolean getValueOfBFrom(MainActivity activity) { + Intent intent = activity.getIntent(); + return intent.getBooleanExtra(B_KEY, false); + } + + public static Intent getIntent(Context context, boolean b) { + Intent intent = new Intent(context, MainActivity.class); + intent.putExtra(B_KEY, b); + return intent; + } + + public static void start(Context context, boolean b) { + Intent intent = getIntent(context, b); + context.startActivity(intent); + } + + public static void startWithFlags(Context context, boolean b, int flags) { + Intent intent = getIntent(context, b); + intent.addFlags(flags); + context.startActivity(intent); + } + + public static Intent getIntent(Context context) { + Intent intent = new Intent(context, MainActivity.class); + return intent; + } + + public static void start(Context context) { + Intent intent = getIntent(context); + context.startActivity(intent); + } + + public static void startWithFlags(Context context, int flags) { + Intent intent = getIntent(context); + intent.addFlags(flags); + context.startActivity(intent); + } +} \ No newline at end of file diff --git a/generationExamples/getter/Single b/generationExamples/getter/Single index d4a2941..e4219dc 100755 --- a/generationExamples/getter/Single +++ b/generationExamples/getter/Single @@ -21,7 +21,6 @@ public final class MainActivityStarter { private static final String NAME_KEY = "com.example.activitystarter.nameStarterKey"; public static void fill(MainActivity activity, Bundle savedInstanceState) { - Intent intent = activity.getIntent(); } public static void save(MainActivity activity, Bundle bundle) { diff --git a/sample/app/src/main/AndroidManifest.xml b/sample/app/src/main/AndroidManifest.xml index d8f1785..4b1b62e 100755 --- a/sample/app/src/main/AndroidManifest.xml +++ b/sample/app/src/main/AndroidManifest.xml @@ -49,7 +49,7 @@ + android:theme="@style/AppTheme.NoActionBar" /> \ No newline at end of file diff --git a/sample/app/src/main/java/com/example/activitystarter/fragment/TabbedPlaceholderFragment.java b/sample/app/src/main/java/com/example/activitystarter/fragment/TabbedPlaceholderFragment.java index ff7881a..80fafed 100755 --- a/sample/app/src/main/java/com/example/activitystarter/fragment/TabbedPlaceholderFragment.java +++ b/sample/app/src/main/java/com/example/activitystarter/fragment/TabbedPlaceholderFragment.java @@ -21,7 +21,7 @@ public TabbedPlaceholderFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_tabbed, container, false); - ActivityStarter.fill(this); + ActivityStarter.fill(this, savedInstanceState); final TextView textView = (TextView) rootView.findViewById(R.id.section_label); textView.setOnClickListener(new View.OnClickListener() { @Override diff --git a/sample/app/src/main/java/com/example/activitystarter/savetest/NonSavingActivity.java b/sample/app/src/main/java/com/example/activitystarter/savetest/NonSavingActivity.java index cbc78c1..9633355 100644 --- a/sample/app/src/main/java/com/example/activitystarter/savetest/NonSavingActivity.java +++ b/sample/app/src/main/java/com/example/activitystarter/savetest/NonSavingActivity.java @@ -27,7 +27,7 @@ public class NonSavingActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ActivityStarter.fill(this); + ActivityStarter.fill(this, savedInstanceState); setContentView(R.layout.activity_save_test); ((TextView) findViewById(R.id.i)).setText(""+i); ((TextView) findViewById(R.id.str)).setText(""+str); diff --git a/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/BaseActivity.kt b/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/BaseActivity.kt index 23ca643..01ee7b9 100755 --- a/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/BaseActivity.kt +++ b/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/BaseActivity.kt @@ -8,7 +8,7 @@ open class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - ActivityStarter.fill(this) + ActivityStarter.fill(this, savedInstanceState) } override fun onSaveInstanceState(outState: Bundle?) { diff --git a/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/MainActivity.kt b/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/MainActivity.kt index 888b0de..e3c4e44 100755 --- a/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/MainActivity.kt +++ b/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/MainActivity.kt @@ -7,6 +7,7 @@ import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.os.Bundle import com.marcinmoskala.kotlinapp.fragment.TabbedFragmentActivityStarter import com.marcinmoskala.kotlinapp.notification.NotificationPublisherStarter +import com.marcinmoskala.kotlinapp.savetest.SavingActivityStarter import kotlinx.android.synthetic.main.activity_main.* import org.joda.time.DateTime @@ -21,9 +22,14 @@ class MainActivity : BaseActivity() { showParcelableDataButton.setOnClickListener { startParcelableActivity() } showSerializableDataButton.setOnClickListener { startSerializableActivity() } showFragmentActivityButton.setOnClickListener { startFragmentActivity() } + showSavingActivityButton.setOnClickListener { startSavingStateActivity() } startNotification() } + private fun startSavingStateActivity() { + SavingActivityStarter.start(this) + } + private fun startNotification() { val intent = NotificationPublisherStarter.getIntent(this, notificationId, notificationTime) val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, FLAG_UPDATE_CURRENT) diff --git a/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/fragment/TabbedPlaceholderFragment.kt b/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/fragment/TabbedPlaceholderFragment.kt index bdcc7bc..7e8c300 100755 --- a/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/fragment/TabbedPlaceholderFragment.kt +++ b/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/fragment/TabbedPlaceholderFragment.kt @@ -17,7 +17,7 @@ class TabbedPlaceholderFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { val rootView = inflater!!.inflate(R.layout.fragment_tabbed, container, false) - ActivityStarter.fill(this) + ActivityStarter.fill(this, savedInstanceState) val textView = rootView.findViewById(R.id.section_label) as TextView textView.setOnClickListener { sectionNumber++ diff --git a/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/savetest/NonSavingActivity.kt b/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/savetest/NonSavingActivity.kt index 82dad9e..ed448f1 100644 --- a/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/savetest/NonSavingActivity.kt +++ b/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/savetest/NonSavingActivity.kt @@ -11,13 +11,16 @@ import kotlinx.android.synthetic.main.activity_save_test.* class NonSavingActivity : Activity() { - @get:Arg(optional = true) var i by argExtra(DEFAULT_I) - @get:Arg(optional = true) var str by argExtra(DEFAULT_STR) - @get:Arg(optional = true) var b by argExtra(DEFAULT_B) + @get:Arg(optional = true) + var i by argExtra(DEFAULT_I) + @get:Arg(optional = true) + var str by argExtra(DEFAULT_STR) + @get:Arg(optional = true) + var b by argExtra(DEFAULT_B) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - ActivityStarter.fill(this) + ActivityStarter.fill(this, savedInstanceState) setContentView(R.layout.activity_save_test) iView.text = "$i" strView.text = str diff --git a/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/savetest/SavingActivity.kt b/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/savetest/SavingActivity.kt index 414620e..eb49eef 100644 --- a/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/savetest/SavingActivity.kt +++ b/sample/kotlinapp/src/main/java/com/marcinmoskala/kotlinapp/savetest/SavingActivity.kt @@ -13,12 +13,13 @@ import kotlinx.android.synthetic.main.activity_save_test.* class SavingActivity : Activity() { - @get:Arg(optional = true) var i by argExtra(NonSavingActivity.DEFAULT_I) - @get:Arg(optional = true) var str by argExtra(NonSavingActivity.DEFAULT_STR) - @get:Arg(optional = true) var b by argExtra(NonSavingActivity.DEFAULT_B) + @get:Arg(optional = true) var i: Int by argExtra(NonSavingActivity.DEFAULT_I) + @get:Arg(optional = true) var str: String by argExtra(NonSavingActivity.DEFAULT_STR) + @get:Arg(optional = true) var b: Boolean by argExtra(NonSavingActivity.DEFAULT_B) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + ActivityStarter.fill(this, savedInstanceState) setContentView(R.layout.activity_save_test) iView.text = "$i" strView.text = str @@ -32,12 +33,12 @@ class SavingActivity : Activity() { companion object { - val DEFAULT_I = -1 - val DEFAULT_STR = "AAA" - val DEFAULT_B = false + const val DEFAULT_I = -1 + const val DEFAULT_STR = "AAA" + const val DEFAULT_B = false - val NEW_I = 100 - val NEW_STR = "BBB" - val NEW_B = true + const val NEW_I = 100 + const val NEW_STR = "BBB" + const val NEW_B = true } } diff --git a/sample/kotlinapp/src/main/res/layout/activity_main.xml b/sample/kotlinapp/src/main/res/layout/activity_main.xml index 99bb13a..0fae243 100755 --- a/sample/kotlinapp/src/main/res/layout/activity_main.xml +++ b/sample/kotlinapp/src/main/res/layout/activity_main.xml @@ -83,5 +83,12 @@ android:textAllCaps="false" android:id="@+id/showFragmentActivityButton"/> +