Skip to content

Commit 85197fd

Browse files
committed
allow to inject menu items into @OptionsMenuItem annotated method
1 parent a7affe7 commit 85197fd

2 files changed

Lines changed: 28 additions & 11 deletions

File tree

  • AndroidAnnotations/androidannotations-core

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
* </blockquote>
5454
*/
5555
@Retention(RetentionPolicy.CLASS)
56-
@Target(ElementType.FIELD)
56+
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
5757
public @interface OptionsMenuItem {
5858

5959
/**

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

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,35 +15,40 @@
1515
*/
1616
package org.androidannotations.internal.core.handler;
1717

18-
import static com.helger.jcodemodel.JExpr._this;
19-
2018
import javax.lang.model.element.Element;
2119

2220
import org.androidannotations.AndroidAnnotationsEnvironment;
2321
import org.androidannotations.ElementValidation;
2422
import org.androidannotations.annotations.OptionsMenuItem;
2523
import org.androidannotations.handler.BaseAnnotationHandler;
24+
import org.androidannotations.handler.MethodInjectionHandler;
2625
import org.androidannotations.helper.IdValidatorHelper;
26+
import org.androidannotations.helper.InjectHelper;
2727
import org.androidannotations.holder.HasOptionsMenu;
2828
import org.androidannotations.rclass.IRClass;
2929

30+
import com.helger.jcodemodel.IJAssignmentTarget;
3031
import com.helger.jcodemodel.JBlock;
3132
import com.helger.jcodemodel.JFieldRef;
3233
import com.helger.jcodemodel.JVar;
3334

34-
public class OptionsMenuItemHandler extends BaseAnnotationHandler<HasOptionsMenu> {
35+
public class OptionsMenuItemHandler extends BaseAnnotationHandler<HasOptionsMenu>implements MethodInjectionHandler<HasOptionsMenu> {
36+
37+
private final InjectHelper<HasOptionsMenu> injectHelper;
3538

3639
public OptionsMenuItemHandler(AndroidAnnotationsEnvironment environment) {
3740
super(OptionsMenuItem.class, environment);
41+
injectHelper = new InjectHelper<>(validatorHelper, this);
3842
}
3943

4044
@Override
4145
public void validate(Element element, ElementValidation validation) {
42-
validatorHelper.enclosingElementHasEActivityOrEFragment(element, validation);
46+
injectHelper.validate(OptionsMenuItem.class, element, validation);
4347

44-
validatorHelper.isDeclaredType(element, validation);
48+
Element param = injectHelper.getParam(element);
49+
validatorHelper.isDeclaredType(param, validation);
4550

46-
validatorHelper.extendsMenuItem(element, validation);
51+
validatorHelper.extendsMenuItem(param, validation);
4752

4853
validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, validation);
4954

@@ -52,11 +57,23 @@ public void validate(Element element, ElementValidation validation) {
5257

5358
@Override
5459
public void process(Element element, HasOptionsMenu holder) {
55-
String fieldName = element.getSimpleName().toString();
56-
JBlock body = holder.getOnCreateOptionsMenuMethodBody();
57-
JVar menuParam = holder.getOnCreateOptionsMenuMenuParam();
60+
injectHelper.process(element, holder);
61+
}
62+
63+
@Override
64+
public JBlock getInvocationBlock(HasOptionsMenu holder) {
65+
return holder.getOnCreateOptionsMenuMethodBody();
66+
}
5867

68+
@Override
69+
public void assignValue(JBlock targetBlock, IJAssignmentTarget fieldRef, HasOptionsMenu holder, Element element, Element param) {
70+
JVar menuParam = holder.getOnCreateOptionsMenuMenuParam();
5971
JFieldRef idsRef = annotationHelper.extractOneAnnotationFieldRef(element, IRClass.Res.ID, true);
60-
body.assign(_this().ref(fieldName), menuParam.invoke("findItem").arg(idsRef));
72+
targetBlock.add(fieldRef.assign(menuParam.invoke("findItem").arg(idsRef)));
73+
}
74+
75+
@Override
76+
public void validateEnclosingElement(Element element, ElementValidation valid) {
77+
validatorHelper.enclosingElementHasEActivityOrEFragment(element, valid);
6178
}
6279
}

0 commit comments

Comments
 (0)