diff options
author | Jon Boekenoogen <jboekeno@google.com> | 2013-11-21 19:18:51 -0800 |
---|---|---|
committer | Jon Boekenoogen <jboekeno@google.com> | 2013-11-21 20:00:02 -0800 |
commit | ccec71c50d3d92bc89a73ef2dac7b18909ffb1e2 (patch) | |
tree | b6b3c0e052438e2be077ad693d2828cbf50972e1 | |
parent | 608b73777f5b1cbe75040e743aedd616a7486fe1 (diff) | |
download | robolectric-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.java | 3 | ||||
-rw-r--r-- | src/main/java/com/xtremelabs/robolectric/res/ResourceReferenceResolver.java | 26 |
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) { |