Merge "Add support for aapt:attr attributes"
diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
index 9bc8e18..2c7e936 100644
--- a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
+++ b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
@@ -638,6 +638,9 @@
return mContext.getProjectResourceValue(ResourceType.ID, idName, defValue);
}
}
+ else if (value.startsWith("@aapt:_aapt")) {
+ return mContext.getLayoutlibCallback().getResourceId(ResourceType.AAPT, value);
+ }
// not a direct id valid reference. First check if it's an enum (this is a corner case
// for attributes that have a reference|enum type), then fallback to resolve
diff --git a/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java b/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java
index 6e3a8e8..c20ee12 100644
--- a/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java
@@ -131,9 +131,16 @@
if (resourceInfo != null) {
String attributeName = resourceInfo.getSecond();
RenderResources renderResources = resources.mContext.getRenderResources();
- return Pair.of(attributeName, platformResFlag_out[0] ?
+ ResourceValue value = platformResFlag_out[0] ?
renderResources.getFrameworkResource(resourceInfo.getFirst(), attributeName) :
- renderResources.getProjectResource(resourceInfo.getFirst(), attributeName));
+ renderResources.getProjectResource(resourceInfo.getFirst(), attributeName);
+
+ if (value == null) {
+ // Unable to resolve the attribute, just leave the unresolved value
+ value = new ResourceValue(resourceInfo.getFirst(), attributeName, attributeName,
+ platformResFlag_out[0]);
+ }
+ return Pair.of(attributeName, value);
}
return null;
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
index b3a2d3e..f1e7b51 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
@@ -286,18 +286,15 @@
Density density = Density.MEDIUM;
if (value instanceof DensityBasedResourceValue) {
- density =
- ((DensityBasedResourceValue)value).getResourceDensity();
+ density = ((DensityBasedResourceValue) value).getResourceDensity();
}
-
if (lowerCaseValue.endsWith(NinePatch.EXTENSION_9PATCH)) {
File file = new File(stringValue);
if (file.isFile()) {
try {
- return getNinePatchDrawable(
- new FileInputStream(file), density, value.isFramework(),
- stringValue, context);
+ return getNinePatchDrawable(new FileInputStream(file), density,
+ value.isFramework(), stringValue, context);
} catch (IOException e) {
// failed to read the file, we'll return null below.
Bridge.getLog().error(LayoutLog.TAG_RESOURCES_READ,
@@ -306,30 +303,28 @@
}
return null;
- } else if (lowerCaseValue.endsWith(".xml")) {
+ } else if (lowerCaseValue.endsWith(".xml") || stringValue.startsWith("@aapt:_aapt/")) {
// create a block parser for the file
- File f = new File(stringValue);
- if (f.isFile()) {
- try {
- // let the framework inflate the Drawable from the XML file.
- XmlPullParser parser = ParserFactory.create(f);
-
- BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
- parser, context, value.isFramework());
- try {
- return Drawable.createFromXml(context.getResources(), blockParser, theme);
- } finally {
- blockParser.ensurePopped();
+ try {
+ XmlPullParser parser = context.getLayoutlibCallback().getParser(value);
+ if (parser == null) {
+ File drawableFile = new File(stringValue);
+ if (drawableFile.isFile()) {
+ parser = ParserFactory.create(drawableFile);
}
- } catch (Exception e) {
- // this is an error and not warning since the file existence is checked before
- // attempting to parse it.
- Bridge.getLog().error(null, "Failed to parse file " + stringValue,
- e, null /*data*/);
}
- } else {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- String.format("File %s does not exist (or is not a file)", stringValue),
+
+ BridgeXmlBlockParser blockParser =
+ new BridgeXmlBlockParser(parser, context, value.isFramework());
+ try {
+ return Drawable.createFromXml(context.getResources(), blockParser, theme);
+ } finally {
+ blockParser.ensurePopped();
+ }
+ } catch (Exception e) {
+ // this is an error and not warning since the file existence is checked before
+ // attempting to parse it.
+ Bridge.getLog().error(null, "Failed to parse file " + stringValue, e,
null /*data*/);
}
@@ -342,8 +337,8 @@
value.isFramework() ? null : context.getProjectKey());
if (bitmap == null) {
- bitmap = Bitmap_Delegate.createBitmap(bmpFile, false /*isMutable*/,
- density);
+ bitmap =
+ Bitmap_Delegate.createBitmap(bmpFile, false /*isMutable*/, density);
Bridge.setCachedBitmap(stringValue, bitmap,
value.isFramework() ? null : context.getProjectKey());
}