aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Boekenoogen <jboekeno@google.com>2013-11-21 19:18:51 -0800
committerJon Boekenoogen <jboekeno@google.com>2013-11-21 20:00:02 -0800
commitccec71c50d3d92bc89a73ef2dac7b18909ffb1e2 (patch)
treeb6b3c0e052438e2be077ad693d2828cbf50972e1
parent608b73777f5b1cbe75040e743aedd616a7486fe1 (diff)
downloadrobolectric-ccec71c50d3d92bc89a73ef2dac7b18909ffb1e2.tar.gz
Fix resource loading issue.
Once robolectric tests are run with PanoSetupLib resources it crashes with a NumberFormatException. This is caused by the resource loader having the assumption that resources that are referenced must be of the same type. Such as: <dimen name="foo">10dp</dimen> <dimen name="bar">@dimen/foo</dimen> However, the following case crashes (and is valid): <integer name="foo">30dp</integer> <dimen name="bar">@integer/foo</dimen> This change explicitly allowed dimen resources to reference dimen resources and integer resources. Probably wouldn't need this change if we moved to v2 which uses AOSP code for resource loading, but haven't had time to work on the migration. Change-Id: I726f69bd5740f31b7d9f1ae863a8792d764f3ee3
-rw-r--r--src/main/java/com/xtremelabs/robolectric/res/DimenResourceLoader.java3
-rw-r--r--src/main/java/com/xtremelabs/robolectric/res/ResourceReferenceResolver.java26
2 files changed, 23 insertions, 6 deletions
diff --git a/src/main/java/com/xtremelabs/robolectric/res/DimenResourceLoader.java b/src/main/java/com/xtremelabs/robolectric/res/DimenResourceLoader.java
index 5d08ae0de..46eeb7d7c 100644
--- a/src/main/java/com/xtremelabs/robolectric/res/DimenResourceLoader.java
+++ b/src/main/java/com/xtremelabs/robolectric/res/DimenResourceLoader.java
@@ -5,7 +5,8 @@ public class DimenResourceLoader extends XpathResourceXmlLoader implements Resou
private static final String[] UNITS = { "dp", "dip", "px", "sp", "mm" };
- private ResourceReferenceResolver<Float> dimenResolver = new ResourceReferenceResolver<Float>("dimen");
+ private ResourceReferenceResolver<Float> dimenResolver =
+ new ResourceReferenceResolver<Float>("dimen", new String[] { "dimen", "integer" });
public DimenResourceLoader(ResourceExtractor resourceExtractor) {
super(resourceExtractor, "/resources/dimen");
diff --git a/src/main/java/com/xtremelabs/robolectric/res/ResourceReferenceResolver.java b/src/main/java/com/xtremelabs/robolectric/res/ResourceReferenceResolver.java
index 0ea1045a2..697eb7716 100644
--- a/src/main/java/com/xtremelabs/robolectric/res/ResourceReferenceResolver.java
+++ b/src/main/java/com/xtremelabs/robolectric/res/ResourceReferenceResolver.java
@@ -8,10 +8,16 @@ import java.util.Map;
class ResourceReferenceResolver<T> {
private Map<String, T> attributeNamesToValues = new HashMap<String, T>();
private Map<String, List<String>> unresolvedReferences = new HashMap<String, List<String>>();
- private String prefix;
+ private String referenceType;
+ private String[] allowedReferenceTypesForRawValues;
- ResourceReferenceResolver(String prefix) {
- this.prefix = prefix;
+ ResourceReferenceResolver(String referenceType) {
+ this(referenceType, new String[] { referenceType });
+ }
+
+ ResourceReferenceResolver(String referenceType, String[] allowedReferenceTypesForRawValues) {
+ this.referenceType = referenceType;
+ this.allowedReferenceTypesForRawValues = allowedReferenceTypesForRawValues;
}
public T getValue(String resourceName) {
@@ -19,8 +25,18 @@ class ResourceReferenceResolver<T> {
}
public void processResource(String name, String rawValue, ResourceValueConverter loader, boolean isSystem) {
- String valuePointer = prefix + "/" + name;
- if (rawValue.startsWith("@" + prefix) || rawValue.startsWith("@android:" + prefix)) {
+ String valuePointer = referenceType + "/" + name;
+
+ boolean isAllowedReferenceType = false;
+ for (String allowedReferenceTypesForRawValue : allowedReferenceTypesForRawValues) {
+ if (rawValue.startsWith("@")
+ && rawValue.contains(allowedReferenceTypesForRawValue + "/")) {
+ isAllowedReferenceType = true;
+ break;
+ }
+ }
+
+ if (isAllowedReferenceType) {
addAttributeReference(rawValue, valuePointer);
} else {
if (isSystem) {