summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kazuki Takise <takise@google.com> 2020-07-03 12:41:49 +0900
committer Kazuki Takise <takise@google.com> 2020-07-03 12:43:39 +0900
commit7b20e7f188aea56b532de79b1497c55285e85595 (patch)
tree3f51043fc069c70171b6d144f7355516059be2b4
parentfa6332bb98133caeb4e04de544091a7e41ebb599 (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.java8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java18
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;
}