Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9f858de2 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

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
parent 39759a9e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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();
            }
        }
+11 −0
Original line number Diff line number Diff line
@@ -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)
     */
+21 −0
Original line number Diff line number Diff line
@@ -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();