diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java index 73f9bea668..4581119c72 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java @@ -275,7 +275,7 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { task2, updateTasks ? mViewCallbacks::updateThumbnailInBackground : null, updateTasks ? mViewCallbacks::updateIconInBackground : null, - groupTask.mSplitBounds); + groupTask instanceof SplitTask splitTask ? splitTask.getSplitBounds() : null); previousTaskView = currentTaskView; } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index a9b772a513..a59c9e3fa3 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -26,8 +26,6 @@ import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_FOLDER; import static com.android.launcher3.config.FeatureFlags.enableTaskbarPinning; import static com.android.launcher3.icons.IconNormalizer.ICON_VISIBLE_AREA_FACTOR; -import static java.util.function.Predicate.not; - import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; @@ -399,7 +397,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar .filter(Objects::nonNull) .toArray(ItemInfo[]::new); // TODO(b/343289567 and b/316004172): support app pairs and desktop mode. - recentTasks = recentTasks.stream().filter(not(GroupTask::supportsMultipleTasks)).toList(); + recentTasks = recentTasks.stream().filter(it -> it instanceof SingleTask).toList(); if (taskbarRecentsLayoutTransition()) { updateItemsWithLayoutTransition(hotseatItemInfos, recentTasks); @@ -650,7 +648,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar // Replace any Recent views with the appropriate type if it's not already that type. final int expectedLayoutResId; boolean isCollection = false; - if (task.supportsMultipleTasks()) { + if (!(task instanceof SingleTask)) { if (task.taskViewType == TaskViewType.DESKTOP) { // TODO(b/316004172): use Desktop tile layout. expectedLayoutResId = -1; diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index c880aa9412..690dec40e6 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -65,7 +65,6 @@ import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.quickstep.util.AnimUtils.completeRunnableListCallback; import static com.android.quickstep.util.SplitAnimationTimings.TABLET_HOME_TO_SPLIT; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_HOME_KEY; -import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -1390,16 +1389,13 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, */ public void launchSplitTasks( @NonNull SplitTask splitTask, @Nullable RemoteTransition remoteTransition) { - mSplitSelectStateController.launchExistingSplitPair( - null /* launchingTaskView */, + mSplitSelectStateController.launchExistingSplitPair(null /* launchingTaskView */, splitTask.getTopLeftTask().key.id, splitTask.getBottomRightTask().key.id, SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT, /* callback= */ success -> mSplitSelectStateController.resetState(), /* freezeTaskList= */ false, - splitTask.mSplitBounds == null - ? SNAP_TO_2_50_50 - : splitTask.mSplitBounds.snapPosition, + splitTask.getSplitBounds().snapPosition, remoteTransition); } diff --git a/quickstep/src/com/android/quickstep/util/DesktopTask.kt b/quickstep/src/com/android/quickstep/util/DesktopTask.kt index 066918571b..53ea022a23 100644 --- a/quickstep/src/com/android/quickstep/util/DesktopTask.kt +++ b/quickstep/src/com/android/quickstep/util/DesktopTask.kt @@ -20,14 +20,9 @@ import com.android.systemui.shared.recents.model.Task /** * A [Task] container that can contain N number of tasks that are part of the desktop in recent - * tasks list. + * tasks list. Note that desktops can be empty with no tasks in them. */ -class DesktopTask(override val tasks: List) : - GroupTask(tasks[0], null, null, TaskViewType.DESKTOP) { - - override fun containsTask(taskId: Int) = tasks.any { it.key.id == taskId } - - override fun supportsMultipleTasks() = true +class DesktopTask(tasks: List) : GroupTask(tasks, TaskViewType.DESKTOP) { override fun copy() = DesktopTask(tasks) diff --git a/quickstep/src/com/android/quickstep/util/GroupTask.kt b/quickstep/src/com/android/quickstep/util/GroupTask.kt index 8237d2e3f2..49c37dce71 100644 --- a/quickstep/src/com/android/quickstep/util/GroupTask.kt +++ b/quickstep/src/com/android/quickstep/util/GroupTask.kt @@ -15,7 +15,6 @@ */ package com.android.quickstep.util -import androidx.annotation.VisibleForTesting import com.android.launcher3.util.SplitConfigurationOptions import com.android.quickstep.views.TaskViewType import com.android.systemui.shared.recents.model.Task @@ -25,27 +24,8 @@ import java.util.Objects * An abstract class for creating [Task] containers that can be [SingleTask]s, [SplitTask]s, or * [DesktopTask]s in the recent tasks list. */ -abstract class GroupTask -@VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) -constructor( - @Deprecated("Prefer using `getTasks()` instead") @JvmField val task1: Task, - @Deprecated("Prefer using `getTasks()` instead") @JvmField val task2: Task?, - @JvmField val mSplitBounds: SplitConfigurationOptions.SplitBounds?, - @JvmField val taskViewType: TaskViewType, -) { - protected constructor( - task1: Task, - task2: Task?, - splitBounds: SplitConfigurationOptions.SplitBounds?, - ) : this( - task1, - task2, - splitBounds, - if (task2 != null) TaskViewType.GROUPED else TaskViewType.SINGLE, - ) - - open fun containsTask(taskId: Int) = - task1.key.id == taskId || (task2 != null && task2.key.id == taskId) +abstract class GroupTask(val tasks: List, @JvmField val taskViewType: TaskViewType) { + fun containsTask(taskId: Int) = tasks.any { it.key.id == taskId } /** * Returns true if a task in this group has a package name that matches the given `packageName`. @@ -61,18 +41,9 @@ constructor( fun isEmpty() = tasks.isEmpty() - /** Returns whether this task supports multiple tasks or not. */ - open fun supportsMultipleTasks() = taskViewType == TaskViewType.GROUPED - - /** Returns a List of all the Tasks in this GroupTask */ - open val tasks: List - get() = listOfNotNull(task1, task2) - /** Creates a copy of this instance */ abstract fun copy(): GroupTask - override fun toString() = "type=$taskViewType task1=$task1 task2=$task2" - override fun equals(o: Any?): Boolean { if (this === o) return true if (o !is GroupTask) return false @@ -83,15 +54,14 @@ constructor( } /** A [Task] container that must contain exactly one task in the recent tasks list. */ -class SingleTask(task: Task) : - GroupTask(task, task2 = null, mSplitBounds = null, TaskViewType.SINGLE) { +class SingleTask(task: Task) : GroupTask(listOf(task), TaskViewType.SINGLE) { val task: Task - get() = task1 + get() = tasks[0] - override fun copy() = SingleTask(task1) + override fun copy() = SingleTask(task) - override fun toString() = "type=$taskViewType task=$task1" + override fun toString() = "type=$taskViewType task=$task" override fun equals(o: Any?): Boolean { if (this === o) return true @@ -104,25 +74,26 @@ class SingleTask(task: Task) : * A [Task] container that must contain exactly two tasks and split bounds to represent an app-pair * in the recent tasks list. */ -class SplitTask(task1: Task, task2: Task, splitBounds: SplitConfigurationOptions.SplitBounds) : - GroupTask(task1, task2, splitBounds, TaskViewType.GROUPED) { +class SplitTask(task1: Task, task2: Task, val splitBounds: SplitConfigurationOptions.SplitBounds) : + GroupTask(listOf(task1, task2), TaskViewType.GROUPED) { val topLeftTask: Task - get() = if (mSplitBounds!!.leftTopTaskId == task1.key.id) task1!! else task2!! + get() = if (splitBounds.leftTopTaskId == tasks[0].key.id) tasks[0] else tasks[1] val bottomRightTask: Task - get() = if (topLeftTask == task1) task2!! else task1!! + get() = if (topLeftTask == tasks[0]) tasks[1] else tasks[0] - override fun copy() = SplitTask(task1, task2!!, mSplitBounds!!) + override fun copy() = SplitTask(tasks[0], tasks[1], splitBounds) - override fun toString() = "type=$taskViewType task1=$task1 task2=$task2" + override fun toString() = + "type=$taskViewType topLeftTask=$topLeftTask bottomRightTask=$bottomRightTask" override fun equals(o: Any?): Boolean { if (this === o) return true if (o !is SplitTask) return false - if (mSplitBounds!! != o.mSplitBounds!!) return false + if (splitBounds != o.splitBounds) return false return super.equals(o) } - override fun hashCode() = Objects.hash(super.hashCode(), mSplitBounds) + override fun hashCode() = Objects.hash(super.hashCode(), splitBounds) } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 29d2689813..9c8b2497c4 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1972,7 +1972,7 @@ public abstract class RecentsView< var splitTask = (SplitTask) groupTask; groupedTaskView.bind(splitTask.getTopLeftTask(), splitTask.getBottomRightTask(), mOrientationState, - mTaskOverlayFactory, splitTask.mSplitBounds); + mTaskOverlayFactory, splitTask.getSplitBounds()); } else if (taskView instanceof DesktopTaskView desktopTaskView) { // Minimized tasks should not be shown in Overview List nonMinimizedTasks =