diff options
| author | 2020-07-03 12:41:49 +0900 | |
|---|---|---|
| committer | 2020-07-03 12:43:39 +0900 | |
| commit | 7b20e7f188aea56b532de79b1497c55285e85595 (patch) | |
| tree | 3f51043fc069c70171b6d144f7355516059be2b4 | |
| parent | fa6332bb98133caeb4e04de544091a7e41ebb599 (diff) | |
Atomically apply windowing mode and display windowing mode
We currently call super.setWindowingMode() and
super.setDisplayWindowingMode() in DisplayContent#setWindowingMode(),
and super.setWindowingMode() calls onConfigurationChanged, which
can end up triggerring rotation update logic.
As some code assumes windowing mode and display windowing mode
always match, they should be atomically updated.
The concrete problem we are facing is that windowing mode change for
the default dipslay triggers rotation incorrectly.
Bug: 159751214
Test: go/wm-smoke
Test: atest DisplayContentTests
Change-Id: Icca1673d8bf649f6cb17bceed8cd0d533d76fabd
| -rw-r--r-- | services/core/java/com/android/server/wm/DisplayContent.java | 8 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java | 18 |
2 files changed, 24 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 9c330ec7963f..7d8411b5c26c 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2295,8 +2295,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp @Override public void setWindowingMode(int windowingMode) { - super.setWindowingMode(windowingMode); - super.setDisplayWindowingMode(windowingMode); + // Intentionally call onRequestedOverrideConfigurationChanged() directly to change windowing + // mode and display windowing mode atomically. + mTmpConfiguration.setTo(getRequestedOverrideConfiguration()); + mTmpConfiguration.windowConfiguration.setWindowingMode(windowingMode); + mTmpConfiguration.windowConfiguration.setDisplayWindowingMode(windowingMode); + onRequestedOverrideConfigurationChanged(mTmpConfiguration); } @Override diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 4466a66657ba..19a10fc54212 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -1512,6 +1512,24 @@ public class DisplayContentTests extends WindowTestsBase { mDisplayContent.ensureActivitiesVisible(null, 0, false, false); } + @Test + public void testSetWindowingModeAtomicallyUpdatesWindoingModeAndDisplayWindowingMode() { + final DisplayContent dc = createNewDisplay(); + final ActivityStack stack = + new ActivityTestsBase.StackBuilder(mWm.mAtmService.mRootWindowContainer) + .setDisplay(dc) + .build(); + doAnswer(invocation -> { + Object[] args = invocation.getArguments(); + final Configuration config = ((Configuration) args[0]); + assertEquals(config.windowConfiguration.getWindowingMode(), + config.windowConfiguration.getDisplayWindowingMode()); + return null; + }).when(stack).onConfigurationChanged(any()); + dc.setWindowingMode(WINDOWING_MODE_FREEFORM); + dc.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + } + private boolean isOptionsPanelAtRight(int displayId) { return (mWm.getPreferredOptionsPanelGravity(displayId) & Gravity.RIGHT) == Gravity.RIGHT; } |