1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.quickstep; 17 18 import android.content.Intent; 19 20 import androidx.annotation.NonNull; 21 import androidx.test.filters.LargeTest; 22 import androidx.test.runner.AndroidJUnit4; 23 24 import com.android.launcher3.tapl.KeyboardQuickSwitch; 25 import com.android.launcher3.taskbar.KeyboardQuickSwitchController; 26 27 import org.junit.Assume; 28 import org.junit.Test; 29 import org.junit.runner.RunWith; 30 31 @LargeTest 32 @RunWith(AndroidJUnit4.class) 33 public class TaplTestsKeyboardQuickSwitch extends AbstractQuickStepTest { 34 35 private enum TestSurface { 36 HOME(true), 37 LAUNCHED_APP(false), 38 HOME_ALL_APPS(true), 39 WIDGETS(true); 40 41 private final boolean mInitialFocusAtZero; 42 TestSurface(boolean initialFocusAtZero)43 TestSurface(boolean initialFocusAtZero) { 44 mInitialFocusAtZero = initialFocusAtZero; 45 } 46 } 47 48 private enum TestCase { 49 DISMISS(0), 50 LAUNCH_LAST_APP(0), 51 LAUNCH_SELECTED_APP(1), 52 DISMISS_WHEN_GOING_HOME(1), 53 LAUNCH_OVERVIEW(KeyboardQuickSwitchController.MAX_TASKS - 1); 54 55 private final int mNumAdditionalRunningTasks; 56 TestCase(int numAdditionalRunningTasks)57 TestCase(int numAdditionalRunningTasks) { 58 mNumAdditionalRunningTasks = numAdditionalRunningTasks; 59 } 60 } 61 62 private static final String CALCULATOR_APP_PACKAGE = 63 resolveSystemApp(Intent.CATEGORY_APP_CALCULATOR); 64 65 @Override setUp()66 public void setUp() throws Exception { 67 Assume.assumeTrue(mLauncher.isTablet()); 68 super.setUp(); 69 startAppFast(CALCULATOR_APP_PACKAGE); 70 startTestActivity(2); 71 } 72 73 @Test testDismiss_fromHome()74 public void testDismiss_fromHome() { 75 runTest(TestSurface.HOME, TestCase.DISMISS); 76 } 77 78 @Test testDismiss_fromApp()79 public void testDismiss_fromApp() { 80 runTest(TestSurface.LAUNCHED_APP, TestCase.DISMISS); 81 } 82 83 @Test testDismiss_fromHomeAllApps()84 public void testDismiss_fromHomeAllApps() { 85 runTest(TestSurface.HOME_ALL_APPS, TestCase.DISMISS); 86 } 87 88 @Test testDismiss_fromWidgets()89 public void testDismiss_fromWidgets() { 90 runTest(TestSurface.WIDGETS, TestCase.DISMISS); 91 } 92 93 @Test testLaunchLastTask_fromHome()94 public void testLaunchLastTask_fromHome() { 95 runTest(TestSurface.HOME, TestCase.LAUNCH_LAST_APP); 96 } 97 98 @Test testLaunchLastTask_fromApp()99 public void testLaunchLastTask_fromApp() { 100 runTest(TestSurface.LAUNCHED_APP, TestCase.LAUNCH_LAST_APP); 101 } 102 103 @Test testLaunchLastTask_fromHomeAllApps()104 public void testLaunchLastTask_fromHomeAllApps() { 105 runTest(TestSurface.HOME_ALL_APPS, TestCase.LAUNCH_LAST_APP); 106 } 107 108 @Test testLaunchLastTask_fromWidgets()109 public void testLaunchLastTask_fromWidgets() { 110 runTest(TestSurface.WIDGETS, TestCase.LAUNCH_LAST_APP); 111 } 112 113 @Test testLaunchSelectedTask_fromHome()114 public void testLaunchSelectedTask_fromHome() { 115 runTest(TestSurface.HOME, TestCase.LAUNCH_SELECTED_APP); 116 } 117 118 @Test testLaunchSelectedTask_fromApp()119 public void testLaunchSelectedTask_fromApp() { 120 runTest(TestSurface.LAUNCHED_APP, TestCase.LAUNCH_SELECTED_APP); 121 } 122 123 @Test testLaunchSelectedTask_fromHomeAllApps()124 public void testLaunchSelectedTask_fromHomeAllApps() { 125 runTest(TestSurface.HOME_ALL_APPS, TestCase.LAUNCH_SELECTED_APP); 126 } 127 128 @Test testLaunchSelectedTask_fromWidgets()129 public void testLaunchSelectedTask_fromWidgets() { 130 runTest(TestSurface.WIDGETS, TestCase.LAUNCH_SELECTED_APP); 131 } 132 133 @Test testLaunchOverviewTask_fromHome()134 public void testLaunchOverviewTask_fromHome() { 135 runTest(TestSurface.HOME, TestCase.LAUNCH_OVERVIEW); 136 } 137 138 @Test testLaunchOverviewTask_fromApp()139 public void testLaunchOverviewTask_fromApp() { 140 runTest(TestSurface.LAUNCHED_APP, TestCase.LAUNCH_OVERVIEW); 141 } 142 143 @Test testLaunchOverviewTask_fromHomeAllApps()144 public void testLaunchOverviewTask_fromHomeAllApps() { 145 runTest(TestSurface.HOME_ALL_APPS, TestCase.LAUNCH_OVERVIEW); 146 } 147 148 @Test testLaunchOverviewTask_fromWidgets()149 public void testLaunchOverviewTask_fromWidgets() { 150 runTest(TestSurface.WIDGETS, TestCase.LAUNCH_OVERVIEW); 151 } 152 153 @Test testLaunchSingleRecentTask()154 public void testLaunchSingleRecentTask() { 155 mLauncher.getLaunchedAppState().switchToOverview().dismissAllTasks(); 156 startAppFast(CALCULATOR_APP_PACKAGE); 157 mLauncher.goHome().showQuickSwitchView().launchFocusedAppTask(CALCULATOR_APP_PACKAGE); 158 } 159 160 @Test testDismissedWhenGoingHome()161 public void testDismissedWhenGoingHome() { 162 runTest(TestSurface.LAUNCHED_APP, TestCase.DISMISS_WHEN_GOING_HOME); 163 } 164 runTest(@onNull TestSurface testSurface, @NonNull TestCase testCase)165 private void runTest(@NonNull TestSurface testSurface, @NonNull TestCase testCase) { 166 for (int i = 0; i < testCase.mNumAdditionalRunningTasks; i++) { 167 startTestActivity(3 + i); 168 } 169 170 KeyboardQuickSwitch kqs; 171 switch (testSurface) { 172 case HOME: 173 kqs = mLauncher.goHome().showQuickSwitchView(); 174 break; 175 case LAUNCHED_APP: 176 mLauncher.setIgnoreTaskbarVisibility(true); 177 kqs = mLauncher.getLaunchedAppState().showQuickSwitchView(); 178 break; 179 case HOME_ALL_APPS: 180 kqs = mLauncher.goHome().switchToAllApps().showQuickSwitchView(); 181 break; 182 case WIDGETS: 183 kqs = mLauncher.goHome().openAllWidgets().showQuickSwitchView(); 184 break; 185 default: 186 throw new IllegalStateException( 187 "KeyboardQuickSwitch could not be initialized for test surface: " 188 + testSurface); 189 } 190 191 switch (testCase) { 192 case DISMISS: 193 kqs.dismiss(); 194 break; 195 case LAUNCH_LAST_APP: 196 kqs.launchFocusedAppTask(testSurface.mInitialFocusAtZero 197 ? getAppPackageName() : CALCULATOR_APP_PACKAGE); 198 break; 199 case LAUNCH_SELECTED_APP: 200 kqs.moveFocusForward(); 201 if (testSurface.mInitialFocusAtZero) { 202 kqs.moveFocusForward(); 203 } 204 kqs.launchFocusedAppTask(CALCULATOR_APP_PACKAGE); 205 break; 206 case DISMISS_WHEN_GOING_HOME: 207 kqs.dismissByGoingHome(); 208 break; 209 case LAUNCH_OVERVIEW: 210 kqs.moveFocusBackward(); 211 if (!testSurface.mInitialFocusAtZero) { 212 kqs.moveFocusBackward(); 213 } 214 kqs.launchFocusedOverviewTask() 215 // Check that the correct task was focused 216 .launchFocusedTaskByEnterKey(CALCULATOR_APP_PACKAGE); 217 break; 218 default: 219 throw new IllegalStateException("Cannot run test case: " + testCase); 220 } 221 } 222 } 223