From 9a7b6f972b3dd83c7027bd2d66c56ed810b0112e Mon Sep 17 00:00:00 2001 From: Jeremy Sim Date: Mon, 18 Dec 2023 18:12:23 +0900 Subject: [PATCH] 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 --- .../taskbar/FallbackTaskbarUIController.java | 7 +++ .../taskbar/TaskbarActivityContext.java | 50 ++++++++++++++++--- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java index f9816102d4..535c8ecec6 100644 --- a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java @@ -104,6 +104,13 @@ public class FallbackTaskbarUIController extends TaskbarUIController { } } + @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 fb25ec12d7..eff6e27898 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -42,7 +42,9 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_V 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.updates.RotationChangeProvider; 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 @@ public class TaskbarActivityContext extends BaseTaskbarContext { @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 @@ public class TaskbarActivityContext extends BaseTaskbarContext { ); } + /** + * 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 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);