From 9705f8fefa102653aade8fddec147a24bf72aba6 Mon Sep 17 00:00:00 2001 From: Schneider Victor-Tulias Date: Tue, 13 May 2025 17:06:51 -0400 Subject: [PATCH] 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 --- .../quickstep/FallbackRecentsTest.java | 2 + .../testcomponent/TestLauncherActivity.java | 18 ++++++ .../android/launcher3/tapl/Background.java | 4 +- .../android/launcher3/tapl/BaseOverview.java | 8 ++- .../launcher3/tapl/KeyboardQuickSwitch.java | 2 +- .../android/launcher3/tapl/Launchable.java | 4 +- .../launcher3/tapl/LaunchedAppState.java | 2 +- .../tapl/LauncherInstrumentation.java | 55 +++++++++++++------ .../android/launcher3/tapl/OverviewTask.java | 2 +- .../launcher3/tapl/OverviewTaskMenu.java | 4 +- .../com/android/launcher3/tapl/Workspace.java | 2 +- 11 files changed, 72 insertions(+), 31 deletions(-) diff --git a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java index 517e4a1a17..234a3c6899 100644 --- a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java +++ b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java @@ -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(); } } diff --git a/tests/src/com/android/launcher3/testcomponent/TestLauncherActivity.java b/tests/src/com/android/launcher3/testcomponent/TestLauncherActivity.java index 357a2322d2..b23f3d705f 100644 --- a/tests/src/com/android/launcher3/testcomponent/TestLauncherActivity.java +++ b/tests/src/com/android/launcher3/testcomponent/TestLauncherActivity.java @@ -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); + } } diff --git a/tests/tapl/com/android/launcher3/tapl/Background.java b/tests/tapl/com/android/launcher3/tapl/Background.java index 784ffb2312..512db394ac 100644 --- a/tests/tapl/com/android/launcher3/tapl/Background.java +++ b/tests/tapl/com/android/launcher3/tapl/Background.java @@ -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"); } diff --git a/tests/tapl/com/android/launcher3/tapl/BaseOverview.java b/tests/tapl/com/android/launcher3/tapl/BaseOverview.java index 802060d64c..5925d01a9f 100644 --- a/tests/tapl/com/android/launcher3/tapl/BaseOverview.java +++ b/tests/tapl/com/android/launcher3/tapl/BaseOverview.java @@ -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)), diff --git a/tests/tapl/com/android/launcher3/tapl/KeyboardQuickSwitch.java b/tests/tapl/com/android/launcher3/tapl/KeyboardQuickSwitch.java index bb5e3000a5..7cb26142a5 100644 --- a/tests/tapl/com/android/launcher3/tapl/KeyboardQuickSwitch.java +++ b/tests/tapl/com/android/launcher3/tapl/KeyboardQuickSwitch.java @@ -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"); } diff --git a/tests/tapl/com/android/launcher3/tapl/Launchable.java b/tests/tapl/com/android/launcher3/tapl/Launchable.java index 2f36a50577..c40e5a93d8 100644 --- a/tests/tapl/com/android/launcher3/tapl/Launchable.java +++ b/tests/tapl/com/android/launcher3/tapl/Launchable.java @@ -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"); diff --git a/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java b/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java index d3467ca725..3e4cf80941 100644 --- a/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java +++ b/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java @@ -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), diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index f03d4771c7..56a9a94d5a 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -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 message, + Parcelable executeAndWaitForLauncherEvent( + Runnable command, + UiAutomation.AccessibilityEventFilter eventFilter, + Supplier message, String actionName) { + return executeAndWaitForLauncherEvent(command, eventFilter, message, actionName, null); + } + + private Parcelable executeAndWaitForLauncherEvent( + Runnable command, + UiAutomation.AccessibilityEventFilter eventFilter, + Supplier 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); } /** diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java index ceb28dd982..8049ec6ebf 100644 --- a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java +++ b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java @@ -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() diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java index 601853f25d..5b7529a5e9 100644 --- a/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java +++ b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java @@ -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"); diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java index 095fcb88bb..68c7049a11 100644 --- a/tests/tapl/com/android/launcher3/tapl/Workspace.java +++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java @@ -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 {