Merge "Defer rotation change while running display change transition" into tm-qpr-dev

This commit is contained in:
Riddle Hsu
2022-08-15 11:08:20 +00:00
committed by Android (Google) Code Review
5 changed files with 28 additions and 16 deletions

View File

@@ -399,9 +399,8 @@ public class DisplayRotation {
return false;
}
final ScreenRotationAnimation screenRotationAnimation =
mDisplayContent.getRotationAnimation();
if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
if (mDisplayContent.inTransition()
&& !mDisplayContent.mTransitionController.useShellTransitionsRotation()) {
// Rotation updates cannot be performed while the previous rotation change animation
// is still in progress. Skip this update. We will try updating again after the
// animation is finished and the display is unfrozen.

View File

@@ -622,9 +622,11 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
throw new IllegalStateException("Can't finish a non-playing transition " + mSyncId);
}
boolean hasParticipatedDisplay = false;
// Commit all going-invisible containers
for (int i = 0; i < mParticipants.size(); ++i) {
final ActivityRecord ar = mParticipants.valueAt(i).asActivityRecord();
final WindowContainer<?> participant = mParticipants.valueAt(i);
final ActivityRecord ar = participant.asActivityRecord();
if (ar != null) {
boolean visibleAtTransitionEnd = mVisibleAtTransitionEndTokens.contains(ar);
// We need both the expected visibility AND current requested-visibility to be
@@ -656,8 +658,13 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
// Legacy dispatch relies on this (for now).
ar.mEnteringAnimation = visibleAtTransitionEnd;
}
continue;
}
final WallpaperWindowToken wt = mParticipants.valueAt(i).asWallpaperToken();
if (participant.asDisplayContent() != null) {
hasParticipatedDisplay = true;
continue;
}
final WallpaperWindowToken wt = participant.asWallpaperToken();
if (wt != null) {
final boolean visibleAtTransitionEnd = mVisibleAtTransitionEndTokens.contains(wt);
if (!visibleAtTransitionEnd && !wt.isVisibleRequested()) {
@@ -737,6 +744,12 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
mState = STATE_FINISHED;
mController.mTransitionTracer.logState(this);
// Rotation change may be deferred while there is a display change transition, so check
// again in case there is a new pending change.
if (hasParticipatedDisplay && !mController.useShellTransitionsRotation()) {
mController.mAtm.mWindowManager.updateRotation(false /* alwaysSendConfiguration */,
false /* forceRelayout */);
}
}
void abort() {

View File

@@ -4290,7 +4290,9 @@ public class WindowManagerService extends IWindowManager.Stub
// Even if alwaysSend, we are waiting for a transition or remote to provide
// updated configuration, so we can't update configuration yet.
if (!pendingRemoteDisplayChange) {
if (!rotationChanged || forceRelayout) {
// The layout-needed flag will be set if there is a rotation change, so
// only set it if the caller requests to force relayout.
if (forceRelayout) {
displayContent.setLayoutNeeded();
layoutNeeded = true;
}

View File

@@ -2466,6 +2466,7 @@ public class ActivityRecordTests extends WindowTestsBase {
activity.addWindow(appWindow);
spyOn(appWindow);
doNothing().when(appWindow).onStartFreezingScreen();
doNothing().when(mWm).startFreezingDisplay(anyInt(), anyInt(), any(), anyInt());
// Set initial orientation and update.
performRotation(displayRotation, Surface.ROTATION_90);
@@ -2474,8 +2475,6 @@ public class ActivityRecordTests extends WindowTestsBase {
// Update the rotation to perform 180 degree rotation and check that resize was reported.
performRotation(displayRotation, Surface.ROTATION_270);
assertTrue(appWindow.mResizeReported);
appWindow.removeImmediately();
}
private void performRotation(DisplayRotation spiedRotation, int rotationToReport) {

View File

@@ -1820,19 +1820,18 @@ public class DisplayContentTests extends WindowTestsBase {
@Test
public void testRemoteRotation() {
DisplayContent dc = createNewDisplay();
final DisplayContent dc = mDisplayContent;
final DisplayRotation dr = dc.getDisplayRotation();
doCallRealMethod().when(dr).updateRotationUnchecked(anyBoolean());
spyOn(dr);
// Rotate 180 degree so the display doesn't have configuration change. This condition is
// used for the later verification of stop-freezing (without setting mWaitingForConfig).
doReturn((dr.getRotation() + 2) % 4).when(dr).rotationForOrientation(anyInt(), anyInt());
final boolean[] continued = new boolean[1];
doAnswer(
invocation -> {
continued[0] = true;
return true;
}).when(dc).updateDisplayOverrideConfigurationLocked();
doAnswer(invocation -> {
continued[0] = true;
mAtm.addWindowLayoutReasons(ActivityTaskManagerService.LAYOUT_REASON_CONFIG_CHANGED);
return true;
}).when(dc).updateDisplayOverrideConfigurationLocked();
final boolean[] called = new boolean[1];
mWm.mDisplayChangeController =
new IDisplayChangeWindowController.Stub() {