Fix NPE with display lists when view not attached
There was logic in ViewGroup that assumed that an accelerated
view must always be able to get a display list for any child
that it was drawing. One situation occurred, however, that
caused a problem with this - a contacts activity was started
and not yet attached, but was being asked to render into an
accelerated canvas. We assumed that the child would have a display
list and simply called getDisplayList(). But since that call
returned null, we later deref'd the null object.
The fix is to check whether a child can have a display list
instead of assuming that it can just because the container view
is accelerated.
Change-Id: I7de62fd597ad50720c9585d621bec02e77c171df
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index c64f564..5e8f31a 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -8227,6 +8227,21 @@
* @hide
*/
protected void dispatchGetDisplayList() {}
+
+ /**
+ * A view that is not attached or hardware accelerated cannot create a display list.
+ * This method checks these conditions and returns the appropriate result.
+ *
+ * @return true if view has the ability to create a display list, false otherwise.
+ *
+ * @hide
+ */
+ public boolean canHaveDisplayList() {
+ if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) {
+ return false;
+ }
+ return true;
+ }
/**
* <p>Returns a display list that can be used to draw this view again
@@ -8237,7 +8252,7 @@
* @hide
*/
public DisplayList getDisplayList() {
- if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) {
+ if (!canHaveDisplayList()) {
return null;
}