1616package org .androidannotations .internal .core .handler ;
1717
1818import static com .helger .jcodemodel .JExpr ._new ;
19- import static com .helger .jcodemodel .JExpr .ref ;
2019
2120import java .util .List ;
2221
2322import javax .lang .model .element .Element ;
23+ import javax .lang .model .element .ElementKind ;
2424import javax .lang .model .element .TypeElement ;
2525import javax .lang .model .type .DeclaredType ;
2626import javax .lang .model .type .TypeMirror ;
2929import org .androidannotations .ElementValidation ;
3030import org .androidannotations .annotations .ViewsById ;
3131import org .androidannotations .handler .BaseAnnotationHandler ;
32+ import org .androidannotations .handler .MethodInjectionHandler ;
3233import org .androidannotations .helper .CanonicalNameConstants ;
3334import org .androidannotations .helper .IdValidatorHelper ;
35+ import org .androidannotations .helper .InjectHelper ;
3436import org .androidannotations .holder .EComponentWithViewSupportHolder ;
3537import org .androidannotations .holder .FoundViewHolder ;
3638import org .androidannotations .rclass .IRClass ;
3739
3840import com .helger .jcodemodel .AbstractJClass ;
41+ import com .helger .jcodemodel .IJAssignmentTarget ;
42+ import com .helger .jcodemodel .IJExpression ;
43+ import com .helger .jcodemodel .JBlock ;
3944import com .helger .jcodemodel .JFieldRef ;
4045
41- public class ViewsByIdHandler extends BaseAnnotationHandler <EComponentWithViewSupportHolder > {
46+ public class ViewsByIdHandler extends BaseAnnotationHandler <EComponentWithViewSupportHolder >implements MethodInjectionHandler <EComponentWithViewSupportHolder > {
47+
48+ private final InjectHelper <EComponentWithViewSupportHolder > injectHelper ;
4249
4350 public ViewsByIdHandler (AndroidAnnotationsEnvironment environment ) {
4451 super (ViewsById .class , environment );
52+ injectHelper = new InjectHelper <>(validatorHelper , this );
4553 }
4654
4755 @ Override
4856 public void validate (Element element , ElementValidation validation ) {
49- validatorHelper . enclosingElementHasEnhancedViewSupportAnnotation ( element , validation );
57+ injectHelper . validate ( ViewsById . class , element , validation );
5058
51- validatorHelper .isDeclaredType (element , validation );
59+ Element param = injectHelper .getParam (element );
60+ validatorHelper .isDeclaredType (param , validation );
5261
53- validatorHelper .extendsListOfView (element , validation );
62+ validatorHelper .extendsListOfView (param , validation );
5463
5564 validatorHelper .resIdsExist (element , IRClass .Res .ID , IdValidatorHelper .FallbackStrategy .NEED_RES_ID , validation );
5665
@@ -59,27 +68,51 @@ public void validate(Element element, ElementValidation validation) {
5968
6069 @ Override
6170 public void process (Element element , EComponentWithViewSupportHolder holder ) {
62- JFieldRef elementRef = ref (element .getSimpleName ().toString ());
71+ injectHelper .process (element , holder );
72+ }
6373
64- TypeMirror viewType = extractViewClass (element );
74+ @ Override
75+ public JBlock getInvocationBlock (EComponentWithViewSupportHolder holder ) {
76+ return holder .getOnViewChangedBodyInjectionBlock ();
77+ }
78+
79+ @ Override
80+ public void assignValue (JBlock targetBlock , IJAssignmentTarget fieldRef , EComponentWithViewSupportHolder holder , Element element , Element param ) {
81+ TypeMirror viewType = extractViewClass (param );
6582 AbstractJClass viewClass = codeModelHelper .typeMirrorToJClass (viewType );
6683
67- instantiateArrayList ( elementRef , viewType , holder );
68- clearList ( elementRef , holder );
84+ String listName = getListName ( element , param );
85+ IJExpression arrayList = instantiateArrayList ( viewType , holder , "list_" + listName );
6986
7087 List <JFieldRef > idsRefs = annotationHelper .extractAnnotationFieldRefs (element , IRClass .Res .ID , true );
7188 for (JFieldRef idRef : idsRefs ) {
72- addViewToListIfNotNull (elementRef , viewClass , idRef , holder );
89+ addViewToListIfNotNull (arrayList , viewClass , idRef , holder );
90+ }
7391
92+ targetBlock .add (fieldRef .assign (arrayList ));
93+ }
94+
95+ @ Override
96+ public void validateEnclosingElement (Element element , ElementValidation valid ) {
97+ validatorHelper .enclosingElementHasEnhancedViewSupportAnnotation (element , valid );
98+ }
99+
100+ private String getListName (Element element , Element param ) {
101+ String listName = param .getSimpleName ().toString ();
102+ if (element .getKind () == ElementKind .PARAMETER ) {
103+ listName = element .getEnclosingElement ().getSimpleName ().toString () + "_" + listName ;
104+ } else if (element .getKind () == ElementKind .METHOD ) {
105+ listName = element .getSimpleName ().toString () + "_" + listName ;
74106 }
107+ return listName ;
75108 }
76109
77- private void instantiateArrayList (JFieldRef elementRef , TypeMirror viewType , EComponentWithViewSupportHolder holder ) {
110+ private IJExpression instantiateArrayList (TypeMirror viewType , EComponentWithViewSupportHolder holder , String name ) {
78111 TypeElement arrayListTypeElement = annotationHelper .typeElementFromQualifiedName (CanonicalNameConstants .ARRAYLIST );
79112 DeclaredType arrayListType = getProcessingEnvironment ().getTypeUtils ().getDeclaredType (arrayListTypeElement , viewType );
80113 AbstractJClass arrayListClass = codeModelHelper .typeMirrorToJClass (arrayListType );
81114
82- holder .getInitBodyInjectionBlock ().assign ( elementRef , _new (arrayListClass ));
115+ return holder .getOnViewChangedBodyBeforeInjectionBlock ().decl ( arrayListClass , name , _new (arrayListClass ));
83116 }
84117
85118 private TypeMirror extractViewClass (Element element ) {
@@ -93,11 +126,7 @@ private TypeMirror extractViewClass(Element element) {
93126 return viewType ;
94127 }
95128
96- private void clearList (JFieldRef elementRef , EComponentWithViewSupportHolder holder ) {
97- holder .getOnViewChangedBodyBeforeInjectionBlock ().add (elementRef .invoke ("clear" ));
98- }
99-
100- private void addViewToListIfNotNull (JFieldRef elementRef , AbstractJClass viewClass , JFieldRef idRef , EComponentWithViewSupportHolder holder ) {
129+ private void addViewToListIfNotNull (IJExpression elementRef , AbstractJClass viewClass , JFieldRef idRef , EComponentWithViewSupportHolder holder ) {
101130 FoundViewHolder foundViewHolder = holder .getFoundViewHolder (idRef , viewClass );
102131 foundViewHolder .getIfNotNullBlock ().invoke (elementRef , "add" ).arg (foundViewHolder .getOrCastRef (viewClass ));
103132 }
0 commit comments