am b3cfb334: Merge "Fix rare NPE in BridgeContext." into lmp-mr1-dev
automerge: 49d3c36
* commit '49d3c36134f818e06dc6c71d462ee8369c73c195':
Fix rare NPE in BridgeContext.
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
index 2f62b93..aa4b560 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
@@ -94,6 +94,7 @@
/**
* Custom implementation of Context/Activity to handle non compiled resources.
*/
+@SuppressWarnings("deprecation") // For use of Pair.
public final class BridgeContext extends Context {
/** The map adds cookies to each view so that IDE can link xml tags to views. */
@@ -569,7 +570,7 @@
// Hint: for XmlPullParser, attach source //DEVICE_SRC/dalvik/libcore/xml/src/java
if (set instanceof BridgeXmlBlockParser) {
- BridgeXmlBlockParser parser = null;
+ BridgeXmlBlockParser parser;
parser = (BridgeXmlBlockParser)set;
isPlatformFile = parser.isPlatformFile();
@@ -590,7 +591,7 @@
} else if (set != null) { // null parser is ok
// really this should not be happening since its instantiated in Bridge
Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- "Parser is not a BridgeXmlBlockParser!", null /*data*/);
+ "Parser is not a BridgeXmlBlockParser!", null);
return null;
}
@@ -602,7 +603,7 @@
// look for a custom style.
String customStyle = null;
if (set != null) {
- customStyle = set.getAttributeValue(null /* namespace*/, "style");
+ customStyle = set.getAttributeValue(null, "style");
}
StyleResourceValue customStyleValues = null;
@@ -625,31 +626,39 @@
// get the name from the int.
Pair<String, Boolean> defStyleAttribute = searchAttr(defStyleAttr);
- if (defaultPropMap != null) {
- String defStyleName = defStyleAttribute.getFirst();
- if (defStyleAttribute.getSecond()) {
- defStyleName = "android:" + defStyleName;
- }
- defaultPropMap.put("style", defStyleName);
- }
-
- // look for the style in the current theme, and its parent:
- ResourceValue item = mRenderResources.findItemInTheme(defStyleAttribute.getFirst(),
- defStyleAttribute.getSecond());
-
- if (item != null) {
- // item is a reference to a style entry. Search for it.
- item = mRenderResources.findResValue(item.getValue(), item.isFramework());
-
- if (item instanceof StyleResourceValue) {
- defStyleValues = (StyleResourceValue)item;
- }
+ if (defStyleAttribute == null) {
+ // This should be rare. Happens trying to map R.style.foo to @style/foo fails.
+ // This will happen if the user explicitly used a non existing int value for
+ // defStyleAttr or there's something wrong with the project structure/build.
+ Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE,
+ "Failed to find the style corresponding to the id " + defStyleAttr, null);
} else {
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR,
- String.format(
- "Failed to find style '%s' in current theme",
- defStyleAttribute.getFirst()),
- null /*data*/);
+ if (defaultPropMap != null) {
+ String defStyleName = defStyleAttribute.getFirst();
+ if (defStyleAttribute.getSecond()) {
+ defStyleName = "android:" + defStyleName;
+ }
+ defaultPropMap.put("style", defStyleName);
+ }
+
+ // look for the style in the current theme, and its parent:
+ ResourceValue item = mRenderResources.findItemInTheme(defStyleAttribute.getFirst(),
+ defStyleAttribute.getSecond());
+
+ if (item != null) {
+ // item is a reference to a style entry. Search for it.
+ item = mRenderResources.findResValue(item.getValue(), item.isFramework());
+
+ if (item instanceof StyleResourceValue) {
+ defStyleValues = (StyleResourceValue) item;
+ }
+ } else {
+ Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR,
+ String.format(
+ "Failed to find style '%s' in current theme",
+ defStyleAttribute.getFirst()),
+ null);
+ }
}
} else if (defStyleRes != 0) {
boolean isFrameworkRes = true;