1515 */
1616
1717#include < memory>
18+ #include < tuple>
1819
20+ #include < android-base/result-gmock.h>
21+ #include < android-base/result.h>
1922#include < com_android_input_flags.h>
2023#include < flag_macros.h>
2124#include < gestures/GestureConverter.h>
2225#include < gtest/gtest.h>
26+ #include < input/InputVerifier.h>
2327
2428#include " FakeEventHub.h"
2529#include " FakeInputReaderPolicy.h"
@@ -43,8 +47,12 @@ const auto TOUCHPAD_PALM_REJECTION =
4347const auto TOUCHPAD_PALM_REJECTION_V2 =
4448 ACONFIG_FLAG (input_flags, enable_v2_touchpad_typing_palm_rejection);
4549
50+ constexpr stime_t ARBITRARY_GESTURE_TIME = 1.2 ;
51+ constexpr stime_t GESTURE_TIME = ARBITRARY_GESTURE_TIME;
52+
4653} // namespace
4754
55+ using android::base::testing::Ok;
4856using testing::AllOf;
4957using testing::Each;
5058using testing::ElementsAre;
@@ -55,9 +63,8 @@ class GestureConverterTest : public testing::Test {
5563protected:
5664 static constexpr int32_t DEVICE_ID = END_RESERVED_ID + 1000 ;
5765 static constexpr int32_t EVENTHUB_ID = 1 ;
58- static constexpr stime_t ARBITRARY_GESTURE_TIME = 1.2 ;
5966
60- void SetUp () {
67+ GestureConverterTest () {
6168 mFakeEventHub = std::make_unique<FakeEventHub>();
6269 mFakePolicy = sp<FakeInputReaderPolicy>::make ();
6370 mFakeListener = std::make_unique<TestInputListener>();
@@ -1698,4 +1705,135 @@ TEST_F_WITH_FLAGS(GestureConverterTest, KeypressCancelsHoverMove,
16981705 WithMotionAction (AMOTION_EVENT_ACTION_HOVER_MOVE))));
16991706}
17001707
1708+ /* *
1709+ * Tests that the event stream output by the converter remains consistent when converting sequences
1710+ * of Gestures interleaved with button presses in various ways. Takes tuples of three Gestures: one
1711+ * that starts the gesture sequence, one that continues it (which may or may not be used in a
1712+ * particular test case), and one that ends it.
1713+ */
1714+ class GestureConverterConsistencyTest
1715+ : public GestureConverterTest,
1716+ public testing::WithParamInterface<std::tuple<Gesture, Gesture, Gesture>> {
1717+ protected:
1718+ GestureConverterConsistencyTest ()
1719+ : GestureConverterTest(),
1720+ mParamStartGesture (std::get<0 >(GetParam())),
1721+ mParamContinueGesture(std::get<1 >(GetParam())),
1722+ mParamEndGesture(std::get<2 >(GetParam())),
1723+ mDeviceContext(*mDevice , EVENTHUB_ID),
1724+ mConverter(*mReader ->getContext (), mDeviceContext, DEVICE_ID),
1725+ mVerifier(" Test verifier" ) {
1726+ mConverter .setDisplayId (ui::LogicalDisplayId::DEFAULT);
1727+ }
1728+
1729+ base::Result<void > processMotionArgs (NotifyMotionArgs arg) {
1730+ return mVerifier .processMovement (arg.deviceId , arg.source , arg.action ,
1731+ arg.getPointerCount (), arg.pointerProperties .data (),
1732+ arg.pointerCoords .data (), arg.flags );
1733+ }
1734+
1735+ void verifyArgsFromGesture (const Gesture& gesture, size_t gestureIndex) {
1736+ std::list<NotifyArgs> args =
1737+ mConverter .handleGesture (ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, gesture);
1738+ for (const NotifyArgs& notifyArg : args) {
1739+ const NotifyMotionArgs& arg = std::get<NotifyMotionArgs>(notifyArg);
1740+ ASSERT_THAT (processMotionArgs (arg), Ok ())
1741+ << " when processing " << arg.dump () << " \n from gesture " << gestureIndex << " : "
1742+ << gesture.String ();
1743+ }
1744+ }
1745+
1746+ void verifyArgsFromGestures (const std::vector<Gesture>& gestures) {
1747+ for (size_t i = 0 ; i < gestures.size (); i++) {
1748+ ASSERT_NO_FATAL_FAILURE (verifyArgsFromGesture (gestures[i], i));
1749+ }
1750+ }
1751+
1752+ Gesture mParamStartGesture ;
1753+ Gesture mParamContinueGesture ;
1754+ Gesture mParamEndGesture ;
1755+
1756+ InputDeviceContext mDeviceContext ;
1757+ GestureConverter mConverter ;
1758+ InputVerifier mVerifier ;
1759+ };
1760+
1761+ TEST_P (GestureConverterConsistencyTest, ButtonChangesDuringGesture) {
1762+ verifyArgsFromGestures ({
1763+ mParamStartGesture ,
1764+ Gesture (kGestureButtonsChange , GESTURE_TIME, GESTURE_TIME,
1765+ /* down=*/ GESTURES_BUTTON_LEFT, /* up=*/ GESTURES_BUTTON_NONE, /* is_tap=*/ false ),
1766+ mParamContinueGesture ,
1767+ Gesture (kGestureButtonsChange , GESTURE_TIME, GESTURE_TIME,
1768+ /* down=*/ GESTURES_BUTTON_NONE, /* up=*/ GESTURES_BUTTON_LEFT, /* is_tap=*/ false ),
1769+ mParamEndGesture ,
1770+ });
1771+ }
1772+
1773+ TEST_P (GestureConverterConsistencyTest, ButtonDownDuringGestureAndUpAfterEnd) {
1774+ verifyArgsFromGestures ({
1775+ mParamStartGesture ,
1776+ Gesture (kGestureButtonsChange , GESTURE_TIME, GESTURE_TIME,
1777+ /* down=*/ GESTURES_BUTTON_LEFT, /* up=*/ GESTURES_BUTTON_NONE, /* is_tap=*/ false ),
1778+ mParamContinueGesture ,
1779+ mParamEndGesture ,
1780+ Gesture (kGestureButtonsChange , GESTURE_TIME, GESTURE_TIME,
1781+ /* down=*/ GESTURES_BUTTON_NONE, /* up=*/ GESTURES_BUTTON_LEFT, /* is_tap=*/ false ),
1782+ });
1783+ }
1784+
1785+ TEST_P (GestureConverterConsistencyTest, GestureStartAndEndDuringButtonDown) {
1786+ verifyArgsFromGestures ({
1787+ Gesture (kGestureButtonsChange , GESTURE_TIME, GESTURE_TIME,
1788+ /* down=*/ GESTURES_BUTTON_LEFT, /* up=*/ GESTURES_BUTTON_NONE, /* is_tap=*/ false ),
1789+ mParamStartGesture ,
1790+ mParamContinueGesture ,
1791+ mParamEndGesture ,
1792+ Gesture (kGestureButtonsChange , GESTURE_TIME, GESTURE_TIME,
1793+ /* down=*/ GESTURES_BUTTON_NONE, /* up=*/ GESTURES_BUTTON_LEFT, /* is_tap=*/ false ),
1794+ });
1795+ }
1796+
1797+ TEST_P (GestureConverterConsistencyTest, GestureStartsWhileButtonDownAndEndsAfterUp) {
1798+ verifyArgsFromGestures ({
1799+ Gesture (kGestureButtonsChange , GESTURE_TIME, GESTURE_TIME,
1800+ /* down=*/ GESTURES_BUTTON_LEFT, /* up=*/ GESTURES_BUTTON_NONE, /* is_tap=*/ false ),
1801+ mParamStartGesture ,
1802+ mParamContinueGesture ,
1803+ Gesture (kGestureButtonsChange , GESTURE_TIME, GESTURE_TIME,
1804+ /* down=*/ GESTURES_BUTTON_NONE, /* up=*/ GESTURES_BUTTON_LEFT, /* is_tap=*/ false ),
1805+ mParamEndGesture ,
1806+ });
1807+ }
1808+
1809+ TEST_P (GestureConverterConsistencyTest, TapToClickDuringGesture) {
1810+ verifyArgsFromGestures ({
1811+ mParamStartGesture ,
1812+ Gesture (kGestureButtonsChange , GESTURE_TIME, GESTURE_TIME,
1813+ /* down=*/ GESTURES_BUTTON_LEFT, /* up=*/ GESTURES_BUTTON_LEFT, /* is_tap=*/ false ),
1814+ mParamEndGesture ,
1815+ });
1816+ }
1817+
1818+ INSTANTIATE_TEST_SUITE_P (
1819+ GestureAndButtonInterleavings, GestureConverterConsistencyTest,
1820+ testing::Values (
1821+ std::make_tuple (Gesture(kGestureScroll , GESTURE_TIME, GESTURE_TIME, 0 , -10 ),
1822+ Gesture(kGestureScroll , GESTURE_TIME, GESTURE_TIME, 0 , -5 ),
1823+ Gesture(kGestureFling , GESTURE_TIME, GESTURE_TIME, 1 , 1 ,
1824+ GESTURES_FLING_START)),
1825+ std::make_tuple(Gesture(kGestureSwipe , GESTURE_TIME, GESTURE_TIME, 0 , -10 ),
1826+ Gesture(kGestureSwipe , GESTURE_TIME, GESTURE_TIME, 0 , 5 ),
1827+ Gesture(kGestureSwipeLift , GESTURE_TIME, GESTURE_TIME)),
1828+ std::make_tuple(Gesture(kGestureFourFingerSwipe , GESTURE_TIME, GESTURE_TIME, 0 ,
1829+ -10 ),
1830+ Gesture(kGestureFourFingerSwipe , GESTURE_TIME, GESTURE_TIME, 0 , 5 ),
1831+ Gesture(kGestureFourFingerSwipeLift , GESTURE_TIME, GESTURE_TIME)),
1832+ std::make_tuple(Gesture(kGesturePinch , GESTURE_TIME, GESTURE_TIME,
1833+ /* dz=*/ 1 , GESTURES_ZOOM_START),
1834+ Gesture(kGesturePinch , GESTURE_TIME, GESTURE_TIME,
1835+ /* dz=*/ 0.8 , GESTURES_ZOOM_UPDATE),
1836+ Gesture(kGesturePinch , GESTURE_TIME, GESTURE_TIME,
1837+ /* dz=*/ 1 , GESTURES_ZOOM_END))));
1838+
17011839} // namespace android
0 commit comments