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

Commit 11e3e6ad authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Change method of checking for active task from index check to top...

Merge "Change method of checking for active task from index check to top visible activity check" into main
parents 8760c39a 1b3c829f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -225,6 +225,7 @@ java_library_static {
        "updates_flags_lib",
        "com_android_server_accessibility_flags_lib",
        "//frameworks/libs/systemui:com_android_systemui_shared_flags_lib",
        "com_android_launcher3_flags_lib",
        "com_android_wm_shell_flags_lib",
        "com.android.server.utils_aconfig-java",
        "service-jobscheduler-deviceidle.flags-aconfig-java",
+12 −3
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;

import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS;
import static com.android.launcher3.Flags.enableRefactorTaskThumbnail;
import static com.android.server.wm.ActivityRecord.State.RESUMED;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_RECENTS;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_RECENTS_TRIM_TASKS;
@@ -1493,12 +1494,20 @@ class RecentTasks {
            if (isExcludeFromRecents) {
                if (DEBUG_RECENTS_TRIM_TASKS) {
                    Slog.d(TAG,
                            "\texcludeFromRecents=true, taskIndex = " + taskIndex
                                    + ", isOnHomeDisplay: " + task.isOnHomeDisplay());
                            "\texcludeFromRecents=true,"
                                + " taskIndex: " + taskIndex
                                + " getTopVisibleActivity: " + task.getTopVisibleActivity()
                                + " isOnHomeDisplay: " + task.isOnHomeDisplay());
                }
                // The Recents is only supported on default display now, we should only keep the
                // most recent task of home display.
                return (task.isOnHomeDisplay() && taskIndex == 0);
                boolean isMostRecentTask;
                if (enableRefactorTaskThumbnail()) {
                    isMostRecentTask = task.getTopVisibleActivity() != null;
                } else {
                    isMostRecentTask = taskIndex == 0;
                }
                return (task.isOnHomeDisplay() && isMostRecentTask);
            }
        }

+99 −10
Original line number Diff line number Diff line
@@ -70,7 +70,10 @@ import android.os.Bundle;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserManager;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.platform.test.flag.junit.SetFlagsRule;
import android.util.ArraySet;
import android.util.IntArray;
import android.util.SparseBooleanArray;
@@ -79,9 +82,12 @@ import android.window.TaskSnapshot;

import androidx.test.filters.MediumTest;

import com.android.launcher3.Flags;
import com.android.server.wm.RecentTasks.Callbacks;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@@ -122,6 +128,10 @@ public class RecentTasksTest extends WindowTestsBase {

    private CallbacksRecorder mCallbacksRecorder;

    @Rule
    public SetFlagsRule mSetFlagsRule =
            new SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT);

    @Before
    public void setUp() throws Exception {
        mTaskPersister = new TestTaskPersister(mContext.getFilesDir());
@@ -697,14 +707,31 @@ public class RecentTasksTest extends WindowTestsBase {
    }

    @Test
    @DisableFlags(Flags.FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL)
    public void testVisibleTasks_excludedFromRecents() {
        testVisibleTasks_excludedFromRecents_internal();
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL)
    public void testVisibleTasks_excludedFromRecents_withRefactorFlag() {
        testVisibleTasks_excludedFromRecents_internal();
    }

    private void testVisibleTasks_excludedFromRecents_internal() {
        mRecentTasks.setParameters(-1 /* min */, 4 /* max */, -1 /* ms */);

        Task excludedTask1 = createTaskBuilder(".ExcludedTask1")
        Task invisibleExcludedTask = createTaskBuilder(".ExcludedTask1")
                .setFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
                .setCreateActivity(true)
                .build();
        Task excludedTask2 = createTaskBuilder(".ExcludedTask2")
        ActivityRecord activityRecord = invisibleExcludedTask.getTopMostActivity();
        activityRecord.setVisibleRequested(false);
        activityRecord.setVisible(false);

        Task visibleExcludedTask = createTaskBuilder(".ExcludedTask2")
                .setFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
                .setCreateActivity(true)
                .build();
        Task detachedExcludedTask = createTaskBuilder(".DetachedExcludedTask")
                .setFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
@@ -718,18 +745,79 @@ public class RecentTasksTest extends WindowTestsBase {
        assertFalse(detachedExcludedTask.isAttached());

        mRecentTasks.add(detachedExcludedTask);
        mRecentTasks.add(excludedTask1);
        mRecentTasks.add(invisibleExcludedTask);
        mRecentTasks.add(mTasks.get(0));
        mRecentTasks.add(mTasks.get(1));
        mRecentTasks.add(mTasks.get(2));
        mRecentTasks.add(excludedTask2);
        mRecentTasks.add(visibleExcludedTask);

        // Excluded tasks should be trimmed, except those with a visible activity.
        triggerTrimAndAssertTrimmed(invisibleExcludedTask, detachedExcludedTask);
    }

    @Test
    @Ignore("b/342627272")
    @DisableFlags(Flags.FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL)
    public void testVisibleTasks_excludedFromRecents_visibleTaskNotFirstTask() {
        testVisibleTasks_excludedFromRecents_visibleTaskNotFirstTask_internal();
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL)
    public void testVisibleTasks_excludedFromRecents_visibleTaskNotFirstTask_withRefactorFlag() {
        testVisibleTasks_excludedFromRecents_visibleTaskNotFirstTask_internal();
    }

    private void testVisibleTasks_excludedFromRecents_visibleTaskNotFirstTask_internal() {
        mRecentTasks.setParameters(-1 /* min */, 4 /* max */, -1 /* ms */);

        Task invisibleExcludedTask = createTaskBuilder(".ExcludedTask1")
                .setFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
                .setCreateActivity(true)
                .build();
        ActivityRecord activityRecord = invisibleExcludedTask.getTopMostActivity();
        activityRecord.setVisibleRequested(false);
        activityRecord.setVisible(false);

        // Except the first-most excluded task, other excluded tasks should be trimmed.
        triggerTrimAndAssertTrimmed(excludedTask1, detachedExcludedTask);
        Task visibleExcludedTask = createTaskBuilder(".ExcludedTask2")
                .setFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
                .setCreateActivity(true)
                .build();
        Task detachedExcludedTask = createTaskBuilder(".DetachedExcludedTask")
                .setFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
                .build();

        // Move home to front so other task can satisfy the condition in RecentTasks#isTrimmable.
        mRootWindowContainer.getDefaultTaskDisplayArea().getRootHomeTask().moveToFront("test");
        // Avoid Task#autoRemoveFromRecents when removing from parent.
        detachedExcludedTask.setHasBeenVisible(true);
        detachedExcludedTask.removeImmediately();
        assertFalse(detachedExcludedTask.isAttached());

        mRecentTasks.add(detachedExcludedTask);
        mRecentTasks.add(visibleExcludedTask);
        mRecentTasks.add(mTasks.get(0));
        mRecentTasks.add(mTasks.get(1));
        mRecentTasks.add(mTasks.get(2));
        mRecentTasks.add(invisibleExcludedTask);

        // Excluded tasks should be trimmed, except those with a visible activity.
        triggerTrimAndAssertTrimmed(invisibleExcludedTask, detachedExcludedTask);
    }

    @Test
    @DisableFlags(Flags.FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL)
    public void testVisibleTasks_excludedFromRecents_firstTaskNotVisible() {
        testVisibleTasks_excludedFromRecents_firstTaskNotVisible_internal();
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL)
    public void testVisibleTasks_excludedFromRecents_firstTaskNotVisible_withRefactorFlag() {
        testVisibleTasks_excludedFromRecents_firstTaskNotVisible_internal();
    }

    private void testVisibleTasks_excludedFromRecents_firstTaskNotVisible_internal() {
        // Create some set of tasks, some of which are visible and some are not
        Task homeTask = createTaskBuilder("com.android.pkg1", ".HomeTask")
                .setParentTask(mTaskContainer.getRootHomeTask())
@@ -738,11 +826,12 @@ public class RecentTasksTest extends WindowTestsBase {
        mRecentTasks.add(homeTask);
        Task excludedTask1 = createTaskBuilder(".ExcludedTask1")
                .setFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
                .setCreateActivity(true)
                .build();
        excludedTask1.mUserSetupComplete = true;
        mRecentTasks.add(excludedTask1);

        // Expect that the first visible excluded-from-recents task is visible
        // Expect that the visible excluded-from-recents task is visible
        assertGetRecentTasksOrder(0 /* flags */, excludedTask1);
    }

@@ -1439,9 +1528,9 @@ public class RecentTasksTest extends WindowTestsBase {
     */
    private void assertGetRecentTasksOrder(int getRecentTaskFlags, Task... expectedTasks) {
        List<RecentTaskInfo> infos = getRecentTasks(getRecentTaskFlags);
        assertTrue(expectedTasks.length == infos.size());
        assertEquals(expectedTasks.length, infos.size());
        for (int i = 0; i < infos.size(); i++) {
            assertTrue(expectedTasks[i].mTaskId == infos.get(i).taskId);
            assertEquals(expectedTasks[i].mTaskId, infos.get(i).taskId);
        }
    }