Only check canSpecifyOrientation at leaf Task

Before, we check if the task can specify orientation to determine if the
task should be letterboxed for orientatoin request, with which we are
using the activity type of the top leaf Task for its sibling Task.

Now, we only check for leaf Task, so that we won't letterbox HOME task
even if it is not the top most.

Bug: 179362640
Test: atest WmTests:TaskTests
Test: manually with split screen
Change-Id: I92e1c1e8c33bf6877ff3aeec94dc8ab1a3ba0c3e
This commit is contained in:
Chris Li
2021-03-03 20:34:09 -08:00
parent 8232386d0b
commit 9a793b07b7
2 changed files with 36 additions and 5 deletions

View File

@@ -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) {

View File

@@ -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());
}
}