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

Commit 273e9992 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Fix task movement if top running activity of focused stack is null

If the target task is non-null and current top task is null (e.g.
the activity may be finishing or use FLAG_ACTIVITY_PREVIOUS_IS_TOP),
we should still consider they are different task so the target task
can be moved to front instead of only move its stack.

Bug: 131589476
Test: atest ActivityStarterTests#testBringTaskToFrontWhenFocusedStackIsFinising
Change-Id: Ibf8befae74aab9e308d82d2149c41cd069615988
parent 29615239
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2075,8 +2075,8 @@ class ActivityStarter {
            final ActivityRecord curTop = (focusStack == null)
                    ? null : focusStack.topRunningNonDelayedActivityLocked(mNotTop);
            final TaskRecord topTask = curTop != null ? curTop.getTaskRecord() : null;
            differentTopTask = topTask != null
                    && (topTask != intentActivity.getTaskRecord() || topTask != focusStack.topTask());
            differentTopTask = topTask != intentActivity.getTaskRecord()
                    || (focusStack != null && topTask != focusStack.topTask());
        } else {
            // The existing task should always be different from those in other displays.
            differentTopTask = true;
+30 −0
Original line number Diff line number Diff line
@@ -706,6 +706,36 @@ public class ActivityStarterTests extends ActivityTestsBase {
        verify(options, times(shouldHaveAborted ? 1 : 0)).abort();
    }

    /**
     * This test ensures that {@link ActivityStarter#setTargetStackAndMoveToFrontIfNeeded} will
     * move the existing task to front if the current focused stack doesn't have running task.
     */
    @Test
    public void testBringTaskToFrontWhenFocusedStackIsFinising() {
        // Put 2 tasks in the same stack (simulate the behavior of home stack).
        final ActivityRecord activity = new ActivityBuilder(mService)
                .setCreateTask(true).build();
        new ActivityBuilder(mService)
                .setStack(activity.getActivityStack())
                .setCreateTask(true).build();

        // Create a top finishing activity.
        final ActivityRecord finishingTopActivity = new ActivityBuilder(mService)
                .setCreateTask(true).build();
        finishingTopActivity.getActivityStack().moveToFront("finishingTopActivity");

        assertEquals(finishingTopActivity, mRootActivityContainer.topRunningActivity());
        finishingTopActivity.finishing = true;

        // Launch the bottom task of the target stack.
        prepareStarter(FLAG_ACTIVITY_NEW_TASK, false /* mockGetLaunchStack */)
                .setReason("testBringTaskToFrontWhenTopStackIsFinising")
                .setIntent(activity.intent)
                .execute();
        // The hierarchies of the activity should move to front.
        assertEquals(activity, mRootActivityContainer.topRunningActivity());
    }

    /**
     * This test ensures that when starting an existing single task activity on secondary display
     * which is not the top focused display, it should deliver new intent to the activity and not