Skip to content

Commit 27ea853

Browse files
committed
allow to inject preferences into @PreferenceByKey annotated methods
1 parent 4e1ba9d commit 27ea853

6 files changed

Lines changed: 36 additions & 47 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
* @see org.androidannotations.annotations.AfterPreferences AfterPreferences
6666
*/
6767
@Retention(RetentionPolicy.CLASS)
68-
@Target(ElementType.FIELD)
68+
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
6969
public @interface PreferenceByKey {
7070

7171
int value() default ResId.DEFAULT_VALUE;

AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EActivityHolder.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -740,11 +740,6 @@ public JBlock getAddPreferencesFromResourceAfterInjectionBlock() {
740740
return preferencesHolder.getAddPreferencesFromResourceAfterInjectionBlock();
741741
}
742742

743-
@Override
744-
public void assignFindPreferenceByKey(JFieldRef idRef, AbstractJClass preferenceClass, JFieldRef fieldRef) {
745-
preferencesHolder.assignFindPreferenceByKey(idRef, preferenceClass, fieldRef);
746-
}
747-
748743
@Override
749744
public FoundPreferenceHolder getFoundPreferenceHolder(JFieldRef idRef, AbstractJClass preferenceClass) {
750745
return preferencesHolder.getFoundPreferenceHolder(idRef, preferenceClass);

AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -564,11 +564,6 @@ public JBlock getAddPreferencesFromResourceAfterInjectionBlock() {
564564
return preferencesDelegate.getAddPreferencesFromResourceAfterInjectionBlock();
565565
}
566566

567-
@Override
568-
public void assignFindPreferenceByKey(JFieldRef idRef, AbstractJClass preferenceClass, JFieldRef fieldRef) {
569-
preferencesDelegate.assignFindPreferenceByKey(idRef, preferenceClass, fieldRef);
570-
}
571-
572567
@Override
573568
public FoundPreferenceHolder getFoundPreferenceHolder(JFieldRef idRef, AbstractJClass preferenceClass) {
574569
return preferencesDelegate.getFoundPreferenceHolder(idRef, preferenceClass);

AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/HasPreferences.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ public interface HasPreferences extends GeneratedClassHolder {
2727

2828
JBlock getAddPreferencesFromResourceAfterInjectionBlock();
2929

30-
void assignFindPreferenceByKey(JFieldRef idRef, AbstractJClass preferenceClass, JFieldRef fieldRef);
31-
3230
FoundPreferenceHolder getFoundPreferenceHolder(JFieldRef idRef, AbstractJClass preferenceClass);
3331

3432
boolean usingSupportV7Preference();

AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/PreferencesDelegate.java

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -95,27 +95,6 @@ private JInvocation findPreferenceByKey(JFieldRef idRef) {
9595
return findPreferenceByKey.arg(getString);
9696
}
9797

98-
@Override
99-
public void assignFindPreferenceByKey(JFieldRef idRef, AbstractJClass preferenceClass, JFieldRef fieldRef) {
100-
String idRefString = idRef.name();
101-
FoundPreferenceHolder foundViewHolder = (FoundPreferenceHolder) holder.foundHolders.get(idRefString);
102-
103-
JBlock block = getAddPreferencesFromResourceInjectionBlock();
104-
IJExpression assignExpression;
105-
106-
if (foundViewHolder != null) {
107-
assignExpression = foundViewHolder.getOrCastRef(preferenceClass);
108-
} else {
109-
assignExpression = findPreferenceByKey(idRef);
110-
if (preferenceClass != null && preferenceClass != getClasses().PREFERENCE && preferenceClass != getClasses().SUPPORT_V7_PREFERENCE) {
111-
assignExpression = cast(preferenceClass, assignExpression);
112-
}
113-
holder.foundHolders.put(idRefString, new FoundPreferenceHolder(this, preferenceClass, fieldRef, block));
114-
}
115-
116-
block.assign(fieldRef, assignExpression);
117-
}
118-
11998
@Override
12099
public FoundPreferenceHolder getFoundPreferenceHolder(JFieldRef idRef, AbstractJClass preferenceClass) {
121100
String idRefString = idRef.name();
@@ -139,15 +118,15 @@ public AbstractJClass getBasePreferenceClass() {
139118

140119
private FoundPreferenceHolder createFoundPreferenceAndIfNotNullBlock(JFieldRef idRef, AbstractJClass preferenceClass) {
141120
IJExpression findPreferenceExpression = findPreferenceByKey(idRef);
142-
JBlock block = getAddPreferencesFromResourceInjectionBlock().blockSimple();
121+
JBlock block = getAddPreferencesFromResourceInjectionBlock();
143122

144123
if (preferenceClass == null) {
145124
preferenceClass = basePreferenceClass;
146125
} else if (!preferenceClass.equals(basePreferenceClass)) {
147126
findPreferenceExpression = cast(preferenceClass, findPreferenceExpression);
148127
}
149128

150-
JVar preference = block.decl(preferenceClass, "preference", findPreferenceExpression);
129+
JVar preference = block.decl(preferenceClass, "preference_" + idRef.name(), findPreferenceExpression);
151130
return new FoundPreferenceHolder(this, preferenceClass, preference, block);
152131
}
153132

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

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,37 +15,48 @@
1515
*/
1616
package org.androidannotations.internal.core.handler;
1717

18-
import static com.helger.jcodemodel.JExpr.ref;
19-
2018
import javax.lang.model.element.Element;
19+
import javax.lang.model.element.ElementKind;
2120
import javax.lang.model.type.TypeMirror;
2221

2322
import org.androidannotations.AndroidAnnotationsEnvironment;
2423
import org.androidannotations.ElementValidation;
2524
import org.androidannotations.annotations.PreferenceByKey;
2625
import org.androidannotations.handler.BaseAnnotationHandler;
26+
import org.androidannotations.handler.MethodInjectionHandler;
2727
import org.androidannotations.helper.IdValidatorHelper;
28+
import org.androidannotations.helper.InjectHelper;
2829
import org.androidannotations.holder.HasPreferences;
2930
import org.androidannotations.rclass.IRClass;
3031

3132
import com.helger.jcodemodel.AbstractJClass;
33+
import com.helger.jcodemodel.IJAssignmentTarget;
34+
import com.helger.jcodemodel.JBlock;
3235
import com.helger.jcodemodel.JFieldRef;
3336

34-
public class PreferenceByKeyHandler extends BaseAnnotationHandler<HasPreferences> {
37+
public class PreferenceByKeyHandler extends BaseAnnotationHandler<HasPreferences>implements MethodInjectionHandler<HasPreferences> {
38+
39+
private final InjectHelper<HasPreferences> injectHelper;
3540

3641
public PreferenceByKeyHandler(AndroidAnnotationsEnvironment environment) {
3742
super(PreferenceByKey.class, environment);
43+
injectHelper = new InjectHelper<>(validatorHelper, this);
3844
}
3945

4046
@Override
4147
protected void validate(Element element, ElementValidation valid) {
42-
validatorHelper.enclosingElementHasEActivityOrEFragment(element, valid);
48+
injectHelper.validate(PreferenceByKey.class, element, valid);
4349

44-
validatorHelper.enclosingElementExtendsPreferenceActivityOrPreferenceFragment(element, valid);
50+
if (element.getKind() == ElementKind.PARAMETER) {
51+
validatorHelper.enclosingElementExtendsPreferenceActivityOrPreferenceFragment(element.getEnclosingElement(), valid);
52+
} else {
53+
validatorHelper.enclosingElementExtendsPreferenceActivityOrPreferenceFragment(element, valid);
54+
}
4555

46-
validatorHelper.isDeclaredType(element, valid);
56+
Element param = injectHelper.getParam(element);
57+
validatorHelper.isDeclaredType(param, valid);
4758

48-
validatorHelper.extendsPreference(element, valid);
59+
validatorHelper.extendsPreference(param, valid);
4960

5061
validatorHelper.isNotPrivate(element, valid);
5162

@@ -54,16 +65,27 @@ protected void validate(Element element, ElementValidation valid) {
5465

5566
@Override
5667
public void process(Element element, HasPreferences holder) throws Exception {
57-
String fieldName = element.getSimpleName().toString();
68+
injectHelper.process(element, holder);
69+
}
5870

59-
TypeMirror prefFieldTypeMirror = element.asType();
71+
@Override
72+
public JBlock getInvocationBlock(HasPreferences holder) {
73+
return holder.getAddPreferencesFromResourceInjectionBlock();
74+
}
75+
76+
@Override
77+
public void assignValue(JBlock targetBlock, IJAssignmentTarget fieldRef, HasPreferences holder, Element element, Element param) {
78+
TypeMirror prefFieldTypeMirror = param.asType();
6079
String typeQualifiedName = prefFieldTypeMirror.toString();
6180

6281
JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(element, IRClass.Res.STRING, true);
6382
AbstractJClass preferenceClass = getJClass(typeQualifiedName);
64-
JFieldRef fieldRef = ref(fieldName);
6583

66-
holder.assignFindPreferenceByKey(idRef, preferenceClass, fieldRef);
84+
targetBlock.add(fieldRef.assign(holder.getFoundPreferenceHolder(idRef, preferenceClass).getOrCastRef(preferenceClass)));
6785
}
6886

87+
@Override
88+
public void validateEnclosingElement(Element element, ElementValidation valid) {
89+
validatorHelper.enclosingElementHasEActivityOrEFragment(element, valid);
90+
}
6991
}

0 commit comments

Comments
 (0)