Update display windowing mode when development settings change
Display settings load windowingMode from display_settings.xml, but check
the enable_freeform_support before setting the windowingMode to
freeform. As a result, we need to update the windowingMode when
enable_freeform_support change.
Fixes: 151163592
Test: WindowManagerSettingsTests
Test: manual: with setting freeform in display_settings.xml, was able to
switch windowingMode by changing enable_freeform_support
Change-Id: I19a5bf61461926e88de94351d3ebe0fa8b96afb2
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index ecbbb03..757ba3a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -882,7 +882,13 @@
FEATURE_FREEFORM_WINDOW_MANAGEMENT) || Settings.Global.getInt(
resolver, DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0;
- mAtmService.mSupportsFreeformWindowManagement = freeformWindowManagement;
+ if (mAtmService.mSupportsFreeformWindowManagement != freeformWindowManagement) {
+ mAtmService.mSupportsFreeformWindowManagement = freeformWindowManagement;
+ synchronized (mGlobalLock) {
+ // Notify the root window container that the display settings value may change.
+ mRoot.onSettingsRetrieved();
+ }
+ }
}
void updateForceResizableTasks() {
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java
index ce6efdf..926bd8c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java
@@ -24,6 +24,9 @@
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
import android.content.ContentResolver;
import android.net.Uri;
@@ -60,11 +63,35 @@
public void testFreeformWindow() {
try (SettingsSession freeformWindowSession = new
SettingsSession(DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT)) {
- final boolean freeformWindow = !freeformWindowSession.getSetting();
- final Uri freeformWindowUri = freeformWindowSession.setSetting(freeformWindow);
+ final boolean curFreeformWindow = freeformWindowSession.getSetting();
+ final boolean newFreeformWindow = !curFreeformWindow;
+ final Uri freeformWindowUri = freeformWindowSession.setSetting(newFreeformWindow);
+ mWm.mAtmService.mSupportsFreeformWindowManagement = curFreeformWindow;
mWm.mSettingsObserver.onChange(false, freeformWindowUri);
- assertEquals(mWm.mAtmService.mSupportsFreeformWindowManagement, freeformWindow);
+ assertEquals(mWm.mAtmService.mSupportsFreeformWindowManagement, newFreeformWindow);
+ }
+ }
+
+ @Test
+ public void testFreeformWindow_valueChanged_updatesDisplaySettings() {
+ try (SettingsSession freeformWindowSession = new
+ SettingsSession(DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT)) {
+ final boolean curFreeformWindow = freeformWindowSession.getSetting();
+ final boolean newFreeformWindow = !curFreeformWindow;
+ final Uri freeformWindowUri = freeformWindowSession.setSetting(newFreeformWindow);
+ mWm.mAtmService.mSupportsFreeformWindowManagement = curFreeformWindow;
+ clearInvocations(mWm.mRoot);
+ mWm.mSettingsObserver.onChange(false, freeformWindowUri);
+
+ // Changed value should update display settings.
+ verify(mWm.mRoot).onSettingsRetrieved();
+
+ clearInvocations(mWm.mRoot);
+ mWm.mSettingsObserver.onChange(false, freeformWindowUri);
+
+ // Unchanged value should not update display settings.
+ verify(mWm.mRoot, never()).onSettingsRetrieved();
}
}
@@ -73,7 +100,8 @@
try (SettingsSession forceResizableSession = new
SettingsSession(DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES)) {
final boolean forceResizableMode = !forceResizableSession.getSetting();
- final Uri forceResizableUri = forceResizableSession.setSetting(forceResizableMode);
+ final Uri forceResizableUri = forceResizableSession.setSetting(forceResizableMode);
+
mWm.mSettingsObserver.onChange(false, forceResizableUri);
assertEquals(mWm.mAtmService.mForceResizableActivities, forceResizableMode);