Skip to content

Commit

Permalink
Add state save for Fragments
Browse files Browse the repository at this point in the history
  • Loading branch information
MarcinMoskala committed Jul 2, 2017
1 parent 4e1bee0 commit fb9a1a7
Show file tree
Hide file tree
Showing 193 changed files with 87 additions and 8 deletions.
Empty file modified .codebeatignore
100644 → 100755
Empty file.
Empty file modified .gitignore
100644 → 100755
Empty file.
Empty file modified .travis.yml
100644 → 100755
Empty file.
Empty file modified CHANGELOG.md
100644 → 100755
Empty file.
Empty file modified LICENSE.txt
100644 → 100755
Empty file.
Empty file modified README.md
100644 → 100755
Empty file.
Empty file modified _config.yml
100644 → 100755
Empty file.
Empty file modified activitystarter-annotations/build.gradle
100644 → 100755
Empty file.
Empty file modified activitystarter-annotations/gradle.properties
100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file modified activitystarter-compiler/build.gradle
100644 → 100755
Empty file.
Empty file modified activitystarter-compiler/gradle.properties
100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ internal abstract class ClassGeneration(val classModel: ClassModel) {
val bundleValue = (if (arg.paramType.typeUsedBySupertype()) "(\$T) " else "") +
arg.addUnwrapper { getBundleGetter(bundleName, arg.saveParamType, fieldName) }
val bundleValueSetter = arg.accessor.makeSetter(bundleValue)
if (checkIfSet) addCode("if(${getBundlePredicate(bundleName, fieldName)}) ")
if (checkIfSet) addCode("if($bundleName != null && ${getBundlePredicate(bundleName, fieldName)}) ")
addStatement("$className.$bundleValueSetter", arg.typeName)
}

Expand Down
Empty file.
34 changes: 32 additions & 2 deletions ...ystarter-compiler/src/main/java/activitystarter/compiler/generation/FragmentGeneration.kt
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,40 @@ import activitystarter.compiler.model.param.ArgumentModel
import activitystarter.compiler.utils.BUNDLE
import activitystarter.compiler.utils.doIf
import com.squareup.javapoet.MethodSpec
import com.squareup.javapoet.TypeSpec

internal class FragmentGeneration(classModel: ClassModel) : ClassGeneration(classModel) {

override fun createFillFieldsMethod() = getBasicFillMethodBuilder()
.addParameter(classModel.targetTypeName, "fragment")
.doIf(classModel.argumentModels.isNotEmpty()) { addStatement("\$T arguments = fragment.getArguments()", BUNDLE) }
.addBundleSetters("arguments", "fragment", true)
.addParameter(BUNDLE, "savedInstanceState")
.doIf(classModel.argumentModels.isNotEmpty()) {
addFieldSettersCode()
}
.build()!!

private fun MethodSpec.Builder.addFieldSettersCode() {
addStatement("\$T arguments = fragment.getArguments()", BUNDLE)
if (classModel.savable) {
for (arg in classModel.argumentModels) {
val bundleName = "savedInstanceState"
val bundlePredicate = getBundlePredicate(bundleName, arg.fieldName)
addCode("if($bundleName != null && $bundlePredicate) {\n")
addBundleSetter(arg, bundleName, "fragment", false)
addCode("} else ")
addBundleSetter(arg, "arguments", "fragment", true)
}
} else {
addBundleSetters("arguments", "fragment", true)
}
}
override fun createStarters(variant: List<ArgumentModel>): List<MethodSpec> = listOf(
createGetFragmentMethod(variant)
)

override fun TypeSpec.Builder.addExtraToClass() = this
.addMethod(createSaveMethod())

private fun createGetFragmentMethod(variant: List<ArgumentModel>) = builderWithCreationBasicFieldsNoContext("newInstance")
.addArgParameters(variant)
.returns(classModel.targetTypeName)
Expand All @@ -32,4 +53,13 @@ internal class FragmentGeneration(classModel: ClassModel) : ClassGeneration(clas
addStatement("fragment.setArguments(args)")
}
.addStatement("return fragment")

private fun createSaveMethod(): MethodSpec = this
.builderWithCreationBasicFieldsNoContext("save")
.addParameter(classModel.targetTypeName, "fragment")
.addParameter(BUNDLE, "bundle")
.doIf(classModel.savable) {
addSaveBundleStatements("bundle", classModel.argumentModels, { "fragment.${it.accessor.getFieldValue()}" })
}
.build()
}
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
10 changes: 10 additions & 0 deletions ...vitystarter-compiler/src/main/java/activitystarter/compiler/processing/ArgumentFactory.kt
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,14 @@ class ArgumentFactory(val enclosingElement: TypeElement, val config: ProjectConf
private fun showProcessingError(element: Element, text: String) {
error(enclosingElement, "@%s %s $text (%s)", Arg::class.java.simpleName, enclosingElement.qualifiedName, element.simpleName)
}

class ProcessingError(override val message: String): Throwable(message)

fun processElement(element: Element) {
fun throwError(message: String): Nothing
= throw ProcessingError("Error in element $element: $message")

val enclosingElement = element.enclosingElement ?: throwError("Lack of enclosing element")
}

}
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file modified activitystarter-parceler-arg-converter/.gitignore
100644 → 100755
Empty file.
Empty file modified activitystarter-parceler-arg-converter/build.gradle
100644 → 100755
Empty file.
Empty file modified activitystarter-parceler-arg-converter/proguard-rules.pro
100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file modified activitystarter/build.gradle
100644 → 100755
Empty file.
Empty file modified activitystarter/gradle.properties
100644 → 100755
Empty file.
Empty file modified activitystarter/proguard-rules.txt
100644 → 100755
Empty file.
Empty file modified activitystarter/src/main/AndroidManifest.xml
100644 → 100755
Empty file.
30 changes: 28 additions & 2 deletions activitystarter/src/main/java/activitystarter/ActivityStarter.java
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,19 @@ public static void fill(@NonNull Activity target, @Nullable Bundle savedInstance
}

public static void fill(@NonNull Fragment target) {
innerFill(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);
innerFill(target, null, Bundle.class);
}

public static void fill(@NonNull android.support.v4.app.Fragment target, @Nullable Bundle savedInstanceState) {
innerFill(target, savedInstanceState, Bundle.class);
}

public static void fill(@NonNull Service target, @NonNull Intent intent) {
Expand All @@ -47,6 +55,24 @@ public static void save(@NonNull Activity target, Bundle bundle) {
invokeMethod(method, target, bundle);
}

public static void save(@NonNull Fragment target, Bundle bundle) {
Class<?> targetClass = target.getClass();
Class<?> starterClass = getStarterClass(targetClass);
if (starterClass == null) return;
Method method = getMethod(starterClass, "save", targetClass, Bundle.class);
if (method == null) return;
invokeMethod(method, target, bundle);
}

public static void save(@NonNull android.support.v4.app.Fragment target, Bundle bundle) {
Class<?> targetClass = target.getClass();
Class<?> starterClass = getStarterClass(targetClass);
if (starterClass == null) return;
Method method = getMethod(starterClass, "save", targetClass, Bundle.class);
if (method == null) return;
invokeMethod(method, target, bundle);
}

private static void innerFill(@NonNull Object target) {
Class<?> targetClass = target.getClass();
Class<?> starterClass = getStarterClass(targetClass);
Expand Down
Empty file modified activitystarter/src/main/java/activitystarter/Helpers.java
100644 → 100755
Empty file.
Empty file modified activitystarter/src/test/java/activitystarter/Helpers.kt
100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
2 changes: 1 addition & 1 deletion build.gradle
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ subprojects { project ->
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.2'
classpath 'com.android.tools.build:gradle:2.3.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
}
}
Expand Down
Empty file modified generationExamples/activity/ConflictedOptional
100644 → 100755
Empty file.
Empty file modified generationExamples/activity/EmptyAnnotated
100644 → 100755
Empty file.
Empty file modified generationExamples/activity/MultipleOptional
100644 → 100755
Empty file.
Empty file modified generationExamples/activity/Optional
100644 → 100755
Empty file.
Empty file modified generationExamples/activity/SetterGetter
100644 → 100755
Empty file.
Empty file modified generationExamples/activity/Simple
100644 → 100755
Empty file.
Empty file modified generationExamples/activityForResult/ConflictedOptional
100644 → 100755
Empty file.
Empty file modified generationExamples/activityForResult/EmptyAnnotated
100644 → 100755
Empty file.
Empty file modified generationExamples/activityForResult/MultipleOptional
100644 → 100755
Empty file.
Empty file modified generationExamples/activityForResult/Optional
100644 → 100755
Empty file.
Empty file modified generationExamples/activityForResult/SetterGetter
100644 → 100755
Empty file.
Empty file modified generationExamples/activityForResult/Simple
100644 → 100755
Empty file.
Empty file modified generationExamples/activityNonSavable/ConflictedOptional
100644 → 100755
Empty file.
Empty file modified generationExamples/activityNonSavable/EmptyAnnotated
100644 → 100755
Empty file.
Empty file modified generationExamples/activityNonSavable/MultipleOptional
100644 → 100755
Empty file.
Empty file modified generationExamples/activityNonSavable/Optional
100644 → 100755
Empty file.
Empty file modified generationExamples/activityNonSavable/SetterGetter
100644 → 100755
Empty file.
Empty file modified generationExamples/activityNonSavable/Simple
100644 → 100755
Empty file.
Empty file modified generationExamples/customId/MultipleOptional
100644 → 100755
Empty file.
Empty file modified generationExamples/customId/Optional
100644 → 100755
Empty file.
Empty file modified generationExamples/customId/Simple
100644 → 100755
Empty file.
Empty file modified generationExamples/fragment/ConflictedOptional
100644 → 100755
Empty file.
Empty file modified generationExamples/fragment/EmptyAnnotated
100644 → 100755
Empty file.
Empty file modified generationExamples/fragment/MultipleOptional
100644 → 100755
Empty file.
Empty file modified generationExamples/fragment/Optional
100644 → 100755
Empty file.
Empty file modified generationExamples/fragment/SetterGetter
100644 → 100755
Empty file.
Empty file modified generationExamples/fragment/Simple
100644 → 100755
Empty file.
Empty file modified generationExamples/service/Complex
100644 → 100755
Empty file.
Empty file modified generationExamples/service/EmptyAnnotated
100644 → 100755
Empty file.
Empty file modified generationExamples/service/Simple
100644 → 100755
Empty file.
Empty file modified generationExamples/shouldThrowError/ActivityPrivateFIeld
100644 → 100755
Empty file.
Empty file.
Empty file modified generationExamples/shouldThrowError/GetterOnly
100644 → 100755
Empty file.
Empty file modified generationExamples/shouldThrowError/List
100644 → 100755
Empty file.
Empty file modified generationExamples/shouldThrowError/PrivateClass
100644 → 100755
Empty file.
Empty file modified generationExamples/shouldThrowError/ServiceParcelableField
100644 → 100755
Empty file.
Empty file modified generationExamples/shouldThrowError/SetterOnly
100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file modified gradle.properties
100644 → 100755
Empty file.
Empty file modified gradle/gradle-mvn-push.gradle
100644 → 100755
Empty file.
Empty file modified gradle/wrapper/gradle-wrapper.jar
100644 → 100755
Empty file.
Empty file modified gradle/wrapper/gradle-wrapper.properties
100644 → 100755
Empty file.
Empty file modified gradlew.bat
100644 → 100755
Empty file.
Empty file modified sample/app/build.gradle
100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file modified sample/app/src/main/AndroidManifest.xml
100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
17 changes: 15 additions & 2 deletions sample/app/src/main/java/com/example/activitystarter/fragment/TabbedPlaceholderFragment.java
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,22 @@ 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);
TextView textView = (TextView) rootView.findViewById(R.id.section_label);
ActivityStarter.fill(this, savedInstanceState);
final TextView textView = (TextView) rootView.findViewById(R.id.section_label);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
++sectionNumber;
textView.setText(getString(R.string.section_format, sectionNumber));
}
});
textView.setText(getString(R.string.section_format, sectionNumber));
return rootView;
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
ActivityStarter.save(this, outState);
}
}
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file modified sample/app/src/main/res/layout/activity_data.xml
100644 → 100755
Empty file.
Empty file modified sample/app/src/main/res/layout/activity_main.xml
100644 → 100755
Empty file.
Empty file modified sample/app/src/main/res/layout/activity_tabbed_fragment.xml
100644 → 100755
Empty file.
Empty file modified sample/app/src/main/res/layout/fragment_tabbed.xml
100644 → 100755
Empty file.
Empty file modified sample/app/src/main/res/mipmap-hdpi/ic_launcher.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified sample/app/src/main/res/mipmap-mdpi/ic_launcher.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified sample/app/src/main/res/mipmap-xhdpi/ic_launcher.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified sample/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified sample/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified sample/app/src/main/res/values-v21/styles.xml
100644 → 100755
Empty file.
Empty file modified sample/app/src/main/res/values-w820dp/dimens.xml
100644 → 100755
Empty file.
Empty file modified sample/app/src/main/res/values/colors.xml
100644 → 100755
Empty file.
Empty file modified sample/app/src/main/res/values/dimens.xml
100644 → 100755
Empty file.
Empty file modified sample/app/src/main/res/values/strings.xml
100644 → 100755
Empty file.
Empty file modified sample/app/src/main/res/values/styles.xml
100644 → 100755
Empty file.
Empty file modified sample/kotlinapp/.gitignore
100644 → 100755
Empty file.
Empty file modified sample/kotlinapp/build.gradle
100644 → 100755
Empty file.
Empty file modified sample/kotlinapp/proguard-rules.pro
100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file modified sample/kotlinapp/src/main/AndroidManifest.xml
100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file modified sample/kotlinapp/src/main/res/layout/activity_data.xml
100644 → 100755
Empty file.
Empty file modified sample/kotlinapp/src/main/res/layout/activity_main.xml
100644 → 100755
Empty file.
Empty file modified sample/kotlinapp/src/main/res/mipmap-hdpi/ic_launcher.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified sample/kotlinapp/src/main/res/mipmap-mdpi/ic_launcher.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified sample/kotlinapp/src/main/res/mipmap-xhdpi/ic_launcher.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified sample/kotlinapp/src/main/res/mipmap-xxhdpi/ic_launcher.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified sample/kotlinapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified sample/kotlinapp/src/main/res/values/colors.xml
100644 → 100755
Empty file.
Empty file modified sample/kotlinapp/src/main/res/values/strings.xml
100644 → 100755
Empty file.
Empty file modified sample/kotlinapp/src/main/res/values/styles.xml
100644 → 100755
Empty file.
Empty file.
Empty file modified settings.gradle
100644 → 100755
Empty file.

0 comments on commit fb9a1a7

Please sign in to comment.