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

Commit 7b4379f0 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Consider transient-hide tasks in waiting transitions

This restores the partial deletion in isTransientHide by [1].
That misunderstood the waiting transition has not been started yet.
But it is actually waiting to play.

Without considering the waiting transitions, it may hit:
1. Start recents (transition=R)
 Add task X to transient-hide
 BLASTSyncEngine.mActiveSyncs[0]=R

2. Start activity on X (transition=A)
 createAndStartCollecting
   > mWaitingTransitions.add(mCollectingTransition)
     (R is mCollectingTransition)
 BLASTSyncEngine.mActiveSyncs[1]=A
 Moves task X to front

3. (R) plays, pops (R) from mWaitingTransitions
4. (A) plays ~ finishes
5. (R) finishes and its finishTransaction sets Task X to invisible
-> Black screen because X is moved top

With considering the waiting transitions, the step 2 won't move
the task to front by checking isTransientHide in ActivityStarter
#startActivityInner. Then the end state is consistent with the
operation of recent transition: return to home.

[1]: I15c32fa4fa06f175e0cfd430dbc5ae806c599e52

Fix: 321102873
Test: TransitionTests#testTransientWithParallelLaunch
Change-Id: Icaa21a6be8a28bfa5369b954e645f72cd47c937c
parent 02b61abc
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -496,6 +496,9 @@ class TransitionController {
        if (mCollectingTransition != null && mCollectingTransition.isInTransientHide(task)) {
            return true;
        }
        for (int i = mWaitingTransitions.size() - 1; i >= 0; --i) {
            if (mWaitingTransitions.get(i).isInTransientHide(task)) return true;
        }
        for (int i = mPlayingTransitions.size() - 1; i >= 0; --i) {
            if (mPlayingTransitions.get(i).isInTransientHide(task)) return true;
        }
@@ -506,6 +509,9 @@ class TransitionController {
        if (mCollectingTransition != null && mCollectingTransition.isTransientVisible(task)) {
            return true;
        }
        for (int i = mWaitingTransitions.size() - 1; i >= 0; --i) {
            if (mWaitingTransitions.get(i).isTransientVisible(task)) return true;
        }
        for (int i = mPlayingTransitions.size() - 1; i >= 0; --i) {
            if (mPlayingTransitions.get(i).isTransientVisible(task)) return true;
        }
+27 −0
Original line number Diff line number Diff line
@@ -1601,6 +1601,33 @@ public class TransitionTests extends WindowTestsBase {
        assertFalse(controller.isTransientVisible(taskRecent));
    }

    @Test
    public void testTransientWithParallelLaunch() {
        final Task recentTask = mDisplayContent.getDefaultTaskDisplayArea().getRootHomeTask();
        final ActivityRecord recent = new ActivityBuilder(mAtm).setTask(recentTask)
                .setVisible(false).build();
        final ActivityRecord app = new ActivityBuilder(mAtm).setCreateTask(true).build();
        final Task appTask = app.getTask();
        registerTestTransitionPlayer();
        final TransitionController controller = mRootWindowContainer.mTransitionController;
        final Transition transition = createTestTransition(TRANSIT_OPEN, controller);
        transition.mParallelCollectType = Transition.PARALLEL_TYPE_RECENTS;
        controller.moveToCollecting(transition);
        transition.collect(recentTask);
        transition.collect(appTask);
        transition.setTransientLaunch(recent, appTask);
        recentTask.moveToFront("move-recent-to-front");
        transition.setAllReady();
        transition.start();
        // Assume that the app starts another activity in its task.
        final Transition newTransition = controller.createAndStartCollecting(TRANSIT_OPEN);

        assertEquals(newTransition, controller.getCollectingTransition());
        assertTrue(controller.mWaitingTransitions.contains(transition));
        assertTrue(controller.isTransientHide(appTask));
        assertTrue(controller.isTransientVisible(appTask));
    }

    @Test
    public void testNotReadyPushPop() {
        final TransitionController controller = new TestTransitionController(mAtm);