From cbe763308a64352ab55f1cbbe85eee96fbab1c47 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Tue, 31 Aug 2021 21:34:53 +0800 Subject: [PATCH] Skip resize changing transition if display is rotating Though the bounds change transactions are not updated synchronously with display rotation, the rotation animation will wait until visible windows are drawn with new configuration. So even if the bounds change for task fragment are sent after receiving onTaskFragmentParentInfoChanged due to rotation change, it can still be covered by rotation animation. Bug: 197983252 Test: Launch split embedded activities and rotated device. Change-Id: I4517eac3ba221b45a20b7d7bd5f05c4def33e8c4 --- .../core/java/com/android/server/wm/ActivityRecord.java | 4 +++- .../core/java/com/android/server/wm/DisplayContent.java | 6 ++++++ .../com/android/server/wm/ScreenRotationAnimation.java | 7 ++++++- services/core/java/com/android/server/wm/TaskFragment.java | 2 ++ .../core/java/com/android/server/wm/WindowContainer.java | 4 ++++ 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 67043dbab6a38..9a56f318f5a23 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -8411,7 +8411,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 62a6f39a45025..a159aa608b75e 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3139,6 +3139,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 242693b758fb2..5fdc580b5432b 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);