Skip to content

Commit 63343c7

Browse files
committed
allow to inject fragments into @FragmentById or @FragmentByTag annotated methods
1 parent 8813c6b commit 63343c7

3 files changed

Lines changed: 38 additions & 11 deletions

File tree

‎AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/FragmentById.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@
106106
* @see FragmentByTag
107107
*/
108108
@Retention(RetentionPolicy.CLASS)
109-
@Target(ElementType.FIELD)
109+
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
110110
public @interface FragmentById {
111111

112112
/**

‎AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/FragmentByTag.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
* @see FragmentById
109109
*/
110110
@Retention(RetentionPolicy.CLASS)
111-
@Target(ElementType.FIELD)
111+
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
112112
public @interface FragmentByTag {
113113

114114
/**

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

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,37 +17,50 @@
1717

1818
import static com.helger.jcodemodel.JExpr.cast;
1919
import static com.helger.jcodemodel.JExpr.invoke;
20-
import static com.helger.jcodemodel.JExpr.ref;
20+
21+
import java.lang.annotation.Annotation;
2122

2223
import javax.lang.model.element.Element;
24+
import javax.lang.model.element.ExecutableElement;
2325
import javax.lang.model.element.TypeElement;
2426
import javax.lang.model.type.TypeMirror;
2527

2628
import org.androidannotations.AndroidAnnotationsEnvironment;
2729
import org.androidannotations.ElementValidation;
30+
import org.androidannotations.handler.MethodInjectionHandler;
2831
import org.androidannotations.helper.CanonicalNameConstants;
32+
import org.androidannotations.helper.InjectHelper;
2933
import org.androidannotations.holder.EComponentWithViewSupportHolder;
3034
import org.androidannotations.holder.EFragmentHolder;
3135

36+
import com.helger.jcodemodel.IJAssignmentTarget;
3237
import com.helger.jcodemodel.IJExpression;
3338
import com.helger.jcodemodel.JBlock;
3439
import com.helger.jcodemodel.JMethod;
3540

41+
public abstract class AbstractFragmentByHandler extends CoreBaseAnnotationHandler<EComponentWithViewSupportHolder>implements MethodInjectionHandler<EComponentWithViewSupportHolder> {
3642

37-
public abstract class AbstractFragmentByHandler extends CoreBaseAnnotationHandler<EComponentWithViewSupportHolder> {
43+
private final InjectHelper<EComponentWithViewSupportHolder> injectHelper;
3844

45+
private Class<? extends Annotation> targetClass;
3946
protected String findFragmentMethodName;
4047

41-
public AbstractFragmentByHandler(Class<?> targetClass, AndroidAnnotationsEnvironment environment, String findFragmentMethodName) {
48+
public AbstractFragmentByHandler(Class<? extends Annotation> targetClass, AndroidAnnotationsEnvironment environment, String findFragmentMethodName) {
4249
super(targetClass, environment);
50+
this.targetClass = targetClass;
4351
this.findFragmentMethodName = findFragmentMethodName;
52+
injectHelper = new InjectHelper<>(validatorHelper, this);
4453
}
4554

4655
@Override
4756
protected void validate(Element element, ElementValidation validation) {
48-
validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validation);
57+
injectHelper.validate(targetClass, element, validation);
4958

50-
validatorHelper.extendsFragment(element, validation);
59+
Element param = element;
60+
if (element instanceof ExecutableElement) {
61+
param = ((ExecutableElement) element).getParameters().get(0);
62+
}
63+
validatorHelper.extendsFragment(param, validation);
5164

5265
validatorHelper.isNotPrivate(element, validation);
5366

@@ -60,27 +73,41 @@ protected void validate(Element element, ElementValidation validation) {
6073

6174
@Override
6275
public final void process(Element element, EComponentWithViewSupportHolder holder) throws Exception {
63-
TypeMirror elementType = element.asType();
76+
injectHelper.process(element, holder);
77+
}
78+
79+
@Override
80+
public JBlock getInvocationBlock(EComponentWithViewSupportHolder holder) {
81+
return holder.getOnViewChangedBodyInjectionBlock();
82+
}
83+
84+
@Override
85+
public void assignValue(JBlock targetBlock, IJAssignmentTarget fieldRef, EComponentWithViewSupportHolder holder, Element element, Element param) {
86+
TypeMirror elementType = param.asType();
6487
String typeQualifiedName = elementType.toString();
6588
TypeElement nativeFragmentElement = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.FRAGMENT);
6689
boolean isNativeFragment = nativeFragmentElement != null && annotationHelper.isSubtype(elementType, nativeFragmentElement.asType());
6790

6891
String fieldName = element.getSimpleName().toString();
69-
JBlock methodBody = holder.getOnViewChangedBodyInjectionBlock();
7092

7193
if (holder instanceof EFragmentHolder) {
7294
boolean childFragment = annotationHelper.extractAnnotationParameter(element, "childFragment");
7395

7496
String fragmentManagerGetter = childFragment ? "getChildFragmentManager" : "getFragmentManager";
7597

76-
methodBody.assign(ref(fieldName), cast(getJClass(typeQualifiedName), invoke(fragmentManagerGetter).invoke(findFragmentMethodName).arg(getFragmentId(element, fieldName))));
98+
targetBlock.add(fieldRef.assign(cast(getJClass(typeQualifiedName), invoke(fragmentManagerGetter).invoke(findFragmentMethodName).arg(getFragmentId(element, fieldName)))));
7799
} else {
78100
JMethod findFragmentMethod = getFindFragmentMethod(isNativeFragment, holder);
79101

80-
methodBody.assign(ref(fieldName), cast(getJClass(typeQualifiedName), invoke(findFragmentMethod).arg(getFragmentId(element, fieldName))));
102+
targetBlock.add(fieldRef.assign(cast(getJClass(typeQualifiedName), invoke(findFragmentMethod).arg(getFragmentId(element, fieldName)))));
81103
}
82104
}
83105

106+
@Override
107+
public void validateEnclosingElement(Element element, ElementValidation valid) {
108+
validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, valid);
109+
}
110+
84111
protected abstract JMethod getFindFragmentMethod(boolean isNativeFragment, EComponentWithViewSupportHolder holder);
85112

86113
protected abstract IJExpression getFragmentId(Element element, String fieldName);

0 commit comments

Comments
 (0)