summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/RenderNode.java4
-rw-r--r--core/java/android/view/View.java60
-rw-r--r--core/java/android/view/ViewGroup.java1
3 files changed, 32 insertions, 33 deletions
diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java
index 6c8c3c7ecd1e..a27c313fcd40 100644
--- a/core/java/android/view/RenderNode.java
+++ b/core/java/android/view/RenderNode.java
@@ -269,8 +269,8 @@ public class RenderNode {
}
/**
- * Returns whether the display list is currently usable. If this returns false,
- * the display list should be re-recorded prior to replaying it.
+ * Returns whether the RenderNode's display list content is currently usable.
+ * If this returns false, the display list should be re-recorded prior to replaying it.
*
* @return boolean true if the display list is able to be replayed, false otherwise.
*/
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 2ca3436f10eb..295107643fee 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -3551,10 +3551,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
private Bitmap mUnscaledDrawingCache;
/**
- * Display list used for the View content.
+ * RenderNode holding View properties, potentially holding a DisplayList of View content.
* <p>
* When non-null and valid, this is expected to contain an up-to-date copy
- * of the View content. It is cleared on temporary detach and reset on
+ * of the View content. Its DisplayList content is cleared on temporary detach and reset on
* cleanup.
*/
RenderNode mDisplayList;
@@ -9719,6 +9719,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
}
+ void ensureRenderNode() {
+ if (mDisplayList == null) {
+ mDisplayList = RenderNode.create(getClass().getName());
+ }
+ }
+
/**
* Recomputes the transform matrix if necessary.
*/
@@ -13689,10 +13695,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
mHardwareLayer.setLayerPaint(mLayerPaint);
RenderNode displayList = mHardwareLayer.startRecording();
- if (getDisplayList(displayList, true) != displayList) {
- throw new IllegalStateException("getDisplayList() didn't return"
- + " the input displaylist for a hardware layer!");
- }
+ getDisplayList(displayList, true);
mHardwareLayer.endRecording(mLocalDirtyRect);
mLocalDirtyRect.setEmpty();
}
@@ -13833,29 +13836,34 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* Otherwise, the same display list will be returned (after having been rendered into
* along the way, depending on the invalidation state of the view).
*
- * @param displayList The previous version of this displayList, could be null.
+ * @param renderNode The previous version of this displayList, could be null.
* @param isLayer Whether the requester of the display list is a layer. If so,
* the view will avoid creating a layer inside the resulting display list.
* @return A new or reused DisplayList object.
*/
- private RenderNode getDisplayList(RenderNode displayList, boolean isLayer) {
+ private void getDisplayList(@NonNull RenderNode renderNode, boolean isLayer) {
final HardwareRenderer renderer = getHardwareRenderer();
+ if (renderNode == null) {
+ throw new IllegalArgumentException("RenderNode must not be null");
+ }
if (renderer == null || !canHaveDisplayList()) {
- return null;
+ // can't populate RenderNode, don't try
+ return;
}
- if (((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0 ||
- displayList == null || !displayList.isValid() ||
- (!isLayer && mRecreateDisplayList))) {
+ if ((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0
+ || !renderNode.isValid()
+ || (!isLayer && mRecreateDisplayList)) {
// Don't need to recreate the display list, just need to tell our
// children to restore/recreate theirs
- if (displayList != null && displayList.isValid() &&
- !isLayer && !mRecreateDisplayList) {
+ if (renderNode.isValid()
+ && !isLayer
+ && !mRecreateDisplayList) {
mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID;
mPrivateFlags &= ~PFLAG_DIRTY_MASK;
dispatchGetDisplayList();
- return displayList;
+ return; // no work needed
}
if (!isLayer) {
@@ -13863,20 +13871,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// we copy in child display lists into ours in drawChild()
mRecreateDisplayList = true;
}
- if (displayList == null) {
- displayList = RenderNode.create(getClass().getName());
- // If we're creating a new display list, make sure our parent gets invalidated
- // since they will need to recreate their display list to account for this
- // new child display list.
- invalidateParentCaches();
- }
boolean caching = false;
int width = mRight - mLeft;
int height = mBottom - mTop;
int layerType = getLayerType();
- final HardwareCanvas canvas = displayList.start(width, height);
+ final HardwareCanvas canvas = renderNode.start(width, height);
try {
if (!isLayer && layerType != LAYER_TYPE_NONE) {
@@ -13919,12 +13920,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
}
} finally {
- displayList.end(renderer, canvas);
- displayList.setCaching(caching);
+ renderNode.end(renderer, canvas);
+ renderNode.setCaching(caching);
if (isLayer) {
- displayList.setLeftTopRightBottom(0, 0, width, height);
+ renderNode.setLeftTopRightBottom(0, 0, width, height);
} else {
- setDisplayListProperties(displayList);
+ setDisplayListProperties(renderNode);
}
if (renderer != getHardwareRenderer()) {
@@ -13939,8 +13940,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID;
mPrivateFlags &= ~PFLAG_DIRTY_MASK;
}
-
- return displayList;
}
/**
@@ -13952,7 +13951,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @hide
*/
public RenderNode getDisplayList() {
- mDisplayList = getDisplayList(mDisplayList, false);
+ ensureRenderNode();
+ getDisplayList(mDisplayList, false);
return mDisplayList;
}
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index aadaa7f0ea78..d9f48212ac87 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -31,7 +31,6 @@ import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.os.Build;
-import android.os.Bundle;
import android.os.Parcelable;
import android.os.SystemClock;
import android.util.AttributeSet;