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);