diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowContainer.java | 9 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java | 17 |
2 files changed, 25 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 191c3a117e85..bea733b0267e 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -1257,7 +1257,14 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< mOrientation = orientation; final WindowContainer parent = getParent(); if (parent != null) { - if (getConfiguration().orientation != getRequestedConfigurationOrientation()) { + if (getConfiguration().orientation != getRequestedConfigurationOrientation() + // Update configuration directly only if the change won't be dispatched from + // ancestor. This prevents from computing intermediate configuration when the + // parent also needs to be updated from the ancestor. E.g. the app requests + // portrait but the task is still in landscape. While updating from display, + // the task can be updated to portrait first so the configuration can be + // computed in a consistent environment. + && (inMultiWindowMode() || !handlesOrientationChangeFromDescendant())) { // Resolve the requested orientation. onConfigurationChanged(parent.getConfiguration()); } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java index 6919c4cf6a7c..00f3d8b874f7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; @@ -634,6 +635,22 @@ public class WindowContainerTests extends WindowTestsBase { } @Test + public void testSetOrientation() { + final TestWindowContainer root = spy(new TestWindowContainerBuilder(mWm).build()); + final TestWindowContainer child = spy(root.addChildWindow()); + doReturn(true).when(root).handlesOrientationChangeFromDescendant(); + child.getWindowConfiguration().setWindowingMode(WINDOWING_MODE_FULLSCREEN); + child.setOrientation(SCREEN_ORIENTATION_PORTRAIT); + // The ancestor should decide whether to dispatch the configuration change. + verify(child, never()).onConfigurationChanged(any()); + + doReturn(false).when(root).handlesOrientationChangeFromDescendant(); + child.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); + // The ancestor doesn't handle the request so the descendant applies the change directly. + verify(child).onConfigurationChanged(any()); + } + + @Test public void testCompareTo() { final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm); final TestWindowContainer root = builder.setLayer(0).build(); |