From a4e5a9eebe328a1cec7ced783f796bf9db0a90c4 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Wed, 6 Apr 2022 12:31:34 -0700 Subject: [PATCH] Prevent double selection of second split app * Also fix small other bug where we were checking only for LauncherState OVERVIEW_SPLIT_SELECT and not for equivalent 3P RecentsState Fixes: 227419997 Test: Repro steps don't cause bug. Yay. Change-Id: Ibb8238185b959d22d8455b6812d29b2e268d9739 --- .../fallback/FallbackRecentsView.java | 5 +++ .../util/SplitSelectStateController.java | 36 +++++++++++++++---- .../quickstep/views/LauncherRecentsView.java | 5 +++ .../android/quickstep/views/RecentsView.java | 27 +++++++++++--- .../com/android/quickstep/views/TaskView.java | 14 +++----- 5 files changed, 68 insertions(+), 19 deletions(-) diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index eda2c5adfe..48af802ff8 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -268,4 +268,9 @@ public class FallbackRecentsView extends RecentsView callback) { - mSecondTaskId = task.key.id; + public void launchSplitTasks(Consumer callback) { final Intent fillInIntent; if (mInitialTaskIntent != null) { fillInIntent = new Intent(); if (TextUtils.equals(mInitialTaskIntent.getComponent().getPackageName(), - task.getTopComponent().getPackageName())) { + mSecondTaskPackageName)) { fillInIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); } } else { @@ -124,6 +125,18 @@ public class SplitSelectStateController { callback, false /* freezeTaskList */, DEFAULT_SPLIT_RATIO); } + + /** + * To be called as soon as user selects the second task (even if animations aren't complete) + * @param task The second task that will be launched. + */ + public void setSecondTask(Task task) { + mSecondTaskId = task.key.id; + if (mInitialTaskIntent != null) { + mSecondTaskPackageName = task.getTopComponent().getPackageName(); + } + } + /** * To be called when we want to launch split pairs from an existing GroupedTaskView. */ @@ -303,7 +316,18 @@ public class SplitSelectStateController { * chosen */ public boolean isSplitSelectActive() { - return (mInitialTaskId != INVALID_TASK_ID || mInitialTaskIntent != null) - && mSecondTaskId == INVALID_TASK_ID; + return isInitialTaskIntentSet() && mSecondTaskId == INVALID_TASK_ID; + } + + /** + * @return {@code true} if the first and second task have been chosen and split is waiting to + * be launched + */ + public boolean isBothSplitAppsConfirmed() { + return isInitialTaskIntentSet() && mSecondTaskId != INVALID_TASK_ID; + } + + private boolean isInitialTaskIntentSet() { + return (mInitialTaskId != INVALID_TASK_ID || mInitialTaskIntent != null); } } diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 8d717d2ec6..45aaf356cf 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -181,4 +181,9 @@ public class LauncherRecentsView extends RecentsView - mSplitSelectStateController.setSecondTask( - task, aBoolean1 -> RecentsView.this.resetFromSplitSelectionState())); + mSplitSelectStateController.launchSplitTasks( + aBoolean1 -> RecentsView.this.resetFromSplitSelectionState())); if (containerTaskView.containsMultipleTasks()) { // If we are launching from a child task, then only hide the thumbnail itself mSecondSplitHiddenView = thumbnailView; @@ -4037,6 +4055,7 @@ public abstract class RecentsView