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

Commit e00f086e authored by wilsonshih's avatar wilsonshih
Browse files

Prevent execute app transition too early when performClearTask

The app transition could be executed in finishIfPossible if one of the
non-top activity in the task is visible but not resumed, which lead the
wrong transition type, normally there should wait for for next resumed
activity be added to opening apps. Use destroyIfPossible to prevent
unnecessary transition.

Bug: 192309923
Test: verify the transition type after SUW call finishAndRemoveTask.
Test: atest AppTransitionControllerTest TaskStackChangedListenerTest
Change-Id: I5c336bc5a8fc52684f5e15d8ff973d0960aa1250
parent bdb91bf0
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -1596,9 +1596,15 @@ class Task extends TaskFragment {
        } else {
            forAllActivities((r) -> {
                if (r.finishing) return;
                // TODO: figure-out how to avoid object creation due to capture of reason variable.
                r.finishIfPossible(Activity.RESULT_CANCELED,
                        null /* resultData */, null /* resultGrants */, reason, false /* oomAdj */);
                // Prevent the transition from being executed too early if the top activity is
                // resumed but the mVisibleRequested of any other activity is true, the transition
                // should wait until next activity resumed.
                if (r.isState(RESUMED) || (r.isVisible()
                        && !mDisplayContent.mAppTransition.containsTransitRequest(TRANSIT_CLOSE))) {
                    r.finishIfPossible(reason, false /* oomAdj */);
                } else {
                    r.destroyIfPossible(reason);
                }
            });
        }
    }
+14 −0
Original line number Diff line number Diff line
@@ -102,6 +102,20 @@ public class AppTransitionControllerTest extends WindowTestsBase {
                        mDisplayContent.mChangingContainers, null, null, false));
    }

    @Test
    public void testClearTaskSkipAppExecuteTransition() {
        final ActivityRecord behind = createActivityRecord(mDisplayContent,
                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
        final Task task = behind.getTask();
        final ActivityRecord top = createActivityRecord(task);
        top.setState(ActivityRecord.State.RESUMED, "test");
        behind.setState(ActivityRecord.State.STARTED, "test");
        behind.mVisibleRequested = true;

        task.performClearTask("test");
        assertFalse(mDisplayContent.mAppTransition.isReady());
    }

    @Test
    public void testTranslucentOpen() {
        final ActivityRecord behind = createActivityRecord(mDisplayContent,