Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9a793b07 authored by Chris Li's avatar Chris Li
Browse files

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
parent 8232386d
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -3297,11 +3297,22 @@ class Task extends WindowContainer<WindowContainer> {

    @Override
    boolean handlesOrientationChangeFromDescendant() {
        return super.handlesOrientationChangeFromDescendant()
        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.
                && canSpecifyOrientation()
                && getDisplayArea().canSpecifyOrientation();
        return canSpecifyOrientation() && getDisplayArea().canSpecifyOrientation();
    }

    void resize(boolean relayout, boolean forced) {
+20 −0
Original line number Diff line number Diff line
@@ -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());
    }
}