Skip to content

Commit 0011b56

Browse files
committed
Fix androidannotations#541 startActivityForResult called on Fragment
1 parent 215e062 commit 0011b56

1 file changed

Lines changed: 47 additions & 5 deletions

File tree

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

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,10 @@ private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, boolean
333333
constructorBody.assign(contextField, constructorContextParam);
334334
constructorBody.assign(holder.intentField, _new(intentClass).arg(constructorContextParam).arg(holder.generatedClass.dotclass()));
335335
}
336+
// Additional constructor for fragments (issue #541)
337+
JFieldVar fragmentField =
338+
addIntentBuilderFragmentConstructor( holder, holder.classes().FRAGMENT, "fragment_", contextField );
339+
JFieldVar fragmentSupportField = addIntentBuilderFragmentConstructor( holder, holder.classes().SUPPORT_V4_FRAGMENT, "fragmentSupport_", contextField );
336340

337341
{
338342
// get()
@@ -360,11 +364,31 @@ private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, boolean
360364

361365
JBlock body = method.body();
362366
JClass activityClass = holder.classes().ACTIVITY;
363-
JConditional condition = body._if(contextField._instanceof(activityClass));
364-
condition._then() //
365-
.invoke(JExpr.cast(activityClass, contextField), "startActivityForResult").arg(holder.intentField).arg(requestCode);
366-
condition._else() //
367-
.invoke(contextField, "startActivity").arg(holder.intentField);
367+
368+
JConditional condition = null;
369+
if (fragmentSupportField != null) {
370+
condition = body._if(fragmentSupportField.ne(JExpr._null()));
371+
condition._then() //
372+
.invoke( fragmentSupportField, "startActivityForResult" ).arg(holder.intentField ).arg(requestCode);
373+
}
374+
if (fragmentField != null) {
375+
if (condition == null){
376+
condition=body._if(fragmentField.ne(JExpr._null()));
377+
} else {
378+
condition = condition._elseif(fragmentField.ne(JExpr._null()));
379+
}
380+
condition._then() //
381+
.invoke(fragmentField, "startActivityForResult").arg(holder.intentField).arg(requestCode);
382+
}
383+
if (condition == null) {
384+
condition=body._if(contextField._instanceof(activityClass));
385+
} else {
386+
condition = condition._elseif(contextField._instanceof(activityClass));
387+
}
388+
condition._then() //
389+
.invoke(JExpr.cast(activityClass, contextField), "startActivityForResult").arg(holder.intentField).arg(requestCode);
390+
condition._else() //
391+
.invoke(contextField, "startActivity").arg(holder.intentField);
368392
} else {
369393
// start()
370394
JMethod method = holder.intentBuilderClass.method(PUBLIC, holder.classes().COMPONENT_NAME, "start");
@@ -383,4 +407,22 @@ private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, boolean
383407
}
384408
}
385409
}
410+
411+
private JFieldVar addIntentBuilderFragmentConstructor(EBeanHolder holder, JClass fragmentClass, String fieldName, JFieldVar contextField) {
412+
413+
try{
414+
Class.forName( fragmentClass.fullName(), false, getClass().getClassLoader() );
415+
} catch ( ClassNotFoundException e ){
416+
// do nothing if the class is not in the classpath
417+
return null;
418+
}
419+
JFieldVar fragmentField = holder.intentBuilderClass.field(PRIVATE, fragmentClass, fieldName);
420+
JMethod constructor = holder.intentBuilderClass.constructor(JMod.PUBLIC);
421+
JVar constructorFragmentParam = constructor.param(fragmentClass, "fragment");
422+
JBlock constructorBody = constructor.body();
423+
constructorBody.assign(fragmentField, constructorFragmentParam);
424+
constructorBody.assign(contextField, constructorFragmentParam.invoke( "getActivity" ));
425+
constructorBody.assign(holder.intentField, _new(holder.classes().INTENT).arg(contextField).arg(holder.generatedClass.dotclass()));
426+
return fragmentField;
427+
}
386428
}

0 commit comments

Comments
 (0)