Skip to content

Commit d9ce667

Browse files
committed
Merge merged PR 733 : Fix extra
2 parents cce0a2c + 9dcfe8d commit d9ce667

6 files changed

Lines changed: 45 additions & 41 deletions

File tree

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ExtraHandler.java‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@ public void process(Element element, HasExtras holder) {
9494

9595
private JFieldVar createStaticExtraField(HasExtras holder, String extraKey, String fieldName) {
9696
String staticFieldName = CaseHelper.camelCaseToUpperSnakeCase(null, fieldName, "Extra");
97-
return holder.getGeneratedClass().field(PUBLIC | STATIC | FINAL, classes().STRING, staticFieldName, lit(extraKey));
97+
JFieldVar staticExtraField = holder.getGeneratedClass().fields().get(staticFieldName);
98+
if (staticExtraField == null) {
99+
staticExtraField = holder.getGeneratedClass().field(PUBLIC | STATIC | FINAL, classes().STRING, staticFieldName, lit(extraKey));
100+
}
101+
return staticExtraField;
98102
}
99103

100104
private void injectExtraInComponent(Element element, HasExtras hasExtras, JFieldVar extraKeyStaticField, String fieldName) {
@@ -138,6 +142,6 @@ private JExpression handleByteArrayExtraBug(Element element, JFieldVar extraKeyS
138142
}
139143

140144
private void createIntentInjectionMethod(Element element, HasIntentBuilder holder, JFieldVar extraKeyStaticField, String fieldName) {
141-
holder.getIntentBuilder().getPutExtraMethod(element.asType(), fieldName, extraKeyStaticField.name());
145+
holder.getIntentBuilder().getPutExtraMethod(element.asType(), fieldName, extraKeyStaticField);
142146
}
143147
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ServiceActionHandler.java‎

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.androidannotations.helper.BundleHelper;
2323
import org.androidannotations.helper.CaseHelper;
2424
import org.androidannotations.holder.EIntentServiceHolder;
25+
import org.androidannotations.holder.HasExtras;
2526
import org.androidannotations.model.AnnotationElements;
2627
import org.androidannotations.process.IsValid;
2728

@@ -103,10 +104,11 @@ private void addActionInOnHandleIntent(EIntentServiceHolder holder, ExecutableEl
103104
for (VariableElement param : methodParameters) {
104105
String paramName = param.getSimpleName().toString();
105106
String extraParamName = paramName + "Extra";
107+
JFieldVar paramVar = getStaticExtraField(holder, paramName);
106108
JClass extraParamClass = codeModelHelper.typeMirrorToJClass(param.asType(), holder);
107109
BundleHelper bundleHelper = new BundleHelper(annotationHelper, param);
108110

109-
JExpression getExtraExpression = JExpr.invoke(extras, bundleHelper.getMethodNameToRestore()).arg(paramName);
111+
JExpression getExtraExpression = JExpr.invoke(extras, bundleHelper.getMethodNameToRestore()).arg(paramVar);
110112
if (bundleHelper.restoreCallNeedCastStatement()) {
111113
getExtraExpression = JExpr.cast(extraParamClass, getExtraExpression);
112114

@@ -140,13 +142,24 @@ private void addActionToIntentBuilder(EIntentServiceHolder holder, ExecutableEle
140142
for (VariableElement param : methodParameters) {
141143
String paramName = param.getSimpleName().toString();
142144
JClass parameterClass = codeModelHelper.typeMirrorToJClass(param.asType(), holder);
145+
146+
JFieldVar paramVar = getStaticExtraField(holder, paramName);
143147
JVar methodParam = method.param(parameterClass, paramName);
144148

145-
JMethod putExtraMethod = holder.getIntentBuilder().getPutExtraMethod(param.asType(), paramName, paramName);
149+
JMethod putExtraMethod = holder.getIntentBuilder().getPutExtraMethod(param.asType(), paramName, paramVar);
146150
body.invoke(putExtraMethod).arg(methodParam);
147151
}
148152

149153
}
150154
body._return(JExpr._this());
151155
}
156+
157+
private JFieldVar getStaticExtraField(EIntentServiceHolder holder, String extraName) {
158+
String staticFieldName = CaseHelper.camelCaseToUpperSnakeCase(null, extraName, "Extra");
159+
JFieldVar staticExtraField = holder.getGeneratedClass().fields().get(staticFieldName);
160+
if (staticExtraField == null) {
161+
staticExtraField = holder.getGeneratedClass().field(PUBLIC | STATIC | FINAL, classes().STRING, staticFieldName, lit(extraName));
162+
}
163+
return staticExtraField;
164+
}
152165
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java‎

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,37 +15,21 @@
1515
*/
1616
package org.androidannotations.helper;
1717

18-
import static com.sun.codemodel.JExpr._new;
19-
import static com.sun.codemodel.JExpr._this;
20-
import static com.sun.codemodel.JExpr.cast;
21-
import static com.sun.codemodel.JMod.FINAL;
22-
import static com.sun.codemodel.JMod.PRIVATE;
23-
import static com.sun.codemodel.JMod.PUBLIC;
24-
import static com.sun.codemodel.JMod.STATIC;
25-
import static javax.lang.model.element.ElementKind.CONSTRUCTOR;
26-
import static org.androidannotations.helper.CanonicalNameConstants.PARCELABLE;
27-
import static org.androidannotations.helper.CanonicalNameConstants.SERIALIZABLE;
28-
import static org.androidannotations.helper.CanonicalNameConstants.STRING;
2918

3019
import java.lang.reflect.Field;
3120
import java.util.ArrayList;
3221
import java.util.List;
3322

34-
import javax.annotation.processing.ProcessingEnvironment;
3523
import javax.lang.model.element.Element;
3624
import javax.lang.model.element.ExecutableElement;
3725
import javax.lang.model.element.TypeElement;
3826
import javax.lang.model.element.VariableElement;
39-
import javax.lang.model.type.*;
4027
import javax.lang.model.util.ElementFilter;
4128
import javax.lang.model.type.ArrayType;
4229
import javax.lang.model.type.DeclaredType;
4330
import javax.lang.model.type.TypeKind;
4431
import javax.lang.model.type.TypeMirror;
4532
import javax.lang.model.type.WildcardType;
46-
import javax.lang.model.util.Elements;
47-
import javax.lang.model.util.Types;
48-
4933
import org.androidannotations.holder.EComponentHolder;
5034
import org.androidannotations.holder.GeneratedClassHolder;
5135

@@ -61,7 +45,6 @@
6145
import com.sun.codemodel.JMod;
6246
import com.sun.codemodel.JStatement;
6347
import com.sun.codemodel.JType;
64-
import com.sun.codemodel.JTypeVar;
6548
import com.sun.codemodel.JVar;
6649

6750
public class APTCodeModelHelper {

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IntentBuilder.java‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,17 +143,17 @@ private boolean hasFragmentSupportInClasspath() {
143143
return elementUtils.getTypeElement(CanonicalNameConstants.SUPPORT_V4_FRAGMENT) != null;
144144
}
145145

146-
public JMethod getPutExtraMethod(TypeMirror elementType, String parameterName, String extraName) {
146+
public JMethod getPutExtraMethod(TypeMirror elementType, String parameterName, JFieldVar extraKeyField) {
147147
Pair<TypeMirror, String> signature = new Pair<TypeMirror, String>(elementType,parameterName);
148148
JMethod putExtraMethod = putExtraMethods.get(signature);
149149
if (putExtraMethod == null) {
150-
putExtraMethod = addPutExtraMethod(elementType, parameterName, extraName);
150+
putExtraMethod = addPutExtraMethod(elementType, parameterName, extraKeyField);
151151
putExtraMethods.put(signature, putExtraMethod);
152152
}
153153
return putExtraMethod;
154154
}
155155

156-
private JMethod addPutExtraMethod(TypeMirror elementType, String parameterName, String extraName) {
156+
private JMethod addPutExtraMethod(TypeMirror elementType, String parameterName, JFieldVar extraKeyField) {
157157
boolean castToSerializable = false;
158158
boolean castToParcelable = false;
159159
if (elementType.getKind() == TypeKind.DECLARED) {
@@ -176,7 +176,7 @@ private JMethod addPutExtraMethod(TypeMirror elementType, String parameterName,
176176
JClass parameterClass = codeModelHelper.typeMirrorToJClass(elementType, holder);
177177
JVar extraParameterVar = method.param(parameterClass, parameterName);
178178
JBlock body = method.body();
179-
JInvocation invocation = body.invoke(holder.getIntentField(), "putExtra").arg(extraName);
179+
JInvocation invocation = body.invoke(holder.getIntentField(), "putExtra").arg(extraKeyField);
180180
if (castToSerializable) {
181181
invocation.arg(cast(holder.classes().SERIALIZABLE, extraParameterVar));
182182
} else if (castToParcelable) {

‎AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/InjectExtraTest.java‎

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,32 +23,33 @@
2323
import org.junit.Test;
2424
import org.junit.runner.RunWith;
2525

26-
import android.content.Intent;
26+
import android.app.Activity;
27+
import android.content.Context;
2728

2829
@RunWith(AndroidAnnotationsTestRunner.class)
2930
public class InjectExtraTest {
3031

31-
private Intent intent;
3232
private ExtraInjectedActivity_ activity;
33+
private Context context = new Activity();
3334

3435
@Before
3536
public void setup() {
3637
activity = new ExtraInjectedActivity_();
37-
intent = new Intent();
38-
activity.setIntent(intent);
3938
}
4039

4140
@Test
4241
public void simple_string_extra_injected() {
43-
intent.putExtra("stringExtra", "Hello!");
42+
activity.setIntent(ExtraInjectedActivity_.intent(context)
43+
.stringExtra("Hello!").get());
4444
activity.onCreate(null);
4545
assertThat(activity.stringExtra).isEqualTo("Hello!");
4646
}
4747

4848
@Test
4949
public void array_extra_injected() {
5050
CustomData[] customData = { new CustomData("42") };
51-
intent.putExtra("arrayExtra", customData);
51+
activity.setIntent(ExtraInjectedActivity_.intent(context)
52+
.arrayExtra(customData).get());
5253
activity.onCreate(null);
5354
assertThat(activity.arrayExtra).isEqualTo(customData);
5455
}
@@ -57,42 +58,45 @@ public void array_extra_injected() {
5758
public void list_extra_injected() {
5859
ArrayList<String> list = new ArrayList<String>();
5960
list.add("Hello !");
60-
intent.putExtra("listExtra", list);
61+
activity.setIntent(ExtraInjectedActivity_.intent(context)
62+
.listExtra(list).get());
6163
activity.onCreate(null);
6264
assertThat(activity.listExtra).isEqualTo(list);
6365
}
6466

6567
@Test
6668
public void int_extra_injected() {
67-
intent.putExtra("intExtra", 42);
69+
activity.setIntent(ExtraInjectedActivity_.intent(context).intExtra(42)
70+
.get());
6871
activity.onCreate(null);
6972
assertThat(activity.intExtra).isEqualTo(42);
7073
}
7174

7275
@Test
7376
public void int_array_extra_injected() {
7477
byte[] byteArray = { 0, 2 };
75-
intent.putExtra("byteArrayExtra", byteArray);
78+
activity.setIntent(ExtraInjectedActivity_.intent(context)
79+
.byteArrayExtra(byteArray).get());
7680
activity.onCreate(null);
7781
assertThat(activity.byteArrayExtra).isEqualTo(byteArray);
7882
}
7983

8084
@Test
8185
public void setIntent_reinjects_extra() {
82-
intent.putExtra("stringExtra", "Hello!");
86+
activity.setIntent(ExtraInjectedActivity_.intent(context)
87+
.stringExtra("Hello!").get());
8388
activity.onCreate(null);
8489

85-
Intent newIntent = new Intent();
86-
newIntent.putExtra("stringExtra", "Hello Again!");
87-
88-
activity.setIntent(newIntent);
90+
activity.setIntent(ExtraInjectedActivity_.intent(context)
91+
.stringExtra("Hello Again!").get());
8992

9093
assertThat(activity.stringExtra).isEqualTo("Hello Again!");
9194
}
9295

9396
@Test
9497
public void extraWithoutValueInjected() {
95-
intent.putExtra("extraWithoutValue", "Hello!");
98+
activity.setIntent(ExtraInjectedActivity_.intent(context)
99+
.extraWithoutValue("Hello!").get());
96100
activity.onCreate(null);
97101
assertThat(activity.extraWithoutValue).isEqualTo("Hello!");
98102
}

‎AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtraInjectedActivity.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
@EActivity
2727
public class ExtraInjectedActivity extends Activity {
2828

29-
@Extra("stringExtra")
29+
@Extra("aStringExtra")
3030
String stringExtra;
3131

3232
@Extra("arrayExtra")

0 commit comments

Comments
 (0)