X Tutup
Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@
* an {@link AfterPreferences} annotated method.
* </p>
* <p>
* This annotation only can be used inside
* {@link org.androidannotations.annotations.EActivity EActivity} or
* {@link org.androidannotations.annotations.EFragment EFragment} annotated
* class, which is a subclass of {@link android.preference.PreferenceActivity
* PreferenceActivity} or <code>PreferenceFragment(Compat)</code>, respectively.
* </p>
* <p>
* The method MUST have zero parameters.
* </p>
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,13 @@
/**
* <p>
* Use it on a {@link android.preference.Preference Preference} or
* {@link android.preference.Preference Preference} subtype fields in a
* {@link android.preference.Preference Preference} subtype or
* <code>android.support.v7.preference.Preference</code> or
* <code>android.support.v7.preference.Preference</code> subtype fields in a
* {@link org.androidannotations.annotations.EActivity EActivity} or
* {@link org.androidannotations.annotations.EFragment EFragment} annotated
* class, which is a subclass of {@link android.preference.PreferenceActivity
* PreferenceActivity} or <code>PreferenceFragment</code>, respectively.
* PreferenceActivity} or <code>PreferenceFragment(Compat)</code>, respectively.
* </p>
* <p>
* The annotation value should be an array of R.string.* fields.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,31 +24,37 @@
* <p>
* This annotation is intended to be used on methods to receive events defined
* by
* {@link android.preference.Preference.OnPreferenceChangeListener#onPreferenceChange(android.preference.Preference, Object)
* OnPreferenceChangeListener#onPreferenceChange} when the value of a
* {@link android.preference.Preference Preference} has been changed by the user
* and is about to be set and/or persisted.
* <code>OnPreferenceChangeListener#onPreferenceChange(Preference, Object)</code>
* when the value of a <code>Preference</code> has been changed by the user and
* is about to be set and/or persisted.
* </p>
* <p>
* The annotation value should be one or several R.string.* fields that refers
* to {@link android.preference.Preference Preference} or subclasses of
* {@link android.preference.Preference Preference}. If not set, the method name
* will be used as the R.string.* field name.
* {@link android.preference.Preference Preference} or
* <code>android.support.v7.preference.Preference</code> or subclasses of
* <code>android.support.v7.preference.Preference</code>. If not set, the method
* name will be used as the R.string.* field name. This annotation only can be
* used inside {@link org.androidannotations.annotations.EActivity EActivity} or
* {@link org.androidannotations.annotations.EFragment EFragment} annotated
* class, which is a subclass of {@link android.preference.PreferenceActivity
* PreferenceActivity} or <code>PreferenceFragment(Compat)</code>, respectively.
* </p>
* <p>
* The method MAY have multiple parameter:
* </p>
* <ul>
* <li>A {@link android.preference.Preference Preference} (or a sublcass)
* <li>A {@link android.preference.Preference Preference} (or a subclass) or
* <code>android.support.v7.preference.Preference</code> (or a subclass)
* parameter to know which preference was targeted by this event</li>
* <li>An {@link Object}, {@link String}, {@link java.util.Set Set of strings}
* and also a {@link Boolean}, {@link Float}, {@link Integer}, {@link Long} or
* their corresponding primitive types to obtain the new value of the
* {@link android.preference.Preference Preference}. Please note with number
* types, we assume that the <code>newValue</code> parameter coming from the
* {@link android.preference.Preference Preference} is a {@link String}, so we
* parse it to a number object (Android {@link android.preference.Preference
* Preference} classes use {@link String}s instead of number objects).</li>
* <code>Preference</code>. Please note with number types, we assume that the
* <code>newValue</code> parameter coming from the <code>Preference</code> is a
* {@link String}, so we parse it to a number object (Android
* <code>Preference</code> classes use {@link String}s instead of number
* objects).</li>
* </ul>
* <blockquote>
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,15 @@
/**
* <p>
* This annotation is intended to be used on methods to receive events defined
* by
* {@link android.preference.Preference.OnPreferenceClickListener#onPreferenceClick(android.preference.Preference)
* OnPreferenceClickListener#onPreferenceClick} when the
* {@link android.preference.Preference Preference} has been clicked by the
* user.
* by <code>OnPreferenceClickListener#onPreferenceClick(Preference)</code> when
* the <code>Preference</code> has been clicked by the user.
* </p>
* <p>
* This annotation only can be used inside
* {@link org.androidannotations.annotations.EActivity EActivity} or
* {@link org.androidannotations.annotations.EFragment EFragment} annotated
* class, which is a subclass of {@link android.preference.PreferenceActivity
* PreferenceActivity} or <code>PreferenceFragment(Compat)</code>, respectively.
* </p>
* <p>
* The annotation value should be one or several of R.string.* fields. If not
Expand All @@ -37,7 +41,8 @@
* The method MAY have one parameter:
* </p>
* <ul>
* <li>A {@link android.preference.Preference Preference} (or a subclass)
* <li>A {@link android.preference.Preference Preference} (or a subclass) or
* <code>android.support.v7.preference.Preference</code> (or a subclass)
* parameter to know which preference has been clicked</li>
* </ul>
* <blockquote>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@
* Should be used on {@link org.androidannotations.annotations.EActivity
* EActivity} or {@link org.androidannotations.annotations.EFragment EFragment}
* classes which are subclass of {@link android.preference.PreferenceActivity
* PreferenceActivity} or <code>PreferenceFragment</code>, to inject the
* preference screen from resource.
* PreferenceActivity} or <code>PreferenceFragment</code> or
* <code>android.support.v7.preference.PreferenceFragmentCompat</code> or
* <code>android.support.v14.PreferenceFragment</code>, to inject the preference
* screen from resource.
* </p>
* <p>
* The annotation value should be one of R.xml.* fields.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,17 @@ public final class CanonicalNameConstants {
public static final String PREFERENCE_ACTIVITY = "android.preference.PreferenceActivity";
public static final String PREFERENCE_FRAGMENT = "android.preference.PreferenceFragment";
public static final String SUPPORT_V4_PREFERENCE_FRAGMENT = "android.support.v4.preference.PreferenceFragment";
public static final String SUPPORT_V7_PREFERENCE_FRAGMENTCOMPAT = "android.support.v7.preference.PreferenceFragmentCompat";
public static final String SUPPORT_V14_PREFERENCE_FRAGMENT = "android.support.v14.preference.PreferenceFragment";
public static final String MACHINARIUS_V4_PREFERENCE_FRAGMENT = "com.github.machinarius.preferencefragment.PreferenceFragment";
public static final String ACTIVITY_COMPAT = "android.support.v4.app.ActivityCompat";
public static final String CONTEXT_COMPAT = "android.support.v4.content.ContextCompat";
public static final String PREFERENCE = "android.preference.Preference";
public static final String SUPPORT_V7_PREFERENCE = "android.support.v7.preference.Preference";
public static final String PREFERENCE_CHANGE_LISTENER = "android.preference.Preference.OnPreferenceChangeListener";
public static final String SUPPORT_V7_PREFERENCE_CHANGE_LISTENER = "android.support.v7.preference.Preference.OnPreferenceChangeListener";
public static final String PREFERENCE_CLICK_LISTENER = "android.preference.Preference.OnPreferenceClickListener";
public static final String SUPPORT_V7_PREFERENCE_CLICK_LISTENER = "android.support.v7.preference.Preference.OnPreferenceClickListener";
public static final String PREFERENCE_ACTIVITY_HEADER = "android.preference.PreferenceActivity.Header";
public static final String APP_WIDGET_MANAGER = "android.appwidget.AppWidgetManager";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ public class ValidatorHelper {
private static final Collection<Integer> VALID_LOG_LEVELS = Arrays.asList(LOG_VERBOSE, LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR);

private static final List<String> VALID_PREFERENCE_CLASSES = asList(CanonicalNameConstants.PREFERENCE_ACTIVITY, CanonicalNameConstants.PREFERENCE_FRAGMENT,
CanonicalNameConstants.SUPPORT_V4_PREFERENCE_FRAGMENT, CanonicalNameConstants.MACHINARIUS_V4_PREFERENCE_FRAGMENT);
CanonicalNameConstants.SUPPORT_V4_PREFERENCE_FRAGMENT, CanonicalNameConstants.MACHINARIUS_V4_PREFERENCE_FRAGMENT, CanonicalNameConstants.SUPPORT_V7_PREFERENCE_FRAGMENTCOMPAT,
CanonicalNameConstants.SUPPORT_V14_PREFERENCE_FRAGMENT);

protected final TargetAnnotationHelper annotationHelper;

Expand Down Expand Up @@ -407,7 +408,7 @@ public void extendsListOfView(Element element, ElementValidation valid) {
}

public void extendsPreference(Element element, ElementValidation validation) {
extendsType(element, CanonicalNameConstants.PREFERENCE, validation);
extendsOneOfTypes(element, asList(CanonicalNameConstants.PREFERENCE, CanonicalNameConstants.SUPPORT_V7_PREFERENCE), validation);
}

public void extendsOneOfTypes(Element element, List<String> typeQualifiedNames, ElementValidation valid) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,10 @@ public V extendsType(String qualifiedName) {
return param(new ExtendsTypeParameterRequirement(qualifiedName));
}

public V extendsAnyOfTypes(String... types) {
return param(new ExtendsAnyOfTypesParameterRequirement(types));
}

public V anyType() {
return extendsType(CanonicalNameConstants.OBJECT);
}
Expand Down Expand Up @@ -361,6 +365,44 @@ protected String description() {
}
}

public class ExtendsAnyOfTypesParameterRequirement extends BaseParameterRequirement {

private List<String> types;

public ExtendsAnyOfTypesParameterRequirement(String... types) {
this.types = Arrays.asList(types);
}

@Override
public boolean isSatisfied(VariableElement parameter) {
TypeMirror elementType = parameter.asType();

for (String type : types) {
TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(type);
if (typeElement != null) {
TypeMirror expectedType = typeElement.asType();
if (annotationHelper.isSubtype(elementType, expectedType)) {
return true;
}
}
}

return false;
}

@Override
protected String description() {
StringBuilder builder = new StringBuilder();
builder.append("extending one of the following: [");
for (int i = 0; i < types.size() - 1; ++i) {
builder.append(types.get(i)).append(", ");
}
builder.append(types.get(types.size() - 1)).append(" ]");

return builder.toString();
}
}

public class AnnotatedWithParameterRequirement extends BaseParameterRequirement {

private Class<? extends Annotation> annotationClass;
Expand Down Expand Up @@ -460,6 +502,10 @@ public OneParamValidator extendsType(String qualifiedName) {
return param(new ExtendsTypeParameterRequirement(qualifiedName));
}

public OneParamValidator extendsAnyOfTypes(String... types) {
return param(new ExtendsAnyOfTypesParameterRequirement(types));
}

public OneParamValidator anyType() {
return param(new AnyTypeParameterRequirement());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -753,6 +753,15 @@ public FoundPreferenceHolder getFoundPreferenceHolder(JFieldRef idRef, JClass pr
return preferencesHolder.getFoundPreferenceHolder(idRef, preferenceClass);
}

@Override
public boolean usingSupportV7Preference() {
return preferencesHolder.usingSupportV7Preference();
}

public JClass getBasePreferenceClass() {
return preferencesHolder.getBasePreferenceClass();
}

@Override
public JBlock getOnBuildHeadersBlock() {
return preferencesHolder.getOnBuildHeadersBlock();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -565,4 +565,13 @@ public void assignFindPreferenceByKey(JFieldRef idRef, JClass preferenceClass, J
public FoundPreferenceHolder getFoundPreferenceHolder(JFieldRef idRef, JClass preferenceClass) {
return preferencesDelegate.getFoundPreferenceHolder(idRef, preferenceClass);
}

@Override
public boolean usingSupportV7Preference() {
return preferencesDelegate.usingSupportV7Preference();
}

public JClass getBasePreferenceClass() {
return preferencesDelegate.getBasePreferenceClass();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ public FoundPreferenceHolder(GeneratedClassHolder holder, JClass type, JExpressi

@Override
protected JClass getBaseType() {
return getClasses().PREFERENCE;
HasPreferences hasPreferences = (HasPreferences) getGeneratedClassHolder();

return hasPreferences.getBasePreferenceClass();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,8 @@ public interface HasPreferences extends GeneratedClassHolder {
void assignFindPreferenceByKey(JFieldRef idRef, JClass preferenceClass, JFieldRef fieldRef);

FoundPreferenceHolder getFoundPreferenceHolder(JFieldRef idRef, JClass preferenceClass);

boolean usingSupportV7Preference();

JClass getBasePreferenceClass();
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,13 @@
import static com.sun.codemodel.JExpr.invoke;
import static com.sun.codemodel.JMod.PUBLIC;

import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;

import org.androidannotations.helper.APTCodeModelHelper;
import org.androidannotations.helper.CanonicalNameConstants;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JClass;
Expand All @@ -37,9 +43,28 @@ public class PreferencesDelegate extends GeneratedClassHolderDelegate<EComponent

protected JBlock addPreferencesFromResourceBlock;

private boolean usingSupportV7Preference = false;
private JClass basePreferenceClass;

public PreferencesDelegate(EComponentWithViewSupportHolder holder) {
super(holder);
codeModelHelper = new APTCodeModelHelper(holder.getEnvironment());
Elements elementUtils = holder.getEnvironment().getProcessingEnvironment().getElementUtils();
Types typeUtils = holder.getEnvironment().getProcessingEnvironment().getTypeUtils();

TypeElement supportV7PreferenceFragmentCompat = elementUtils.getTypeElement(CanonicalNameConstants.SUPPORT_V7_PREFERENCE_FRAGMENTCOMPAT);

TypeElement supportV14PreferenceFragment = elementUtils.getTypeElement(CanonicalNameConstants.SUPPORT_V14_PREFERENCE_FRAGMENT);

TypeMirror annotatedType = holder.getAnnotatedElement().asType();

if (supportV7PreferenceFragmentCompat != null && typeUtils.isSubtype(annotatedType, supportV7PreferenceFragmentCompat.asType())
|| supportV14PreferenceFragment != null && typeUtils.isSubtype(annotatedType, supportV14PreferenceFragment.asType())) {
usingSupportV7Preference = true;
basePreferenceClass = getClasses().SUPPORT_V7_PREFERENCE;
} else {
basePreferenceClass = getClasses().PREFERENCE;
}
}

@Override
Expand Down Expand Up @@ -76,7 +101,7 @@ public void assignFindPreferenceByKey(JFieldRef idRef, JClass preferenceClass, J
assignExpression = foundViewHolder.getOrCastRef(preferenceClass);
} else {
assignExpression = findPreferenceByKey(idRef);
if (preferenceClass != null && preferenceClass != getClasses().PREFERENCE) {
if (preferenceClass != null && preferenceClass != getClasses().PREFERENCE && preferenceClass != getClasses().SUPPORT_V7_PREFERENCE) {
assignExpression = cast(preferenceClass, assignExpression);
}
holder.foundHolders.put(idRefString, new FoundPreferenceHolder(this, preferenceClass, fieldRef, block));
Expand All @@ -96,13 +121,22 @@ public FoundPreferenceHolder getFoundPreferenceHolder(JFieldRef idRef, JClass pr
return foundPreferenceHolder;
}

@Override
public boolean usingSupportV7Preference() {
return usingSupportV7Preference;
}

public JClass getBasePreferenceClass() {
return basePreferenceClass;
}

private FoundPreferenceHolder createFoundPreferenceAndIfNotNullBlock(JFieldRef idRef, JClass preferenceClass) {
JExpression findPreferenceExpression = findPreferenceByKey(idRef);
JBlock block = getAddPreferencesFromResourceBlock().block();

if (preferenceClass == null) {
preferenceClass = getClasses().PREFERENCE;
} else if (preferenceClass != getClasses().PREFERENCE) {
preferenceClass = basePreferenceClass;
} else if (!preferenceClass.equals(basePreferenceClass)) {
findPreferenceExpression = cast(preferenceClass, findPreferenceExpression);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public void process(Element element, T holder) {

List<JFieldRef> idsRefs = annotationHelper.extractAnnotationFieldRefs(element, getResourceType(), true);

JDefinedClass listenerAnonymousClass = getCodeModel().anonymousClass(getListenerClass());
JDefinedClass listenerAnonymousClass = getCodeModel().anonymousClass(getListenerClass(holder));
JMethod listenerMethod = createListenerMethod(listenerAnonymousClass);
listenerMethod.annotate(Override.class);

Expand Down Expand Up @@ -108,7 +108,8 @@ protected final JExpression castArgumentIfNecessary(T holder, String baseType, J
protected final boolean isTypeOrSubclass(String baseType, Element element) {
TypeMirror typeMirror = element.asType();
TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(baseType);
return annotationHelper.isSubtype(typeMirror, typeElement.asType());

return typeElement != null && annotationHelper.isSubtype(typeMirror, typeElement.asType());
}

protected abstract void assignListeners(T holder, List<JFieldRef> idsRefs, JDefinedClass listenerAnonymousClass);
Expand All @@ -121,9 +122,9 @@ protected final boolean isTypeOrSubclass(String baseType, Element element) {

protected abstract String getSetterName();

protected abstract JClass getListenerClass();
protected abstract JClass getListenerClass(T holder);

protected abstract JClass getListenerTargetClass();
protected abstract JClass getListenerTargetClass(T holder);

protected String getMethodName() {
return methodName;
Expand Down
Loading
X Tutup