Merge "Ensure Surface is recreated if children are detached." into pi-dev

This commit is contained in:
Rob Carr
2018-03-16 02:41:13 +00:00
committed by Android (Google) Code Review
2 changed files with 15 additions and 0 deletions

View File

@@ -4297,6 +4297,15 @@ class WindowState extends WindowContainer<WindowState> 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);

View File

@@ -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() {