Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.

Commit b48c0a0

Browse files
committed
Implement PreferenceByKeyHandler
1 parent 32b3fed commit b48c0a0

13 files changed

Lines changed: 288 additions & 67 deletions

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractListenerHandler.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
8080
@Override
8181
public void process(Element element, EComponentWithViewSupportHolder holder) {
8282
this.holder = holder;
83-
this.methodName = element.getSimpleName().toString();
83+
methodName = element.getSimpleName().toString();
8484

8585
ExecutableElement executableElement = (ExecutableElement) element;
8686
List<? extends VariableElement> parameters = executableElement.getParameters();
@@ -103,7 +103,7 @@ public void process(Element element, EComponentWithViewSupportHolder holder) {
103103

104104
for (JFieldRef idRef : idsRefs) {
105105
FoundViewHolder foundViewHolder = holder.getFoundViewHolder(idRef, getViewClass());
106-
foundViewHolder.getIfNotNullBlock().invoke(foundViewHolder.getView(), getSetterName()).arg(_new(listenerAnonymousClass));
106+
foundViewHolder.getIfNotNullBlock().invoke(foundViewHolder.getRef(), getSetterName()).arg(_new(listenerAnonymousClass));
107107
}
108108
}
109109

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AnnotationHandlers.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ public AnnotationHandlers(ProcessingEnvironment processingEnvironment) {
119119
add(new HierarchyViewerSupportHandler(processingEnvironment));
120120
add(new WindowFeatureHandler(processingEnvironment));
121121
add(new ReceiverHandler(processingEnvironment));
122+
add(new PreferenceByKeyHandler(processingEnvironment));
122123

123124
add(new IgnoredWhenDetachedHandler(processingEnvironment));
124125
/* After injection methods must be after injections */
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package org.androidannotations.handler;
2+
3+
import static com.sun.codemodel.JExpr.ref;
4+
5+
import javax.annotation.processing.ProcessingEnvironment;
6+
import javax.lang.model.element.Element;
7+
import javax.lang.model.type.TypeMirror;
8+
9+
import org.androidannotations.annotations.PreferenceByKey;
10+
import org.androidannotations.helper.AndroidManifest;
11+
import org.androidannotations.helper.IdAnnotationHelper;
12+
import org.androidannotations.helper.IdValidatorHelper;
13+
import org.androidannotations.holder.EComponentWithViewSupportHolder;
14+
import org.androidannotations.model.AndroidSystemServices;
15+
import org.androidannotations.model.AnnotationElements;
16+
import org.androidannotations.process.IsValid;
17+
import org.androidannotations.rclass.IRClass;
18+
19+
import com.sun.codemodel.JClass;
20+
import com.sun.codemodel.JFieldRef;
21+
22+
public class PreferenceByKeyHandler extends BaseAnnotationHandler<EComponentWithViewSupportHolder> {
23+
24+
private IdAnnotationHelper annotationHelper;
25+
26+
public PreferenceByKeyHandler(ProcessingEnvironment processingEnvironment) {
27+
super(PreferenceByKey.class, processingEnvironment);
28+
29+
}
30+
31+
@Override
32+
public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) {
33+
super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest);
34+
annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass);
35+
}
36+
37+
@Override
38+
protected void validate(Element element, AnnotationElements validatedElements, IsValid valid) {
39+
validatorHelper.enclosingElementHasEActivityOrEFragment(element, validatedElements, valid);
40+
validatorHelper.extendsPreferenceActivityOrPreferenceFragment(element.getEnclosingElement(), valid);
41+
42+
validatorHelper.isDeclaredType(element, valid);
43+
44+
validatorHelper.extendsPreference(element, valid);
45+
46+
validatorHelper.isNotPrivate(element, valid);
47+
48+
validatorHelper.resIdsExist(element, IRClass.Res.STRING, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid);
49+
}
50+
51+
@Override
52+
public void process(Element element, EComponentWithViewSupportHolder holder) throws Exception {
53+
String fieldName = element.getSimpleName().toString();
54+
55+
TypeMirror prefFieldTypeMirror = element.asType();
56+
String typeQualifiedName = prefFieldTypeMirror.toString();
57+
58+
JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(processHolder, element, IRClass.Res.STRING, true);
59+
JClass preferenceClass = refClass(typeQualifiedName);
60+
JFieldRef fieldRef = ref(fieldName);
61+
62+
holder.assignFindPreferenceByKey(idRef, preferenceClass, fieldRef);
63+
}
64+
65+
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PreferenceScreenHandler.java‎

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
package org.androidannotations.handler;
22

3-
import java.util.Arrays;
4-
import java.util.List;
5-
63
import javax.annotation.processing.ProcessingEnvironment;
74
import javax.lang.model.element.Element;
85

96
import org.androidannotations.annotations.PreferenceScreen;
107
import org.androidannotations.helper.AnnotationHelper;
11-
import org.androidannotations.helper.CanonicalNameConstants;
128
import org.androidannotations.helper.IdValidatorHelper;
139
import org.androidannotations.holder.EComponentWithViewSupportHolder;
1410
import org.androidannotations.model.AnnotationElements;
@@ -19,8 +15,6 @@
1915

2016
public class PreferenceScreenHandler extends BaseAnnotationHandler<EComponentWithViewSupportHolder> {
2117

22-
private static final List<String> VALID_SUPER_CLASSES = Arrays.asList(CanonicalNameConstants.PREFERENCE_ACTIVITY, CanonicalNameConstants.PREFERENCE_ACTIVITY);
23-
2418
private final AnnotationHelper annotationHelper;
2519

2620
public PreferenceScreenHandler(ProcessingEnvironment processingEnvironment) {
@@ -30,7 +24,7 @@ public PreferenceScreenHandler(ProcessingEnvironment processingEnvironment) {
3024

3125
@Override
3226
protected void validate(Element element, AnnotationElements validatedElements, IsValid valid) {
33-
validatorHelper.extendsOneOfTypes(element, VALID_SUPER_CLASSES, valid);
27+
validatorHelper.extendsPreferenceActivityOrPreferenceFragment(element, valid);
3428
validatorHelper.hasEActivityOrEFragment(element, validatedElements, valid);
3529
validatorHelper.resIdsExist(element, IRClass.Res.XML, IdValidatorHelper.FallbackStrategy.NEED_RES_ID, valid);
3630
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ViewsByIdHandler.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ private void clearList(JFieldRef elementRef, EComponentWithViewSupportHolder hol
106106

107107
private void addViewToListIfNotNull(JFieldRef elementRef, JClass viewClass, JFieldRef idRef, EComponentWithViewSupportHolder holder) {
108108
FoundViewHolder foundViewHolder = holder.getFoundViewHolder(idRef, viewClass);
109-
foundViewHolder.getIfNotNullBlock().invoke(elementRef, "add").arg(foundViewHolder.getView(viewClass));
109+
foundViewHolder.getIfNotNullBlock().invoke(elementRef, "add").arg(foundViewHolder.getOrCastRef(viewClass));
110110
}
111111

112112
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ public final class CanonicalNameConstants {
109109
public static final String WAKE_LOCK = "android.os.PowerManager.WakeLock";
110110
public static final String PREFERENCE_ACTIVITY = "android.preference.PreferenceActivity";
111111
public static final String PREFERENCE_FRAGMENT = "android.preference.PreferenceFragment";
112+
public static final String PREFERENCE = "android.preference.Preference";
112113

113114
/*
114115
* Android permission

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ public class ValidatorHelper {
112112
private static final List<Receiver.RegisterAt> VALID_SERVICE_REGISTER_AT = Arrays.asList(Receiver.RegisterAt.OnCreateOnDestroy);
113113
private static final List<Receiver.RegisterAt> VALID_FRAGMENT_REGISTER_AT = Arrays.asList(Receiver.RegisterAt.OnCreateOnDestroy, Receiver.RegisterAt.OnResumeOnPause, Receiver.RegisterAt.OnStartOnStop, Receiver.RegisterAt.OnAttachOnDetach);
114114

115+
private static final List<String> VALID_PREFERENCE_CLASSES = asList(CanonicalNameConstants.PREFERENCE_ACTIVITY, CanonicalNameConstants.PREFERENCE_FRAGMENT);
116+
115117
protected final TargetAnnotationHelper annotationHelper;
116118

117119
public final ValidatorParameterHelper param;
@@ -548,6 +550,10 @@ public void extendsListOfView(Element element, IsValid valid) {
548550
}
549551
}
550552

553+
public void extendsPreference(Element element, IsValid valid) {
554+
extendsType(element, CanonicalNameConstants.PREFERENCE, valid);
555+
}
556+
551557
public void hasASqlLiteOpenHelperParameterizedType(Element element, IsValid valid) {
552558
TypeMirror helperType = annotationHelper.extractAnnotationParameter(element, "helper");
553559

@@ -1459,4 +1465,8 @@ public void hasSupportV4JarIfLocal(Element element, IsValid valid) {
14591465
}
14601466
}
14611467

1468+
public void extendsPreferenceActivityOrPreferenceFragment(Element element, IsValid valid) {
1469+
extendsOneOfTypes(element, VALID_PREFERENCE_CLASSES, valid);
1470+
}
1471+
14621472
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.androidannotations.holder;
2+
3+
import com.sun.codemodel.JBlock;
4+
5+
public class EComponentWithPreferenceSupportHolder {
6+
7+
private final EComponentWithViewSupportHolder holder;
8+
9+
protected JBlock addPreferencesFromResourceBlock;
10+
11+
public EComponentWithPreferenceSupportHolder(EComponentWithViewSupportHolder holder) {
12+
this.holder = holder;
13+
}
14+
15+
public JBlock getAddPreferencesFromResourceBlock() {
16+
if (addPreferencesFromResourceBlock == null) {
17+
holder.setAddPreferencesFromResource();
18+
}
19+
return addPreferencesFromResourceBlock;
20+
}
21+
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EComponentWithViewSupportHolder.java‎

Lines changed: 97 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,34 +15,51 @@
1515
*/
1616
package org.androidannotations.holder;
1717

18-
import com.sun.codemodel.*;
18+
import static com.sun.codemodel.JExpr._new;
19+
import static com.sun.codemodel.JExpr._null;
20+
import static com.sun.codemodel.JExpr._this;
21+
import static com.sun.codemodel.JExpr.cast;
22+
import static com.sun.codemodel.JExpr.invoke;
23+
import static com.sun.codemodel.JMod.FINAL;
24+
import static com.sun.codemodel.JMod.PRIVATE;
25+
import static com.sun.codemodel.JMod.PUBLIC;
26+
27+
import java.util.HashMap;
28+
import java.util.Map;
29+
30+
import javax.lang.model.element.TypeElement;
31+
import javax.lang.model.type.TypeMirror;
32+
1933
import org.androidannotations.api.view.HasViews;
2034
import org.androidannotations.api.view.OnViewChangedListener;
2135
import org.androidannotations.api.view.OnViewChangedNotifier;
2236
import org.androidannotations.helper.ViewNotifierHelper;
2337
import org.androidannotations.process.ProcessHolder;
2438

25-
import javax.lang.model.element.TypeElement;
26-
import javax.lang.model.type.TypeMirror;
27-
import java.util.HashMap;
28-
import java.util.Map;
29-
30-
import static com.sun.codemodel.JExpr.*;
31-
import static com.sun.codemodel.JMod.*;
39+
import com.sun.codemodel.JBlock;
40+
import com.sun.codemodel.JClass;
41+
import com.sun.codemodel.JDefinedClass;
42+
import com.sun.codemodel.JExpr;
43+
import com.sun.codemodel.JExpression;
44+
import com.sun.codemodel.JFieldRef;
45+
import com.sun.codemodel.JInvocation;
46+
import com.sun.codemodel.JMethod;
47+
import com.sun.codemodel.JVar;
3248

3349
public abstract class EComponentWithViewSupportHolder extends EComponentHolder {
3450

3551
protected ViewNotifierHelper viewNotifierHelper;
3652
private JBlock onViewChangedBody;
3753
private JBlock onViewChangedBodyBeforeFindViews;
3854
private JVar onViewChangedHasViewsParam;
39-
private Map<String, FoundViewHolder> foundViewsHolders = new HashMap<String, FoundViewHolder>();
55+
private Map<String, FoundHolder> foundHolders = new HashMap<String, FoundHolder>();
4056
protected JMethod findNativeFragmentById;
4157
protected JMethod findSupportFragmentById;
4258
protected JMethod findNativeFragmentByTag;
4359
protected JMethod findSupportFragmentByTag;
4460
private HashMap<String, TextWatcherHolder> textWatcherHolders = new HashMap<String, TextWatcherHolder>();
4561
private HashMap<String, OnSeekBarChangeListenerHolder> onSeekBarChangeListenerHolders = new HashMap<String, OnSeekBarChangeListenerHolder>();
62+
private EComponentWithPreferenceSupportHolder preferenceSupportHolder;
4663

4764
public EComponentWithViewSupportHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception {
4865
super(processHolder, annotatedElement);
@@ -89,30 +106,30 @@ public JInvocation findViewById(JFieldRef idRef) {
89106

90107
public void assignFindViewById(JFieldRef idRef, JClass viewClass, JFieldRef fieldRef) {
91108
String idRefString = codeModelHelper.getIdStringFromIdFieldRef(idRef);
92-
FoundViewHolder foundViewHolder = foundViewsHolders.get(idRefString);
109+
FoundViewHolder foundViewHolder = (FoundViewHolder) foundHolders.get(idRefString);
93110

94111
JBlock block = getOnViewChangedBody();
95112
JExpression assignExpression;
96113

97114
if (foundViewHolder != null) {
98-
assignExpression = foundViewHolder.getView(viewClass);
115+
assignExpression = foundViewHolder.getOrCastRef(viewClass);
99116
} else {
100117
assignExpression = findViewById(idRef);
101118
if (viewClass != null && viewClass != classes().VIEW) {
102119
assignExpression = cast(viewClass, assignExpression);
103120
}
104-
foundViewsHolders.put(idRefString, new FoundViewHolder(this, viewClass, fieldRef, block));
121+
foundHolders.put(idRefString, new FoundViewHolder(this, viewClass, fieldRef, block));
105122
}
106123

107124
block.assign(fieldRef, assignExpression);
108125
}
109126

110127
public FoundViewHolder getFoundViewHolder(JFieldRef idRef, JClass viewClass) {
111128
String idRefString = codeModelHelper.getIdStringFromIdFieldRef(idRef);
112-
FoundViewHolder foundViewHolder = foundViewsHolders.get(idRefString);
129+
FoundViewHolder foundViewHolder = (FoundViewHolder) foundHolders.get(idRefString);
113130
if (foundViewHolder == null) {
114131
foundViewHolder = createFoundViewAndIfNotNullBlock(idRef, viewClass);
115-
foundViewsHolders.put(idRefString, foundViewHolder);
132+
foundHolders.put(idRefString, foundViewHolder);
116133
}
117134
return foundViewHolder;
118135
}
@@ -131,6 +148,57 @@ protected FoundViewHolder createFoundViewAndIfNotNullBlock(JFieldRef idRef, JCla
131148
return new FoundViewHolder(this, viewClass, view, block);
132149
}
133150

151+
public JInvocation findPreferenceByKey(JFieldRef idRef) {
152+
JInvocation getString = invoke(_this(), "getString").arg(idRef);
153+
JInvocation findPreferenceByKey = invoke(_this(), "findPreference");
154+
findPreferenceByKey.arg(getString);
155+
return findPreferenceByKey;
156+
}
157+
158+
public void assignFindPreferenceByKey(JFieldRef idRef, JClass preferenceClass, JFieldRef fieldRef) {
159+
String idRefString = codeModelHelper.getIdStringFromIdFieldRef(idRef);
160+
FoundPreferenceHolder foundViewHolder = (FoundPreferenceHolder) foundHolders.get(idRefString);
161+
162+
JBlock block = getPreferenceSupportHolder().getAddPreferencesFromResourceBlock();
163+
JExpression assignExpression;
164+
165+
if (foundViewHolder != null) {
166+
assignExpression = foundViewHolder.getOrCastRef(preferenceClass);
167+
} else {
168+
assignExpression = findPreferenceByKey(idRef);
169+
if (preferenceClass != null && preferenceClass != classes().PREFERENCE) {
170+
assignExpression = cast(preferenceClass, assignExpression);
171+
}
172+
foundHolders.put(idRefString, new FoundPreferenceHolder(this, preferenceClass, fieldRef, block));
173+
}
174+
175+
block.assign(fieldRef, assignExpression);
176+
}
177+
178+
public FoundPreferenceHolder getFoundPreferenceHolder(JFieldRef idRef, JClass preferenceClass) {
179+
String idRefString = codeModelHelper.getIdStringFromIdFieldRef(idRef);
180+
FoundPreferenceHolder foundPreferenceHolder = (FoundPreferenceHolder) foundHolders.get(idRefString);
181+
if (foundPreferenceHolder == null) {
182+
foundPreferenceHolder = createFoundPreferenceAndIfNotNullBlock(idRef, preferenceClass);
183+
foundHolders.put(idRefString, foundPreferenceHolder);
184+
}
185+
return foundPreferenceHolder;
186+
}
187+
188+
protected FoundPreferenceHolder createFoundPreferenceAndIfNotNullBlock(JFieldRef idRef, JClass preferenceClass) {
189+
JExpression findPreferenceExpression = findPreferenceByKey(idRef);
190+
JBlock block = getPreferenceSupportHolder().getAddPreferencesFromResourceBlock();
191+
192+
if (preferenceClass == null) {
193+
preferenceClass = classes().PREFERENCE;
194+
} else if (preferenceClass != classes().PREFERENCE) {
195+
findPreferenceExpression = cast(preferenceClass, findPreferenceExpression);
196+
}
197+
198+
JVar preference = block.decl(preferenceClass, "preference", findPreferenceExpression);
199+
return new FoundPreferenceHolder(this, preferenceClass, preference, block);
200+
}
201+
134202
public JMethod getFindNativeFragmentById() {
135203
if (findNativeFragmentById == null) {
136204
setFindNativeFragmentById();
@@ -257,4 +325,19 @@ private OnSeekBarChangeListenerHolder createOnSeekBarChangeListenerHolder(JField
257325

258326
return new OnSeekBarChangeListenerHolder(this, onSeekbarChangeListenerClass);
259327
}
328+
329+
public EComponentWithPreferenceSupportHolder getPreferenceSupportHolder() {
330+
if (preferenceSupportHolder == null) {
331+
preferenceSupportHolder = new EComponentWithPreferenceSupportHolder(this);
332+
}
333+
return preferenceSupportHolder;
334+
}
335+
336+
public void setAddPreferencesFromResource() {
337+
JMethod method = generatedClass.method(PUBLIC, codeModel().VOID, "addPreferencesFromResource");
338+
method.annotate(Override.class);
339+
JVar preferencesResIdParam = method.param(int.class, "preferencesResId");
340+
method.body().invoke(JExpr._super(), "addPreferencesFromResource").arg(preferencesResIdParam);
341+
getPreferenceSupportHolder().addPreferencesFromResourceBlock = method.body();
342+
}
260343
}

0 commit comments

Comments
 (0)