Consistently checking state change messages
Checking for events whenever Launcher sends them.
Checking for correct events (final events, not for events from
intermediate state changes).
This should simplify diagnosing of bugs involving TAPL.
This is also supposed to fix Fallback overview tests.
Bug: 143488140
Change-Id: If053ed808ec71bf2b652ab680be5bdfe9ff8cbb9
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java
index e0e20ee..3f5179f 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java
@@ -18,6 +18,7 @@
import static com.android.launcher3.QuickstepAppTransitionManagerImpl.RECENTS_LAUNCH_DURATION;
import static com.android.launcher3.QuickstepAppTransitionManagerImpl.STATUS_BAR_TRANSITION_DURATION;
import static com.android.launcher3.QuickstepAppTransitionManagerImpl.STATUS_BAR_TRANSITION_PRE_DELAY;
+import static com.android.launcher3.testing.TestProtocol.OVERVIEW_STATE_ORDINAL;
import static com.android.quickstep.TaskUtils.taskIsATargetWithMode;
import static com.android.quickstep.TaskViewUtils.getRecentsWindowAnimator;
import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING;
@@ -38,6 +39,7 @@
import com.android.launcher3.LauncherAnimationRunner;
import com.android.launcher3.R;
import com.android.launcher3.anim.Interpolators;
+import com.android.launcher3.compat.AccessibilityManagerCompat;
import com.android.launcher3.util.ObjectWrapper;
import com.android.launcher3.views.BaseDragLayer;
import com.android.quickstep.fallback.FallbackRecentsView;
@@ -217,6 +219,12 @@
mFallbackRecentsView.reset();
}
+ @Override
+ protected void onResume() {
+ super.onResume();
+ AccessibilityManagerCompat.sendStateEventToTest(getBaseContext(), OVERVIEW_STATE_ORDINAL);
+ }
+
public void onTaskLaunched() {
mFallbackRecentsView.resetTaskVisuals();
}
diff --git a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java
index 85cffaa..abd2180 100644
--- a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java
+++ b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java
@@ -31,6 +31,8 @@
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.launcher3.util.rule.ShellCommandRule.disableHeadsUpNotification;
import static com.android.launcher3.util.rule.ShellCommandRule.getLauncherCommand;
+import static com.android.launcher3.util.rule.TestStabilityRule.LOCAL;
+import static com.android.launcher3.util.rule.TestStabilityRule.UNBUNDLED_POSTSUBMIT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -57,10 +59,10 @@
import com.android.launcher3.testcomponent.TestCommandReceiver;
import com.android.launcher3.util.Wait;
import com.android.launcher3.util.rule.FailureWatcher;
+import com.android.launcher3.util.rule.TestStabilityRule;
import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch;
import com.android.quickstep.views.RecentsView;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.RuleChain;
@@ -130,7 +132,7 @@
@NavigationModeSwitch
@Test
- @Ignore // b/143488140
+ @TestStabilityRule.Stability(flavors = LOCAL | UNBUNDLED_POSTSUBMIT) // b/143488140
public void goToOverviewFromHome() {
mDevice.pressHome();
assertTrue("Fallback Launcher not visible", mDevice.wait(Until.hasObject(By.pkg(
@@ -141,7 +143,7 @@
@NavigationModeSwitch
@Test
- @Ignore // b/143488140
+ @TestStabilityRule.Stability(flavors = LOCAL | UNBUNDLED_POSTSUBMIT) // b/143488140
public void goToOverviewFromApp() {
startAppFastAndWaitForRecentTask(resolveSystemApp(Intent.CATEGORY_APP_CALCULATOR));
@@ -176,7 +178,7 @@
@NavigationModeSwitch
@Test
- @Ignore // b/143488140
+ @TestStabilityRule.Stability(flavors = LOCAL | UNBUNDLED_POSTSUBMIT) // b/143488140
public void testOverview() {
startAppFastAndWaitForRecentTask(getAppPackageName());
startAppFastAndWaitForRecentTask(resolveSystemApp(Intent.CATEGORY_APP_CALCULATOR));
diff --git a/tests/tapl/com/android/launcher3/tapl/Background.java b/tests/tapl/com/android/launcher3/tapl/Background.java
index 6583d32..d9ae778 100644
--- a/tests/tapl/com/android/launcher3/tapl/Background.java
+++ b/tests/tapl/com/android/launcher3/tapl/Background.java
@@ -17,6 +17,7 @@
package com.android.launcher3.tapl;
import static com.android.launcher3.testing.TestProtocol.BACKGROUND_APP_STATE_ORDINAL;
+import static com.android.launcher3.testing.TestProtocol.OVERVIEW_STATE_ORDINAL;
import android.graphics.Point;
import android.os.SystemClock;
@@ -54,13 +55,13 @@
try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
"want to switch from background to overview")) {
verifyActiveContainer();
- goToOverviewUnchecked(BACKGROUND_APP_STATE_ORDINAL);
+ goToOverviewUnchecked();
return mLauncher.isFallbackOverview() ?
new BaseOverview(mLauncher) : new Overview(mLauncher);
}
}
- protected void goToOverviewUnchecked(int expectedState) {
+ protected void goToOverviewUnchecked() {
switch (mLauncher.getNavigationModel()) {
case ZERO_BUTTON: {
final int centerX = mLauncher.getDevice().getDisplayWidth() / 2;
@@ -81,9 +82,11 @@
start,
end),
event -> TestProtocol.PAUSE_DETECTED_MESSAGE.equals(event.getClassName()),
- "Pause wasn't detected");
- mLauncher.sendPointer(
- downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, end);
+ () -> "Pause wasn't detected");
+ mLauncher.runToState(
+ () -> mLauncher.sendPointer(
+ downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, end),
+ OVERVIEW_STATE_ORDINAL);
break;
}
@@ -105,17 +108,14 @@
startY = endY = mLauncher.getDevice().getDisplayHeight() / 2;
}
- if (mLauncher.isFallbackOverview()) {
- mLauncher.linearGesture(startX, startY, endX, endY, 10, false);
- new BaseOverview(mLauncher);
- } else {
- mLauncher.swipeToState(startX, startY, endX, endY, 10, expectedState);
- }
+ mLauncher.swipeToState(startX, startY, endX, endY, 10, OVERVIEW_STATE_ORDINAL);
break;
}
case THREE_BUTTON:
- mLauncher.waitForSystemUiObject("recent_apps").click();
+ mLauncher.runToState(
+ () -> mLauncher.waitForSystemUiObject("recent_apps").click(),
+ OVERVIEW_STATE_ORDINAL);
break;
}
}
@@ -167,7 +167,7 @@
case THREE_BUTTON:
// Double press the recents button.
UiObject2 recentsButton = mLauncher.waitForSystemUiObject("recent_apps");
- recentsButton.click();
+ mLauncher.runToState(() -> recentsButton.click(), OVERVIEW_STATE_ORDINAL);
mLauncher.getOverview();
recentsButton.click();
break;
diff --git a/tests/tapl/com/android/launcher3/tapl/Home.java b/tests/tapl/com/android/launcher3/tapl/Home.java
index e0fe933..1e4d937 100644
--- a/tests/tapl/com/android/launcher3/tapl/Home.java
+++ b/tests/tapl/com/android/launcher3/tapl/Home.java
@@ -16,7 +16,6 @@
package com.android.launcher3.tapl;
-import static com.android.launcher3.testing.TestProtocol.OVERVIEW_STATE_ORDINAL;
import static com.android.launcher3.testing.TestProtocol.QUICK_SWITCH_STATE_ORDINAL;
import androidx.annotation.NonNull;
@@ -52,7 +51,7 @@
try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
"want to switch from home to overview")) {
verifyActiveContainer();
- goToOverviewUnchecked(OVERVIEW_STATE_ORDINAL);
+ goToOverviewUnchecked();
try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer(
"performed the switch action")) {
return new Overview(mLauncher);
diff --git a/tests/tapl/com/android/launcher3/tapl/Launchable.java b/tests/tapl/com/android/launcher3/tapl/Launchable.java
index df80a51..6881197 100644
--- a/tests/tapl/com/android/launcher3/tapl/Launchable.java
+++ b/tests/tapl/com/android/launcher3/tapl/Launchable.java
@@ -56,7 +56,7 @@
mLauncher.executeAndWaitForEvent(
() -> mObject.click(),
event -> event.getEventType() == TYPE_WINDOW_STATE_CHANGED,
- "Launching an app didn't open a new window: " + mObject.getText());
+ () -> "Launching an app didn't open a new window: " + mObject.getText());
mLauncher.assertTrue(
"App didn't start: " + selector,
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index 727d757..2fea1b7 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -22,7 +22,6 @@
import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
import static com.android.launcher3.tapl.TestHelpers.getOverviewPackageName;
-import static com.android.launcher3.testing.TestProtocol.BACKGROUND_APP_STATE_ORDINAL;
import static com.android.launcher3.testing.TestProtocol.NORMAL_STATE_ORDINAL;
import android.app.ActivityManager;
@@ -78,6 +77,8 @@
import java.util.concurrent.TimeoutException;
import java.util.function.Consumer;
import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
/**
* The main tapl object. The only object that can be explicitly constructed by the using code. It
@@ -510,7 +511,7 @@
}
Parcelable executeAndWaitForEvent(Runnable command,
- UiAutomation.AccessibilityEventFilter eventFilter, String message) {
+ UiAutomation.AccessibilityEventFilter eventFilter, Supplier<String> message) {
try {
final AccessibilityEvent event =
mInstrumentation.getUiAutomation().executeAndWaitForEvent(
@@ -518,7 +519,7 @@
assertNotNull("executeAndWaitForEvent returned null (this can't happen)", event);
return event.getParcelableData();
} catch (TimeoutException e) {
- fail(message);
+ fail(message.get());
return null;
}
}
@@ -557,15 +558,12 @@
log("Hierarchy before swiping up to home");
dumpViewHierarchy();
log(action = "swiping up to home from " + getVisibleStateMessage());
- final int finalState = mDevice.hasObject(By.pkg(getLauncherPackageName()))
- || isFallbackOverview()
- ? NORMAL_STATE_ORDINAL : BACKGROUND_APP_STATE_ORDINAL;
try (LauncherInstrumentation.Closable c = addContextLayer(action)) {
swipeToState(
displaySize.x / 2, displaySize.y - 1,
displaySize.x / 2, 0,
- ZERO_BUTTON_STEPS_FROM_BACKGROUND_TO_HOME, finalState);
+ ZERO_BUTTON_STEPS_FROM_BACKGROUND_TO_HOME, NORMAL_STATE_ORDINAL);
}
}
} else {
@@ -576,7 +574,7 @@
waitForSystemUiObject("home").click();
},
event -> true,
- "Pressing Home didn't produce any events");
+ () -> "Pressing Home didn't produce any events");
mDevice.waitForIdle();
}
try (LauncherInstrumentation.Closable c = addContextLayer(
@@ -771,14 +769,38 @@
return mDevice;
}
+ private static String eventListToString(List<Integer> actualEvents) {
+ if (actualEvents.isEmpty()) return "no events";
+
+ return "["
+ + actualEvents.stream()
+ .map(state -> TestProtocol.stateOrdinalToString(state))
+ .collect(Collectors.joining(", "))
+ + "]";
+ }
+
+ void runToState(Runnable command, int expectedState) {
+ final List<Integer> actualEvents = new ArrayList<>();
+ executeAndWaitForEvent(
+ command,
+ event -> isSwitchToStateEvent(event, expectedState, actualEvents),
+ () -> "Failed to receive an event for the swipe end: expected "
+ + TestProtocol.stateOrdinalToString(expectedState)
+ + ", actual: " + eventListToString(actualEvents));
+ }
+
+ private boolean isSwitchToStateEvent(
+ AccessibilityEvent event, int expectedState, List<Integer> actualEvents) {
+ if (!TestProtocol.SWITCHED_TO_STATE_MESSAGE.equals(event.getClassName())) return false;
+
+ final Bundle parcel = (Bundle) event.getParcelableData();
+ final int actualState = parcel.getInt(TestProtocol.STATE_FIELD);
+ actualEvents.add(actualState);
+ return actualState == expectedState;
+ }
+
void swipeToState(int startX, int startY, int endX, int endY, int steps, int expectedState) {
- final Bundle parcel = (Bundle) executeAndWaitForEvent(
- () -> linearGesture(startX, startY, endX, endY, steps, false),
- event -> TestProtocol.SWITCHED_TO_STATE_MESSAGE.equals(event.getClassName()),
- "Swipe failed to receive an event for the swipe end");
- assertEquals("Swipe switched launcher to a wrong state;",
- TestProtocol.stateOrdinalToString(expectedState),
- TestProtocol.stateOrdinalToString(parcel.getInt(TestProtocol.STATE_FIELD)));
+ runToState(() -> linearGesture(startX, startY, endX, endY, steps, false), expectedState);
}
int getBottomGestureSize() {
@@ -864,7 +886,7 @@
executeAndWaitForEvent(
() -> linearGesture(startX, startY, endX, endY, steps, slowDown),
event -> TestProtocol.SCROLL_FINISHED_MESSAGE.equals(event.getClassName()),
- "Didn't receive a scroll end message: " + startX + ", " + startY
+ () -> "Didn't receive a scroll end message: " + startX + ", " + startY
+ ", " + endX + ", " + endY);
}
diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
index 2ee424b..46f8ba5 100644
--- a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
+++ b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
@@ -67,8 +67,8 @@
mLauncher.executeAndWaitForEvent(
() -> mTask.click(),
event -> event.getEventType() == TYPE_WINDOW_STATE_CHANGED,
- "Launching task didn't open a new window: " +
- mTask.getParent().getContentDescription());
+ () -> "Launching task didn't open a new window: "
+ + mTask.getParent().getContentDescription());
}
return new Background(mLauncher);
}
diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java
index 81d343d..8a53ef1 100644
--- a/tests/tapl/com/android/launcher3/tapl/Workspace.java
+++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java
@@ -17,6 +17,8 @@
package com.android.launcher3.tapl;
import static com.android.launcher3.testing.TestProtocol.ALL_APPS_STATE_ORDINAL;
+import static com.android.launcher3.testing.TestProtocol.NORMAL_STATE_ORDINAL;
+import static com.android.launcher3.testing.TestProtocol.SPRING_LOADED_STATE_ORDINAL;
import static junit.framework.TestCase.assertTrue;
@@ -165,14 +167,21 @@
LauncherInstrumentation.log("dragIconToWorkspace: begin");
final Point launchableCenter = launchable.getObject().getVisibleCenter();
final long downTime = SystemClock.uptimeMillis();
- launcher.sendPointer(downTime, downTime, MotionEvent.ACTION_DOWN, launchableCenter);
- LauncherInstrumentation.log("dragIconToWorkspace: sent down");
- launcher.waitForLauncherObject(longPressIndicator);
- LauncherInstrumentation.log("dragIconToWorkspace: indicator");
- launcher.movePointer(launchableCenter, dest, 10, downTime, true);
+ launcher.runToState(
+ () -> {
+ launcher.sendPointer(downTime, downTime, MotionEvent.ACTION_DOWN,
+ launchableCenter);
+ LauncherInstrumentation.log("dragIconToWorkspace: sent down");
+ launcher.waitForLauncherObject(longPressIndicator);
+ LauncherInstrumentation.log("dragIconToWorkspace: indicator");
+ launcher.movePointer(launchableCenter, dest, 10, downTime, true);
+ },
+ SPRING_LOADED_STATE_ORDINAL);
LauncherInstrumentation.log("dragIconToWorkspace: moved pointer");
- launcher.sendPointer(
- downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, dest);
+ launcher.runToState(
+ () -> launcher.sendPointer(
+ downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, dest),
+ NORMAL_STATE_ORDINAL);
LauncherInstrumentation.log("dragIconToWorkspace: end");
launcher.waitUntilGone("drop_target_bar");
}