Update connected display config on settings load.
Bug: 128354502
Test: Manual test.
atest DisplayWindowSettingsTests
atest RootWindowContainerTests
Change-Id: I2b85735d4b27516f5cb69d34592ae856208df25e
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 794a4b8..a1dbbab 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -748,6 +748,7 @@
mWindowManager.setSupportsPictureInPicture(mSupportsPictureInPicture);
mWindowManager.setSupportsFreeformWindowManagement(mSupportsFreeformWindowManagement);
mWindowManager.setIsPc(isPc);
+ mWindowManager.mRoot.onSettingsRetrieved();
// This happens before any activities are started, so we can change global configuration
// in-place.
updateConfigurationLocked(configuration, null, true);
diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java
index 4617890..db96847 100644
--- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java
+++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java
@@ -352,6 +352,24 @@
dc.mDisplayScalingDisabled = entry.mForcedScalingMode == FORCE_SCALING_MODE_DISABLED;
}
+ /**
+ * 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.
+ *
+ * @param dc the given display.
+ * @return {@code true} if any settings for this display has changed; {@code false} if nothing
+ * changed.
+ */
+ boolean updateSettingsForDisplay(DisplayContent dc) {
+ if (dc.getWindowingMode() != getWindowingModeLocked(dc)) {
+ // For the time being the only thing that may change is windowing mode, so just update
+ // that.
+ dc.setWindowingMode(getWindowingModeLocked(dc));
+ return true;
+ }
+ return false;
+ }
+
private void readSettings() {
FileInputStream stream;
try {
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index db7613a..8f4e842 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -245,6 +245,34 @@
return dc;
}
+ /**
+ * Called when DisplayWindowSettings values may change.
+ */
+ void onSettingsRetrieved() {
+ final int numDisplays = mChildren.size();
+ for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
+ final DisplayContent displayContent = mChildren.get(displayNdx);
+ final boolean changed = mWmService.mDisplayWindowSettings.updateSettingsForDisplay(
+ displayContent);
+ if (!changed) {
+ continue;
+ }
+
+ displayContent.initializeDisplayOverrideConfiguration();
+ mWmService.reconfigureDisplayLocked(displayContent);
+
+ // We need to update global configuration as well if config of default display has
+ // changed. Do it inline because ATMS#retrieveSettings() will soon update the
+ // configuration inline, which will overwrite the new windowing mode.
+ if (displayContent.isDefaultDisplay) {
+ final Configuration newConfig = mWmService.computeNewConfiguration(
+ displayContent.getDisplayId());
+ mWmService.mAtmService.updateConfigurationLocked(newConfig, null /* starting */,
+ false /* initLocale */);
+ }
+ }
+ }
+
boolean isLayoutNeeded() {
final int numDisplays = mChildren.size();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
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 2dad187..9a8a732 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
@@ -148,6 +148,19 @@
}
@Test
+ public void testPrimaryDisplayUpdateToFreeform_HasFreeformSupport_IsPc() {
+ mTarget.applySettingsToDisplayLocked(mPrimaryDisplay);
+
+ mWm.setSupportsFreeformWindowManagement(true);
+ mWm.setIsPc(true);
+
+ mTarget.updateSettingsForDisplay(mPrimaryDisplay);
+
+ assertEquals(WindowConfiguration.WINDOWING_MODE_FREEFORM,
+ mPrimaryDisplay.getWindowingMode());
+ }
+
+ @Test
public void testSecondaryDisplayDefaultToFullscreen_NoFreeformSupport() {
mTarget.applySettingsToDisplayLocked(mSecondaryDisplay);
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index 45fe5d2..35a8ec3 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -20,9 +20,11 @@
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import android.app.WindowConfiguration;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
@@ -71,5 +73,21 @@
assertFalse(app.isVisible());
assertFalse(mWm.mRoot.isAnyNonToastWindowVisibleForUid(FAKE_CALLING_UID));
}
+
+ @Test
+ public void testUpdateDefaultDisplayWindowingModeOnSettingsRetrieved() {
+ synchronized (mWm.mGlobalLock) {
+ assertEquals(WindowConfiguration.WINDOWING_MODE_FULLSCREEN,
+ mWm.getDefaultDisplayContentLocked().getWindowingMode());
+
+ mWm.mIsPc = true;
+ mWm.mSupportsFreeformWindowManagement = true;
+
+ mWm.mRoot.onSettingsRetrieved();
+
+ assertEquals(WindowConfiguration.WINDOWING_MODE_FREEFORM,
+ mWm.getDefaultDisplayContentLocked().getWindowingMode());
+ }
+ }
}