Loading services/core/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -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", Loading services/core/java/com/android/server/wm/RecentTasks.java +12 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } } Loading services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +99 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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()); Loading Loading @@ -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) Loading @@ -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()) Loading @@ -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); } Loading Loading @@ -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); } } Loading Loading
services/core/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -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", Loading
services/core/java/com/android/server/wm/RecentTasks.java +12 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } } Loading
services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +99 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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()); Loading Loading @@ -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) Loading @@ -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()) Loading @@ -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); } Loading Loading @@ -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); } } Loading