From 598aff3ae2547a3958355d8c0b000b067ec16434 Mon Sep 17 00:00:00 2001 From: Yoann Delouis Date: Wed, 17 Apr 2013 11:45:25 +0200 Subject: [PATCH] Cast beans which implements Serializable and Parcelable into Parcelable in putExtra --- .../helper/CanonicalNameConstants.java | 2 ++ .../processing/EBeansHolder.java | 1 + .../processing/ExtraProcessor.java | 9 ++++++++ .../test15/ExtraInjectedActivity.java | 4 ++++ .../test15/ParcelableSerializableData.java | 21 +++++++++++++++++++ 5 files changed, 37 insertions(+) create mode 100644 AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ParcelableSerializableData.java diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java index 13b3a0ea30..587607d52f 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java @@ -15,6 +15,7 @@ */ package org.androidannotations.helper; +import java.io.Serializable; import java.net.URI; import java.sql.SQLException; import java.util.ArrayList; @@ -42,6 +43,7 @@ public final class CanonicalNameConstants { public static final String INTEGER = Integer.class.getCanonicalName(); public static final String BOOLEAN = Boolean.class.getCanonicalName(); public static final String ARRAYLIST = ArrayList.class.getCanonicalName(); + public static final String SERIALIZABLE = Serializable.class.getCanonicalName(); /* * Android diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java index 48ccd19bb4..bfc5e4137c 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java @@ -96,6 +96,7 @@ public class Classes { public final JClass HANDLER = refClass(CanonicalNameConstants.HANDLER); public final JClass KEY_STORE = refClass(CanonicalNameConstants.KEY_STORE); public final JClass VIEW_SERVER = refClass(CanonicalNameConstants.VIEW_SERVER); + public final JClass PARCELABLE = refClass(CanonicalNameConstants.PARCELABLE); /* * Sherlock diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ExtraProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ExtraProcessor.java index 62c5796e4e..2e92d3c51f 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ExtraProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ExtraProcessor.java @@ -26,6 +26,7 @@ import static com.sun.codemodel.JMod.PUBLIC; import static com.sun.codemodel.JMod.STATIC; import static org.androidannotations.helper.CanonicalNameConstants.PARCELABLE; +import static org.androidannotations.helper.CanonicalNameConstants.SERIALIZABLE; import static org.androidannotations.helper.CanonicalNameConstants.STRING; import javax.annotation.processing.ProcessingEnvironment; @@ -137,6 +138,7 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { JMethod method = holder.intentBuilderClass.method(PUBLIC, holder.intentBuilderClass, fieldName); boolean castToSerializable = false; + boolean castToParcelable = false; TypeMirror extraType = elementType; if (extraType.getKind() == TypeKind.DECLARED) { Elements elementUtils = processingEnv.getElementUtils(); @@ -147,6 +149,11 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { if (!typeUtils.isSubtype(extraType, stringType)) { castToSerializable = true; } + } else { + TypeMirror serializableType = elementUtils.getTypeElement(SERIALIZABLE).asType(); + if (typeUtils.isSubtype(extraType, serializableType)) { + castToParcelable = true; + } } } JClass paramClass = helper.typeMirrorToJClass(extraType, holder); @@ -155,6 +162,8 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { JInvocation invocation = body.invoke(holder.intentField, "putExtra").arg(extraKeyField); if (castToSerializable) { invocation.arg(cast(classes.SERIALIZABLE, extraParam)); + } else if (castToParcelable) { + invocation.arg(cast(classes.PARCELABLE, extraParam)); } else { invocation.arg(extraParam); } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtraInjectedActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtraInjectedActivity.java index 043e621d5e..f789e052ec 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtraInjectedActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtraInjectedActivity.java @@ -43,6 +43,9 @@ public class ExtraInjectedActivity extends Activity { @Extra String extraWithoutValue; + + @Extra + ParcelableSerializableData parcelableSerializableData; @Override protected void onNewIntent(Intent intent) { @@ -53,5 +56,6 @@ void intentWithExtras() { ExtraInjectedActivity_.intent(this).arrayExtra(null).start(); ExtraInjectedActivity_.intent(this).intExtra(42).get(); ExtraInjectedActivity_.intent(this).stringExtra("hello").startForResult(42); + ExtraInjectedActivity_.intent(this).parcelableSerializableData(new ParcelableSerializableData()).get(); } } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ParcelableSerializableData.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ParcelableSerializableData.java new file mode 100644 index 0000000000..747b8ed9b5 --- /dev/null +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ParcelableSerializableData.java @@ -0,0 +1,21 @@ +package org.androidannotations.test15; + +import java.io.Serializable; + +import android.os.Parcel; +import android.os.Parcelable; + +public class ParcelableSerializableData implements Parcelable, Serializable { + + private static final long serialVersionUID = 920532042616086169L; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + + } +}