diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 8249887d9c..696c3089ab 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1930,7 +1930,7 @@ public class Launcher extends StatefulActivity implements Launche @Override public boolean dispatchKeyEvent(KeyEvent event) { - TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "Key event", event); + TestLogging.recordKeyEvent(TestProtocol.SEQUENCE_MAIN, "Key event", event); return (event.getKeyCode() == KeyEvent.KEYCODE_HOME) || super.dispatchKeyEvent(event); } diff --git a/src/com/android/launcher3/testing/TestInformationHandler.java b/src/com/android/launcher3/testing/TestInformationHandler.java index bc5129d8cf..6f61c0e766 100644 --- a/src/com/android/launcher3/testing/TestInformationHandler.java +++ b/src/com/android/launcher3/testing/TestInformationHandler.java @@ -130,13 +130,18 @@ public class TestInformationHandler implements ResourceBasedOverride { case TestProtocol.REQUEST_IS_TWO_PANELS: response.putBoolean(TestProtocol.TEST_INFO_RESPONSE_FIELD, - mDeviceProfile.isTwoPanels); + mDeviceProfile.isTwoPanels); return response; case TestProtocol.REQUEST_SET_FORCE_PAUSE_TIMEOUT: TestProtocol.sForcePauseTimeout = Long.parseLong(arg); return response; + case TestProtocol.REQUEST_GET_HAD_NONTEST_EVENTS: + response.putBoolean( + TestProtocol.TEST_INFO_RESPONSE_FIELD, TestLogging.sHadEventsNotFromTest); + return response; + default: return null; } diff --git a/src/com/android/launcher3/testing/TestLogging.java b/src/com/android/launcher3/testing/TestLogging.java index 51e081972f..6cdd3ca6cf 100644 --- a/src/com/android/launcher3/testing/TestLogging.java +++ b/src/com/android/launcher3/testing/TestLogging.java @@ -17,6 +17,7 @@ package com.android.launcher3.testing; import android.util.Log; +import android.view.KeyEvent; import android.view.MotionEvent; import com.android.launcher3.Utilities; @@ -25,6 +26,7 @@ import java.util.function.BiConsumer; public final class TestLogging { private static BiConsumer sEventConsumer; + public static boolean sHadEventsNotFromTest; private static void recordEventSlow(String sequence, String event) { Log.d(TestProtocol.TAPL_EVENTS_TAG, sequence + " / " + event); @@ -46,9 +48,17 @@ public final class TestLogging { } } + public static void recordKeyEvent(String sequence, String message, KeyEvent event) { + if (Utilities.IS_RUNNING_IN_TEST_HARNESS) { + recordEventSlow(sequence, message + ": " + event); + if (event.getDeviceId() != -1) sHadEventsNotFromTest = true; + } + } + public static void recordMotionEvent(String sequence, String message, MotionEvent event) { if (Utilities.IS_RUNNING_IN_TEST_HARNESS && event.getAction() != MotionEvent.ACTION_MOVE) { recordEventSlow(sequence, message + ": " + event); + if (event.getDeviceId() != -1) sHadEventsNotFromTest = true; } } diff --git a/src/com/android/launcher3/testing/TestProtocol.java b/src/com/android/launcher3/testing/TestProtocol.java index d73c4b43a6..7d8f4797ce 100644 --- a/src/com/android/launcher3/testing/TestProtocol.java +++ b/src/com/android/launcher3/testing/TestProtocol.java @@ -93,6 +93,7 @@ public final class TestProtocol { public static final String REQUEST_RECENT_TASKS_LIST = "recent-tasks-list"; public static final String REQUEST_START_EVENT_LOGGING = "start-event-logging"; public static final String REQUEST_GET_TEST_EVENTS = "get-test-events"; + public static final String REQUEST_GET_HAD_NONTEST_EVENTS = "get-had-nontest-events"; public static final String REQUEST_STOP_EVENT_LOGGING = "stop-event-logging"; public static final String REQUEST_CLEAR_DATA = "clear-data"; public static final String REQUEST_IS_TABLET = "is-tablet"; diff --git a/tests/src/com/android/launcher3/util/rule/FailureWatcher.java b/tests/src/com/android/launcher3/util/rule/FailureWatcher.java index 5fbf847ec6..60529a43c4 100644 --- a/tests/src/com/android/launcher3/util/rule/FailureWatcher.java +++ b/tests/src/com/android/launcher3/util/rule/FailureWatcher.java @@ -13,6 +13,7 @@ import com.android.launcher3.ui.AbstractLauncherUiTest; import org.junit.rules.TestWatcher; import org.junit.runner.Description; +import org.junit.runners.model.Statement; import java.io.File; import java.io.FileOutputStream; @@ -37,6 +38,26 @@ public class FailureWatcher extends TestWatcher { AbstractLauncherUiTest.checkDetectedLeaks(mLauncher); } + @Override + public Statement apply(Statement base, Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + try { + base.evaluate(); + } finally { + if (mLauncher.hadNontestEvents()) { + throw new AssertionError( + "Launcher received events not sent by the test. This may mean " + + "that the touch screen of the lab device has sent false" + + " events. See the logcat for TaplEvents tag and look " + + "for events with deviceId != -1"); + } + } + } + }; + } + @Override protected void failed(Throwable e, Description description) { onError(mDevice, description, e); diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index abcc7788e2..c2930f19a1 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -306,6 +306,11 @@ public final class LauncherInstrumentation { getTestInfo(TestProtocol.REQUEST_SET_FORCE_PAUSE_TIMEOUT, Long.toString(timeout)); } + public boolean hadNontestEvents() { + return getTestInfo(TestProtocol.REQUEST_GET_HAD_NONTEST_EVENTS) + .getBoolean(TestProtocol.TEST_INFO_RESPONSE_FIELD); + } + void setActiveContainer(VisibleContainer container) { sActiveContainer = new WeakReference<>(container); }