From 7b20e7f188aea56b532de79b1497c55285e85595 Mon Sep 17 00:00:00 2001 From: Kazuki Takise Date: Fri, 3 Jul 2020 12:41:49 +0900 Subject: [PATCH] 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 --- .../com/android/server/wm/DisplayContent.java | 8 ++++++-- .../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 9c330ec7963f5..7d8411b5c26ca 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 4466a66657ba5..19a10fc54212f 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; }