Merge "Call preserveSurfaces when detaching children." into rvc-dev am: 5b72ddd8ed

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11712621

Change-Id: If8cbdd40cc01ab40456459d3e07fe25155c98c8f
This commit is contained in:
Chavi Weingarten
2020-06-05 00:23:47 +00:00
committed by Automerger Merge Worker

View File

@@ -418,25 +418,25 @@ class WindowStateAnimator {
if (!mDestroyPreservedSurfaceUponRedraw) {
return;
}
if (mSurfaceController != null) {
if (mPendingDestroySurface != null) {
// 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
// child layers need to be reparented to the new surface to make this
// transparent to the app.
if (mWin.mActivityRecord == null || mWin.mActivityRecord.isRelaunching() == false) {
mPostDrawTransaction.reparentChildren(
mPendingDestroySurface.getClientViewRootSurface(),
mSurfaceController.mSurfaceControl).apply();
}
}
// 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
// child layers need to be reparented to the new surface to make this
// transparent to the app.
// 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(
mPendingDestroySurface.getClientViewRootSurface(),
mSurfaceController.mSurfaceControl).apply();
}
destroyDeferredSurfaceLocked();
mDestroyPreservedSurfaceUponRedraw = false;
}
void markPreservedSurfaceForDestroy() {
private void markPreservedSurfaceForDestroy() {
if (mDestroyPreservedSurfaceUponRedraw
&& !mService.mDestroyPreservedSurface.contains(mWin)) {
mService.mDestroyPreservedSurface.add(mWin);
@@ -1363,9 +1363,13 @@ class WindowStateAnimator {
if (mPendingDestroySurface != null && mDestroyPreservedSurfaceUponRedraw) {
final SurfaceControl pendingSurfaceControl = mPendingDestroySurface.mSurfaceControl;
mPostDrawTransaction.reparent(pendingSurfaceControl, null);
mPostDrawTransaction.reparentChildren(
mPendingDestroySurface.getClientViewRootSurface(),
mSurfaceController.mSurfaceControl);
// 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(
mPendingDestroySurface.getClientViewRootSurface(),
mSurfaceController.mSurfaceControl);
}
}
SurfaceControl.mergeToGlobalTransaction(mPostDrawTransaction);
@@ -1593,6 +1597,12 @@ class WindowStateAnimator {
mSurfaceController.detachChildren();
}
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) {