diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 8866fe59b9f8e..91cd4bb545a13 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -4297,6 +4297,15 @@ class WindowState extends WindowContainer implements WindowManagerP final boolean wasVisible = isVisibleLw(); result |= (!wasVisible || !isDrawnLw()) ? RELAYOUT_RES_FIRST_TIME : 0; + + if (mWinAnimator.mChildrenDetached) { + // If there are detached children hanging around we need to force + // the client receiving a new Surface. + mWinAnimator.preserveSurfaceLocked(); + result |= RELAYOUT_RES_SURFACE_CHANGED + | RELAYOUT_RES_FIRST_TIME; + } + if (mAnimatingExit) { Slog.d(TAG, "relayoutVisibleWindow: " + this + " mAnimatingExit=true, mRemoveOnExit=" + mRemoveOnExit + ", mDestroying=" + mDestroying); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 97ccff030a8fd..410eddfeb71b2 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -221,6 +221,10 @@ class WindowStateAnimator { private final SurfaceControl.Transaction mReparentTransaction = new SurfaceControl.Transaction(); + // Used to track whether we have called detach children on the way to invisibility, in which + // case we need to give the client a new Surface if it lays back out to a visible state. + boolean mChildrenDetached = false; + WindowStateAnimator(final WindowState win) { final WindowManagerService service = win.mService; @@ -430,6 +434,7 @@ class WindowStateAnimator { if (mSurfaceController != null) { return mSurfaceController; } + mChildrenDetached = false; if ((mWin.mAttrs.privateFlags & PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY) != 0) { windowType = SurfaceControl.WINDOW_TYPE_DONT_SCREENSHOT; @@ -1478,6 +1483,7 @@ class WindowStateAnimator { if (mSurfaceController != null) { mSurfaceController.detachChildren(); } + mChildrenDetached = true; } int getLayer() {