From: Garfield Tan Date: Thu, 14 Mar 2019 21:50:59 +0000 (-0700) Subject: Update connected display config on settings load. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=b5910b4f8824696f6f6ddc2d08ee66ff27522ccd;p=android-x86%2Fframeworks-base.git 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 794a4b84dcaa..a1dbbab2036a 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 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { 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 4617890be722..db96847e802b 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 @@ class DisplayWindowSettings { 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 db7613ace705..8f4e8422581b 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 @@ class RootWindowContainer extends WindowContainer 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 2dad18708499..9a8a732a9da8 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 @@ public class DisplayWindowSettingsTests extends WindowTestsBase { } @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 45fe5d24adf5..35a8ec37c758 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_APPLICATION; 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 @@ public class RootWindowContainerTests extends WindowTestsBase { 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()); + } + } }