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 Type |
+ * Resource Type |
+ *
+ *
+ * | String |
+ * R.string.* |
+ *
+ *
+ * | int |
+ * R.integer.* |
+ *
+ *
+ * | long |
+ * R.integer.* |
+ *
+ *
+ * | float |
+ * R.integer.* |
+ *
+ *
+ * | boolean |
+ * R.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() {