Skip to content

Commit 5c82ec2

Browse files
committed
Adding OptionsMenu and OptionsItem support for fragments, including with Sherlock. androidannotations#245
1 parent ea234e0 commit 5c82ec2

20 files changed

Lines changed: 218 additions & 47 deletions

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/SherlockHelper.java‎

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@
1515
*/
1616
package com.googlecode.androidannotations.helper;
1717

18-
import static java.util.Arrays.asList;
19-
20-
import java.util.ArrayList;
21-
import java.util.List;
22-
2318
import javax.lang.model.element.TypeElement;
19+
import javax.lang.model.type.DeclaredType;
20+
import javax.lang.model.type.NoType;
21+
import javax.lang.model.type.TypeMirror;
2422

2523
import com.googlecode.androidannotations.processing.EBeanHolder;
2624

@@ -29,38 +27,23 @@
2927
*/
3028
public class SherlockHelper {
3129

32-
public static final List<String> SHERLOCK_ACTIVITY_CLASS_NAMES = asList( //
33-
"com.actionbarsherlock.app.SherlockActivity", //
34-
"com.actionbarsherlock.app.SherlockFragmentActivity", //
35-
"com.actionbarsherlock.app.SherlockListActivity", //
36-
"com.actionbarsherlock.app.SherlockExpandableListActivity.java", //
37-
"com.actionbarsherlock.app.SherlockMapActivity", //
38-
"com.actionbarsherlock.app.SherlockPreferenceActivity" //
39-
);
40-
4130
private final AnnotationHelper annotationHelper;
4231

43-
private final List<TypeElement> sherlockActivityTypeElements = new ArrayList<TypeElement>();
44-
4532
public SherlockHelper(AnnotationHelper annotationHelper) {
4633
this.annotationHelper = annotationHelper;
47-
48-
for (String sherlockClassName : SHERLOCK_ACTIVITY_CLASS_NAMES) {
49-
TypeElement sherlockActivityTypeElement = annotationHelper.typeElementFromQualifiedName(sherlockClassName);
50-
if (sherlockActivityTypeElement != null) {
51-
sherlockActivityTypeElements.add(sherlockActivityTypeElement);
52-
}
53-
}
5434
}
5535

5636
/**
5737
* Checks whether the Activity extends one of the ActionBarSherlock Activity
5838
* types
5939
*/
6040
public boolean usesSherlock(EBeanHolder holder) {
61-
TypeElement annotatedType = annotationHelper.typeElementFromQualifiedName(holder.eBean._extends().fullName());
62-
for (TypeElement sherlockActivityTypeElement : sherlockActivityTypeElements) {
63-
if (annotationHelper.isSubtype(annotatedType, sherlockActivityTypeElement)) {
41+
TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(holder.eBean._extends().fullName());
42+
43+
TypeMirror superType;
44+
while (!((superType = typeElement.getSuperclass()) instanceof NoType)) {
45+
typeElement = (TypeElement) ((DeclaredType) superType).asElement();
46+
if (typeElement.getQualifiedName().toString().startsWith("com.actionbarsherlock.app")) {
6447
return true;
6548
}
6649
}

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/ValidatorHelper.java‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,23 @@ public void enclosingElementHasEActivity(Element element, AnnotationElements val
170170
hasClassAnnotation(element, enclosingElement, validatedElements, EActivity.class, valid);
171171
}
172172

173+
public void enclosingElementHasEActivityOrEFragment(Element element, AnnotationElements validatedElements, IsValid valid) {
174+
Element enclosingElement = element.getEnclosingElement();
175+
@SuppressWarnings("unchecked")
176+
List<Class<? extends Annotation>> validAnnotations = asList(EActivity.class, EFragment.class);
177+
hasOneOfClassAnnotations(element, enclosingElement, validatedElements, validAnnotations, valid);
178+
}
179+
173180
public void hasEActivity(Element element, AnnotationElements validatedElements, IsValid valid) {
174181
hasClassAnnotation(element, element, validatedElements, EActivity.class, valid);
175182
}
176183

184+
public void hasEActivityOrEFragment(Element element, AnnotationElements validatedElements, IsValid valid) {
185+
@SuppressWarnings("unchecked")
186+
List<Class<? extends Annotation>> validAnnotations = asList(EActivity.class, EFragment.class);
187+
hasOneOfClassAnnotations(element, element, validatedElements, validAnnotations, valid);
188+
}
189+
177190
public void enclosingElementHasEnhancedViewSupportAnnotation(Element element, AnnotationElements validatedElements, IsValid valid) {
178191
Element enclosingElement = element.getEnclosingElement();
179192
hasOneOfClassAnnotations(element, enclosingElement, validatedElements, VALID_ENHANCED_VIEW_SUPPORT_ANNOTATIONS, valid);

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EActivityProcessor.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public Class<? extends Annotation> getTarget() {
8989
@Override
9090
public void process(Element element, JCodeModel codeModel, EBeansHolder activitiesHolder) throws Exception {
9191

92-
EBeanHolder holder = activitiesHolder.create(element);
92+
EBeanHolder holder = activitiesHolder.create(element, getTarget());
9393

9494
TypeElement typeElement = (TypeElement) element;
9595

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EApplicationProcessor.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public Class<? extends Annotation> getTarget() {
4444
@Override
4545
public void process(Element element, JCodeModel codeModel, EBeansHolder activitiesHolder) throws Exception {
4646

47-
EBeanHolder holder = activitiesHolder.create(element);
47+
EBeanHolder holder = activitiesHolder.create(element, getTarget());
4848

4949
TypeElement typeElement = (TypeElement) element;
5050

@@ -73,6 +73,7 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder activiti
7373
{
7474
/*
7575
* Setting to null shouldn't be a problem as long as we don't allow
76+
*
7677
* @App and @Extra on this component
7778
*/
7879
holder.initIfActivityBody = null;
@@ -81,5 +82,4 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder activiti
8182

8283
}
8384

84-
8585
}

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EBeanHolder.java‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package com.googlecode.androidannotations.processing;
1717

18+
import java.lang.annotation.Annotation;
1819
import java.util.HashMap;
1920

2021
import com.googlecode.androidannotations.annotations.EBean;
@@ -90,10 +91,12 @@ public class EBeanHolder {
9091
public JMethod findNativeFragmentByTag;
9192
public JMethod findSupportFragmentByTag;
9293

93-
private EBeansHolder eBeansHolder;
94+
private final EBeansHolder eBeansHolder;
95+
public final Class<? extends Annotation> eBeanAnnotation;
9496

95-
public EBeanHolder(EBeansHolder eBeansHolder) {
97+
public EBeanHolder(EBeansHolder eBeansHolder, Class<? extends Annotation> eBeanAnnotation) {
9698
this.eBeansHolder = eBeansHolder;
99+
this.eBeanAnnotation = eBeanAnnotation;
97100
}
98101

99102
public Classes classes() {

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EBeanProcessor.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public Class<? extends Annotation> getTarget() {
5353
@Override
5454
public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception {
5555

56-
EBeanHolder holder = eBeansHolder.create(element);
56+
EBeanHolder holder = eBeansHolder.create(element, getTarget());
5757

5858
TypeElement typeElement = (TypeElement) element;
5959

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EBeansHolder.java‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.io.FileInputStream;
1919
import java.io.InputStream;
2020
import java.io.Serializable;
21+
import java.lang.annotation.Annotation;
2122
import java.util.HashMap;
2223
import java.util.Map;
2324

@@ -136,8 +137,8 @@ public EBeansHolder(JCodeModel codeModel) {
136137
classes = new Classes();
137138
}
138139

139-
public EBeanHolder create(Element activityElement) {
140-
EBeanHolder activityHolder = new EBeanHolder(this);
140+
public EBeanHolder create(Element activityElement, Class<? extends Annotation> eBeanAnnotation) {
141+
EBeanHolder activityHolder = new EBeanHolder(this, eBeanAnnotation);
141142
EBeanHolders.put(activityElement, activityHolder);
142143
return activityHolder;
143144
}

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EFragmentProcessor.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public Class<? extends Annotation> getTarget() {
6060
@Override
6161
public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception {
6262

63-
EBeanHolder holder = eBeansHolder.create(element);
63+
EBeanHolder holder = eBeansHolder.create(element, getTarget());
6464

6565
TypeElement typeElement = (TypeElement) element;
6666

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EProviderProcessor.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public Class<? extends Annotation> getTarget() {
4444
@Override
4545
public void process(Element element, JCodeModel codeModel, EBeansHolder activitiesHolder) throws Exception {
4646

47-
EBeanHolder holder = activitiesHolder.create(element);
47+
EBeanHolder holder = activitiesHolder.create(element, getTarget());
4848

4949
TypeElement typeElement = (TypeElement) element;
5050

@@ -73,6 +73,7 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder activiti
7373
{
7474
/*
7575
* Setting to null shouldn't be a problem as long as we don't allow
76+
*
7677
* @App and @Extra on this component
7778
*/
7879
holder.initIfActivityBody = null;
@@ -81,5 +82,4 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder activiti
8182

8283
}
8384

84-
8585
}

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EReceiverProcessor.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public Class<? extends Annotation> getTarget() {
4646
@Override
4747
public void process(Element element, JCodeModel codeModel, EBeansHolder activitiesHolder) throws Exception {
4848

49-
EBeanHolder holder = activitiesHolder.create(element);
49+
EBeanHolder holder = activitiesHolder.create(element, getTarget());
5050

5151
TypeElement typeElement = (TypeElement) element;
5252

0 commit comments

Comments
 (0)