diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanHolder.java index b41c8ef9d3..895012d286 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanHolder.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanHolder.java @@ -114,6 +114,10 @@ public class EBeanHolder { public JMethod findNativeFragmentByTag; public JMethod findSupportFragmentByTag; + public JBlock onCreateOptionMenuMethodBody; + public JVar onCreateOptionMenuMenuInflaterVariable; + public JVar onCreateOptionMenuMenuParam; + private final EBeansHolder eBeansHolder; public final Class eBeanAnnotation; diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsMenuProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsMenuProcessor.java index 45c3935479..8b1972da14 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsMenuProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsMenuProcessor.java @@ -15,8 +15,6 @@ */ package org.androidannotations.processing; -import static com.sun.codemodel.JExpr.TRUE; -import static com.sun.codemodel.JExpr._super; import static com.sun.codemodel.JExpr.invoke; import static com.sun.codemodel.JMod.PUBLIC; @@ -33,9 +31,11 @@ import org.androidannotations.processing.EBeansHolder.Classes; import org.androidannotations.rclass.IRClass; import org.androidannotations.rclass.IRClass.Res; + import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; import com.sun.codemodel.JCodeModel; +import com.sun.codemodel.JExpr; import com.sun.codemodel.JFieldRef; import com.sun.codemodel.JInvocation; import com.sun.codemodel.JMethod; @@ -86,33 +86,48 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { returnType = codeModel.BOOLEAN; } - JMethod method = holder.generatedClass.method(PUBLIC, returnType, "onCreateOptionsMenu"); - method.annotate(Override.class); - JVar menuParam = method.param(menuClass, "menu"); + JBlock body = holder.onCreateOptionMenuMethodBody; + JVar menuInflater = holder.onCreateOptionMenuMenuInflaterVariable; + JVar menuParam = holder.onCreateOptionMenuMenuParam; - JBlock body = method.body(); + if (body == null) { + JMethod method = holder.generatedClass.method(PUBLIC, returnType, "onCreateOptionsMenu"); + method.annotate(Override.class); - JVar menuInflater; - if (isFragment) { - menuInflater = method.param(menuInflaterClass, "inflater"); - } else { - menuInflater = body.decl(menuInflaterClass, "menuInflater", invoke(getMenuInflaterMethodName)); + menuParam = method.param(menuClass, "menu"); + + JBlock methodBody = method.body(); + + if (isFragment) { + menuInflater = method.param(menuInflaterClass, "inflater"); + } else { + menuInflater = methodBody.decl(menuInflaterClass, "menuInflater", invoke(getMenuInflaterMethodName)); + } + + body = methodBody.block(); + + JInvocation superCall = invoke(JExpr._super(), method); + superCall.arg(menuParam); + + if (isFragment) { + superCall.arg(menuInflater); + methodBody.add(superCall); + } else { + methodBody._return(superCall); + } + + if (isFragment) { + holder.init.body().invoke("setHasOptionsMenu").arg(JExpr.TRUE); + } + + holder.onCreateOptionMenuMethodBody = body; + holder.onCreateOptionMenuMenuInflaterVariable = menuInflater; + holder.onCreateOptionMenuMenuParam = menuParam; } for (JFieldRef optionsMenuRefId : fieldRefs) { body.invoke(menuInflater, "inflate").arg(optionsMenuRefId).arg(menuParam); } - JInvocation superCall = invoke(_super(), method).arg(menuParam); - if (isFragment) { - superCall.arg(menuInflater); - body.add(superCall); - } else { - body._return(superCall); - } - - if (isFragment) { - holder.init.body().invoke("setHasOptionsMenu").arg(TRUE); - } } } diff --git a/AndroidAnnotations/functional-test-1-5/AndroidManifest.xml b/AndroidAnnotations/functional-test-1-5/AndroidManifest.xml index c1f95e9191..9a17c03c25 100644 --- a/AndroidAnnotations/functional-test-1-5/AndroidManifest.xml +++ b/AndroidAnnotations/functional-test-1-5/AndroidManifest.xml @@ -58,6 +58,7 @@ + diff --git a/AndroidAnnotations/functional-test-1-5/res/menu/my_menu3.xml b/AndroidAnnotations/functional-test-1-5/res/menu/my_menu3.xml new file mode 100644 index 0000000000..9575c20dcd --- /dev/null +++ b/AndroidAnnotations/functional-test-1-5/res/menu/my_menu3.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/menu/OptionsMenuSubActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/menu/OptionsMenuSubActivity.java new file mode 100644 index 0000000000..bb3df5745c --- /dev/null +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/menu/OptionsMenuSubActivity.java @@ -0,0 +1,26 @@ +/** + * Copyright (C) 2010-2012 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.test15.menu; + +import org.androidannotations.annotations.EActivity; +import org.androidannotations.annotations.OptionsMenu; +import org.androidannotations.test15.R; + +@EActivity +@OptionsMenu(R.menu.my_menu3) +public class OptionsMenuSubActivity extends OptionsMenuActivity { + +}