From 9f858de2d07feed4fec3f4fba35a413c423f6813 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Fri, 21 Jul 2023 14:33:46 +0000 Subject: Do not skip finishing async rotation by a non-rotation transition Otherwise when completing a fixed rotation without display rotation change but there is a display size change transition, the animation of async rotation won't be stopped. Which may lead to some bars window invisible because it expected there will be a rotation change to trigger it to fade-in the bars but the display didn't rotate. Bug: 275566237 Test: atest ShowImeWhileEnteringOverviewTest TransitionTests#testFinishRotationControllerWithFixedRotation Change-Id: I73da710fbb4fa1d6c20a9aed6da80c3d9009230e --- .../java/com/android/server/wm/DisplayContent.java | 2 +- .../com/android/server/wm/TransitionController.java | 11 +++++++++++ .../src/com/android/server/wm/TransitionTests.java | 21 +++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index cb7414e2e86e..346d9c695fb6 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1935,7 +1935,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } else if (mFixedRotationLaunchingApp != null && r == null) { mWmService.mDisplayNotificationController.dispatchFixedRotationFinished(this); // Keep async rotation controller if the next transition of display is requested. - if (!mTransitionController.isCollecting(this)) { + if (!mTransitionController.hasCollectingRotationChange(this, getRotation())) { finishAsyncRotationIfPossible(); } } diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index 79cb61be5948..76b09c81e18c 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -561,6 +561,17 @@ class TransitionController { return mCollectingTransition != null ? mCollectingTransition.mType : TRANSIT_NONE; } + /** + * Returns {@code true} if the window container is in the collecting transition, and its + * collected rotation is different from the target rotation. + */ + boolean hasCollectingRotationChange(@NonNull WindowContainer wc, int targetRotation) { + final Transition transition = mCollectingTransition; + if (transition == null || !transition.mParticipants.contains(wc)) return false; + final Transition.ChangeInfo changeInfo = transition.mChanges.get(wc); + return changeInfo != null && changeInfo.mRotation != targetRotation; + } + /** * @see #requestTransitionIfNeeded(int, int, WindowContainer, WindowContainer, RemoteTransition) */ diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java index ed0c8ef489e5..0b32bc5d38b3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -1238,6 +1238,27 @@ public class TransitionTests extends WindowTestsBase { assertEquals(freeze, controller.shouldFreezeInsetsPosition(w)); } + @Test + public void testFinishRotationControllerWithFixedRotation() { + final ActivityRecord app = new ActivityBuilder(mAtm).setCreateTask(true).build(); + mDisplayContent.setFixedRotationLaunchingAppUnchecked(app); + registerTestTransitionPlayer(); + mDisplayContent.setLastHasContent(); + mDisplayContent.requestChangeTransitionIfNeeded(1 /* changes */, null /* displayChange */); + assertNotNull(mDisplayContent.getAsyncRotationController()); + mDisplayContent.setFixedRotationLaunchingAppUnchecked(null); + assertNull("Clear rotation controller if rotation is not changed", + mDisplayContent.getAsyncRotationController()); + + mDisplayContent.setFixedRotationLaunchingAppUnchecked(app); + assertNotNull(mDisplayContent.getAsyncRotationController()); + mDisplayContent.getDisplayRotation().setRotation( + mDisplayContent.getWindowConfiguration().getRotation() + 1); + mDisplayContent.setFixedRotationLaunchingAppUnchecked(null); + assertNotNull("Keep rotation controller if rotation will be changed", + mDisplayContent.getAsyncRotationController()); + } + @Test public void testDeferRotationForTransientLaunch() { final TestTransitionPlayer player = registerTestTransitionPlayer(); -- cgit v1.2.3-59-g8ed1b