From e276e91a8ee9e14d8a77c6f2bce41c361822dea0 Mon Sep 17 00:00:00 2001 From: John Ericksen Date: Fri, 7 Feb 2014 23:30:52 -0700 Subject: [PATCH] Added Parceler support --- .../java/icepick/processor/AbsWriter.java | 8 ++++++- .../icepick/processor/AnnotatedField.java | 1 + .../processor/AnnotationsConverter.java | 16 +++++++++++++ sample/build.gradle | 2 ++ .../frankiesardo/icepick/ExampleParcel.java | 24 +++++++++++++++++++ .../frankiesardo/icepick/MainActivity.java | 1 + 6 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 sample/src/main/java/com/github/frankiesardo/icepick/ExampleParcel.java diff --git a/icepick-processor/src/main/java/icepick/processor/AbsWriter.java b/icepick-processor/src/main/java/icepick/processor/AbsWriter.java index 4a3e7de..e90bedb 100644 --- a/icepick-processor/src/main/java/icepick/processor/AbsWriter.java +++ b/icepick-processor/src/main/java/icepick/processor/AbsWriter.java @@ -68,8 +68,11 @@ protected String emitRestoreState(AnnotatedField field) { case SERIALIZABLE: return " target." + field.getName() + " = (" + field.getFieldType() + ") savedInstanceState.getSerializable(" + BASE_KEY + " + \"" + field.getName() + "\");\n"; + case PARCEL: + return " target." + field.getName() + " = org.parceler.Parceles.unwrap(" + + "savedInstanceState.getParcelable(" + BASE_KEY + " + \"" + field.getName() + "\"));\n"; default: - return " target." + field.getName() + " = " + "unwrap(" + + return " target." + field.getName() + " = unwrap(" + "savedInstanceState.getParcelable(" + BASE_KEY + " + \"" + field.getName() + "\"));\n"; } } @@ -86,6 +89,9 @@ protected String emitSaveState(AnnotatedField field) { case SERIALIZABLE: return " outState.putSerializable(" + BASE_KEY + " + \"" + field.getName() + "\", target." + field.getName() + ");\n"; + case PARCEL: + return " outState.putParcelable(" + BASE_KEY + " + \"" + + field.getName() + "\", org.parceler.Parceles.wrap(target." + field.getName() + "));\n"; default: return " outState.putParcelable(" + BASE_KEY + " + \"" + field.getName() + "\", wrap(target." + field.getName() + "));\n"; diff --git a/icepick-processor/src/main/java/icepick/processor/AnnotatedField.java b/icepick-processor/src/main/java/icepick/processor/AnnotatedField.java index 5a36515..c4d2397 100644 --- a/icepick-processor/src/main/java/icepick/processor/AnnotatedField.java +++ b/icepick-processor/src/main/java/icepick/processor/AnnotatedField.java @@ -8,6 +8,7 @@ class AnnotatedField { enum WrappingStrategy { SERIALIZABLE, PARCELABLE, + PARCEL, CUSTOM } diff --git a/icepick-processor/src/main/java/icepick/processor/AnnotationsConverter.java b/icepick-processor/src/main/java/icepick/processor/AnnotationsConverter.java index f77da86..1d61c01 100644 --- a/icepick-processor/src/main/java/icepick/processor/AnnotationsConverter.java +++ b/icepick-processor/src/main/java/icepick/processor/AnnotationsConverter.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Set; import javax.annotation.processing.Messager; +import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; @@ -83,10 +84,25 @@ private AnnotatedField.WrappingStrategy wrappingStrategy(TypeMirror type) { return AnnotatedField.WrappingStrategy.SERIALIZABLE; } + if (isAnnotated(typeUtils.asElement(type), "org.parceler.Parcel")){ + return AnnotatedField.WrappingStrategy.PARCEL; + } + return AnnotatedField.WrappingStrategy.CUSTOM; } } + private boolean isAnnotated(Element element, String annotationName) { + if (element != null) { + for (AnnotationMirror annotationMirror : element.getAnnotationMirrors()) { + if (annotationMirror.getAnnotationType().asElement().toString().equals(annotationName)) { + return true; + } + } + } + return false; + } + private class ToErasedEnclosingClass implements Function { @Override public TypeMirror apply(AnnotatedField field) { TypeElement enclosingClassType = field.getEnclosingClassType(); diff --git a/sample/build.gradle b/sample/build.gradle index 2ad5db4..0dbf0ea 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -4,6 +4,8 @@ dependencies { compile 'joda-time:joda-time:2.3' compile 'com.github.frankiesardo:icepick:2.3.1' provided 'com.github.frankiesardo:icepick-processor:2.3.1' + compile 'org.parceler:parceler:0.2.6' + provided 'org.parceler:parceler-api:0.2.6' } android { diff --git a/sample/src/main/java/com/github/frankiesardo/icepick/ExampleParcel.java b/sample/src/main/java/com/github/frankiesardo/icepick/ExampleParcel.java new file mode 100644 index 0000000..88589f5 --- /dev/null +++ b/sample/src/main/java/com/github/frankiesardo/icepick/ExampleParcel.java @@ -0,0 +1,24 @@ +package com.github.frankiesardo.icepick; + +import org.parceler.Parcel; +import org.parceler.ParcelConstructor; + +@Parcel +public class ExampleParcel { + String name; + int age; + + @ParcelConstructor + public ExampleParcel(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } +} diff --git a/sample/src/main/java/com/github/frankiesardo/icepick/MainActivity.java b/sample/src/main/java/com/github/frankiesardo/icepick/MainActivity.java index f7f7521..5dbda3f 100644 --- a/sample/src/main/java/com/github/frankiesardo/icepick/MainActivity.java +++ b/sample/src/main/java/com/github/frankiesardo/icepick/MainActivity.java @@ -12,6 +12,7 @@ public class MainActivity extends BaseActivity { @Icicle String message; @Icicle Bundle someUnusedExtras = new Bundle(); @Icicle DateTime timestamp = DateTime.now(); + @Icicle ExampleParcel exampleParcel; CustomView customView;