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

Commit f7f7f9c4 authored by Louis Chang's avatar Louis Chang
Browse files

Do not use top running activities in other tasks when reset tasks

There were no running activities left in the resetting task, because
all activities in the task were set as finishing. The next top running
activity from other tasks was selected and returning it as the new
taskTop. However, we shouldn’t return the activity that was not
belonging to the resetting task because other tasks below would be
reused for the newly starting activity.

Bug: 135033489
Test: atest ActivityStackTests

Change-Id: Ia3793cd3d65837fdbc4cd43c2639e86184f6fb15
parent 57872964
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -3579,6 +3579,16 @@ class ActivityStack extends ConfigurationContainer {
        return taskInsertionPoint;
    }

    /**
     * Reset the task by reparenting the activities that have same affinity to the task or
     * reparenting the activities that have different affinityies out of the task, while these
     * activities allow task reparenting.
     *
     * @param taskTop     Top activity of the task might be reset.
     * @param newActivity The activity that going to be started.
     * @return The non-finishing top activity of the task after reset or the original task top
     *         activity if all activities within the task are finishing.
     */
    final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop,
            ActivityRecord newActivity) {
        final boolean forceReset =
@@ -3609,9 +3619,10 @@ class ActivityStack extends ConfigurationContainer {

        int taskNdx = mTaskHistory.indexOf(task);
        if (taskNdx >= 0) {
            do {
                taskTop = mTaskHistory.get(taskNdx--).getTopActivity();
            } while (taskTop == null && taskNdx >= 0);
            ActivityRecord newTop = mTaskHistory.get(taskNdx).getTopActivity();
            if (newTop != null) {
                taskTop = newTop;
            }
        }

        if (topOptions != null) {
+13 −0
Original line number Diff line number Diff line
@@ -1079,6 +1079,19 @@ public class ActivityStackTests extends ActivityTestsBase {
        assertTrue(listener.mChanged);
    }

    @Test
    public void testResetTaskWithFinishingActivities() {
        final ActivityRecord taskTop =
                new ActivityBuilder(mService).setStack(mStack).setCreateTask(true).build();
        // Make all activities in the task are finishing to simulate TaskRecord#getTopActivity
        // returns null.
        taskTop.finishing = true;

        final ActivityRecord newR = new ActivityBuilder(mService).build();
        final ActivityRecord result = mStack.resetTaskIfNeededLocked(taskTop, newR);
        assertThat(result).isEqualTo(taskTop);
    }

    private void verifyShouldSleepActivities(boolean focusedStack,
            boolean keyguardGoingAway, boolean displaySleeping, boolean expected) {
        final ActivityDisplay display = mock(ActivityDisplay.class);