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

Commit 1b3c829f authored by Uwais Ashraf's avatar Uwais Ashraf
Browse files

Change method of checking for active task from index check to top visible activity check

Bug: 342627272
Fix: 360117891
Flag: com.android.launcher3.enable_refactor_task_thumbnail
Test: RecentTasksTest
Change-Id: I20cb6921ec81f1edf9ed6078ec3746966ce2cb9b
parent 5bc9142f
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);
        }
    }