diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java index f58fd4547d..5caf0045cb 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java @@ -32,6 +32,7 @@ import com.android.quickstep.util.DesktopTask; import com.android.quickstep.util.GroupTask; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; +import com.android.systemui.shared.system.ActivityManagerWrapper; import java.io.PrintWriter; import java.util.ArrayList; @@ -115,8 +116,15 @@ public final class KeyboardQuickSwitchController implements && desktopController.areFreeformTasksVisible(); if (mModel.isTaskListValid(mTaskListChangeId)) { - mQuickSwitchViewController.openQuickSwitchView(mTasks, - mNumHiddenTasks, /* updateTasks= */ false, currentFocusedIndex, onDesktop); + // When we are opening the KQS with no focus override, check if the first task is + // running. If not, focus that first task. + mQuickSwitchViewController.openQuickSwitchView( + mTasks, + mNumHiddenTasks, + /* updateTasks= */ false, + currentFocusedIndex == -1 && !mControllerCallbacks.isFirstTaskRunning() + ? 0 : currentFocusedIndex, + onDesktop); return; } @@ -126,8 +134,15 @@ public final class KeyboardQuickSwitchController implements } else { processLoadedTasks(tasks); } - mQuickSwitchViewController.openQuickSwitchView(mTasks, - mNumHiddenTasks, /* updateTasks= */ true, currentFocusedIndex, onDesktop); + // Check if the first task is running after the recents model has updated so that we use + // the correct index. + mQuickSwitchViewController.openQuickSwitchView( + mTasks, + mNumHiddenTasks, + /* updateTasks= */ true, + currentFocusedIndex == -1 && !mControllerCallbacks.isFirstTaskRunning() + ? 0 : currentFocusedIndex, + onDesktop); }); } @@ -246,5 +261,20 @@ public final class KeyboardQuickSwitchController implements void onCloseComplete() { mQuickSwitchViewController = null; } + + boolean isTaskRunning(@Nullable GroupTask task) { + if (task == null) { + return false; + } + int runningTaskId = ActivityManagerWrapper.getInstance().getRunningTask().taskId; + Task task2 = task.task2; + + return runningTaskId == task.task1.key.id + || (task2 != null && runningTaskId == task2.key.id); + } + + boolean isFirstTaskRunning() { + return isTaskRunning(getTaskAt(0)); + } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java index b29ce6be14..6e88780ef0 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java @@ -117,9 +117,12 @@ public class KeyboardQuickSwitchViewController { * index will be focused. */ protected int launchFocusedTask() { - // Launch the second-most recent task if the user quick switches too quickly, if possible. - return launchTaskAt(mCurrentFocusIndex == -1 - ? (mControllerCallbacks.getTaskCount() > 1 ? 1 : 0) : mCurrentFocusIndex); + if (mCurrentFocusIndex != -1) { + return launchTaskAt(mCurrentFocusIndex); + } + // If the user quick switches too quickly, updateCurrentFocusIndex might not have run. + return launchTaskAt(mControllerCallbacks.isFirstTaskRunning() + && mControllerCallbacks.getTaskCount() > 1 ? 1 : 0); } private int launchTaskAt(int index) { @@ -134,10 +137,7 @@ public class KeyboardQuickSwitchViewController { if (task == null) { return Math.max(0, index); } - Task task2 = task.task2; - int runningTaskId = ActivityManagerWrapper.getInstance().getRunningTask().taskId; - if (runningTaskId == task.task1.key.id - || (task2 != null && runningTaskId == task2.key.id)) { + if (mControllerCallbacks.isTaskRunning(task)) { // Ignore attempts to run the selected task if it is already running. return -1; } @@ -146,7 +146,7 @@ public class KeyboardQuickSwitchViewController { UI_HELPER_EXECUTOR.execute(() -> SystemUiProxy.INSTANCE.get(mKeyboardQuickSwitchView.getContext()) .showDesktopApp(task.task1.key.id)); - } else if (task2 == null) { + } else if (task.task2 == null) { UI_HELPER_EXECUTOR.execute(() -> ActivityManagerWrapper.getInstance().startActivityFromRecents( task.task1.key, diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java b/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java index 829e54bdff..7191f70c0c 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java @@ -33,7 +33,16 @@ import org.junit.runner.RunWith; public class TaplTestsKeyboardQuickSwitch extends AbstractQuickStepTest { private enum TestSurface { - HOME, LAUNCHED_APP, HOME_ALL_APPS, WIDGETS, + HOME(true), + LAUNCHED_APP(false), + HOME_ALL_APPS(true), + WIDGETS(true); + + private final boolean mInitialFocusAtZero; + + TestSurface(boolean initialFocusAtZero) { + mInitialFocusAtZero = initialFocusAtZero; + } } private enum TestCase { @@ -172,13 +181,22 @@ public class TaplTestsKeyboardQuickSwitch extends AbstractQuickStepTest { kqs.dismiss(); break; case LAUNCH_LAST_APP: - kqs.launchFocusedAppTask(CALCULATOR_APP_PACKAGE); + kqs.launchFocusedAppTask(testSurface.mInitialFocusAtZero + ? getAppPackageName() : CALCULATOR_APP_PACKAGE); break; case LAUNCH_SELECTED_APP: - kqs.moveFocusForward().launchFocusedAppTask(CALCULATOR_APP_PACKAGE); + kqs.moveFocusForward(); + if (testSurface.mInitialFocusAtZero) { + kqs.moveFocusForward(); + } + kqs.launchFocusedAppTask(CALCULATOR_APP_PACKAGE); break; case LAUNCH_OVERVIEW: - kqs.moveFocusBackward().moveFocusBackward().launchFocusedOverviewTask(); + kqs.moveFocusBackward(); + if (!testSurface.mInitialFocusAtZero) { + kqs.moveFocusBackward(); + } + kqs.launchFocusedOverviewTask(); break; default: throw new IllegalStateException("Cannot run test case: " + testCase);