Update TestLauncherActivity to send TAPL launcher stopped message

This removes the need for a workaround in LauncherInstrumentation.executeAndWaitForLauncherStop for FallbackRecentsTests with recents window enabled

Flag: com.android.launcher3.enable_fallback_overview_in_window
Bug: 377678992
Test: FallbackRecentsTest
Change-Id: I1b974cb2bfff4c14e99abb96c35dcdff04ed0be7
This commit is contained in:
Schneider Victor-Tulias
2025-05-13 17:06:51 -04:00
committed by Schneider Victor-tulias
parent 66923a912c
commit 9705f8fefa
11 changed files with 72 additions and 31 deletions
@@ -137,6 +137,7 @@ public class FallbackRecentsTest {
getLauncherCommand(mOtherLauncherActivity));
updateHandler.mChangeCounter
.await(DEFAULT_BROADCAST_TIMEOUT_SECS, TimeUnit.SECONDS);
mLauncher.setTestLauncherPackage(mOtherLauncherActivity.packageName);
try {
base.evaluate();
} finally {
@@ -144,6 +145,7 @@ public class FallbackRecentsTest {
TestCommandReceiver.callCommand(TestCommandReceiver.DISABLE_TEST_LAUNCHER);
UiDevice.getInstance(getInstrumentation()).executeShellCommand(
getLauncherCommand(getLauncherInMyProcess()));
mLauncher.setTestLauncherPackage(null);
pressHomeAndWaitForOverviewClose();
}
}
@@ -20,8 +20,12 @@ import static android.content.Intent.CATEGORY_LAUNCHER;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
import static com.android.launcher3.testing.shared.TestProtocol.LAUNCHER_ACTIVITY_STOPPED_MESSAGE;
import android.app.LauncherActivity;
import android.content.Intent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
public class TestLauncherActivity extends LauncherActivity {
@@ -31,4 +35,18 @@ public class TestLauncherActivity extends LauncherActivity {
.addCategory(CATEGORY_LAUNCHER)
.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
}
@Override
protected void onStop() {
super.onStop();
final AccessibilityManager accessibilityManager =
getSystemService(AccessibilityManager.class);
if (accessibilityManager == null || !accessibilityManager.isEnabled()) return;
final AccessibilityEvent e = AccessibilityEvent.obtain(
AccessibilityEvent.TYPE_ANNOUNCEMENT);
e.setClassName(LAUNCHER_ACTIVITY_STOPPED_MESSAGE);
e.setPackageName(getApplicationContext().getPackageName());
accessibilityManager.sendAccessibilityEvent(e);
}
}
@@ -263,7 +263,7 @@ public abstract class Background extends LauncherInstrumentation.VisibleContaine
endY = startY;
}
mLauncher.executeAndWaitForLauncherHidden(
mLauncher.executeAndWaitForLauncherStop(
() -> mLauncher.linearGesture(
startX, startY, endX, endY, 20, false,
LauncherInstrumentation.GestureScope.EXPECT_PILFER),
@@ -276,7 +276,7 @@ public abstract class Background extends LauncherInstrumentation.VisibleContaine
"clicking Recents button for the first time");
mLauncher.getOverview();
mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, SQUARE_BUTTON_EVENT);
mLauncher.executeAndWaitForLauncherHidden(
mLauncher.executeAndWaitForLauncherStop(
() -> recentsButton.click(),
"clicking Recents button for the second time");
}
@@ -167,8 +167,10 @@ public class BaseOverview extends LauncherInstrumentation.VisibleContainer {
final Runnable clickClearAll = () -> mLauncher.clickLauncherObject(
mLauncher.waitForObjectInContainer(verifyActiveContainer(),
clearAllSelector));
if (mLauncher.is3PLauncher()) {
mLauncher.executeAndWaitForLauncherHidden(
// When the recents window is enabled, there is no RecentsActivity to send
// LAUNCHER_ACTIVITY_STOPPED_MESSAGE in the 3P launcher case.
if (mLauncher.is3PLauncher() && !mLauncher.isRecentsWindowEnabled()) {
mLauncher.executeAndWaitForLauncherStop(
clickClearAll,
"clicking 'Clear All'");
} else {
@@ -512,7 +514,7 @@ public class BaseOverview extends LauncherInstrumentation.VisibleContainer {
mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, EVENT_ENTER_UP);
mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, TASK_START_EVENT);
mLauncher.executeAndWaitForLauncherHidden(
mLauncher.executeAndWaitForLauncherStop(
() -> mLauncher.assertTrue(
"Failed to press enter",
mLauncher.getDevice().pressKeyCode(KeyEvent.KEYCODE_ENTER)),
@@ -224,7 +224,7 @@ public final class KeyboardQuickSwitch {
if (expectedPackageName == null || !mIsHomeState) {
mLauncher.unpressKeyCode(KeyEvent.KEYCODE_ALT_LEFT, 0);
} else {
mLauncher.executeAndWaitForLauncherHidden(
mLauncher.executeAndWaitForLauncherStop(
() -> mLauncher.unpressKeyCode(KeyEvent.KEYCODE_ALT_LEFT, 0),
"unpressing left alt");
}
@@ -63,7 +63,7 @@ public abstract class Launchable {
+ mLauncher.getVisibleBounds(mObject));
if (launcherStopsAfterLaunch()) {
mLauncher.executeAndWaitForLauncherHidden(
mLauncher.executeAndWaitForLauncherStop(
() -> mLauncher.clickLauncherObject(mObject),
"clicking the launchable");
} else {
@@ -96,7 +96,7 @@ public abstract class Launchable {
+ mObject.getVisibleCenter() + " in " + mLauncher.getVisibleBounds(
mObject));
mLauncher.executeAndWaitForLauncherHidden(
mLauncher.executeAndWaitForLauncherStop(
() -> mLauncher.clickLauncherObject(mObject),
"clicking the launchable");
@@ -157,7 +157,7 @@ public final class LaunchedAppState extends Background {
int endX = startX;
int endY = startY - taskbarFromNavThreshold;
mLauncher.executeAndWaitForLauncherHidden(
mLauncher.executeAndWaitForLauncherStop(
() -> mLauncher.linearGesture(startX, startY, endX, endY, 10,
/* slowDown= */ true,
LauncherInstrumentation.GestureScope.EXPECT_PILFER),
@@ -121,6 +121,7 @@ public final class LauncherInstrumentation {
private static final Pattern EVENT_ON_BACK_INVOKED = Pattern.compile("onBackInvoked");
private final String mLauncherPackage;
@Nullable private String mTestLauncherPackage;
private Boolean mIsLauncher3;
private long mTestStartTime = -1;
@@ -1121,13 +1122,37 @@ public final class LauncherInstrumentation {
getBoolean(TestProtocol.TEST_INFO_RESPONSE_FIELD);
}
Parcelable executeAndWaitForLauncherEvent(Runnable command,
UiAutomation.AccessibilityEventFilter eventFilter, Supplier<String> message,
Parcelable executeAndWaitForLauncherEvent(
Runnable command,
UiAutomation.AccessibilityEventFilter eventFilter,
Supplier<String> message,
String actionName) {
return executeAndWaitForLauncherEvent(command, eventFilter, message, actionName, null);
}
private Parcelable executeAndWaitForLauncherEvent(
Runnable command,
UiAutomation.AccessibilityEventFilter eventFilter,
Supplier<String> message,
String actionName,
@Nullable String launcherPackageOverride) {
log("executeAndWaitForLauncherEvent: launcherPackageOverride=" + launcherPackageOverride);
return executeAndWaitForEvent(
command,
e -> mLauncherPackage.equals(e.getPackageName()) && eventFilter.accept(e),
message, actionName);
e -> {
CharSequence eventPackageName = e.getPackageName();
return (launcherPackageOverride != null
? launcherPackageOverride.equals(eventPackageName)
: mLauncherPackage.equals(eventPackageName))
&& eventFilter.accept(e);
},
message,
actionName);
}
public void setTestLauncherPackage(@Nullable String testLauncherPackage) {
log("Setting mTestLauncherPackage=" + testLauncherPackage);
mTestLauncherPackage = testLauncherPackage;
}
Parcelable executeAndWaitForEvent(Runnable command,
@@ -1149,20 +1174,14 @@ public final class LauncherInstrumentation {
}
}
void executeAndWaitForLauncherHidden(Runnable command, String actionName) {
// Since LAUNCHER_ACTIVITY_STOPPED_MESSAGE is only ever sent from Launcher.onStop or
// RecentsActivity.onStop, we never receive this signal on 3P launchers with recents
// window enabled. So, instead we should wait for the recent window's state manager to
// report the normal state.
if (is3PLauncher() && isRecentsWindowEnabled()) {
runToState(command, NORMAL_STATE_ORDINAL, actionName);
} else {
executeAndWaitForLauncherEvent(
() -> command.run(),
event -> TestProtocol.LAUNCHER_ACTIVITY_STOPPED_MESSAGE
.equals(event.getClassName().toString()),
() -> "Launcher activity didn't stop", actionName);
}
void executeAndWaitForLauncherStop(Runnable command, String actionName) {
executeAndWaitForLauncherEvent(
command,
event -> TestProtocol.LAUNCHER_ACTIVITY_STOPPED_MESSAGE
.equals(event.getClassName().toString()),
() -> "Launcher activity didn't stop",
actionName,
isRecentsWindowEnabled() ? mTestLauncherPackage : null);
}
/**
@@ -245,7 +245,7 @@ public final class OverviewTask {
public LaunchedAppState open() {
try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck()) {
verifyActiveContainer();
mLauncher.executeAndWaitForLauncherHidden(
mLauncher.executeAndWaitForLauncherStop(
() -> mLauncher.clickLauncherObject(mTask),
"clicking an overview task");
if (mOverview.getContainerType()
@@ -103,7 +103,7 @@ public class OverviewTaskMenu {
try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck();
LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
"before tapping the app info menu item")) {
mLauncher.executeAndWaitForLauncherHidden(
mLauncher.executeAndWaitForLauncherStop(
() -> mLauncher.clickLauncherObject(
mLauncher.findObjectInContainer(mMenu, By.text("App info"))),
"tapped app info menu item");
@@ -144,7 +144,7 @@ public class OverviewTaskMenu {
try (LauncherInstrumentation.Closable ignored = mLauncher.eventsCheck();
LauncherInstrumentation.Closable ignored1 = mLauncher.addContextLayer(
"before tapping the desktop menu item")) {
mLauncher.executeAndWaitForLauncherHidden(
mLauncher.executeAndWaitForLauncherStop(
() -> mLauncher.clickLauncherObject(
mLauncher.findObjectInContainer(mMenu, By.text("Desktop"))),
"tapped desktop menu item");
@@ -555,7 +555,7 @@ public final class Workspace extends Home {
private static void dropDraggedIcon(LauncherInstrumentation launcher, Point dest, long downTime,
@Nullable Runnable expectedEvents, boolean startsActivity) {
if (startsActivity) {
launcher.executeAndWaitForLauncherHidden(
launcher.executeAndWaitForLauncherStop(
() -> sendUp(launcher, dest, downTime),
"sending UP event");
} else {