Ignore taskbar launch request if app(s) are already running
This CL fixes several issues:
- When launching an app pair on top of the exact same app pair, Overview no longer enters a broken state
- When launching another app quickly after launching an app pair, splitscreen no longer breaks
Fixes: 315190686
Test: Launch app pair and then launch same app pair again from Taskbar -- Overview does not break
Flag: ACONFIG com.android.wm.shell.enable_app_pairs DEVELOPMENT
Change-Id: I0d474dd89359e1a10a881c5cf8deee64754219c3
diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
index f981610..535c8ec 100644
--- a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
@@ -105,6 +105,13 @@
}
@Override
+ protected boolean isInOverview() {
+ TopTaskTracker.CachedTaskInfo topTask = TopTaskTracker.INSTANCE
+ .get(mControllers.taskbarActivityContext).getCachedTopTask(true);
+ return topTask.isRecentsTask();
+ }
+
+ @Override
public RecentsView getRecentsView() {
return mRecentsActivity.getOverviewPanel();
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index fb25ec1..eff6e27 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -42,7 +42,9 @@
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
+import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
@@ -130,10 +132,13 @@
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider;
import java.io.PrintWriter;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
import java.util.function.Consumer;
+import java.util.stream.Collectors;
/**
* The {@link ActivityContext} with which we inflate Taskbar-related Views. This allows UI elements
@@ -1147,15 +1152,25 @@
@Nullable Task foundTask = foundTasks[0];
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;
+ if (foundTaskView != null) {
+ // The foundTaskView contains the 1-2 taskIds we are looking for.
+ // If we are already in-app and running the correct tasks, no need
+ // to do anything.
+ if (FeatureFlags.enableAppPairs()
+ && isAlreadyInApp(foundTaskView.getTaskIds())) {
+ return;
+ }
+ // If we are in Overview and the TaskView tile is visible, expand that
+ // tile.
+ if (foundTaskView.isVisibleToUser()) {
+ TestLogging.recordEvent(
+ TestProtocol.SEQUENCE_MAIN, "start: taskbarAppIcon");
+ foundTaskView.launchTasks();
+ return;
+ }
}
}
-
+ // If none of the above cases apply, launch a new app or app pair.
if (findExactPairMatch) {
// We did not find the app pair we were looking for, so launch one.
recents.getSplitSelectController().getAppPairsController().launchAppPair(
@@ -1167,6 +1182,27 @@
);
}
+ /**
+ * Checks if a given list of taskIds are all already running in-app.
+ */
+ private boolean isAlreadyInApp(int[] ids) {
+ if (mControllers.uiController.isInOverview()) {
+ return false;
+ }
+
+ RunningTaskInfo[] currentlyRunningTasks = ActivityManagerWrapper.getInstance()
+ .getRunningTasks(false /* filterOnlyVisibleRecents */);
+ Set<Integer> currentlyRunningIds = Arrays.stream(currentlyRunningTasks)
+ .map(task -> task.taskId).collect(Collectors.toSet());
+
+ for (int id : ids) {
+ if (id != ActivityTaskManager.INVALID_TASK_ID && !currentlyRunningIds.contains(id)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
private void startItemInfoActivity(ItemInfo info) {
Intent intent = new Intent(info.getIntent())
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);