Loading libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java +34 −7 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.wm.shell.shared; import static android.app.WindowConfiguration.windowingModeToString; import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; import static android.view.Display.INVALID_DISPLAY; import android.annotation.IntDef; import android.app.ActivityManager.RecentTaskInfo; Loading Loading @@ -64,6 +65,11 @@ public class GroupedTaskInfo implements Parcelable { */ private final int mDeskId; /** * The ID of the display that desk with [mDeskId] is in. */ private final int mDeskDisplayId; /** * The type of this particular task info, can be one of TYPE_FULLSCREEN, TYPE_SPLIT or * TYPE_DESK. Loading Loading @@ -109,8 +115,9 @@ public class GroupedTaskInfo implements Parcelable { * Create new for a stack of fullscreen tasks */ public static GroupedTaskInfo forFullscreenTasks(@NonNull TaskInfo task) { return new GroupedTaskInfo(/* deskId = */ -1, List.of(task), null, TYPE_FULLSCREEN, /* minimizedFreeformTaskIds = */ null); return new GroupedTaskInfo(/* deskId = */ -1, /* displayId = */ INVALID_DISPLAY, List.of(task), null, TYPE_FULLSCREEN, /* minimizedFreeformTaskIds = */ null); } /** Loading @@ -118,8 +125,9 @@ public class GroupedTaskInfo implements Parcelable { */ public static GroupedTaskInfo forSplitTasks(@NonNull TaskInfo task1, @NonNull TaskInfo task2, @NonNull SplitBounds splitBounds) { return new GroupedTaskInfo(/* deskId = */ -1, List.of(task1, task2), splitBounds, TYPE_SPLIT, /* minimizedFreeformTaskIds = */ null); return new GroupedTaskInfo(/* deskId = */ -1, /* displayId = */ INVALID_DISPLAY, List.of(task1, task2), splitBounds, TYPE_SPLIT, /* minimizedFreeformTaskIds = */ null); } /** Loading @@ -127,9 +135,11 @@ public class GroupedTaskInfo implements Parcelable { */ public static GroupedTaskInfo forDeskTasks( int deskId, int deskDisplayId, @NonNull List<TaskInfo> tasks, @NonNull Set<Integer> minimizedFreeformTaskIds) { return new GroupedTaskInfo(deskId, tasks, /* splitBounds = */ null, TYPE_DESK, return new GroupedTaskInfo(deskId, deskDisplayId, tasks, /* splitBounds = */ null, TYPE_DESK, minimizedFreeformTaskIds.stream().mapToInt(i -> i).toArray()); } Loading @@ -149,11 +159,13 @@ public class GroupedTaskInfo implements Parcelable { private GroupedTaskInfo( int deskId, int deskDisplayId, @NonNull List<TaskInfo> tasks, @Nullable SplitBounds splitBounds, @GroupType int type, @Nullable int[] minimizedFreeformTaskIds) { mDeskId = deskId; mDeskDisplayId = deskDisplayId; mTasks = tasks; mGroupedTasks = null; mSplitBounds = splitBounds; Loading @@ -164,6 +176,7 @@ public class GroupedTaskInfo implements Parcelable { private GroupedTaskInfo(@NonNull List<GroupedTaskInfo> groupedTasks) { mDeskId = -1; mDeskDisplayId = INVALID_DISPLAY; mTasks = null; mGroupedTasks = groupedTasks; mSplitBounds = null; Loading @@ -185,6 +198,7 @@ public class GroupedTaskInfo implements Parcelable { protected GroupedTaskInfo(@NonNull Parcel parcel) { mDeskId = parcel.readInt(); mDeskDisplayId = parcel.readInt(); mTasks = new ArrayList(); final int numTasks = parcel.readInt(); for (int i = 0; i < numTasks; i++) { Loading Loading @@ -294,6 +308,16 @@ public class GroupedTaskInfo implements Parcelable { return mDeskId; } /** * Returns the ID of the display that hosts the desk represented by [mDeskId]. */ public int getDeskDisplayId() { if (mType != TYPE_DESK) { throw new IllegalStateException("No display ID for non desktop task"); } return mDeskDisplayId; } /** * Get type of this recents entry. One of {@link GroupType}. * Note: This is deprecated, callers should use `isBaseType()` and not make assumptions about Loading Loading @@ -323,6 +347,7 @@ public class GroupedTaskInfo implements Parcelable { } GroupedTaskInfo other = (GroupedTaskInfo) obj; return mDeskId == other.mDeskId && mDeskDisplayId == other.mDeskDisplayId && mType == other.mType && Objects.equals(mTasks, other.mTasks) && Objects.equals(mGroupedTasks, other.mGroupedTasks) Loading @@ -332,7 +357,7 @@ public class GroupedTaskInfo implements Parcelable { @Override public int hashCode() { return Objects.hash(mDeskId, mType, mTasks, mGroupedTasks, mSplitBounds, return Objects.hash(mDeskId, mDeskDisplayId, mType, mTasks, mGroupedTasks, mSplitBounds, Arrays.hashCode(mMinimizedTaskIds)); } Loading @@ -345,6 +370,7 @@ public class GroupedTaskInfo implements Parcelable { .collect(Collectors.joining(",\n\t", "[\n\t", "\n]"))); } else { taskString.append("Desk ID= ").append(mDeskId).append(", "); taskString.append("Desk Display ID=").append(mDeskDisplayId).append(", "); taskString.append("Tasks=" + mTasks.stream() .map(taskInfo -> getTaskInfoDumpString(taskInfo)) .collect(Collectors.joining(", ", "[", "]"))); Loading Loading @@ -377,6 +403,7 @@ public class GroupedTaskInfo implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(mDeskId); parcel.writeInt(mDeskDisplayId); // We don't use the parcel list methods because we want to only write the TaskInfo state // and not the subclasses (Recents/RunningTaskInfo) whose fields are all deprecated final int tasksSize = mTasks != null ? mTasks.size() : 0; Loading libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java +10 −5 Original line number Diff line number Diff line Loading @@ -536,17 +536,20 @@ public class RecentTasksController implements TaskStackListenerCallback, } /** * Represents a desk whose ID is `mDeskId` and contains the tasks in `mDeskTasks`. Some of these * tasks are minimized and their IDs are contained in the `mMinimizedDeskTasks` set. * Represents a desk whose ID is `mDeskId` inside the display with `mDisplayId` and contains * the tasks in `mDeskTasks`. Some of these tasks are minimized and their IDs are contained * in the `mMinimizedDeskTasks` set. */ private static class Desk { final int mDeskId; final int mDisplayId; boolean mHasVisibleTasks = false; final ArrayList<TaskInfo> mDeskTasks = new ArrayList<>(); final Set<Integer> mMinimizedDeskTasks = new HashSet<>(); Desk(int deskId) { Desk(int deskId, int displayId) { mDeskId = deskId; mDisplayId = displayId; } void addTask(TaskInfo taskInfo, boolean isMinimized, boolean isVisible) { Loading @@ -562,7 +565,8 @@ public class RecentTasksController implements TaskStackListenerCallback, } GroupedTaskInfo createDeskTaskInfo() { return GroupedTaskInfo.forDeskTasks(mDeskId, mDeskTasks, mMinimizedDeskTasks); return GroupedTaskInfo.forDeskTasks(mDeskId, mDisplayId, mDeskTasks, mMinimizedDeskTasks); } } Loading Loading @@ -601,7 +605,8 @@ public class RecentTasksController implements TaskStackListenerCallback, private Desk getOrCreateDesk(int deskId) { var desk = mTmpDesks.get(deskId); if (desk == null) { desk = new Desk(deskId); desk = new Desk(deskId, mDesktopUserRepositories.get().getCurrent().getDisplayForDesk(deskId)); mTmpDesks.put(deskId, desk); } return desk; Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedTaskInfoTest.kt +4 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.app.TaskInfo import android.graphics.Rect import android.os.Parcel import android.testing.AndroidTestingRunner import android.view.Display.DEFAULT_DISPLAY import android.window.IWindowContainerToken import android.window.WindowContainerToken import androidx.test.filters.SmallTest Loading Loading @@ -281,7 +282,8 @@ class GroupedTaskInfoTest : ShellTestCase() { val task2 = createTaskInfo(id = 2) val taskInfo = GroupedTaskInfo.forDeskTasks( /* deskId = */ 500, listOf(task1, task2), setOf()) /* deskId = */ 500, DEFAULT_DISPLAY, listOf(task1, task2), setOf() ) assertThat(taskInfo.deskId).isEqualTo(500) assertThat(taskInfo.getTaskById(1)).isEqualTo(task1) Loading Loading @@ -335,6 +337,7 @@ class GroupedTaskInfoTest : ShellTestCase() { ): GroupedTaskInfo { return GroupedTaskInfo.forDeskTasks( deskId, DEFAULT_DISPLAY, freeformTaskIds.map { createTaskInfo(it) }.toList(), minimizedTaskIds.toSet()) } Loading Loading
libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java +34 −7 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.wm.shell.shared; import static android.app.WindowConfiguration.windowingModeToString; import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; import static android.view.Display.INVALID_DISPLAY; import android.annotation.IntDef; import android.app.ActivityManager.RecentTaskInfo; Loading Loading @@ -64,6 +65,11 @@ public class GroupedTaskInfo implements Parcelable { */ private final int mDeskId; /** * The ID of the display that desk with [mDeskId] is in. */ private final int mDeskDisplayId; /** * The type of this particular task info, can be one of TYPE_FULLSCREEN, TYPE_SPLIT or * TYPE_DESK. Loading Loading @@ -109,8 +115,9 @@ public class GroupedTaskInfo implements Parcelable { * Create new for a stack of fullscreen tasks */ public static GroupedTaskInfo forFullscreenTasks(@NonNull TaskInfo task) { return new GroupedTaskInfo(/* deskId = */ -1, List.of(task), null, TYPE_FULLSCREEN, /* minimizedFreeformTaskIds = */ null); return new GroupedTaskInfo(/* deskId = */ -1, /* displayId = */ INVALID_DISPLAY, List.of(task), null, TYPE_FULLSCREEN, /* minimizedFreeformTaskIds = */ null); } /** Loading @@ -118,8 +125,9 @@ public class GroupedTaskInfo implements Parcelable { */ public static GroupedTaskInfo forSplitTasks(@NonNull TaskInfo task1, @NonNull TaskInfo task2, @NonNull SplitBounds splitBounds) { return new GroupedTaskInfo(/* deskId = */ -1, List.of(task1, task2), splitBounds, TYPE_SPLIT, /* minimizedFreeformTaskIds = */ null); return new GroupedTaskInfo(/* deskId = */ -1, /* displayId = */ INVALID_DISPLAY, List.of(task1, task2), splitBounds, TYPE_SPLIT, /* minimizedFreeformTaskIds = */ null); } /** Loading @@ -127,9 +135,11 @@ public class GroupedTaskInfo implements Parcelable { */ public static GroupedTaskInfo forDeskTasks( int deskId, int deskDisplayId, @NonNull List<TaskInfo> tasks, @NonNull Set<Integer> minimizedFreeformTaskIds) { return new GroupedTaskInfo(deskId, tasks, /* splitBounds = */ null, TYPE_DESK, return new GroupedTaskInfo(deskId, deskDisplayId, tasks, /* splitBounds = */ null, TYPE_DESK, minimizedFreeformTaskIds.stream().mapToInt(i -> i).toArray()); } Loading @@ -149,11 +159,13 @@ public class GroupedTaskInfo implements Parcelable { private GroupedTaskInfo( int deskId, int deskDisplayId, @NonNull List<TaskInfo> tasks, @Nullable SplitBounds splitBounds, @GroupType int type, @Nullable int[] minimizedFreeformTaskIds) { mDeskId = deskId; mDeskDisplayId = deskDisplayId; mTasks = tasks; mGroupedTasks = null; mSplitBounds = splitBounds; Loading @@ -164,6 +176,7 @@ public class GroupedTaskInfo implements Parcelable { private GroupedTaskInfo(@NonNull List<GroupedTaskInfo> groupedTasks) { mDeskId = -1; mDeskDisplayId = INVALID_DISPLAY; mTasks = null; mGroupedTasks = groupedTasks; mSplitBounds = null; Loading @@ -185,6 +198,7 @@ public class GroupedTaskInfo implements Parcelable { protected GroupedTaskInfo(@NonNull Parcel parcel) { mDeskId = parcel.readInt(); mDeskDisplayId = parcel.readInt(); mTasks = new ArrayList(); final int numTasks = parcel.readInt(); for (int i = 0; i < numTasks; i++) { Loading Loading @@ -294,6 +308,16 @@ public class GroupedTaskInfo implements Parcelable { return mDeskId; } /** * Returns the ID of the display that hosts the desk represented by [mDeskId]. */ public int getDeskDisplayId() { if (mType != TYPE_DESK) { throw new IllegalStateException("No display ID for non desktop task"); } return mDeskDisplayId; } /** * Get type of this recents entry. One of {@link GroupType}. * Note: This is deprecated, callers should use `isBaseType()` and not make assumptions about Loading Loading @@ -323,6 +347,7 @@ public class GroupedTaskInfo implements Parcelable { } GroupedTaskInfo other = (GroupedTaskInfo) obj; return mDeskId == other.mDeskId && mDeskDisplayId == other.mDeskDisplayId && mType == other.mType && Objects.equals(mTasks, other.mTasks) && Objects.equals(mGroupedTasks, other.mGroupedTasks) Loading @@ -332,7 +357,7 @@ public class GroupedTaskInfo implements Parcelable { @Override public int hashCode() { return Objects.hash(mDeskId, mType, mTasks, mGroupedTasks, mSplitBounds, return Objects.hash(mDeskId, mDeskDisplayId, mType, mTasks, mGroupedTasks, mSplitBounds, Arrays.hashCode(mMinimizedTaskIds)); } Loading @@ -345,6 +370,7 @@ public class GroupedTaskInfo implements Parcelable { .collect(Collectors.joining(",\n\t", "[\n\t", "\n]"))); } else { taskString.append("Desk ID= ").append(mDeskId).append(", "); taskString.append("Desk Display ID=").append(mDeskDisplayId).append(", "); taskString.append("Tasks=" + mTasks.stream() .map(taskInfo -> getTaskInfoDumpString(taskInfo)) .collect(Collectors.joining(", ", "[", "]"))); Loading Loading @@ -377,6 +403,7 @@ public class GroupedTaskInfo implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(mDeskId); parcel.writeInt(mDeskDisplayId); // We don't use the parcel list methods because we want to only write the TaskInfo state // and not the subclasses (Recents/RunningTaskInfo) whose fields are all deprecated final int tasksSize = mTasks != null ? mTasks.size() : 0; Loading
libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java +10 −5 Original line number Diff line number Diff line Loading @@ -536,17 +536,20 @@ public class RecentTasksController implements TaskStackListenerCallback, } /** * Represents a desk whose ID is `mDeskId` and contains the tasks in `mDeskTasks`. Some of these * tasks are minimized and their IDs are contained in the `mMinimizedDeskTasks` set. * Represents a desk whose ID is `mDeskId` inside the display with `mDisplayId` and contains * the tasks in `mDeskTasks`. Some of these tasks are minimized and their IDs are contained * in the `mMinimizedDeskTasks` set. */ private static class Desk { final int mDeskId; final int mDisplayId; boolean mHasVisibleTasks = false; final ArrayList<TaskInfo> mDeskTasks = new ArrayList<>(); final Set<Integer> mMinimizedDeskTasks = new HashSet<>(); Desk(int deskId) { Desk(int deskId, int displayId) { mDeskId = deskId; mDisplayId = displayId; } void addTask(TaskInfo taskInfo, boolean isMinimized, boolean isVisible) { Loading @@ -562,7 +565,8 @@ public class RecentTasksController implements TaskStackListenerCallback, } GroupedTaskInfo createDeskTaskInfo() { return GroupedTaskInfo.forDeskTasks(mDeskId, mDeskTasks, mMinimizedDeskTasks); return GroupedTaskInfo.forDeskTasks(mDeskId, mDisplayId, mDeskTasks, mMinimizedDeskTasks); } } Loading Loading @@ -601,7 +605,8 @@ public class RecentTasksController implements TaskStackListenerCallback, private Desk getOrCreateDesk(int deskId) { var desk = mTmpDesks.get(deskId); if (desk == null) { desk = new Desk(deskId); desk = new Desk(deskId, mDesktopUserRepositories.get().getCurrent().getDisplayForDesk(deskId)); mTmpDesks.put(deskId, desk); } return desk; Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedTaskInfoTest.kt +4 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.app.TaskInfo import android.graphics.Rect import android.os.Parcel import android.testing.AndroidTestingRunner import android.view.Display.DEFAULT_DISPLAY import android.window.IWindowContainerToken import android.window.WindowContainerToken import androidx.test.filters.SmallTest Loading Loading @@ -281,7 +282,8 @@ class GroupedTaskInfoTest : ShellTestCase() { val task2 = createTaskInfo(id = 2) val taskInfo = GroupedTaskInfo.forDeskTasks( /* deskId = */ 500, listOf(task1, task2), setOf()) /* deskId = */ 500, DEFAULT_DISPLAY, listOf(task1, task2), setOf() ) assertThat(taskInfo.deskId).isEqualTo(500) assertThat(taskInfo.getTaskById(1)).isEqualTo(task1) Loading Loading @@ -335,6 +337,7 @@ class GroupedTaskInfoTest : ShellTestCase() { ): GroupedTaskInfo { return GroupedTaskInfo.forDeskTasks( deskId, DEFAULT_DISPLAY, freeformTaskIds.map { createTaskInfo(it) }.toList(), minimizedTaskIds.toSet()) } Loading