diff --git a/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/sharedpreferences/DefaultRes.java b/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/sharedpreferences/DefaultRes.java index db7f8ce6b1..a51b56885f 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/sharedpreferences/DefaultRes.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/sharedpreferences/DefaultRes.java @@ -31,6 +31,36 @@ * The annotation value must be one of R.* fields. If the value is not set, the * method name will be used as the R.* field name. *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Return TypeResource Type
StringR.string.*
intR.integer.*
longR.integer.*
floatR.integer.*
booleanR.bool.*
Set<String>R.array.*
*

* The key of the preference will be the method name by default. This can be * overridden by specifying a string resource with the {@link #keyRes()} diff --git a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/prefs/SomePrefs.java b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/prefs/SomePrefs.java index 71f38ad3eb..cda1ec9823 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/prefs/SomePrefs.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/prefs/SomePrefs.java @@ -21,6 +21,7 @@ import org.androidannotations.annotations.sharedpreferences.DefaultFloat; import org.androidannotations.annotations.sharedpreferences.DefaultInt; import org.androidannotations.annotations.sharedpreferences.DefaultLong; +import org.androidannotations.annotations.sharedpreferences.DefaultRes; import org.androidannotations.annotations.sharedpreferences.DefaultString; import org.androidannotations.annotations.sharedpreferences.DefaultStringSet; import org.androidannotations.annotations.sharedpreferences.SharedPref; @@ -60,4 +61,7 @@ public interface SomePrefs { @DefaultStringSet({}) Set emtpyStringSet(); + + @DefaultRes(R.array.planets_array) + Set planetsStringSet(); } diff --git a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/prefs/PrefsActivityTest.java b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/prefs/PrefsActivityTest.java index 01488cc123..143cfb0370 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/prefs/PrefsActivityTest.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/prefs/PrefsActivityTest.java @@ -238,4 +238,19 @@ public void getStringSetEmptySetDefaultValue() { assertThat(somePrefs.types().get()).isEmpty(); } + + @Test + public void getStringSetEmptyWithDefaultValue() { + sharedPref.edit().clear().commit(); + + assertThat(somePrefs.emtpyStringSet().get()).isEmpty(); + } + + @Test + public void getStringSetWithDefaultRes() { + sharedPref.edit().clear().commit(); + + assertThat(somePrefs.planetsStringSet().get().size()).isEqualTo(8); + assertThat(somePrefs.planetsStringSet().get()).contains("Earth"); + } } diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/SharedPrefHandler.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/SharedPrefHandler.java index 3f3ad8c527..b105340f4b 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/SharedPrefHandler.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/SharedPrefHandler.java @@ -96,7 +96,7 @@ private static final class DefaultPrefInfo { put("int", new DefaultPrefInfo<>(DefaultInt.class, IntPrefField.class, IRClass.Res.INTEGER, 0, "intField")); put("long", new DefaultPrefInfo<>(DefaultLong.class, LongPrefField.class, IRClass.Res.INTEGER, 0L, "longField")); put(CanonicalNameConstants.STRING, new DefaultPrefInfo<>(DefaultString.class, StringPrefField.class, IRClass.Res.STRING, "", "stringField")); - put(CanonicalNameConstants.STRING_SET, new DefaultPrefInfo>(DefaultStringSet.class, StringSetPrefField.class, null, null, "stringSetField")); + put(CanonicalNameConstants.STRING_SET, new DefaultPrefInfo>(DefaultStringSet.class, StringSetPrefField.class, IRClass.Res.ARRAY, null, "stringSetField")); } }; @@ -322,10 +322,21 @@ private IJExpression extractResValue(SharedPrefHolder holder, Element method, IR case STRING: resourceGetMethodName = "getString"; break; + case ARRAY: + resourceGetMethodName = "getStringArray"; + break; default: break; } - return holder.getContextField().invoke("getResources").invoke(resourceGetMethodName).arg(idRef); + + JInvocation resourceInvocation = holder.getContextField().invoke("getResources").invoke(resourceGetMethodName).arg(idRef); + + if (IRClass.Res.ARRAY.equals(res)) { + JInvocation asList = getClasses().ARRAYS.staticInvoke("asList"); + JInvocation newHashMap = JExpr._new(getClasses().HASH_SET.narrow(getClasses().STRING)); + resourceInvocation = newHashMap.arg(asList.arg(resourceInvocation)); + } + return resourceInvocation; } private IJExpression newEmptyStringHashSet() {