summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@android.com>2010-10-26 16:58:34 -0700
committerXavier Ducrohet <xav@android.com>2010-10-26 17:14:55 -0700
commitc2e28dd74813799aad132673ff9d302657dd04ed (patch)
treeaf700b4c91f9135026816458018547e7303dfc32 /tools
parent2f19f56ac5bcf02ed503bdaf95b724cba8ff782d (diff)
downloadframeworks_base-c2e28dd74813799aad132673ff9d302657dd04ed.zip
frameworks_base-c2e28dd74813799aad132673ff9d302657dd04ed.tar.gz
frameworks_base-c2e28dd74813799aad132673ff9d302657dd04ed.tar.bz2
Fix issue with project resources overriding framework resources.
Framework resources loaded through Drawable.createFromXml could be overriden by project resources if there were loaded through a state list drawable where the final resource name was used by a project resource (of the same type). This ensures that the XML parser knows that it's a framework resource being parsed and that the resource resolution uses that information. Change-Id: I39cf9eba755e55f1604b968637aeecff969a558d
Diffstat (limited to 'tools')
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java15
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeXmlPullAttributes.java23
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/ResourceHelper.java3
3 files changed, 22 insertions, 19 deletions
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
index 1436494..ecd22e2 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
@@ -266,7 +266,7 @@ public final class BridgeContext extends Context {
customStyle = parser.getAttributeValue(null /* namespace*/, "style");
}
if (customStyle != null) {
- IResourceValue item = findResValue(customStyle);
+ IResourceValue item = findResValue(customStyle, false /*forceFrameworkOnly*/);
if (item instanceof IStyleResourceValue) {
defStyleValues = (IStyleResourceValue)item;
@@ -283,7 +283,7 @@ public final class BridgeContext extends Context {
if (item != null) {
// item is a reference to a style entry. Search for it.
- item = findResValue(item.getValue());
+ item = findResValue(item.getValue(), false /*forceFrameworkOnly*/);
if (item instanceof IStyleResourceValue) {
defStyleValues = (IStyleResourceValue)item;
@@ -413,7 +413,7 @@ public final class BridgeContext extends Context {
}
// get the IResourceValue referenced by this value
- IResourceValue resValue = findResValue(value);
+ IResourceValue resValue = findResValue(value, false /*forceFrameworkOnly*/);
// if resValue is null, but value is not null, this means it was not a reference.
// we return the name/value wrapper in a IResourceValue
@@ -449,7 +449,7 @@ public final class BridgeContext extends Context {
}
// else attempt to find another IResourceValue referenced by this one.
- IResourceValue resolvedValue = findResValue(value.getValue());
+ IResourceValue resolvedValue = findResValue(value.getValue(), value.isFramework());
// if the value did not reference anything, then we simply return the input value
if (resolvedValue == null) {
@@ -476,9 +476,11 @@ public final class BridgeContext extends Context {
* only support the android namespace.
*
* @param reference the resource reference to search for.
+ * @param forceFrameworkOnly if true all references are considered to be toward framework
+ * resource even if the reference does not include the android: prefix.
* @return a {@link IResourceValue} or <code>null</code>.
*/
- IResourceValue findResValue(String reference) {
+ IResourceValue findResValue(String reference, boolean forceFrameworkOnly) {
if (reference == null) {
return null;
}
@@ -560,7 +562,8 @@ public final class BridgeContext extends Context {
segments[1] = segments[1].substring(BridgeConstants.PREFIX_ANDROID.length());
}
- return findResValue(segments[0], segments[1], frameworkOnly);
+ return findResValue(segments[0], segments[1],
+ forceFrameworkOnly ? true :frameworkOnly);
}
// Looks like the value didn't reference anything. Return null.
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeXmlPullAttributes.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeXmlPullAttributes.java
index 4be6eab..d145ff6 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeXmlPullAttributes.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeXmlPullAttributes.java
@@ -41,7 +41,7 @@ public class BridgeXmlPullAttributes extends XmlPullAttributes {
/*
* (non-Javadoc)
* @see android.util.XmlPullAttributes#getAttributeNameResource(int)
- *
+ *
* This methods must return com.android.internal.R.attr.<name> matching
* the name of the attribute.
* It returns 0 if it doesn't find anything.
@@ -50,19 +50,19 @@ public class BridgeXmlPullAttributes extends XmlPullAttributes {
public int getAttributeNameResource(int index) {
// get the attribute name.
String name = getAttributeName(index);
-
+
// get the attribute namespace
String ns = mParser.getAttributeNamespace(index);
-
+
if (BridgeConstants.NS_RESOURCES.equals(ns)) {
Integer v = Bridge.getResourceValue(BridgeConstants.RES_ATTR, name);
if (v != null) {
return v.intValue();
}
-
+
return 0;
}
-
+
// this is not an attribute in the android namespace, we query the customviewloader, if
// the namespaces match.
if (mContext.getProjectCallback().getNamespace().equals(ns)) {
@@ -75,7 +75,7 @@ public class BridgeXmlPullAttributes extends XmlPullAttributes {
return 0;
}
-
+
/*
* (non-Javadoc)
* @see android.util.XmlPullAttributes#getAttributeResourceValue(int, int)
@@ -83,7 +83,7 @@ public class BridgeXmlPullAttributes extends XmlPullAttributes {
@Override
public int getAttributeResourceValue(int index, int defaultValue) {
String value = getAttributeValue(index);
-
+
return resolveResourceValue(value, defaultValue);
}
@@ -94,14 +94,15 @@ public class BridgeXmlPullAttributes extends XmlPullAttributes {
@Override
public int getAttributeResourceValue(String namespace, String attribute, int defaultValue) {
String value = getAttributeValue(namespace, attribute);
-
+
return resolveResourceValue(value, defaultValue);
}
private int resolveResourceValue(String value, int defaultValue) {
// now look for this particular value
- IResourceValue resource = mContext.resolveResValue(mContext.findResValue(value));
-
+ IResourceValue resource = mContext.resolveResValue(
+ mContext.findResValue(value, mPlatformFile));
+
if (resource != null) {
Integer id = null;
if (mPlatformFile || resource.isFramework()) {
@@ -115,7 +116,7 @@ public class BridgeXmlPullAttributes extends XmlPullAttributes {
return id;
}
}
-
+
return defaultValue;
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/ResourceHelper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/ResourceHelper.java
index 3d0dd73..f624753 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/ResourceHelper.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/ResourceHelper.java
@@ -148,8 +148,7 @@ public final class ResourceHelper {
parser.setInput(new FileReader(f));
d = Drawable.createFromXml(context.getResources(),
- // FIXME: we need to know if this resource is platform or not
- new BridgeXmlBlockParser(parser, context, false));
+ new BridgeXmlBlockParser(parser, context, isFramework));
return d;
} catch (XmlPullParserException e) {
context.getLogger().error(e);