Don't recompute display mode during a mode switch

When an app requests a display mode change, it's plausible that the next
thing to happen is going to be a configuration change.

During the configuration change, multiple windows that contributed to
the selection of the display mode will no longer be displayed. This can
lead to a device bouncing between two display modes for a while.

We need to wait for windows to redraw and for the screen to unfreeze
again before we next call DisplayManagerService.setDisplayProperties.

Test: atest android.display.cts.DisplayTest
Bug: 158316271
Change-Id: I58e4626e74a911a14cbcd426d1f09ef68303dafa
This commit is contained in:
Robin Lee
2021-01-20 00:20:47 +01:00
parent 7ee87037f5
commit f18a9641e6

View File

@@ -4185,12 +4185,14 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mInsetsStateController.getImeSourceProvider().checkShowImePostLayout();
mLastHasContent = mTmpApplySurfaceChangesTransactionState.displayHasContent;
mWmService.mDisplayManagerInternal.setDisplayProperties(mDisplayId,
mLastHasContent,
mTmpApplySurfaceChangesTransactionState.preferredRefreshRate,
mTmpApplySurfaceChangesTransactionState.preferredModeId,
mTmpApplySurfaceChangesTransactionState.preferMinimalPostProcessing,
true /* inTraversal, must call performTraversalInTrans... below */);
if (!mWmService.mDisplayFrozen) {
mWmService.mDisplayManagerInternal.setDisplayProperties(mDisplayId,
mLastHasContent,
mTmpApplySurfaceChangesTransactionState.preferredRefreshRate,
mTmpApplySurfaceChangesTransactionState.preferredModeId,
mTmpApplySurfaceChangesTransactionState.preferMinimalPostProcessing,
true /* inTraversal, must call performTraversalInTrans... below */);
}
final boolean wallpaperVisible = mWallpaperController.isWallpaperVisible();
if (wallpaperVisible != mLastWallpaperVisible) {