diff options
author | Xavier Ducrohet <xav@android.com> | 2010-10-26 16:58:34 -0700 |
---|---|---|
committer | Xavier Ducrohet <xav@android.com> | 2010-10-26 17:14:55 -0700 |
commit | c2e28dd74813799aad132673ff9d302657dd04ed (patch) | |
tree | af700b4c91f9135026816458018547e7303dfc32 /tools/layoutlib/bridge/src | |
parent | 2f19f56ac5bcf02ed503bdaf95b724cba8ff782d (diff) | |
download | frameworks_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/layoutlib/bridge/src')
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); |