Merge "Fix bug with Taskbar launches in Overview" into tm-qpr-dev

This commit is contained in:
Jeremy Sim
2023-01-19 02:23:32 +00:00
committed by Android (Google) Code Review
4 changed files with 39 additions and 12 deletions

View File

@@ -101,7 +101,7 @@ public interface QuickstepSystemShortcut {
RecentsView recentsView = mTarget.getOverviewPanel();
// Check if there is already an instance of this app running, if so, initiate the split
// using that.
recentsView.findLastActiveTaskAndDoSplitOperation(
recentsView.findLastActiveTaskAndRunCallback(
intent.getComponent(),
(Consumer<Task>) foundTask -> {
SplitSelectSource source = new SplitSelectSource(mOriginalView,

View File

@@ -94,6 +94,7 @@ import com.android.launcher3.util.TraceHelper;
import com.android.launcher3.util.ViewCache;
import com.android.launcher3.views.ActivityContext;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.rotation.RotationButtonController;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -101,6 +102,7 @@ import com.android.systemui.unfold.updates.RotationChangeProvider;
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider;
import java.io.PrintWriter;
import java.util.function.Consumer;
/**
* The {@link ActivityContext} with which we inflate Taskbar-related Views. This allows UI elements
@@ -778,12 +780,12 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
});
});
} else if (tag instanceof WorkspaceItemInfo) {
// Tapping a launchable icon on Taskbar
WorkspaceItemInfo info = (WorkspaceItemInfo) tag;
if (!info.isDisabled() || !ItemClickHandler.handleDisabledItemClicked(info, this)) {
TaskbarUIController taskbarUIController = mControllers.uiController;
RecentsView recents = taskbarUIController.getRecentsView();
if (recents != null
&& taskbarUIController.getRecentsView().isSplitSelectionActive()) {
if (recents != null && recents.isSplitSelectionActive()) {
// If we are selecting a second app for split, launch the split tasks
taskbarUIController.triggerSecondAppForSplit(info, info.intent, view);
} else {
@@ -810,7 +812,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
getSystemService(LauncherApps.class)
.startShortcut(packageName, id, null, null, info.user);
} else {
startItemInfoActivity(info);
launchFromTaskbarPreservingSplitIfVisible(recents, info);
}
mControllers.uiController.onTaskbarIconLaunched(info);
@@ -825,6 +827,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true);
}
} else if (tag instanceof AppInfo) {
// Tapping an item in AllApps
AppInfo info = (AppInfo) tag;
TaskbarUIController taskbarUIController = mControllers.uiController;
RecentsView recents = taskbarUIController.getRecentsView();
@@ -833,9 +836,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
// If we are selecting a second app for split, launch the split tasks
taskbarUIController.triggerSecondAppForSplit(info, info.intent, view);
} else {
// Else launch the selected task
startItemInfoActivity((AppInfo) tag);
mControllers.uiController.onTaskbarIconLaunched((AppInfo) tag);
launchFromTaskbarPreservingSplitIfVisible(recents, info);
mControllers.uiController.onTaskbarIconLaunched(info);
}
mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true);
} else if (tag instanceof ItemClickProxy) {
@@ -847,6 +849,31 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
AbstractFloatingView.closeAllOpenViews(this);
}
/**
* Run when the user taps a Taskbar icon while in Overview. If the tapped app is currently
* visible to the user in Overview, or is part of a visible split pair, we expand the TaskView
* as if the user tapped on it (preserving the split pair). Otherwise, launch it normally
* (potentially breaking a split pair).
*/
private void launchFromTaskbarPreservingSplitIfVisible(RecentsView recents, ItemInfo info) {
recents.findLastActiveTaskAndRunCallback(
info.getTargetComponent(),
(Consumer<Task>) foundTask -> {
if (foundTask != null) {
TaskView foundTaskView =
recents.getTaskViewByTaskId(foundTask.key.id);
if (foundTaskView != null
&& foundTaskView.isVisibleToUser()) {
TestLogging.recordEvent(
TestProtocol.SEQUENCE_MAIN, "start: taskbarAppIcon");
foundTaskView.launchTasks();
return;
}
}
startItemInfoActivity(info);
});
}
private void startItemInfoActivity(ItemInfo info) {
Intent intent = new Intent(info.getIntent())
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

View File

@@ -170,7 +170,7 @@ public class TaskbarUIController {
*/
public void triggerSecondAppForSplit(ItemInfoWithIcon info, Intent intent, View startingView) {
RecentsView recents = getRecentsView();
recents.findLastActiveTaskAndDoSplitOperation(
recents.findLastActiveTaskAndRunCallback(
info.getTargetComponent(),
(Consumer<Task>) foundTask -> {
if (foundTask != null) {

View File

@@ -1275,14 +1275,14 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
}
/**
* Pulls the list of active Tasks from RecentModel, and finds the most recently active Task
* Pulls the list of active Tasks from RecentsModel, and finds the most recently active Task
* matching a given ComponentName. Then uses that Task (which could be null) with the given
* callback.
*
* Used in various splitscreen operations when we need to check if there is a currently running
* Task of a certain type and use the most recent one.
* Used in various task-switching or splitscreen operations when we need to check if there is a
* currently running Task of a certain type and use the most recent one.
*/
public void findLastActiveTaskAndDoSplitOperation(ComponentName componentName,
public void findLastActiveTaskAndRunCallback(ComponentName componentName,
Consumer<Task> callback) {
mModel.getTasks(taskGroups -> {
Task lastActiveTask = null;