From d06e8dc8a32a49c21fe9108792d39feacd135cbe Mon Sep 17 00:00:00 2001 From: Gustav Sennton Date: Tue, 18 Jun 2024 11:54:38 +0000 Subject: [PATCH] Ignore minimized Desktop apps in Overview. For each desktop session, Overview shows a single tile with multiple desktop tasks. With this CL avoid showing minimized tasks in that tile. Bug: 333013317 Flag: com.android.window.flags.enable_desktop_windowing_mode Test: manual: ensured minimized desktop tasks are not shown in Overview Change-Id: I48cb6826849abf225c0fe4448ca7b0b13afea44e --- .../android/quickstep/RecentTasksList.java | 14 ++++- .../android/quickstep/views/RecentsView.java | 9 +++- .../quickstep/RecentTasksListTest.java | 53 +++++++++++++++++++ 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/quickstep/src/com/android/quickstep/RecentTasksList.java b/quickstep/src/com/android/quickstep/RecentTasksList.java index 66091d43f1..3d4167a25e 100644 --- a/quickstep/src/com/android/quickstep/RecentTasksList.java +++ b/quickstep/src/com/android/quickstep/RecentTasksList.java @@ -44,6 +44,7 @@ import com.android.wm.shell.util.GroupedRecentTaskInfo; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.function.Consumer; @@ -324,7 +325,9 @@ public class RecentTasksList { // leftover TYPE_FREEFORM tasks created when flag was on should be ignored. if (enableDesktopWindowingMode()) { GroupTask desktopTask = createDesktopTask(rawTask); - allTasks.add(desktopTask); + if (desktopTask != null) { + allTasks.add(desktopTask); + } } continue; } @@ -368,8 +371,13 @@ public class RecentTasksList { return allTasks; } - private DesktopTask createDesktopTask(GroupedRecentTaskInfo recentTaskInfo) { + private @Nullable DesktopTask createDesktopTask(GroupedRecentTaskInfo recentTaskInfo) { ArrayList tasks = new ArrayList<>(recentTaskInfo.getTaskInfoList().size()); + int[] minimizedTaskIds = recentTaskInfo.getMinimizedTaskIds(); + if (minimizedTaskIds.length == recentTaskInfo.getTaskInfoList().size()) { + // All Tasks are minimized -> don't create a DesktopTask + return null; + } for (ActivityManager.RecentTaskInfo taskInfo : recentTaskInfo.getTaskInfoList()) { Task.TaskKey key = new Task.TaskKey(taskInfo); Task task = Task.from(key, taskInfo, false); @@ -377,6 +385,8 @@ public class RecentTasksList { task.positionInParent = taskInfo.positionInParent; task.appBounds = taskInfo.configuration.windowConfiguration.getAppBounds(); task.isVisible = taskInfo.isVisible; + task.isMinimized = + Arrays.stream(minimizedTaskIds).anyMatch(taskId -> taskId == taskInfo.taskId); tasks.add(task); } return new DesktopTask(tasks); diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index d806e3ddc6..c1e112a4c9 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1826,8 +1826,13 @@ public abstract class RecentsView nonMinimizedTasks = + ((DesktopTask) groupTask).tasks.stream() + .filter(task -> !task.isMinimized) + .toList(); + ((DesktopTaskView) taskView).bind(nonMinimizedTasks, mOrientationState, + mTaskOverlayFactory); mDesktopTaskView = (DesktopTaskView) taskView; } else { Task task = groupTask.task1.key.id == stagedTaskIdToBeRemoved ? groupTask.task2 diff --git a/quickstep/tests/src/com/android/quickstep/RecentTasksListTest.java b/quickstep/tests/src/com/android/quickstep/RecentTasksListTest.java index 03244eb0bf..ce16b70a1b 100644 --- a/quickstep/tests/src/com/android/quickstep/RecentTasksListTest.java +++ b/quickstep/tests/src/com/android/quickstep/RecentTasksListTest.java @@ -32,6 +32,8 @@ import androidx.test.filters.SmallTest; import com.android.launcher3.util.LooperExecutor; import com.android.quickstep.util.GroupTask; +import com.android.quickstep.views.TaskView; +import com.android.systemui.shared.recents.model.Task; import com.android.wm.shell.util.GroupedRecentTaskInfo; import org.junit.Before; @@ -40,8 +42,11 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; @SmallTest public class RecentTasksListTest { @@ -104,4 +109,52 @@ public class RecentTasksListTest { assertEquals(taskDescription, taskList.get(0).task1.taskDescription.getLabel()); assertNull(taskList.get(0).task2.taskDescription.getLabel()); } + + @Test + public void loadTasksInBackground_freeformTask_createsDesktopTask() { + ActivityManager.RecentTaskInfo[] tasks = { + createRecentTaskInfo(1 /* taskId */), + createRecentTaskInfo(4 /* taskId */), + createRecentTaskInfo(5 /* taskId */)}; + GroupedRecentTaskInfo recentTaskInfos = GroupedRecentTaskInfo.forFreeformTasks( + tasks, Collections.emptySet() /* minimizedTaskIds */); + when(mockSystemUiProxy.getRecentTasks(anyInt(), anyInt())) + .thenReturn(new ArrayList<>(Collections.singletonList(recentTaskInfos))); + + List taskList = mRecentTasksList.loadTasksInBackground( + Integer.MAX_VALUE /* numTasks */, -1 /* requestId */, false /* loadKeysOnly */); + + assertEquals(1, taskList.size()); + assertEquals(TaskView.Type.DESKTOP, taskList.get(0).taskViewType); + List actualFreeformTasks = taskList.get(0).getTasks(); + assertEquals(3, actualFreeformTasks.size()); + assertEquals(1, actualFreeformTasks.get(0).key.id); + assertEquals(4, actualFreeformTasks.get(1).key.id); + assertEquals(5, actualFreeformTasks.get(2).key.id); + } + + @Test + public void loadTasksInBackground_freeformTask_onlyMinimizedTasks_doesNotCreateDesktopTask() { + ActivityManager.RecentTaskInfo[] tasks = { + createRecentTaskInfo(1 /* taskId */), + createRecentTaskInfo(4 /* taskId */), + createRecentTaskInfo(5 /* taskId */)}; + Set minimizedTaskIds = + Arrays.stream(new Integer[]{1, 4, 5}).collect(Collectors.toSet()); + GroupedRecentTaskInfo recentTaskInfos = + GroupedRecentTaskInfo.forFreeformTasks(tasks, minimizedTaskIds); + when(mockSystemUiProxy.getRecentTasks(anyInt(), anyInt())) + .thenReturn(new ArrayList<>(Collections.singletonList(recentTaskInfos))); + + List taskList = mRecentTasksList.loadTasksInBackground( + Integer.MAX_VALUE /* numTasks */, -1 /* requestId */, false /* loadKeysOnly */); + + assertEquals(0, taskList.size()); + } + + private ActivityManager.RecentTaskInfo createRecentTaskInfo(int taskId) { + ActivityManager.RecentTaskInfo recentTaskInfo = new ActivityManager.RecentTaskInfo(); + recentTaskInfo.taskId = taskId; + return recentTaskInfo; + } }