Loading core/java/android/app/ActivityManager.java +9 −4 Original line number Diff line number Diff line Loading @@ -2764,14 +2764,19 @@ public class ActivityManager { /** * Information of organized child tasks. * * @deprecated No longer used * @hide */ @Deprecated public ArrayList<RecentTaskInfo> childrenTaskInfos = new ArrayList<>(); /** * Information about the last snapshot taken for this task. * * @deprecated No longer used * @hide */ @Deprecated public PersistedTaskSnapshotData lastSnapshotData = new PersistedTaskSnapshotData(); public RecentTaskInfo() { Loading @@ -2793,7 +2798,7 @@ public class ActivityManager { lastSnapshotData.taskSize = source.readTypedObject(Point.CREATOR); lastSnapshotData.contentInsets = source.readTypedObject(Rect.CREATOR); lastSnapshotData.bufferSize = source.readTypedObject(Point.CREATOR); super.readFromParcel(source); super.readTaskFromParcel(source); } @Override Loading @@ -2804,7 +2809,7 @@ public class ActivityManager { dest.writeTypedObject(lastSnapshotData.taskSize, flags); dest.writeTypedObject(lastSnapshotData.contentInsets, flags); dest.writeTypedObject(lastSnapshotData.bufferSize, flags); super.writeToParcel(dest, flags); super.writeTaskToParcel(dest, flags); } public static final @android.annotation.NonNull Creator<RecentTaskInfo> CREATOR Loading Loading @@ -2988,13 +2993,13 @@ public class ActivityManager { public void readFromParcel(Parcel source) { id = source.readInt(); super.readFromParcel(source); super.readTaskFromParcel(source); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); super.writeToParcel(dest, flags); super.writeTaskToParcel(dest, flags); } public static final @android.annotation.NonNull Creator<RunningTaskInfo> CREATOR = new Creator<RunningTaskInfo>() { Loading core/java/android/app/ActivityTaskManager.java +2 −3 Original line number Diff line number Diff line Loading @@ -534,10 +534,9 @@ public class ActivityTaskManager { dest.writeIntArray(childTaskUserIds); dest.writeInt(visible ? 1 : 0); dest.writeInt(position); super.writeToParcel(dest, flags); super.writeTaskToParcel(dest, flags); } @Override void readFromParcel(Parcel source) { bounds = source.readTypedObject(Rect.CREATOR); childTaskIds = source.createIntArray(); Loading @@ -546,7 +545,7 @@ public class ActivityTaskManager { childTaskUserIds = source.createIntArray(); visible = source.readInt() > 0; position = source.readInt(); super.readFromParcel(source); super.readTaskFromParcel(source); } public static final @NonNull Creator<RootTaskInfo> CREATOR = new Creator<>() { Loading core/java/android/app/TaskInfo.java +6 −4 Original line number Diff line number Diff line Loading @@ -364,8 +364,9 @@ public class TaskInfo { // Do nothing } private TaskInfo(Parcel source) { readFromParcel(source); /** @hide */ public TaskInfo(Parcel source) { readTaskFromParcel(source); } /** Loading Loading @@ -524,7 +525,7 @@ public class TaskInfo { /** * Reads the TaskInfo from a parcel. */ void readFromParcel(Parcel source) { void readTaskFromParcel(Parcel source) { userId = source.readInt(); taskId = source.readInt(); effectiveUid = source.readInt(); Loading Loading @@ -577,8 +578,9 @@ public class TaskInfo { /** * Writes the TaskInfo to a parcel. * @hide */ void writeToParcel(Parcel dest, int flags) { public void writeTaskToParcel(Parcel dest, int flags) { dest.writeInt(userId); dest.writeInt(taskId); dest.writeInt(effectiveUid); Loading libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedRecentTaskInfo.aidl→libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -16,4 +16,4 @@ package com.android.wm.shell.shared; parcelable GroupedRecentTaskInfo; No newline at end of file parcelable GroupedTaskInfo; No newline at end of file libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedRecentTaskInfo.java→libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java +110 −58 Original line number Diff line number Diff line Loading @@ -17,7 +17,8 @@ package com.android.wm.shell.shared; import android.annotation.IntDef; import android.app.ActivityManager; import android.app.ActivityManager.RecentTaskInfo; import android.app.TaskInfo; import android.app.WindowConfiguration; import android.os.Parcel; import android.os.Parcelable; Loading @@ -27,69 +28,91 @@ import androidx.annotation.Nullable; import com.android.wm.shell.shared.split.SplitBounds; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.Set; /** * Simple container for recent tasks. May contain either a single or pair of tasks. * Simple container for recent tasks which should be presented as a single task within the * Overview UI. */ public class GroupedRecentTaskInfo implements Parcelable { public class GroupedTaskInfo implements Parcelable { public static final int TYPE_SINGLE = 1; public static final int TYPE_FULLSCREEN = 1; public static final int TYPE_SPLIT = 2; public static final int TYPE_FREEFORM = 3; @IntDef(prefix = {"TYPE_"}, value = { TYPE_SINGLE, TYPE_FULLSCREEN, TYPE_SPLIT, TYPE_FREEFORM }) public @interface GroupType {} /** * The type of this particular task info, can be one of TYPE_FULLSCREEN, TYPE_SPLIT or * TYPE_FREEFORM. */ @GroupType protected final int mType; /** * The list of tasks associated with this single recent task info. * TYPE_FULLSCREEN: Contains the stack of tasks associated with a single "task" in overview * TYPE_SPLIT: Contains the two split roots of each side * TYPE_FREEFORM: Contains the set of tasks currently in freeform mode */ @NonNull private final ActivityManager.RecentTaskInfo[] mTasks; protected final List<TaskInfo> mTasks; /** * Only set for TYPE_SPLIT. * * Information about the split bounds. */ @Nullable private final SplitBounds mSplitBounds; @GroupType private final int mType; // TODO(b/348332802): move isMinimized inside each Task object instead once we have a // replacement for RecentTaskInfo private final int[] mMinimizedTaskIds; protected final SplitBounds mSplitBounds; /** * Create new for a single task * Only set for TYPE_FREEFORM. * * TODO(b/348332802): move isMinimized inside each Task object instead once we have a * replacement for RecentTaskInfo */ public static GroupedRecentTaskInfo forSingleTask( @NonNull ActivityManager.RecentTaskInfo task) { return new GroupedRecentTaskInfo(new ActivityManager.RecentTaskInfo[]{task}, null, TYPE_SINGLE, null /* minimizedFreeformTasks */); @Nullable protected final int[] mMinimizedTaskIds; /** * Create new for a stack of fullscreen tasks */ public static GroupedTaskInfo forFullscreenTasks(@NonNull TaskInfo task) { return new GroupedTaskInfo(List.of(task), null, TYPE_FULLSCREEN, null /* minimizedFreeformTasks */); } /** * Create new for a pair of tasks in split screen */ public static GroupedRecentTaskInfo forSplitTasks(@NonNull ActivityManager.RecentTaskInfo task1, @NonNull ActivityManager.RecentTaskInfo task2, @Nullable SplitBounds splitBounds) { return new GroupedRecentTaskInfo(new ActivityManager.RecentTaskInfo[]{task1, task2}, splitBounds, TYPE_SPLIT, null /* minimizedFreeformTasks */); public static GroupedTaskInfo forSplitTasks(@NonNull TaskInfo task1, @NonNull TaskInfo task2, @Nullable SplitBounds splitBounds) { return new GroupedTaskInfo(List.of(task1, task2), splitBounds, TYPE_SPLIT, null /* minimizedFreeformTasks */); } /** * Create new for a group of freeform tasks */ public static GroupedRecentTaskInfo forFreeformTasks( @NonNull ActivityManager.RecentTaskInfo[] tasks, public static GroupedTaskInfo forFreeformTasks( @NonNull List<TaskInfo> tasks, @NonNull Set<Integer> minimizedFreeformTasks) { return new GroupedRecentTaskInfo( tasks, null /* splitBounds */, TYPE_FREEFORM, return new GroupedTaskInfo(tasks, null /* splitBounds */, TYPE_FREEFORM, minimizedFreeformTasks.stream().mapToInt(i -> i).toArray()); } private GroupedRecentTaskInfo( @NonNull ActivityManager.RecentTaskInfo[] tasks, private GroupedTaskInfo( @NonNull List<TaskInfo> tasks, @Nullable SplitBounds splitBounds, @GroupType int type, @Nullable int[] minimizedFreeformTaskIds) { Loading @@ -100,52 +123,56 @@ public class GroupedRecentTaskInfo implements Parcelable { ensureAllMinimizedIdsPresent(tasks, minimizedFreeformTaskIds); } private static void ensureAllMinimizedIdsPresent( @NonNull ActivityManager.RecentTaskInfo[] tasks, private void ensureAllMinimizedIdsPresent( @NonNull List<TaskInfo> tasks, @Nullable int[] minimizedFreeformTaskIds) { if (minimizedFreeformTaskIds == null) { return; } if (!Arrays.stream(minimizedFreeformTaskIds).allMatch( taskId -> Arrays.stream(tasks).anyMatch(task -> task.taskId == taskId))) { taskId -> tasks.stream().anyMatch(task -> task.taskId == taskId))) { throw new IllegalArgumentException("Minimized task IDs contain non-existent Task ID."); } } GroupedRecentTaskInfo(Parcel parcel) { mTasks = parcel.createTypedArray(ActivityManager.RecentTaskInfo.CREATOR); protected GroupedTaskInfo(@NonNull Parcel parcel) { mTasks = new ArrayList(); final int numTasks = parcel.readInt(); for (int i = 0; i < numTasks; i++) { mTasks.add(new TaskInfo(parcel)); } mSplitBounds = parcel.readTypedObject(SplitBounds.CREATOR); mType = parcel.readInt(); mMinimizedTaskIds = parcel.createIntArray(); } /** * Get primary {@link ActivityManager.RecentTaskInfo} * Get primary {@link RecentTaskInfo} */ @NonNull public ActivityManager.RecentTaskInfo getTaskInfo1() { return mTasks[0]; public TaskInfo getTaskInfo1() { return mTasks.getFirst(); } /** * Get secondary {@link ActivityManager.RecentTaskInfo}. * Get secondary {@link RecentTaskInfo}. * * Used in split screen. */ @Nullable public ActivityManager.RecentTaskInfo getTaskInfo2() { if (mTasks.length > 1) { return mTasks[1]; public TaskInfo getTaskInfo2() { if (mTasks.size() > 1) { return mTasks.get(1); } return null; } /** * Get all {@link ActivityManager.RecentTaskInfo}s grouped together. * Get all {@link RecentTaskInfo}s grouped together. */ @NonNull public List<ActivityManager.RecentTaskInfo> getTaskInfoList() { return Arrays.asList(mTasks); public List<TaskInfo> getTaskInfoList() { return mTasks; } /** Loading @@ -164,28 +191,46 @@ public class GroupedRecentTaskInfo implements Parcelable { return mType; } @Nullable public int[] getMinimizedTaskIds() { return mMinimizedTaskIds; } @Override public boolean equals(Object obj) { if (!(obj instanceof GroupedTaskInfo)) { return false; } GroupedTaskInfo other = (GroupedTaskInfo) obj; return mType == other.mType && Objects.equals(mTasks, other.mTasks) && Objects.equals(mSplitBounds, other.mSplitBounds) && Arrays.equals(mMinimizedTaskIds, other.mMinimizedTaskIds); } @Override public int hashCode() { return Objects.hash(mType, mTasks, mSplitBounds, Arrays.hashCode(mMinimizedTaskIds)); } @Override public String toString() { StringBuilder taskString = new StringBuilder(); for (int i = 0; i < mTasks.length; i++) { for (int i = 0; i < mTasks.size(); i++) { if (i == 0) { taskString.append("Task"); } else { taskString.append(", Task"); } taskString.append(i + 1).append(": ").append(getTaskInfo(mTasks[i])); taskString.append(i + 1).append(": ").append(getTaskInfo(mTasks.get(i))); } if (mSplitBounds != null) { taskString.append(", SplitBounds: ").append(mSplitBounds); } taskString.append(", Type="); switch (mType) { case TYPE_SINGLE: taskString.append("TYPE_SINGLE"); case TYPE_FULLSCREEN: taskString.append("TYPE_FULLSCREEN"); break; case TYPE_SPLIT: taskString.append("TYPE_SPLIT"); Loading @@ -199,7 +244,7 @@ public class GroupedRecentTaskInfo implements Parcelable { return taskString.toString(); } private String getTaskInfo(ActivityManager.RecentTaskInfo taskInfo) { private String getTaskInfo(TaskInfo taskInfo) { if (taskInfo == null) { return null; } Loading @@ -213,7 +258,12 @@ public class GroupedRecentTaskInfo implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeTypedArray(mTasks, flags); // 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 parcel.writeInt(mTasks.size()); for (int i = 0; i < mTasks.size(); i++) { mTasks.get(i).writeTaskToParcel(parcel, flags); } parcel.writeTypedObject(mSplitBounds, flags); parcel.writeInt(mType); parcel.writeIntArray(mMinimizedTaskIds); Loading @@ -224,13 +274,15 @@ public class GroupedRecentTaskInfo implements Parcelable { return 0; } public static final @android.annotation.NonNull Creator<GroupedRecentTaskInfo> CREATOR = new Creator<GroupedRecentTaskInfo>() { public GroupedRecentTaskInfo createFromParcel(Parcel source) { return new GroupedRecentTaskInfo(source); public static final Creator<GroupedTaskInfo> CREATOR = new Creator() { @Override public GroupedTaskInfo createFromParcel(Parcel in) { return new GroupedTaskInfo(in); } public GroupedRecentTaskInfo[] newArray(int size) { return new GroupedRecentTaskInfo[size]; @Override public GroupedTaskInfo[] newArray(int size) { return new GroupedTaskInfo[size]; } }; } Loading
core/java/android/app/ActivityManager.java +9 −4 Original line number Diff line number Diff line Loading @@ -2764,14 +2764,19 @@ public class ActivityManager { /** * Information of organized child tasks. * * @deprecated No longer used * @hide */ @Deprecated public ArrayList<RecentTaskInfo> childrenTaskInfos = new ArrayList<>(); /** * Information about the last snapshot taken for this task. * * @deprecated No longer used * @hide */ @Deprecated public PersistedTaskSnapshotData lastSnapshotData = new PersistedTaskSnapshotData(); public RecentTaskInfo() { Loading @@ -2793,7 +2798,7 @@ public class ActivityManager { lastSnapshotData.taskSize = source.readTypedObject(Point.CREATOR); lastSnapshotData.contentInsets = source.readTypedObject(Rect.CREATOR); lastSnapshotData.bufferSize = source.readTypedObject(Point.CREATOR); super.readFromParcel(source); super.readTaskFromParcel(source); } @Override Loading @@ -2804,7 +2809,7 @@ public class ActivityManager { dest.writeTypedObject(lastSnapshotData.taskSize, flags); dest.writeTypedObject(lastSnapshotData.contentInsets, flags); dest.writeTypedObject(lastSnapshotData.bufferSize, flags); super.writeToParcel(dest, flags); super.writeTaskToParcel(dest, flags); } public static final @android.annotation.NonNull Creator<RecentTaskInfo> CREATOR Loading Loading @@ -2988,13 +2993,13 @@ public class ActivityManager { public void readFromParcel(Parcel source) { id = source.readInt(); super.readFromParcel(source); super.readTaskFromParcel(source); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); super.writeToParcel(dest, flags); super.writeTaskToParcel(dest, flags); } public static final @android.annotation.NonNull Creator<RunningTaskInfo> CREATOR = new Creator<RunningTaskInfo>() { Loading
core/java/android/app/ActivityTaskManager.java +2 −3 Original line number Diff line number Diff line Loading @@ -534,10 +534,9 @@ public class ActivityTaskManager { dest.writeIntArray(childTaskUserIds); dest.writeInt(visible ? 1 : 0); dest.writeInt(position); super.writeToParcel(dest, flags); super.writeTaskToParcel(dest, flags); } @Override void readFromParcel(Parcel source) { bounds = source.readTypedObject(Rect.CREATOR); childTaskIds = source.createIntArray(); Loading @@ -546,7 +545,7 @@ public class ActivityTaskManager { childTaskUserIds = source.createIntArray(); visible = source.readInt() > 0; position = source.readInt(); super.readFromParcel(source); super.readTaskFromParcel(source); } public static final @NonNull Creator<RootTaskInfo> CREATOR = new Creator<>() { Loading
core/java/android/app/TaskInfo.java +6 −4 Original line number Diff line number Diff line Loading @@ -364,8 +364,9 @@ public class TaskInfo { // Do nothing } private TaskInfo(Parcel source) { readFromParcel(source); /** @hide */ public TaskInfo(Parcel source) { readTaskFromParcel(source); } /** Loading Loading @@ -524,7 +525,7 @@ public class TaskInfo { /** * Reads the TaskInfo from a parcel. */ void readFromParcel(Parcel source) { void readTaskFromParcel(Parcel source) { userId = source.readInt(); taskId = source.readInt(); effectiveUid = source.readInt(); Loading Loading @@ -577,8 +578,9 @@ public class TaskInfo { /** * Writes the TaskInfo to a parcel. * @hide */ void writeToParcel(Parcel dest, int flags) { public void writeTaskToParcel(Parcel dest, int flags) { dest.writeInt(userId); dest.writeInt(taskId); dest.writeInt(effectiveUid); Loading
libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedRecentTaskInfo.aidl→libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -16,4 +16,4 @@ package com.android.wm.shell.shared; parcelable GroupedRecentTaskInfo; No newline at end of file parcelable GroupedTaskInfo; No newline at end of file
libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedRecentTaskInfo.java→libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java +110 −58 Original line number Diff line number Diff line Loading @@ -17,7 +17,8 @@ package com.android.wm.shell.shared; import android.annotation.IntDef; import android.app.ActivityManager; import android.app.ActivityManager.RecentTaskInfo; import android.app.TaskInfo; import android.app.WindowConfiguration; import android.os.Parcel; import android.os.Parcelable; Loading @@ -27,69 +28,91 @@ import androidx.annotation.Nullable; import com.android.wm.shell.shared.split.SplitBounds; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.Set; /** * Simple container for recent tasks. May contain either a single or pair of tasks. * Simple container for recent tasks which should be presented as a single task within the * Overview UI. */ public class GroupedRecentTaskInfo implements Parcelable { public class GroupedTaskInfo implements Parcelable { public static final int TYPE_SINGLE = 1; public static final int TYPE_FULLSCREEN = 1; public static final int TYPE_SPLIT = 2; public static final int TYPE_FREEFORM = 3; @IntDef(prefix = {"TYPE_"}, value = { TYPE_SINGLE, TYPE_FULLSCREEN, TYPE_SPLIT, TYPE_FREEFORM }) public @interface GroupType {} /** * The type of this particular task info, can be one of TYPE_FULLSCREEN, TYPE_SPLIT or * TYPE_FREEFORM. */ @GroupType protected final int mType; /** * The list of tasks associated with this single recent task info. * TYPE_FULLSCREEN: Contains the stack of tasks associated with a single "task" in overview * TYPE_SPLIT: Contains the two split roots of each side * TYPE_FREEFORM: Contains the set of tasks currently in freeform mode */ @NonNull private final ActivityManager.RecentTaskInfo[] mTasks; protected final List<TaskInfo> mTasks; /** * Only set for TYPE_SPLIT. * * Information about the split bounds. */ @Nullable private final SplitBounds mSplitBounds; @GroupType private final int mType; // TODO(b/348332802): move isMinimized inside each Task object instead once we have a // replacement for RecentTaskInfo private final int[] mMinimizedTaskIds; protected final SplitBounds mSplitBounds; /** * Create new for a single task * Only set for TYPE_FREEFORM. * * TODO(b/348332802): move isMinimized inside each Task object instead once we have a * replacement for RecentTaskInfo */ public static GroupedRecentTaskInfo forSingleTask( @NonNull ActivityManager.RecentTaskInfo task) { return new GroupedRecentTaskInfo(new ActivityManager.RecentTaskInfo[]{task}, null, TYPE_SINGLE, null /* minimizedFreeformTasks */); @Nullable protected final int[] mMinimizedTaskIds; /** * Create new for a stack of fullscreen tasks */ public static GroupedTaskInfo forFullscreenTasks(@NonNull TaskInfo task) { return new GroupedTaskInfo(List.of(task), null, TYPE_FULLSCREEN, null /* minimizedFreeformTasks */); } /** * Create new for a pair of tasks in split screen */ public static GroupedRecentTaskInfo forSplitTasks(@NonNull ActivityManager.RecentTaskInfo task1, @NonNull ActivityManager.RecentTaskInfo task2, @Nullable SplitBounds splitBounds) { return new GroupedRecentTaskInfo(new ActivityManager.RecentTaskInfo[]{task1, task2}, splitBounds, TYPE_SPLIT, null /* minimizedFreeformTasks */); public static GroupedTaskInfo forSplitTasks(@NonNull TaskInfo task1, @NonNull TaskInfo task2, @Nullable SplitBounds splitBounds) { return new GroupedTaskInfo(List.of(task1, task2), splitBounds, TYPE_SPLIT, null /* minimizedFreeformTasks */); } /** * Create new for a group of freeform tasks */ public static GroupedRecentTaskInfo forFreeformTasks( @NonNull ActivityManager.RecentTaskInfo[] tasks, public static GroupedTaskInfo forFreeformTasks( @NonNull List<TaskInfo> tasks, @NonNull Set<Integer> minimizedFreeformTasks) { return new GroupedRecentTaskInfo( tasks, null /* splitBounds */, TYPE_FREEFORM, return new GroupedTaskInfo(tasks, null /* splitBounds */, TYPE_FREEFORM, minimizedFreeformTasks.stream().mapToInt(i -> i).toArray()); } private GroupedRecentTaskInfo( @NonNull ActivityManager.RecentTaskInfo[] tasks, private GroupedTaskInfo( @NonNull List<TaskInfo> tasks, @Nullable SplitBounds splitBounds, @GroupType int type, @Nullable int[] minimizedFreeformTaskIds) { Loading @@ -100,52 +123,56 @@ public class GroupedRecentTaskInfo implements Parcelable { ensureAllMinimizedIdsPresent(tasks, minimizedFreeformTaskIds); } private static void ensureAllMinimizedIdsPresent( @NonNull ActivityManager.RecentTaskInfo[] tasks, private void ensureAllMinimizedIdsPresent( @NonNull List<TaskInfo> tasks, @Nullable int[] minimizedFreeformTaskIds) { if (minimizedFreeformTaskIds == null) { return; } if (!Arrays.stream(minimizedFreeformTaskIds).allMatch( taskId -> Arrays.stream(tasks).anyMatch(task -> task.taskId == taskId))) { taskId -> tasks.stream().anyMatch(task -> task.taskId == taskId))) { throw new IllegalArgumentException("Minimized task IDs contain non-existent Task ID."); } } GroupedRecentTaskInfo(Parcel parcel) { mTasks = parcel.createTypedArray(ActivityManager.RecentTaskInfo.CREATOR); protected GroupedTaskInfo(@NonNull Parcel parcel) { mTasks = new ArrayList(); final int numTasks = parcel.readInt(); for (int i = 0; i < numTasks; i++) { mTasks.add(new TaskInfo(parcel)); } mSplitBounds = parcel.readTypedObject(SplitBounds.CREATOR); mType = parcel.readInt(); mMinimizedTaskIds = parcel.createIntArray(); } /** * Get primary {@link ActivityManager.RecentTaskInfo} * Get primary {@link RecentTaskInfo} */ @NonNull public ActivityManager.RecentTaskInfo getTaskInfo1() { return mTasks[0]; public TaskInfo getTaskInfo1() { return mTasks.getFirst(); } /** * Get secondary {@link ActivityManager.RecentTaskInfo}. * Get secondary {@link RecentTaskInfo}. * * Used in split screen. */ @Nullable public ActivityManager.RecentTaskInfo getTaskInfo2() { if (mTasks.length > 1) { return mTasks[1]; public TaskInfo getTaskInfo2() { if (mTasks.size() > 1) { return mTasks.get(1); } return null; } /** * Get all {@link ActivityManager.RecentTaskInfo}s grouped together. * Get all {@link RecentTaskInfo}s grouped together. */ @NonNull public List<ActivityManager.RecentTaskInfo> getTaskInfoList() { return Arrays.asList(mTasks); public List<TaskInfo> getTaskInfoList() { return mTasks; } /** Loading @@ -164,28 +191,46 @@ public class GroupedRecentTaskInfo implements Parcelable { return mType; } @Nullable public int[] getMinimizedTaskIds() { return mMinimizedTaskIds; } @Override public boolean equals(Object obj) { if (!(obj instanceof GroupedTaskInfo)) { return false; } GroupedTaskInfo other = (GroupedTaskInfo) obj; return mType == other.mType && Objects.equals(mTasks, other.mTasks) && Objects.equals(mSplitBounds, other.mSplitBounds) && Arrays.equals(mMinimizedTaskIds, other.mMinimizedTaskIds); } @Override public int hashCode() { return Objects.hash(mType, mTasks, mSplitBounds, Arrays.hashCode(mMinimizedTaskIds)); } @Override public String toString() { StringBuilder taskString = new StringBuilder(); for (int i = 0; i < mTasks.length; i++) { for (int i = 0; i < mTasks.size(); i++) { if (i == 0) { taskString.append("Task"); } else { taskString.append(", Task"); } taskString.append(i + 1).append(": ").append(getTaskInfo(mTasks[i])); taskString.append(i + 1).append(": ").append(getTaskInfo(mTasks.get(i))); } if (mSplitBounds != null) { taskString.append(", SplitBounds: ").append(mSplitBounds); } taskString.append(", Type="); switch (mType) { case TYPE_SINGLE: taskString.append("TYPE_SINGLE"); case TYPE_FULLSCREEN: taskString.append("TYPE_FULLSCREEN"); break; case TYPE_SPLIT: taskString.append("TYPE_SPLIT"); Loading @@ -199,7 +244,7 @@ public class GroupedRecentTaskInfo implements Parcelable { return taskString.toString(); } private String getTaskInfo(ActivityManager.RecentTaskInfo taskInfo) { private String getTaskInfo(TaskInfo taskInfo) { if (taskInfo == null) { return null; } Loading @@ -213,7 +258,12 @@ public class GroupedRecentTaskInfo implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeTypedArray(mTasks, flags); // 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 parcel.writeInt(mTasks.size()); for (int i = 0; i < mTasks.size(); i++) { mTasks.get(i).writeTaskToParcel(parcel, flags); } parcel.writeTypedObject(mSplitBounds, flags); parcel.writeInt(mType); parcel.writeIntArray(mMinimizedTaskIds); Loading @@ -224,13 +274,15 @@ public class GroupedRecentTaskInfo implements Parcelable { return 0; } public static final @android.annotation.NonNull Creator<GroupedRecentTaskInfo> CREATOR = new Creator<GroupedRecentTaskInfo>() { public GroupedRecentTaskInfo createFromParcel(Parcel source) { return new GroupedRecentTaskInfo(source); public static final Creator<GroupedTaskInfo> CREATOR = new Creator() { @Override public GroupedTaskInfo createFromParcel(Parcel in) { return new GroupedTaskInfo(in); } public GroupedRecentTaskInfo[] newArray(int size) { return new GroupedRecentTaskInfo[size]; @Override public GroupedTaskInfo[] newArray(int size) { return new GroupedTaskInfo[size]; } }; }