From df0b33a2b51cb76e87aa4594b311eb3cb9c41631 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Thu, 12 Mar 2020 17:53:50 -0700 Subject: [PATCH] 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 --- .../server/wm/WindowManagerService.java | 8 ++++- .../server/wm/WindowManagerSettingsTests.java | 36 ++++++++++++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ecbbb03a7c94f..757ba3aa0579c 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 @@ public class WindowManagerService extends IWindowManager.Stub 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 ce6efdfbffc60..926bd8c9846a7 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 android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIV 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 class WindowManagerSettingsTests extends WindowTestsBase { 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 @@ public class WindowManagerSettingsTests extends WindowTestsBase { 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);