Merge "Call preserveSurfaces when detaching children." into rvc-dev

This commit is contained in:
Chavi Weingarten
2020-06-05 00:05:03 +00:00
committed by Android (Google) Code Review

View File

@@ -418,25 +418,25 @@ class WindowStateAnimator {
if (!mDestroyPreservedSurfaceUponRedraw) { if (!mDestroyPreservedSurfaceUponRedraw) {
return; return;
} }
if (mSurfaceController != null) {
if (mPendingDestroySurface != null) {
// If we are preserving a surface but we aren't relaunching that means // If we are preserving a surface but we aren't relaunching that means
// we are just doing an in-place switch. In that case any SurfaceFlinger side // we are just doing an in-place switch. In that case any SurfaceFlinger side
// child layers need to be reparented to the new surface to make this // child layers need to be reparented to the new surface to make this
// transparent to the app. // transparent to the app.
if (mWin.mActivityRecord == null || mWin.mActivityRecord.isRelaunching() == false) { // If the children are detached, we don't want to reparent them to the new surface.
// Instead let the children get removed when the old surface is deleted.
if (mSurfaceController != null && mPendingDestroySurface != null && !mChildrenDetached
&& (mWin.mActivityRecord == null || !mWin.mActivityRecord.isRelaunching())) {
mPostDrawTransaction.reparentChildren( mPostDrawTransaction.reparentChildren(
mPendingDestroySurface.getClientViewRootSurface(), mPendingDestroySurface.getClientViewRootSurface(),
mSurfaceController.mSurfaceControl).apply(); mSurfaceController.mSurfaceControl).apply();
} }
}
}
destroyDeferredSurfaceLocked(); destroyDeferredSurfaceLocked();
mDestroyPreservedSurfaceUponRedraw = false; mDestroyPreservedSurfaceUponRedraw = false;
} }
void markPreservedSurfaceForDestroy() { private void markPreservedSurfaceForDestroy() {
if (mDestroyPreservedSurfaceUponRedraw if (mDestroyPreservedSurfaceUponRedraw
&& !mService.mDestroyPreservedSurface.contains(mWin)) { && !mService.mDestroyPreservedSurface.contains(mWin)) {
mService.mDestroyPreservedSurface.add(mWin); mService.mDestroyPreservedSurface.add(mWin);
@@ -1363,10 +1363,14 @@ class WindowStateAnimator {
if (mPendingDestroySurface != null && mDestroyPreservedSurfaceUponRedraw) { if (mPendingDestroySurface != null && mDestroyPreservedSurfaceUponRedraw) {
final SurfaceControl pendingSurfaceControl = mPendingDestroySurface.mSurfaceControl; final SurfaceControl pendingSurfaceControl = mPendingDestroySurface.mSurfaceControl;
mPostDrawTransaction.reparent(pendingSurfaceControl, null); mPostDrawTransaction.reparent(pendingSurfaceControl, null);
// If the children are detached, we don't want to reparent them to the new surface.
// Instead let the children get removed when the old surface is deleted.
if (!mChildrenDetached) {
mPostDrawTransaction.reparentChildren( mPostDrawTransaction.reparentChildren(
mPendingDestroySurface.getClientViewRootSurface(), mPendingDestroySurface.getClientViewRootSurface(),
mSurfaceController.mSurfaceControl); mSurfaceController.mSurfaceControl);
} }
}
SurfaceControl.mergeToGlobalTransaction(mPostDrawTransaction); SurfaceControl.mergeToGlobalTransaction(mPostDrawTransaction);
return true; return true;
@@ -1593,6 +1597,12 @@ class WindowStateAnimator {
mSurfaceController.detachChildren(); mSurfaceController.detachChildren();
} }
mChildrenDetached = true; mChildrenDetached = true;
// If the children are detached, it means the app is exiting. We don't want to tear the
// content down too early, otherwise we could end up with a flicker. By preserving the
// current surface, we ensure the content remains on screen until the window is completely
// removed. It also ensures that the old surface is cleaned up when started again since it
// forces mSurfaceController to be set to null.
preserveSurfaceLocked();
} }
void setOffsetPositionForStackResize(boolean offsetPositionForStackResize) { void setOffsetPositionForStackResize(boolean offsetPositionForStackResize) {