diff options
author | Chet Haase <chet@google.com> | 2011-01-27 10:30:25 -0800 |
---|---|---|
committer | Chet Haase <chet@google.com> | 2011-01-27 10:30:25 -0800 |
commit | f4ac547f868db7c8a358e1f6e3d8fcebb02dbd49 (patch) | |
tree | 3bc02f0ae034b5acba5082a8cadad237a6991981 /core/java/android/view | |
parent | e38ba4acbe6f1536997ffb98d662fc3eff07add8 (diff) | |
download | frameworks_base-f4ac547f868db7c8a358e1f6e3d8fcebb02dbd49.zip frameworks_base-f4ac547f868db7c8a358e1f6e3d8fcebb02dbd49.tar.gz frameworks_base-f4ac547f868db7c8a358e1f6e3d8fcebb02dbd49.tar.bz2 |
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
Diffstat (limited to 'core/java/android/view')
-rw-r--r-- | core/java/android/view/View.java | 17 | ||||
-rw-r--r-- | core/java/android/view/ViewGroup.java | 2 |
2 files changed, 17 insertions, 2 deletions
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 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * @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 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * @hide */ public DisplayList getDisplayList() { - if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) { + if (!canHaveDisplayList()) { return null; } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 1313b78..d0509b2 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2381,7 +2381,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } else if (layerType == LAYER_TYPE_NONE) { // Delay getting the display list until animation-driven alpha values are // set up and possibly passed on to the view - hasDisplayList = true; + hasDisplayList = child.canHaveDisplayList(); } } } |