diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 55f463dba2f71..aec2686c20d80 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2783,7 +2783,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (displayMetricsChanged || physicalDisplayChanged) { if (physicalDisplayChanged) { // Reapply the window settings as the underlying physical display has changed. - mWmService.mDisplayWindowSettings.applySettingsToDisplayLocked(this); + // Do not include rotation settings here, postpone them until the display + // metrics are updated as rotation settings might depend on them + mWmService.mDisplayWindowSettings.applySettingsToDisplayLocked(this, + /* includeRotationSettings */ false); } // If there is an override set for base values - use it, otherwise use new values. diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java index 8260fd6c09f44..483c799c5afa6 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java +++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java @@ -244,6 +244,10 @@ class DisplayWindowSettings { } void applySettingsToDisplayLocked(DisplayContent dc) { + applySettingsToDisplayLocked(dc, /* includeRotationSettings */ true); + } + + void applySettingsToDisplayLocked(DisplayContent dc, boolean includeRotationSettings) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); @@ -282,6 +286,8 @@ class DisplayWindowSettings { boolean dontMoveToTop = settings.mDontMoveToTop != null ? settings.mDontMoveToTop : false; dc.mDontMoveToTop = dontMoveToTop; + + if (includeRotationSettings) applyRotationSettingsToDisplayLocked(dc); } void applyRotationSettingsToDisplayLocked(DisplayContent dc) { diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java index 9e4cd161c4780..365e749df79fe 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java @@ -51,6 +51,7 @@ import androidx.test.filters.SmallTest; import com.android.server.LocalServices; import com.android.server.policy.WindowManagerPolicy; +import com.android.server.wm.DisplayWindowSettings.SettingsProvider.SettingsEntry; import org.junit.Before; import org.junit.Test; @@ -447,6 +448,21 @@ public class DisplayWindowSettingsTests extends WindowTestsBase { assertEquals(456, config.densityDpi); } + @Test + public void testDisplayRotationSettingsAppliedOnCreation() { + // Create new displays with different rotation settings + final SettingsEntry settingsEntry1 = new SettingsEntry(); + settingsEntry1.mIgnoreOrientationRequest = false; + final DisplayContent dcDontIgnoreOrientation = createMockSimulatedDisplay(settingsEntry1); + final SettingsEntry settingsEntry2 = new SettingsEntry(); + settingsEntry2.mIgnoreOrientationRequest = true; + final DisplayContent dcIgnoreOrientation = createMockSimulatedDisplay(settingsEntry2); + + // Verify that newly created displays are created with correct rotation settings + assertFalse(dcDontIgnoreOrientation.getIgnoreOrientationRequest()); + assertTrue(dcIgnoreOrientation.getIgnoreOrientationRequest()); + } + public final class TestSettingsProvider implements DisplayWindowSettings.SettingsProvider { Map mOverrideSettingsCache = new HashMap<>(); diff --git a/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java b/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java index 3065e7dab2967..8b0716c699adf 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java @@ -30,6 +30,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static org.mockito.ArgumentMatchers.any; +import android.annotation.Nullable; import android.content.res.Configuration; import android.graphics.Insets; import android.graphics.Rect; @@ -38,6 +39,8 @@ import android.view.Display; import android.view.DisplayCutout; import android.view.DisplayInfo; +import com.android.server.wm.DisplayWindowSettings.SettingsProvider.SettingsEntry; + class TestDisplayContent extends DisplayContent { public static final int DEFAULT_LOGICAL_DISPLAY_DENSITY = 300; @@ -81,6 +84,7 @@ class TestDisplayContent extends DisplayContent { protected final ActivityTaskManagerService mService; private boolean mSystemDecorations = false; private int mStatusBarHeight = 0; + private SettingsEntry mOverrideSettings; Builder(ActivityTaskManagerService service, int width, int height) { mService = service; @@ -104,6 +108,10 @@ class TestDisplayContent extends DisplayContent { private String generateUniqueId() { return "TEST_DISPLAY_CONTENT_" + System.currentTimeMillis(); } + Builder setOverrideSettings(@Nullable SettingsEntry overrideSettings) { + mOverrideSettings = overrideSettings; + return this; + } Builder setSystemDecorations(boolean yes) { mSystemDecorations = yes; return this; @@ -151,6 +159,11 @@ class TestDisplayContent extends DisplayContent { TestDisplayContent build() { SystemServicesTestRule.checkHoldsLock(mService.mGlobalLock); + if (mOverrideSettings != null) { + mService.mWindowManager.mDisplayWindowSettingsProvider + .updateOverrideSettings(mInfo, mOverrideSettings); + } + final int displayId = SystemServicesTestRule.sNextDisplayId++; final Display display = new Display(DisplayManagerGlobal.getInstance(), displayId, mInfo, DEFAULT_DISPLAY_ADJUSTMENTS); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 34038c57eafce..59a2068e7b115 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -106,6 +106,7 @@ import android.window.TransitionRequestInfo; import com.android.internal.policy.AttributeCache; import com.android.internal.util.ArrayUtils; +import com.android.server.wm.DisplayWindowSettings.SettingsProvider.SettingsEntry; import org.junit.After; import org.junit.Before; @@ -720,18 +721,21 @@ class WindowTestsBase extends SystemServiceTestsBase { /** Creates a {@link DisplayContent} and adds it to the system. */ private DisplayContent createNewDisplayWithImeSupport(@DisplayImePolicy int imePolicy) { - return createNewDisplay(mDisplayInfo, imePolicy); + return createNewDisplay(mDisplayInfo, imePolicy, /* overrideSettings */ null); } /** Creates a {@link DisplayContent} that supports IME and adds it to the system. */ DisplayContent createNewDisplay(DisplayInfo info) { - return createNewDisplay(info, DISPLAY_IME_POLICY_LOCAL); + return createNewDisplay(info, DISPLAY_IME_POLICY_LOCAL, /* overrideSettings */ null); } /** Creates a {@link DisplayContent} and adds it to the system. */ - private DisplayContent createNewDisplay(DisplayInfo info, @DisplayImePolicy int imePolicy) { + private DisplayContent createNewDisplay(DisplayInfo info, @DisplayImePolicy int imePolicy, + @Nullable SettingsEntry overrideSettings) { final DisplayContent display = - new TestDisplayContent.Builder(mAtm, info).build(); + new TestDisplayContent.Builder(mAtm, info) + .setOverrideSettings(overrideSettings) + .build(); final DisplayContent dc = display.mDisplayContent; // this display can show IME. dc.mWmService.mDisplayWindowSettings.setDisplayImePolicy(dc, imePolicy); @@ -749,7 +753,7 @@ class WindowTestsBase extends SystemServiceTestsBase { DisplayInfo displayInfo = new DisplayInfo(); displayInfo.copyFrom(mDisplayInfo); displayInfo.state = displayState; - return createNewDisplay(displayInfo, DISPLAY_IME_POLICY_LOCAL); + return createNewDisplay(displayInfo, DISPLAY_IME_POLICY_LOCAL, /* overrideSettings */ null); } /** Creates a {@link TestWindowState} */ @@ -761,11 +765,15 @@ class WindowTestsBase extends SystemServiceTestsBase { /** Creates a {@link DisplayContent} as parts of simulate display info for test. */ DisplayContent createMockSimulatedDisplay() { + return createMockSimulatedDisplay(/* overrideSettings */ null); + } + + DisplayContent createMockSimulatedDisplay(@Nullable SettingsEntry overrideSettings) { DisplayInfo displayInfo = new DisplayInfo(); displayInfo.copyFrom(mDisplayInfo); displayInfo.type = Display.TYPE_VIRTUAL; displayInfo.ownerUid = SYSTEM_UID; - return createNewDisplay(displayInfo, DISPLAY_IME_POLICY_FALLBACK_DISPLAY); + return createNewDisplay(displayInfo, DISPLAY_IME_POLICY_FALLBACK_DISPLAY, overrideSettings); } IDisplayWindowInsetsController createDisplayWindowInsetsController() {