diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 1b930259d642d..3d9d1f8985f58 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -8420,7 +8420,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A startFreezingScreenLocked(globalChanges); } forceNewConfig = false; - preserveWindow &= isResizeOnlyChange(changes); + // Do not preserve window if it is freezing screen because the original window won't be + // able to update drawn state that causes freeze timeout. + preserveWindow &= isResizeOnlyChange(changes) && !mFreezingScreen; final boolean hasResizeChange = hasResizeChange(changes & ~info.getRealConfigChanged()); if (hasResizeChange) { final boolean isDragResizing = task.isDragResizing(); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 3627ad1e313da..db5e3d0e8c93c 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3133,6 +3133,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mScreenRotationAnimation; } + /** If the display is in transition, there should be a screenshot covering it. */ + @Override + boolean inTransition() { + return mScreenRotationAnimation != null || super.inTransition(); + } + @Override public void dumpDebug(ProtoOutputStream proto, long fieldId, @WindowTraceLogLevel int logLevel) { diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index d440a14d61993..d1460f41cad68 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -729,7 +729,12 @@ class ScreenRotationAnimation { mScreenshotRotationAnimator = null; mRotateScreenAnimator = null; mService.mAnimator.mBulkUpdateParams |= WindowSurfacePlacer.SET_UPDATE_ROTATION; - kill(); + if (mDisplayContent.getRotationAnimation() == ScreenRotationAnimation.this) { + // It also invokes kill(). + mDisplayContent.setRotationAnimation(null); + } else { + kill(); + } mService.updateRotation(false, false); } } diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index cec4694629cf8..1b72826fba9b0 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -2014,6 +2014,8 @@ class TaskFragment extends WindowContainer { || mDisplayContent == null || mTaskFragmentOrganizer == null || getSurfaceControl() == null + // The change transition will be covered by display. + || mDisplayContent.inTransition() || !isVisible()) { return false; } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index b6c8e13bb74f2..aec7cab2a1ec9 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -987,6 +987,10 @@ class WindowContainer extends ConfigurationContainer< return mDisplayContent != null && mDisplayContent.mChangingContainers.contains(this); } + boolean inTransition() { + return mWmService.mAtmService.getTransitionController().inTransition(this); + } + void sendAppVisibilityToClients() { for (int i = mChildren.size() - 1; i >= 0; --i) { final WindowContainer wc = mChildren.get(i);