diff options
| author | 2020-07-10 17:09:08 +0000 | |
|---|---|---|
| committer | 2020-07-10 17:09:08 +0000 | |
| commit | 57627f152dbc774aca13ba475906b6d398561efb (patch) | |
| tree | e092fdc5a0c637d6382474fbc31bdd676043af48 | |
| parent | aa2c7c9f3ea731e26df14ed157fb04878b91276b (diff) | |
| parent | 2b66979876c84a361d124a972cfc6a5a1580bc45 (diff) | |
Merge "Reparent bounds layer if surface was replaced." into rvc-dev am: ab3d80c98d am: 2b66979876
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12123266
Change-Id: Ia7bb0a9368776b3615f9033b6480174dcee16af9
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 2b7044d0c67e..fefe564787ca 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1824,13 +1824,19 @@ 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() { + private void updateBoundsLayer(boolean shouldReparent) { if (mBoundsLayer != null) { setBoundsLayerCrop(); - mTransaction.deferTransactionUntil(mBoundsLayer, - getRenderSurfaceControl(), mSurface.getNextFrameNumber()) - .apply(); + mTransaction.deferTransactionUntil(mBoundsLayer, getRenderSurfaceControl(), + mSurface.getNextFrameNumber()); + + if (shouldReparent) { + mTransaction.reparent(mBoundsLayer, getRenderSurfaceControl()); + } + mTransaction.apply(); } } @@ -2912,7 +2918,16 @@ public final class ViewRootImpl implements ViewParent, } if (surfaceSizeChanged || surfaceReplaced || surfaceCreated || windowAttributesChanged) { - updateBoundsLayer(); + // 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); } final boolean didLayout = layoutRequested && (!mStopped || mReportNextDraw); |