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

Commit 2aaf4cdf authored by Mark Renouf's avatar Mark Renouf
Browse files

Exclude recent tasks within an ActivityView

singleTaskInstance is set by ActivityView to limit
the display to a single task. This also itentifies
the VirtualDisplay associated with an ActivityView.

Since an Activity within ActivityView cannot be
brought to front via recents, they are suppressed.

Test: atest WmTests:RecentTasksTest
Bug: 123587368
Bug: 126185105
Change-Id: I6cf913da793d2fab919a0d7ec88e7965fa50a257
parent 01f2c3cb
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -1159,7 +1159,8 @@ class RecentTasks {
    /**
     * @return whether the given active task should be presented to the user through SystemUI.
     */
    private boolean isVisibleRecentTask(TaskRecord task) {
    @VisibleForTesting
    boolean isVisibleRecentTask(TaskRecord task) {
        if (DEBUG_RECENTS_TRIM_TASKS) Slog.d(TAG, "isVisibleRecentTask: task=" + task
                + " minVis=" + mMinNumVisibleTasks + " maxVis=" + mMaxNumVisibleTasks
                + " sessionDuration=" + mActiveTasksSessionDurationMs
@@ -1195,6 +1196,17 @@ class RecentTasks {
                }
        }

        // Tasks managed by/associated with an ActivityView should be excluded from recents.
        // singleTaskInstance is set on the VirtualDisplay managed by ActivityView
        // TODO(b/126185105): Find a different signal to use besides isSingleTaskInstance
        final ActivityStack stack = task.getStack();
        if (stack != null) {
            ActivityDisplay display = stack.getDisplay();
            if (display != null && display.isSingleTaskInstance()) {
                return false;
            }
        }

        // If we're in lock task mode, ignore the root task
        if (task == mService.getLockTaskController().getRootTask()) {
            return false;
+40 −1
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.view.Display.DEFAULT_DISPLAY;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy;

import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
@@ -96,6 +95,7 @@ public class RecentTasksTest extends ActivityTestsBase {
    private TestActivityTaskManagerService mTestService;
    private ActivityDisplay mDisplay;
    private ActivityDisplay mOtherDisplay;
    private ActivityDisplay mSingleTaskDisplay;
    private ActivityStack mStack;
    private ActivityStack mHomeStack;
    private TestTaskPersister mTaskPersister;
@@ -547,6 +547,41 @@ public class RecentTasksTest extends ActivityTestsBase {
        assertTrimmed(mTasks.get(0), mTasks.get(1));
    }

    /**
     * Tests that tasks on singleTaskDisplay are not visible and not trimmed/removed.
     */
    @Test
    public void testVisibleTasks_singleTaskDisplay() {
        mRecentTasks.setOnlyTestVisibleRange();
        mRecentTasks.setParameters(-1 /* min */, 3 /* max */, -1 /* ms */);

        ActivityStack singleTaskStack = mSingleTaskDisplay.createStack(
                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);

        TaskRecord excludedTask1 = createTaskBuilder(".ExcludedTask1")
                .setStack(singleTaskStack)
                .build();

        assertFalse("Tasks on singleTaskDisplay should not be visible recents",
                mRecentTasks.isVisibleRecentTask(excludedTask1));

        mRecentTasks.add(excludedTask1);

        // Add N+1 visible tasks.
        mRecentTasks.add(mTasks.get(0));
        mRecentTasks.add(mTasks.get(1));
        mRecentTasks.add(mTasks.get(2));
        mRecentTasks.add(mTasks.get(3));

        // excludedTask is not trimmed.
        assertTrimmed(mTasks.get(0));

        mRecentTasks.removeAllVisibleTasks();

        // Only visible tasks removed.
        assertTrimmed(mTasks.get(0), mTasks.get(1), mTasks.get(2), mTasks.get(3));
    }

    @Test
    public void testBackStackTasks_expectNoTrim() {
        mRecentTasks.setParameters(-1 /* min */, 1 /* max */, -1 /* ms */);
@@ -879,8 +914,12 @@ public class RecentTasksTest extends ActivityTestsBase {
            super.createDefaultDisplay();
            mDisplay = mRootActivityContainer.getActivityDisplay(DEFAULT_DISPLAY);
            mOtherDisplay = TestActivityDisplay.create(mTestStackSupervisor, DEFAULT_DISPLAY + 1);
            mSingleTaskDisplay = TestActivityDisplay.create(mTestStackSupervisor,
                    DEFAULT_DISPLAY + 2);
            mSingleTaskDisplay.setDisplayToSingleTaskInstance();
            mRootActivityContainer.addChild(mOtherDisplay, ActivityDisplay.POSITION_TOP);
            mRootActivityContainer.addChild(mDisplay, ActivityDisplay.POSITION_TOP);
            mRootActivityContainer.addChild(mSingleTaskDisplay, ActivityDisplay.POSITION_TOP);
        }
    }