Skip to content

Commit 161f128

Browse files
committed
allow to inject lists of views into @ViewsById annotated methods
1 parent bbda8a1 commit 161f128

2 files changed

Lines changed: 47 additions & 18 deletions

File tree

  • AndroidAnnotations/androidannotations-core
    • androidannotations-api/src/main/java/org/androidannotations/annotations
    • androidannotations/src/main/java/org/androidannotations/internal/core/handler

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
* @see org.androidannotations.annotations.AfterViews
6565
*/
6666
@Retention(RetentionPolicy.CLASS)
67-
@Target(ElementType.FIELD)
67+
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
6868
public @interface ViewsById {
6969

7070
/**

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

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
package org.androidannotations.internal.core.handler;
1717

1818
import static com.helger.jcodemodel.JExpr._new;
19-
import static com.helger.jcodemodel.JExpr.ref;
2019

2120
import java.util.List;
2221

2322
import javax.lang.model.element.Element;
23+
import javax.lang.model.element.ElementKind;
2424
import javax.lang.model.element.TypeElement;
2525
import javax.lang.model.type.DeclaredType;
2626
import javax.lang.model.type.TypeMirror;
@@ -29,28 +29,37 @@
2929
import org.androidannotations.ElementValidation;
3030
import org.androidannotations.annotations.ViewsById;
3131
import org.androidannotations.handler.BaseAnnotationHandler;
32+
import org.androidannotations.handler.MethodInjectionHandler;
3233
import org.androidannotations.helper.CanonicalNameConstants;
3334
import org.androidannotations.helper.IdValidatorHelper;
35+
import org.androidannotations.helper.InjectHelper;
3436
import org.androidannotations.holder.EComponentWithViewSupportHolder;
3537
import org.androidannotations.holder.FoundViewHolder;
3638
import org.androidannotations.rclass.IRClass;
3739

3840
import com.helger.jcodemodel.AbstractJClass;
41+
import com.helger.jcodemodel.IJAssignmentTarget;
42+
import com.helger.jcodemodel.IJExpression;
43+
import com.helger.jcodemodel.JBlock;
3944
import 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

Comments
 (0)