mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-28 07:46:55 +00:00
ACTION_UP is always preceded by ACTION_DOWN which means when launcher receives an UP events, down event is obviously sent. In b/325377690 , we started seeing only in P9 devices the DOWN events didn't reach TAPL. I added InputDispatcher logs which shows both DOWN and UP events are sent by system_server to NexusLauncher. However TAPL doesn't receive it. After spending lot of time debugging this, I think we are safe to remove DOWN event expectation in TAPL. Bug: 325377690 Test: Manual, TAPL presubmits Flag: NA Change-Id: I6d3587c488d45e3dc53d2c1c4f3b6b49285eae94
220 lines
9.5 KiB
Java
220 lines
9.5 KiB
Java
/*
|
|
* Copyright (C) 2023 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package com.android.launcher3.tapl;
|
|
|
|
import static com.android.launcher3.tapl.LauncherInstrumentation.KEYBOARD_QUICK_SWITCH_RES_ID;
|
|
|
|
import android.view.KeyEvent;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
|
|
import com.android.launcher3.testing.shared.TestProtocol;
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
/**
|
|
* Operations on the Keyboard Quick Switch View
|
|
*/
|
|
public final class KeyboardQuickSwitch {
|
|
|
|
private static final Pattern EVENT_ALT_TAB_DOWN = Pattern.compile(
|
|
"KeyboardQuickSwitchView key event: KeyEvent.*?action=ACTION_DOWN.*?keyCode=KEYCODE_TAB"
|
|
+ ".*?metaState=META_ALT_ON");
|
|
private static final Pattern EVENT_ALT_TAB_UP = Pattern.compile(
|
|
"KeyboardQuickSwitchView key event: KeyEvent.*?action=ACTION_UP.*?keyCode=KEYCODE_TAB"
|
|
+ ".*?metaState=META_ALT_ON");
|
|
private static final Pattern EVENT_ALT_SHIFT_TAB_UP = Pattern.compile(
|
|
"KeyboardQuickSwitchView key event: KeyEvent.*?action=ACTION_UP.*?keyCode=KEYCODE_TAB"
|
|
+ ".*?metaState=META_ALT_ON|META_SHIFT_ON");
|
|
private static final Pattern EVENT_ALT_ESC_UP = Pattern.compile(
|
|
"KeyboardQuickSwitchView key event: KeyEvent.*?action=ACTION_UP"
|
|
+ ".*?keyCode=KEYCODE_ESCAPE.*?metaState=META_ALT_ON");
|
|
private static final Pattern EVENT_KQS_ALT_LEFT_UP = Pattern.compile(
|
|
"KeyboardQuickSwitchView key event: KeyEvent.*?action=ACTION_UP"
|
|
+ ".*?keyCode=KEYCODE_ALT_LEFT");
|
|
private static final Pattern EVENT_HOME_ALT_LEFT_UP = Pattern.compile(
|
|
"Key event: KeyEvent.*?action=ACTION_UP"
|
|
+ ".*?keyCode=KEYCODE_ALT_LEFT");
|
|
|
|
private final LauncherInstrumentation mLauncher;
|
|
private final LauncherInstrumentation.ContainerType mStartingContainerType;
|
|
private final boolean mIsHomeState;
|
|
|
|
KeyboardQuickSwitch(
|
|
LauncherInstrumentation launcher,
|
|
LauncherInstrumentation.ContainerType startingContainerType,
|
|
boolean isHomeState) {
|
|
mLauncher = launcher;
|
|
mStartingContainerType = startingContainerType;
|
|
mIsHomeState = isHomeState;
|
|
}
|
|
|
|
/**
|
|
* Focuses the next task in the Keyboard quick switch view.
|
|
* <p>
|
|
* Tasks are ordered left-to-right in LTR, and vice versa in RLT, in a carousel.
|
|
* <ul>
|
|
* <li>If no task has been focused yet, and there is only one task, then that task will be
|
|
* focused</li>
|
|
* <li>If no task has been focused yet, and there are two or more tasks, then the second
|
|
* task will be focused</li>
|
|
* <li>If the currently-focused task is at the end of the list, the first task will be
|
|
* focused</li>
|
|
* </ul>
|
|
*/
|
|
public KeyboardQuickSwitch moveFocusForward() {
|
|
try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer(
|
|
"want to move keyboard quick switch focus forward");
|
|
LauncherInstrumentation.Closable e = mLauncher.eventsCheck()) {
|
|
mLauncher.waitForLauncherObject(KEYBOARD_QUICK_SWITCH_RES_ID);
|
|
mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, EVENT_ALT_TAB_UP);
|
|
mLauncher.assertTrue("Failed to press alt+tab",
|
|
mLauncher.getDevice().pressKeyCode(
|
|
KeyEvent.KEYCODE_TAB, KeyEvent.META_ALT_ON));
|
|
|
|
try (LauncherInstrumentation.Closable c2 = mLauncher.addContextLayer(
|
|
"pressed alt+tab")) {
|
|
mLauncher.waitForLauncherObject(KEYBOARD_QUICK_SWITCH_RES_ID);
|
|
|
|
return this;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Focuses the next task in the Keyboard quick switch view.
|
|
* <p>
|
|
* Tasks are ordered left-to-right in LTR, and vice versa in RLT, in a carousel.
|
|
* <ul>
|
|
* <li>If no task has been focused yet, and there is only one task, then that task will be
|
|
* focused</li>
|
|
* <li>If no task has been focused yet, and there are two or more tasks, then the second
|
|
* task will be focused</li>
|
|
* <li>If the currently-focused task is at the start of the list, the last task will be
|
|
* focused</li>
|
|
* </ul>
|
|
*/
|
|
public KeyboardQuickSwitch moveFocusBackward() {
|
|
try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer(
|
|
"want to move keyboard quick switch focus backward");
|
|
LauncherInstrumentation.Closable e = mLauncher.eventsCheck()) {
|
|
mLauncher.waitForLauncherObject(KEYBOARD_QUICK_SWITCH_RES_ID);
|
|
|
|
mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, EVENT_ALT_SHIFT_TAB_UP);
|
|
mLauncher.assertTrue("Failed to press alt+shift+tab",
|
|
mLauncher.getDevice().pressKeyCode(
|
|
KeyEvent.KEYCODE_TAB,
|
|
KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON));
|
|
|
|
try (LauncherInstrumentation.Closable c2 = mLauncher.addContextLayer(
|
|
"pressed alt+shift+tab")) {
|
|
mLauncher.waitForLauncherObject(KEYBOARD_QUICK_SWITCH_RES_ID);
|
|
|
|
return this;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Dismisses the Keyboard Quick Switch view without launching the focused task.
|
|
* <p>
|
|
* The device will return to the same state it started in before displaying the Keyboard Quick
|
|
* Switch view.
|
|
*/
|
|
public void dismiss() {
|
|
try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer(
|
|
"want to dismiss keyboard quick switch view");
|
|
LauncherInstrumentation.Closable e = mLauncher.eventsCheck()) {
|
|
mLauncher.waitForLauncherObject(KEYBOARD_QUICK_SWITCH_RES_ID);
|
|
|
|
mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, EVENT_ALT_ESC_UP);
|
|
mLauncher.assertTrue("Failed to press alt+tab",
|
|
mLauncher.getDevice().pressKeyCode(
|
|
KeyEvent.KEYCODE_ESCAPE, KeyEvent.META_ALT_ON));
|
|
|
|
try (LauncherInstrumentation.Closable c2 = mLauncher.addContextLayer(
|
|
"pressed alt+esc")) {
|
|
mLauncher.waitUntilLauncherObjectGone(KEYBOARD_QUICK_SWITCH_RES_ID);
|
|
|
|
// Verify the final state is the same as the initial state
|
|
mLauncher.verifyContainerType(mStartingContainerType);
|
|
|
|
// Wait until the device has fully settled before unpressing the key code
|
|
if (mIsHomeState) {
|
|
mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, EVENT_HOME_ALT_LEFT_UP);
|
|
}
|
|
mLauncher.unpressKeyCode(KeyEvent.KEYCODE_ALT_LEFT, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Launches the currently-focused app task.
|
|
* <p>
|
|
* This method should only be used if the focused task is for a recent running app, otherwise
|
|
* use {@link #launchFocusedOverviewTask()}.
|
|
*
|
|
* @param expectedPackageName the package name of the expected launched app
|
|
*/
|
|
public LaunchedAppState launchFocusedAppTask(@NonNull String expectedPackageName) {
|
|
try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck()) {
|
|
return (LaunchedAppState) launchFocusedTask(expectedPackageName);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Launches the currently-focused overview task.
|
|
* <p>
|
|
* This method only should be used if the focused task is for overview, otherwise use
|
|
* {@link #launchFocusedAppTask(String)}.
|
|
*/
|
|
public Overview launchFocusedOverviewTask() {
|
|
try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck()) {
|
|
return (Overview) launchFocusedTask(null);
|
|
}
|
|
}
|
|
|
|
private LauncherInstrumentation.VisibleContainer launchFocusedTask(
|
|
@Nullable String expectedPackageName) {
|
|
try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer(
|
|
"want to launch focused task: "
|
|
+ (expectedPackageName == null ? "Overview" : expectedPackageName))) {
|
|
mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, EVENT_KQS_ALT_LEFT_UP);
|
|
|
|
if (expectedPackageName == null || !mIsHomeState) {
|
|
mLauncher.unpressKeyCode(KeyEvent.KEYCODE_ALT_LEFT, 0);
|
|
} else {
|
|
mLauncher.executeAndWaitForLauncherStop(
|
|
() -> mLauncher.unpressKeyCode(KeyEvent.KEYCODE_ALT_LEFT, 0),
|
|
"unpressing left alt");
|
|
}
|
|
|
|
try (LauncherInstrumentation.Closable c2 = mLauncher.addContextLayer(
|
|
"un-pressed left alt")) {
|
|
mLauncher.waitUntilLauncherObjectGone(KEYBOARD_QUICK_SWITCH_RES_ID);
|
|
|
|
if (expectedPackageName != null) {
|
|
mLauncher.assertAppLaunched(expectedPackageName);
|
|
return mLauncher.getLaunchedAppState();
|
|
} else {
|
|
return mLauncher.getOverview();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|