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
This commit is contained in:
Riddle Hsu
2023-07-21 14:33:46 +00:00
parent 39759a9ed1
commit 9f858de2d0
3 changed files with 33 additions and 1 deletions

View File

@@ -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();
}
}

View File

@@ -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)
*/

View File

@@ -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();