Skip to content

Commit 2ee251d

Browse files
committed
Fix runtime crash on Android 2.3
1 parent 51f31e1 commit 2ee251d

6 files changed

Lines changed: 73 additions & 24 deletions

File tree

AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ private ProcessResult processAnnotations(AnnotationElements validatedModel, IRCl
551551
private ModelProcessor buildModelProcessor(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest, AnnotationElements validatedModel) {
552552
ModelProcessor modelProcessor = new ModelProcessor();
553553
modelProcessor.register(new EApplicationProcessor());
554-
modelProcessor.register(new EActivityProcessor(processingEnv, rClass));
554+
modelProcessor.register(new EActivityProcessor(processingEnv, rClass, androidManifest));
555555
modelProcessor.register(new EServiceProcessor(processingEnv));
556556
modelProcessor.register(new EIntentServiceProcessor(processingEnv));
557557
modelProcessor.register(new EReceiverProcessor());

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -298,15 +298,15 @@ public JVar findParameterByName(JMethod method, String name) {
298298
return null;
299299
}
300300

301-
public void addActivityIntentBuilder(JCodeModel codeModel, EBeanHolder holder, AnnotationHelper annotationHelper) throws Exception {
302-
addIntentBuilder(codeModel, holder, annotationHelper, true);
301+
public void addActivityIntentBuilder(JCodeModel codeModel, EBeanHolder holder, AnnotationHelper annotationHelper, boolean addFragmentIntent) throws Exception {
302+
addIntentBuilder(codeModel, holder, annotationHelper, true, addFragmentIntent);
303303
}
304304

305305
public void addServiceIntentBuilder(JCodeModel codeModel, EBeanHolder holder, AnnotationHelper annotationHelper) throws Exception {
306-
addIntentBuilder(codeModel, holder, annotationHelper, false);
306+
addIntentBuilder(codeModel, holder, annotationHelper, false, false);
307307
}
308308

309-
private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, AnnotationHelper annotationHelper, boolean isActivity) throws JClassAlreadyExistsException {
309+
private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, AnnotationHelper annotationHelper, boolean isActivity, boolean addFragmentIntent) throws JClassAlreadyExistsException {
310310
JClass contextClass = holder.classes().CONTEXT;
311311
JClass intentClass = holder.classes().INTENT;
312312
JClass fragmentClass = holder.classes().FRAGMENT;
@@ -326,9 +326,10 @@ private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, Annotati
326326
constructorBody.assign(contextField, constructorContextParam);
327327
constructorBody.assign(holder.intentField, _new(intentClass).arg(constructorContextParam).arg(holder.generatedClass.dotclass()));
328328
}
329+
329330
// Additional constructor for fragments (issue #541)
330331
Elements elementUtils = annotationHelper.getElementUtils();
331-
boolean fragmentInClasspath = elementUtils.getTypeElement(CanonicalNameConstants.FRAGMENT) != null;
332+
boolean fragmentInClasspath = addFragmentIntent && elementUtils.getTypeElement(CanonicalNameConstants.FRAGMENT) != null;
332333
boolean fragmentSupportInClasspath = elementUtils.getTypeElement(CanonicalNameConstants.SUPPORT_V4_FRAGMENT) != null;
333334

334335
JFieldVar fragmentField = null;

AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/AndroidManifest.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,28 @@ public class AndroidManifest {
2626
private final String applicationClassName;
2727
private final boolean libraryProject;
2828
private final boolean debugabble;
29+
private final int minSdkVersion;
30+
private final int maxSdkVersion;
31+
private final int targetSdkVersion;
2932

30-
public static AndroidManifest createManifest(String applicationPackage, String applicationClassName, List<String> componentQualifiedNames, List<String> permissionQualifiedNames, boolean debugabble) {
31-
return new AndroidManifest(false, applicationPackage, applicationClassName, componentQualifiedNames, permissionQualifiedNames, debugabble);
33+
public static AndroidManifest createManifest(String applicationPackage, String applicationClassName, List<String> componentQualifiedNames, List<String> permissionQualifiedNames, int minSdkVersion, int maxSdkVersion, int targetSdkVersion, boolean debugabble) {
34+
return new AndroidManifest(false, applicationPackage, applicationClassName, componentQualifiedNames, permissionQualifiedNames, minSdkVersion, maxSdkVersion, targetSdkVersion, debugabble);
3235
}
3336

34-
public static AndroidManifest createLibraryManifest(String applicationPackage) {
35-
return new AndroidManifest(true, applicationPackage, "", Collections.<String> emptyList(), Collections.<String> emptyList(), false);
37+
public static AndroidManifest createLibraryManifest(String applicationPackage, int minSdkVersion, int maxSdkVersion, int targetSdkVersion) {
38+
return new AndroidManifest(true, applicationPackage, "", Collections.<String> emptyList(), Collections.<String> emptyList(), minSdkVersion, maxSdkVersion, targetSdkVersion, false);
3639
}
3740

38-
private AndroidManifest(boolean libraryProject, String applicationPackage, String applicationClassName, List<String> componentQualifiedNames, List<String> permissionQualifiedNames, boolean debuggable) {
41+
private AndroidManifest(boolean libraryProject, String applicationPackage, String applicationClassName, List<String> componentQualifiedNames, List<String> permissionQualifiedNames, int minSdkVersion, int maxSdkVersion, int targetSdkVersion, boolean debuggable) {
3942
this.libraryProject = libraryProject;
4043
this.applicationPackage = applicationPackage;
4144
this.applicationClassName = applicationClassName;
4245
this.componentQualifiedNames = componentQualifiedNames;
4346
this.permissionQualifiedNames = permissionQualifiedNames;
44-
this.debugabble = debuggable;
47+
this.minSdkVersion = minSdkVersion;
48+
this.maxSdkVersion = maxSdkVersion;
49+
this.targetSdkVersion = targetSdkVersion;
50+
debugabble = debuggable;
4551
}
4652

4753
public String getApplicationPackage() {
@@ -68,4 +74,16 @@ public boolean isDebuggable() {
6874
return debugabble;
6975
}
7076

77+
public int getMinSdkVersion() {
78+
return minSdkVersion;
79+
}
80+
81+
public int getMaxSdkVersion() {
82+
return maxSdkVersion;
83+
}
84+
85+
public int getTargetSdkVersion() {
86+
return targetSdkVersion;
87+
}
88+
7189
}

AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/AndroidManifestFinder.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
import org.w3c.dom.Document;
3737
import org.w3c.dom.Element;
38+
import org.w3c.dom.NamedNodeMap;
3839
import org.w3c.dom.Node;
3940
import org.w3c.dom.NodeList;
4041

@@ -171,7 +172,6 @@ private Option<File> findManifestInParentsDirectories() {
171172
}
172173

173174
private Option<AndroidManifest> parse(File androidManifestFile, boolean libraryProject) {
174-
175175
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
176176

177177
Document doc;
@@ -189,8 +189,19 @@ private Option<AndroidManifest> parse(File androidManifestFile, boolean libraryP
189189

190190
String applicationPackage = documentElement.getAttribute("package");
191191

192+
int minSdkVersion = -1;
193+
int maxSdkVersion = -1;
194+
int targetSdkVersion = -1;
195+
NodeList sdkNodes = documentElement.getElementsByTagName("uses-sdk");
196+
if (sdkNodes.getLength() > 0) {
197+
Node sdkNode = sdkNodes.item(0);
198+
minSdkVersion = extractAttributeIntValue(sdkNode, "android:minSdkVersion", -1);
199+
maxSdkVersion = extractAttributeIntValue(sdkNode, "android:maxSdkVersion", -1);
200+
targetSdkVersion = extractAttributeIntValue(sdkNode, "android:targetSdkVersion", -1);
201+
}
202+
192203
if (libraryProject) {
193-
return Option.of(AndroidManifest.createLibraryManifest(applicationPackage));
204+
return Option.of(AndroidManifest.createLibraryManifest(applicationPackage, minSdkVersion, maxSdkVersion, targetSdkVersion));
194205
}
195206

196207
NodeList applicationNodes = documentElement.getElementsByTagName("application");
@@ -241,7 +252,21 @@ private Option<AndroidManifest> parse(File androidManifestFile, boolean libraryP
241252
List<String> permissionQualifiedNames = new ArrayList<String>();
242253
permissionQualifiedNames.addAll(usesPermissionQualifiedNames);
243254

244-
return Option.of(AndroidManifest.createManifest(applicationPackage, applicationClassQualifiedName, componentQualifiedNames, permissionQualifiedNames, applicationDebuggableMode));
255+
return Option.of(AndroidManifest.createManifest(applicationPackage, applicationClassQualifiedName, componentQualifiedNames, permissionQualifiedNames, minSdkVersion, maxSdkVersion, targetSdkVersion, applicationDebuggableMode));
256+
}
257+
258+
private int extractAttributeIntValue(Node node, String attribute, int defaultValue) {
259+
try {
260+
NamedNodeMap attributes = node.getAttributes();
261+
if (attributes.getLength() > 0) {
262+
Node attributeNode = attributes.getNamedItem(attribute);
263+
if (attributeNode != null) {
264+
return Integer.parseInt(attributeNode.getNodeValue());
265+
}
266+
}
267+
} catch (NumberFormatException ignored) {
268+
}
269+
return defaultValue;
245270
}
246271

247272
private List<String> extractComponentNames(String applicationPackage, NodeList componentNodes) {

AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EActivityProcessor.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.androidannotations.annotations.EActivity;
3737
import org.androidannotations.api.SdkVersionHelper;
3838
import org.androidannotations.helper.APTCodeModelHelper;
39+
import org.androidannotations.helper.AndroidManifest;
3940
import org.androidannotations.helper.AnnotationHelper;
4041
import org.androidannotations.helper.CanonicalNameConstants;
4142
import org.androidannotations.helper.ModelConstants;
@@ -57,19 +58,22 @@
5758

5859
public class EActivityProcessor implements GeneratingElementProcessor {
5960

61+
private static final int MIN_SDK_WITH_FRAGMENT_SUPPORT = 11;
6062
private final IRClass rClass;
6163
private List<TypeElement> greendroidActivityElements;
6264

6365
private final AnnotationHelper annotationHelper;
6466

6567
private final ProcessingEnvironment processingEnv;
6668
private final APTCodeModelHelper aptCodeModelHelper;
69+
private AndroidManifest androidManifest;
6770

68-
public EActivityProcessor(ProcessingEnvironment processingEnv, IRClass rClass) {
71+
public EActivityProcessor(ProcessingEnvironment processingEnv, IRClass rClass, AndroidManifest androidManifest) {
6972
this.processingEnv = processingEnv;
73+
this.rClass = rClass;
74+
this.androidManifest = androidManifest;
7075
annotationHelper = new AnnotationHelper(processingEnv);
7176
aptCodeModelHelper = new APTCodeModelHelper();
72-
this.rClass = rClass;
7377

7478
greendroidActivityElements = new ArrayList<TypeElement>();
7579
for (String greendroidActivityName : GREENDROID_ACTIVITIES_LIST_CLASS) {
@@ -201,8 +205,8 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHo
201205

202206
}
203207

204-
aptCodeModelHelper.addActivityIntentBuilder(codeModel, holder, annotationHelper);
205-
208+
boolean addFragmentIntent = androidManifest.getMinSdkVersion() >= MIN_SDK_WITH_FRAGMENT_SUPPORT;
209+
aptCodeModelHelper.addActivityIntentBuilder(codeModel, holder, annotationHelper, addFragmentIntent);
206210
}
207211

208212
private void setContentViewMethod(String setContentViewMethodName, JCodeModel codeModel, EBeanHolder holder, JType[] paramTypes, String[] paramNames) {

AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/efragment/StartActivityFragment.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515
*/
1616
package org.androidannotations.test15.efragment;
1717

18-
import android.app.Fragment;
1918
import org.androidannotations.annotations.EFragment;
20-
import org.androidannotations.test15.ExtraInjectedActivity_;
19+
20+
import android.app.Fragment;
2121

2222
@EFragment
2323
public class StartActivityFragment extends Fragment {
24-
void startActivity() {
25-
ExtraInjectedActivity_.intent(this).start();
26-
}
24+
void startActivity() {
25+
// TODO: The only way to test this is to change minSdkVersion to 11 in AndroidManifest.xml but we want to stick on lower verison as possible
26+
// ExtraInjectedActivity_.intent(this).start();
27+
}
2728
}

0 commit comments

Comments
 (0)