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

Commit 2ee01372 authored by Mateusz Cicheński's avatar Mateusz Cicheński
Browse files

Use the task windowing mode to determine inheritance

This matters in very unique scenario:
- activity A1 is launched in Task T1 with launchMode=singleInstance
- it then launches activity A2, activity A2 gets hosted in T2 due to
launchMode of A1
- then A2 enters PiP
- user expands PiP via the menu overlay icon
- A2 decides to startActivity(...) A1 in the onPictureInPictureParamsChanged
- A2 also calls finish() on itself

At that point T2 was in PINNED windowing mode, but A2 was already not.
The existing logic would have compared the A2 windowing mode and A1
windowing mode, and since both would be not PINNED, it would then decide
to inherit the task windowing mode, making T1 now in PINNED windowing
mode. This leads to wrong WM state, as T1 was not meant to be in that
windowing mode.

Bug: 296071915
Test: atest TaskLaunchParamsModifierTests

Change-Id: I005f92ef7dbb334c64466d83eb5bbe6b4c03d144
parent 4c3db108
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -559,7 +559,7 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
            return false;
        }

        final int sourceWindowingMode = source.getWindowingMode();
        final int sourceWindowingMode = source.getTask().getWindowingMode();
        if (sourceWindowingMode != WINDOWING_MODE_FULLSCREEN
                && sourceWindowingMode != WINDOWING_MODE_FREEFORM) {
            return false;
+2 −1
Original line number Diff line number Diff line
@@ -1679,9 +1679,10 @@ public class ActivityStarterTests extends WindowTestsBase {

    @Test
    public void testResultCanceledWhenNotAllowedStartingActivity() {
        final Task task = new TaskBuilder(mSupervisor).build();
        final ActivityStarter starter = prepareStarter(0, false);
        final ActivityRecord targetRecord = new ActivityBuilder(mAtm).build();
        final ActivityRecord sourceRecord = new ActivityBuilder(mAtm).build();
        final ActivityRecord sourceRecord = new ActivityBuilder(mAtm).setTask(task).build();
        targetRecord.resultTo = sourceRecord;

        // Abort the activity start and ensure the sourceRecord gets the result (RESULT_CANCELED).
+33 −0
Original line number Diff line number Diff line
@@ -678,6 +678,39 @@ public class TaskLaunchParamsModifierTests extends WindowTestsBase {
                WINDOWING_MODE_FULLSCREEN);
    }

    @Test
    public void testInheritsSourceTaskWindowingModeWhenActivityIsInDifferentWindowingMode() {
        final TestDisplayContent fullscreenDisplay = createNewDisplayContent(
                WINDOWING_MODE_FULLSCREEN);
        final ActivityRecord source = createSourceActivity(fullscreenDisplay);
        source.setWindowingMode(WINDOWING_MODE_PINNED);
        source.getTask().setWindowingMode(WINDOWING_MODE_FREEFORM);

        assertEquals(RESULT_CONTINUE,
                new CalculateRequestBuilder().setSource(source).calculate());

        assertEquivalentWindowingMode(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode,
                WINDOWING_MODE_FULLSCREEN);
    }

    @Test
    public void testDoesNotInheritsSourceTaskWindowingModeWhenActivityIsInFreeformWindowingMode() {
        // The activity could end up in different windowing mode state after calling finish()
        // while the task would still hold the WINDOWING_MODE_PINNED state, or in other words
        // be still in the Picture in Picture mode.
        final TestDisplayContent fullscreenDisplay = createNewDisplayContent(
                WINDOWING_MODE_FULLSCREEN);
        final ActivityRecord source = createSourceActivity(fullscreenDisplay);
        source.setWindowingMode(WINDOWING_MODE_FREEFORM);
        source.getTask().setWindowingMode(WINDOWING_MODE_PINNED);

        assertEquals(RESULT_CONTINUE,
                new CalculateRequestBuilder().setSource(source).calculate());

        assertEquivalentWindowingMode(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode,
                WINDOWING_MODE_FULLSCREEN);
    }


    @Test
    public void testKeepsPictureInPictureLaunchModeInOptions() {