From 876e779427eeeb906368d489579e8c0d53293bce Mon Sep 17 00:00:00 2001 From: Nick Chameyev Date: Thu, 13 Jan 2022 13:11:33 +0000 Subject: [PATCH] Load rotation settings when creating a display In ag/16433357 applyRotationSettingsToDisplayLocked was extracted from applySettingsToDisplayLocked method. This was done to load rotation settings only after updating the display size. After separating this method we didn't call the second method in all places where we called the original one. Added a flag that controls loading rotation settings which is 'true' by default to fix loading of these settings on the first boot. Fixes: 212200866 Test: atest WmTests:DisplayWindowSettingsTests Test: open portrait only app on a display with 'ignore orientation request = true' after booting Change-Id: Id248393dc389b54c140a83d3a0bb93fef1a200ed --- .../com/android/server/wm/DisplayContent.java | 5 ++++- .../server/wm/DisplayWindowSettings.java | 6 ++++++ .../server/wm/DisplayWindowSettingsTests.java | 16 +++++++++++++++ .../android/server/wm/TestDisplayContent.java | 13 ++++++++++++ .../android/server/wm/WindowTestsBase.java | 20 +++++++++++++------ 5 files changed, 53 insertions(+), 7 deletions(-) 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() {