summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java9
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java17
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();