From e59d85ae82eaf8a558e3f974954545e663bc439a Mon Sep 17 00:00:00 2001 From: Nick Chameyev Date: Thu, 9 Dec 2021 19:00:18 +0000 Subject: [PATCH] Update display size before updating 'ignore orientation request' When folding/unfolding a foldable device 'ignore orientation request' flag might be updated in DisplayContent because different displays might have different properties. This might result into updated display rotation. This flag is updated in 'applySettingsToDisplayLocked' and the new rotation might be applied in the same method. But DisplayRotation is not updated with the new display size when applySettingsToDisplayLocked is invoked. This caused calculation of incorrect rotation (using old display dimensions). Fixed by updating display rotation settings only after updating the size of the display. Fixes: 203844967 Test: open portrait only app on the unfolded screen, fold the device => app is still in portrait orientation Test: open rotatable app on the unfolded screen, fold the device => app is in portrait orientation Test: rotate screen on inner/outer screen of a foldable device Change-Id: Ie408ebe7e5913b4a1f97d46581d693e56efaf46c --- .../com/android/server/wm/DisplayContent.java | 26 +++++++------------ .../android/server/wm/DisplayRotation.java | 2 +- .../server/wm/DisplayWindowSettings.java | 13 +++++++--- .../server/wm/DisplayPolicyTestsBase.java | 9 +------ .../server/wm/DisplayRotationTests.java | 6 ++--- 5 files changed, 23 insertions(+), 33 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 44d36237b5553..fc0db0811448a 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1995,23 +1995,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } void configureDisplayPolicy() { - final int width = mBaseDisplayWidth; - final int height = mBaseDisplayHeight; - final int shortSize; - final int longSize; - if (width > height) { - shortSize = height; - longSize = width; - } else { - shortSize = width; - longSize = height; - } - - final int shortSizeDp = shortSize * DENSITY_DEFAULT / mBaseDisplayDensity; - final int longSizeDp = longSize * DENSITY_DEFAULT / mBaseDisplayDensity; - mDisplayPolicy.updateConfigurationAndScreenSizeDependentBehaviors(); - mDisplayRotation.configure(width, height, shortSizeDp, longSizeDp); + mDisplayRotation.configure(mBaseDisplayWidth, mBaseDisplayHeight); } /** @@ -2794,6 +2779,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mIsSizeForced ? mBaseDisplayHeight : newHeight, mIsDensityForced ? mBaseDisplayDensity : newDensity); + configureDisplayPolicy(); + + if (physicalDisplayChanged) { + // Reapply the rotation window settings, we are doing this after updating + // the screen size and configuring display policy as the rotation depends + // on the display size + mWmService.mDisplayWindowSettings.applyRotationSettingsToDisplayLocked(this); + } + // Real display metrics changed, so we should also update initial values. mInitialDisplayWidth = newWidth; mInitialDisplayHeight = newHeight; diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index 4684cb18ebfbf..3d9cca1d805a9 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -293,7 +293,7 @@ public class DisplayRotation { currentUserRes.getBoolean(R.bool.config_allowSeamlessRotationDespiteNavBarMoving); } - void configure(int width, int height, int shortSizeDp, int longSizeDp) { + void configure(int width, int height) { final Resources res = mContext.getResources(); if (width > height) { mLandscapeRotation = Surface.ROTATION_0; diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java index 6d5abe1e2f31d..8260fd6c09f44 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java +++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java @@ -265,10 +265,6 @@ class DisplayWindowSettings { dc.mIsDensityForced = hasDensityOverride; dc.mIsSizeForced = hasSizeOverride; - final boolean ignoreOrientationRequest = settings.mIgnoreOrientationRequest != null - ? settings.mIgnoreOrientationRequest : false; - dc.setIgnoreOrientationRequest(ignoreOrientationRequest); - final boolean ignoreDisplayCutout = settings.mIgnoreDisplayCutout != null ? settings.mIgnoreDisplayCutout : false; dc.mIgnoreDisplayCutout = ignoreDisplayCutout; @@ -288,6 +284,15 @@ class DisplayWindowSettings { dc.mDontMoveToTop = dontMoveToTop; } + void applyRotationSettingsToDisplayLocked(DisplayContent dc) { + final DisplayInfo displayInfo = dc.getDisplayInfo(); + final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); + + final boolean ignoreOrientationRequest = settings.mIgnoreOrientationRequest != null + ? settings.mIgnoreOrientationRequest : false; + dc.setIgnoreOrientationRequest(ignoreOrientationRequest); + } + /** * Updates settings for the given display after system features are loaded into window manager * service, e.g. if this device is PC and if this device supports freeform. diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java index f5b361cff16d7..97b1c91d156a7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java @@ -16,7 +16,6 @@ package com.android.server.wm; -import static android.util.DisplayMetrics.DENSITY_DEFAULT; import static android.view.DisplayCutout.BOUNDS_POSITION_BOTTOM; import static android.view.DisplayCutout.BOUNDS_POSITION_LEFT; import static android.view.DisplayCutout.BOUNDS_POSITION_RIGHT; @@ -56,7 +55,6 @@ public class DisplayPolicyTestsBase extends WindowTestsBase { static final int DISPLAY_WIDTH = 500; static final int DISPLAY_HEIGHT = 1000; - static final int DISPLAY_DENSITY = 320; static final int DISPLAY_CUTOUT_HEIGHT = 8; static final int IME_HEIGHT = 415; @@ -85,12 +83,7 @@ public class DisplayPolicyTestsBase extends WindowTestsBase { doReturn(true).when(mDisplayPolicy).hasNavigationBar(); doReturn(true).when(mDisplayPolicy).hasStatusBar(); - final int shortSizeDp = - Math.min(DISPLAY_WIDTH, DISPLAY_HEIGHT) * DENSITY_DEFAULT / DISPLAY_DENSITY; - final int longSizeDp = - Math.min(DISPLAY_WIDTH, DISPLAY_HEIGHT) * DENSITY_DEFAULT / DISPLAY_DENSITY; - mDisplayContent.getDisplayRotation().configure( - DISPLAY_WIDTH, DISPLAY_HEIGHT, shortSizeDp, longSizeDp); + mDisplayContent.getDisplayRotation().configure(DISPLAY_WIDTH, DISPLAY_HEIGHT); mDisplayPolicy.onConfigurationChanged(); addWindow(mStatusBarWindow); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java index e1aca55762d61..6342183ea28e0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java @@ -681,7 +681,7 @@ public class DisplayRotationTests { } /** - * Call {@link DisplayRotation#configure(int, int, int, int)} to configure {@link #mTarget} + * Call {@link DisplayRotation#configure(int, int)} to configure {@link #mTarget} * according to given parameters. */ private void configureDisplayRotation(int displayOrientation, boolean isCar, boolean isTv) { @@ -709,9 +709,7 @@ public class DisplayRotationTests { when(mockPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)) .thenReturn(isTv); - final int shortSizeDp = (isCar || isTv) ? 540 : 720; - final int longSizeDp = 960; - mTarget.configure(width, height, shortSizeDp, longSizeDp); + mTarget.configure(width, height); } private void freezeRotation(int rotation) {