Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.

Commit 1a3c81a

Browse files
committed
Added parceler @Extra and @InstanceState support
1 parent e8e0533 commit 1a3c81a

11 files changed

Lines changed: 119 additions & 10 deletions

File tree

‎AndroidAnnotations/androidannotations-core/androidannotations-test/pom.xml‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,17 @@
8282
<version>140</version>
8383
<scope>test</scope>
8484
</dependency>
85+
<dependency>
86+
<groupId>org.parceler</groupId>
87+
<artifactId>parceler</artifactId>
88+
<version>1.0.3</version>
89+
<scope>provided</scope>
90+
</dependency>
91+
<dependency>
92+
<groupId>org.parceler</groupId>
93+
<artifactId>parceler-api</artifactId>
94+
<version>1.0.3</version>
95+
</dependency>
8596
</dependencies>
8697
<build>
8798
<plugins>

‎AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/ExtraInjectedActivity.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import org.androidannotations.annotations.EActivity;
2121
import org.androidannotations.annotations.Extra;
22+
import org.androidannotations.test.parceler.ParcelerBean;
2223

2324
import android.app.Activity;
2425
import android.content.Intent;
@@ -41,6 +42,9 @@ public class ExtraInjectedActivity extends Activity {
4142
@Extra("byteArrayExtra")
4243
byte[] byteArrayExtra;
4344

45+
@Extra("parcelerExtra")
46+
ParcelerBean parcelerExample;
47+
4448
@Extra
4549
String extraWithoutValue;
4650

@@ -57,6 +61,8 @@ void intentWithExtras() {
5761
ExtraInjectedActivity_.intent(this).intExtra(42).get();
5862
ExtraInjectedActivity_.intent(this).stringExtra("hello")
5963
.startForResult(42);
64+
ExtraInjectedActivity_.intent(this)
65+
.parcelerExample(new ParcelerBean("Andy", 42));
6066
ExtraInjectedActivity_.intent(this)
6167
.parcelableSerializableData(new ParcelableSerializableData())
6268
.get();

‎AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/instancestate/SaveInstanceStateActivity.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.androidannotations.annotations.EActivity;
2121
import org.androidannotations.annotations.InstanceState;
2222
import org.androidannotations.test.R;
23+
import org.androidannotations.test.parceler.ParcelerBean;
2324

2425
import android.app.Activity;
2526
import android.os.Bundle;
@@ -180,4 +181,6 @@ public class SaveInstanceStateActivity extends Activity {
180181
@InstanceState
181182
Bundle bundle;
182183

184+
@InstanceState
185+
ParcelerBean parcelerBean;
183186
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* Copyright (C) 2010-2015 eBusiness Information, Excilys Group
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
5+
* use this file except in compliance with the License. You may obtain a copy of
6+
* the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed To in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations under
14+
* the License.
15+
*/
16+
package org.androidannotations.test.parceler;
17+
18+
import org.parceler.Parcel;
19+
import org.parceler.ParcelConstructor;
20+
21+
22+
@Parcel
23+
public class ParcelerBean {
24+
25+
String name;
26+
int age;
27+
28+
public ParcelerBean() {
29+
}
30+
31+
@ParcelConstructor
32+
public ParcelerBean(String name, int age) {
33+
this.name = name;
34+
this.age = age;
35+
}
36+
37+
public String getName() {
38+
return name;
39+
}
40+
41+
public int getAge() {
42+
return age;
43+
}
44+
}

‎AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/InjectExtraTest.java‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import java.util.ArrayList;
2121

22+
import org.androidannotations.test.parceler.ParcelerBean;
2223
import org.junit.Before;
2324
import org.junit.Test;
2425
import org.junit.runner.RunWith;
@@ -93,4 +94,11 @@ public void extraWithoutValueInjected() {
9394
assertThat(activity.extraWithoutValue).isEqualTo("Hello!");
9495
}
9596

97+
@Test
98+
public void parcelerExtraInjected() {
99+
controller.withIntent(ExtraInjectedActivity_.intent(context).parcelerExample(new ParcelerBean("Andy", 42)).get()).create();
100+
assertThat(activity.parcelerExample.getName()).isEqualTo("Andy");
101+
assertThat(activity.parcelerExample.getAge()).isEqualTo(42);
102+
}
103+
96104
}

‎AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/helper/AnnotationHelper.java‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,19 @@ public TypeElement typeElementFromQualifiedName(String qualifiedName) {
9595
return getElementUtils().getTypeElement(qualifiedName);
9696
}
9797

98+
public boolean isAnnotatedWith(TypeMirror typeMirror, String qualifedName) {
99+
if (typeMirror instanceof DeclaredType) {
100+
Element element = ((DeclaredType) typeMirror).asElement();
101+
102+
for (AnnotationMirror annotationMirror : element.getAnnotationMirrors()) {
103+
if (annotationMirror.getAnnotationType().toString().equals(qualifedName)) {
104+
return true;
105+
}
106+
}
107+
}
108+
return false;
109+
}
110+
98111
public String generatedClassQualifiedNameFromQualifiedName(String qualifiedName) {
99112
TypeElement type = typeElementFromQualifiedName(qualifiedName);
100113
if (type.getNestingKind() == NestingKind.MEMBER) {

‎AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/helper/BundleHelper.java‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ public class BundleHelper {
8383

8484
private boolean restoreCallNeedCastStatement = false;
8585
private boolean restoreCallNeedsSuppressWarning = false;
86+
private boolean parcelerBean = false;
8687

8788
private String methodNameToSave;
8889
private String methodNameToRestore;
@@ -172,6 +173,10 @@ public BundleHelper(AndroidAnnotationsEnvironment environment, TypeMirror elemen
172173
if (isTypeParcelable(type)) {
173174
methodNameToSave = "put" + "Parcelable";
174175
methodNameToRestore = "get" + "Parcelable";
176+
} else if (annotationHelper.isAnnotatedWith(type, "org.parceler.Parcel")) {
177+
methodNameToSave = "put" + "Parcelable";
178+
methodNameToRestore = "get" + "Parcelable";
179+
parcelerBean = true;
175180
} else {
176181
methodNameToSave = "put" + "Serializable";
177182
methodNameToRestore = "get" + "Serializable";
@@ -225,6 +230,10 @@ public JExpression getExpressionToRestoreFromBundle(JClass variableClass, JExpre
225230
expressionToRestore = JExpr.invoke(bundle, methodNameToRestore).arg(extraKey);
226231
}
227232

233+
if (parcelerBean) {
234+
expressionToRestore = environment.getCodeModel().ref("org.parceler.Parcels").staticInvoke("unwrap").arg(expressionToRestore);
235+
}
236+
228237
if (restoreCallNeedCastStatement) {
229238
expressionToRestore = JExpr.cast(variableClass, expressionToRestore);
230239

@@ -234,4 +243,8 @@ public JExpression getExpressionToRestoreFromBundle(JClass variableClass, JExpre
234243
}
235244
return expressionToRestore;
236245
}
246+
247+
public boolean isParcelerBean() {
248+
return parcelerBean;
249+
}
237250
}

‎AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -545,8 +545,10 @@ public void canBePutInABundle(Element element, ElementValidation valid) {
545545
if (typeMirror.getKind() != TypeKind.NONE) {
546546
TypeMirror parcelableType = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.PARCELABLE).asType();
547547
TypeMirror serializableType = annotationHelper.typeElementFromQualifiedName("java.io.Serializable").asType();
548-
if (!annotationHelper.isSubtype(typeMirror, parcelableType) && !annotationHelper.isSubtype(typeMirror, serializableType)) {
549-
valid.addError("Unrecognized type. Please let your attribute be primitive or implement Serializable or Parcelable");
548+
if (!annotationHelper.isSubtype(typeMirror, parcelableType)
549+
&& !annotationHelper.isSubtype(typeMirror, serializableType)
550+
&& !annotationHelper.isAnnotatedWith(typeMirror, "org.parceler.Parcel")) {
551+
valid.addError("Unrecognized type. Please let your attribute be primitive or implement Serializable or Parcelable or an annotated Parceler bean.");
550552
}
551553
}
552554
}

‎AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/FragmentArgHandler.java‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,10 @@ private void createBuilderInjectionMethod(Element element, EFragmentHolder holde
106106
JClass paramClass = codeModelHelper.typeMirrorToJClass(type);
107107

108108
JMethod method = builderClass.method(PUBLIC, holder.narrow(builderClass), fieldName);
109-
JVar arg = method.param(paramClass, fieldName);
109+
JExpression arg = method.param(paramClass, fieldName);
110+
if (bundleHelper.isParcelerBean()) {
111+
arg = getCodeModel().ref("org.parceler.Parcels").staticInvoke("wrap").arg(arg);
112+
}
110113
method.body().invoke(builderArgsField, bundleHelper.getMethodNameToSave()).arg(argKeyStaticField).arg(arg);
111114
method.body()._return(_this());
112115

‎AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/InstanceStateHandler.java‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,11 @@ public void process(Element element, HasInstanceState holder) {
6666
BundleHelper bundleHelper = new BundleHelper(getEnvironment(), type);
6767

6868
JFieldRef ref = ref(fieldName);
69-
saveStateBody.invoke(saveStateBundleParam, bundleHelper.getMethodNameToSave()).arg(fieldName).arg(ref);
69+
JExpression refExpression = ref;
70+
if (bundleHelper.isParcelerBean()) {
71+
refExpression = getCodeModel().ref("org.parceler.Parcels").staticInvoke("wrap").arg(refExpression);
72+
}
73+
saveStateBody.invoke(saveStateBundleParam, bundleHelper.getMethodNameToSave()).arg(fieldName).arg(refExpression);
7074

7175
JExpression restoreMethodCall = bundleHelper.getExpressionToRestoreFromBundle(elementClass, restoreStateBundleParam, JExpr.lit(fieldName), restoreStateMethod);
7276
restoreStateBody.assign(ref, restoreMethodCall);

0 commit comments

Comments
 (0)