Resource resolution fixes.

1. Some dynamic ids weren't created and resulted in ResourceNotFound
exceptions.
2. Prevent NPE if a style attribute (eg. style="?attr/foo"), which
cannot be resolved, is resolved. This effectively, also results in
making it harder to catch misconfigured themes. However, support
library does it, and we don't want to throw errors when the library is
working as intended.

Change-Id: I731d8fb9209eb72b464d235d1072d416e132970b
This commit is contained in:
Deepanshu Gupta
2015-01-15 15:25:49 -08:00
parent 10b829e126
commit b6864ac6cd
2 changed files with 24 additions and 8 deletions

View File

@@ -614,15 +614,27 @@ public final class BridgeTypedArray extends TypedArray {
int pos = value.indexOf('/');
String idName = value.substring(pos + 1);
boolean create = value.startsWith("@+");
boolean isFrameworkId =
mPlatformFile || value.startsWith("@android") || value.startsWith("@+android");
// if this is a framework id
if (mPlatformFile || value.startsWith("@android") || value.startsWith("@+android")) {
// look for idName in the android R classes
return mContext.getFrameworkResourceValue(ResourceType.ID, idName, defValue);
// Look for the idName in project or android R class depending on isPlatform.
if (create) {
Integer idValue;
if (isFrameworkId) {
idValue = Bridge.getResourceId(ResourceType.ID, idName);
} else {
idValue = mContext.getProjectCallback().getResourceId(ResourceType.ID, idName);
}
return idValue == null ? defValue : idValue;
}
// This calls the same method as in if(create), but doesn't create a dynamic id, if
// one is not found.
if (isFrameworkId) {
return mContext.getFrameworkResourceValue(ResourceType.ID, idName, defValue);
} else {
return mContext.getProjectResourceValue(ResourceType.ID, idName, defValue);
}
// look for idName in the project R class.
return mContext.getProjectResourceValue(ResourceType.ID, idName, defValue);
}
// not a direct id valid reference? resolve it

View File

@@ -288,6 +288,11 @@ public final class BridgeContext extends Context {
value = mRenderResources.resolveResValue(value);
}
if (value == null) {
// unable to find the attribute.
return false;
}
// check if this is a style resource
if (value instanceof StyleResourceValue) {
// get the id that will represent this style.
@@ -295,7 +300,6 @@ public final class BridgeContext extends Context {
return true;
}
int a;
// if this is a framework value.
if (value.isFramework()) {