diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/Task.java | 21 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/TaskTests.java | 20 |
2 files changed, 36 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 80173b5942e6..3f6f55723e22 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3297,11 +3297,22 @@ class Task extends WindowContainer<WindowContainer> { @Override boolean handlesOrientationChangeFromDescendant() { - return super.handlesOrientationChangeFromDescendant() - // Display won't rotate for the orientation request if the Task/TaskDisplayArea - // can't specify orientation. - && canSpecifyOrientation() - && getDisplayArea().canSpecifyOrientation(); + if (!super.handlesOrientationChangeFromDescendant()) { + return false; + } + + // At task level, we want to check canSpecifyOrientation() based on the top activity type. + // Do this only on leaf Task, so that the result is not affecting by the sibling leaf Task. + // Otherwise, root Task will use the result from the top leaf Task, and all its child + // leaf Tasks will rely on that from super.handlesOrientationChangeFromDescendant(). + if (!isLeafTask()) { + return true; + } + + // Check for leaf Task. + // Display won't rotate for the orientation request if the Task/TaskDisplayArea + // can't specify orientation. + return canSpecifyOrientation() && getDisplayArea().canSpecifyOrientation(); } void resize(boolean relayout, boolean forced) { diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index c3eb5c49cea0..ecb8b607a106 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -16,8 +16,11 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; +import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; @@ -257,4 +260,21 @@ public class TaskTests extends WindowTestsBase { task.resolveOverrideConfiguration(parentConfig); assertThat(resolvedOverride.getWindowingMode()).isEqualTo(WINDOWING_MODE_UNDEFINED); } + + @Test + public void testHandlesOrientationChangeFromDescendant() { + final Task rootTask = createTaskStackOnDisplay(WINDOWING_MODE_MULTI_WINDOW, + ACTIVITY_TYPE_STANDARD, mDisplayContent); + final Task leafTask1 = createTaskInStack(rootTask, 0 /* userId */); + final Task leafTask2 = createTaskInStack(rootTask, 0 /* userId */); + leafTask1.getWindowConfiguration().setActivityType(ACTIVITY_TYPE_HOME); + leafTask2.getWindowConfiguration().setActivityType(ACTIVITY_TYPE_STANDARD); + + assertEquals(leafTask2, rootTask.getTopChild()); + assertTrue(rootTask.handlesOrientationChangeFromDescendant()); + // Treat orientation request from home as handled. + assertTrue(leafTask1.handlesOrientationChangeFromDescendant()); + // Orientation request from standard activity in multi window will not be handled. + assertFalse(leafTask2.handlesOrientationChangeFromDescendant()); + } } |