1717
1818import static com .helger .jcodemodel .JExpr .cast ;
1919import static com .helger .jcodemodel .JExpr .invoke ;
20- import static com .helger .jcodemodel .JExpr .ref ;
20+
21+ import java .lang .annotation .Annotation ;
2122
2223import javax .lang .model .element .Element ;
24+ import javax .lang .model .element .ExecutableElement ;
2325import javax .lang .model .element .TypeElement ;
2426import javax .lang .model .type .TypeMirror ;
2527
2628import org .androidannotations .AndroidAnnotationsEnvironment ;
2729import org .androidannotations .ElementValidation ;
30+ import org .androidannotations .handler .MethodInjectionHandler ;
2831import org .androidannotations .helper .CanonicalNameConstants ;
32+ import org .androidannotations .helper .InjectHelper ;
2933import org .androidannotations .holder .EComponentWithViewSupportHolder ;
3034import org .androidannotations .holder .EFragmentHolder ;
3135
36+ import com .helger .jcodemodel .IJAssignmentTarget ;
3237import com .helger .jcodemodel .IJExpression ;
3338import com .helger .jcodemodel .JBlock ;
3439import 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