diff options
| author | 2024-09-24 00:12:44 +0000 | |
|---|---|---|
| committer | 2024-09-24 00:12:44 +0000 | |
| commit | 11e3e6ad4c3495f8037ae5155f10af967567169c (patch) | |
| tree | 3331e5b6de0cecd363eadb1a0bf0893fe31c9a2a | |
| parent | 8760c39a3d9e20b1756d6452dd0fd061c0de5d45 (diff) | |
| parent | 1b3c829fd2fbb420a7c6c3e596f2e835f1a82009 (diff) | |
Merge "Change method of checking for active task from index check to top visible activity check" into main
| -rw-r--r-- | services/core/Android.bp | 1 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/RecentTasks.java | 15 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java | 109 |
3 files changed, 112 insertions, 13 deletions
diff --git a/services/core/Android.bp b/services/core/Android.bp index 4e36e3ff9188..c6e599e8edee 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -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", diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index 7aede8b4a068..9da848aa05d8 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -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); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 8f3d3c5a86e9..e0344d73f540 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -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); - // Except the first-most excluded task, other excluded tasks should be trimmed. - triggerTrimAndAssertTrimmed(excludedTask1, detachedExcludedTask); + // 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); + + 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()); - for (int i = 0; i < infos.size(); i++) { - assertTrue(expectedTasks[i].mTaskId == infos.get(i).taskId); + assertEquals(expectedTasks.length, infos.size()); + for (int i = 0; i < infos.size(); i++) { + assertEquals(expectedTasks[i].mTaskId, infos.get(i).taskId); } } |