Reconfigure displays on ready to apply DisplayWindowSettings
For secondary displays, we apply display settings in RWC#createDisplayContent()
in RAC#setWindowManager() but WMS#reconfigureDisplayLocked() may not take effect since
display was not ready then and reconfigure call will be a no-op.
This CL will reconfigure all displays in WMS#displayReady().
Fixes: 131909551
Test: atest WmTests:DisplayWindowSettingsTests#testDisplayWindowSettingsAppliedOnDisplayReady
Test: manual: 1. adb pull data/system/display_settings.xml
2. add forcedDensity="XXX" in the row which display
name="local:1"
3. adb push display_settings.xml data/system
4. adb reboot
5. Verify if nav bar applies the density change
Change-Id: I21172fbe590da499c633b54bfe53f6e92adb7ee8
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 45c7e69..9d8b04e 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -4405,12 +4405,12 @@
if (mMaxUiWidth > 0) {
mRoot.forAllDisplays(displayContent -> displayContent.setMaxUiWidth(mMaxUiWidth));
}
- final boolean changed = applyForcedPropertiesForDefaultDisplay();
+ applyForcedPropertiesForDefaultDisplay();
mAnimator.ready();
mDisplayReady = true;
- if (changed) {
- reconfigureDisplayLocked(getDefaultDisplayContentLocked());
- }
+ // Reconfigure all displays to make sure that forced properties and
+ // DisplayWindowSettings are applied.
+ mRoot.forAllDisplays(this::reconfigureDisplayLocked);
mIsTouchDevice = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TOUCHSCREEN);
}
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 336fa04..2bffc16 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
@@ -23,6 +23,7 @@
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.atLeastOnce;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
@@ -41,6 +42,7 @@
import static org.mockito.Matchers.eq;
import android.app.WindowConfiguration;
+import android.content.res.Configuration;
import android.platform.test.annotations.Presubmit;
import android.util.Xml;
import android.view.Display;
@@ -606,6 +608,35 @@
}
}
+ @Test
+ public void testDisplayWindowSettingsAppliedOnDisplayReady() {
+ // Set forced densities for two displays in DisplayWindowSettings
+ final DisplayContent dc = createMockSimulatedDisplay();
+ final DisplayWindowSettings settings = new DisplayWindowSettings(mWm, mStorage);
+ settings.setForcedDensity(mPrimaryDisplay, 123, 0 /* userId */);
+ settings.setForcedDensity(dc, 456, 0 /* userId */);
+
+ // Apply settings to displays - the settings will be stored, but config will not be
+ // recalculated immediately.
+ settings.applySettingsToDisplayLocked(mPrimaryDisplay);
+ settings.applySettingsToDisplayLocked(dc);
+ assertFalse(mPrimaryDisplay.mWaitingForConfig);
+ assertFalse(dc.mWaitingForConfig);
+
+ // Notify WM that the displays are ready and check that they are reconfigured.
+ spyOn(mWm);
+ mWm.displayReady();
+ waitUntilHandlersIdle();
+ verify(mWm, atLeastOnce()).reconfigureDisplayLocked(eq(mPrimaryDisplay));
+ verify(mWm, atLeastOnce()).reconfigureDisplayLocked(eq(dc));
+
+ final Configuration config = new Configuration();
+ mPrimaryDisplay.computeScreenConfiguration(config);
+ assertEquals(123, config.densityDpi);
+ dc.computeScreenConfiguration(config);
+ assertEquals(456, config.densityDpi);
+ }
+
/**
* Prepares display settings and stores in {@link #mStorage}. Uses provided display identifier
* and stores windowingMode=WINDOWING_MODE_PINNED.