From e6c662098d26aa1470156a246349245f89a41cbc Mon Sep 17 00:00:00 2001 From: Chavi Weingarten Date: Tue, 4 Aug 2020 20:24:12 +0000 Subject: [PATCH] Revert "Reparent bounds layer if surface was replaced." This was intended to fix a reparent issue when preserving surfaces before the app was closed. That is no longer happening so this change is no longer needed. The reason this causes the flicker is it waits to reparent until next frame. However, the frame can be submitted before WM gets a chance to show the new Surface since that request is sent to WM. Therefore, the SurfaceView can end up getting reparented to the new SurfaceControl before the new SurfaceControl is visible, causing it to be hidden for a few frames. This reverts commit c1dcac956838818a57b9334332df21ac55e91c02. Reason for revert: b/162377855 Fixes: 162377855 Test: Split screen with SurfaceView doesn't flicker Change-Id: Ic7a209b7aa66e278b99a526d8427f140b31de0f6 --- core/java/android/view/ViewRootImpl.java | 25 +++++------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 7453f21d379bb..bcf3b49c66442 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1824,19 +1824,13 @@ public final class ViewRootImpl implements ViewParent, /** * Called after window layout to update the bounds surface. If the surface insets have changed * or the surface has resized, update the bounds surface. - * - * @param shouldReparent Whether it should reparent the bounds layer to the main SurfaceControl. */ - private void updateBoundsLayer(boolean shouldReparent) { + private void updateBoundsLayer() { if (mBoundsLayer != null) { setBoundsLayerCrop(); - mTransaction.deferTransactionUntil(mBoundsLayer, getRenderSurfaceControl(), - mSurface.getNextFrameNumber()); - - if (shouldReparent) { - mTransaction.reparent(mBoundsLayer, getRenderSurfaceControl()); - } - mTransaction.apply(); + mTransaction.deferTransactionUntil(mBoundsLayer, + getRenderSurfaceControl(), mSurface.getNextFrameNumber()) + .apply(); } } @@ -2919,16 +2913,7 @@ public final class ViewRootImpl implements ViewParent, } if (surfaceSizeChanged || surfaceReplaced || surfaceCreated || windowAttributesChanged) { - // If the surface has been replaced, there's a chance the bounds layer is not parented - // to the new layer. When updating bounds layer, also reparent to the main VRI - // SurfaceControl to ensure it's correctly placed in the hierarchy. - // - // This needs to be done on the client side since WMS won't reparent the children to the - // new surface if it thinks the app is closing. WMS gets the signal that the app is - // stopping, but on the client side it doesn't get stopped since it's restarted quick - // enough. WMS doesn't want to keep around old children since they will leak when the - // client creates new children. - updateBoundsLayer(surfaceReplaced); + updateBoundsLayer(); } final boolean didLayout = layoutRequested && (!mStopped || mReportNextDraw);