diff options
author | 2024-05-03 23:15:39 +0000 | |
---|---|---|
committer | 2024-05-04 00:07:37 +0000 | |
commit | 8b053510e6a7e094d2ee993fca75ec868f2e7e9f (patch) | |
tree | ef254e6488a01504870948ea9dbfbefc21ec497f | |
parent | 764882004f446826c25e83f3dcd88de2c9c841f8 (diff) |
Touchpad: Cleanup after PointerChoreographer refactor
Remove duplicated tests and references to PointerController.
Bug: 311416205
Test: atest inputflinger_tests
Change-Id: I02bd7c8f4c4126c9ae7d2fdffd94175b37478925
6 files changed, 100 insertions, 1742 deletions
diff --git a/services/inputflinger/reader/mapper/TouchpadInputMapper.cpp b/services/inputflinger/reader/mapper/TouchpadInputMapper.cpp index f558ba1196..6a38aa7b08 100644 --- a/services/inputflinger/reader/mapper/TouchpadInputMapper.cpp +++ b/services/inputflinger/reader/mapper/TouchpadInputMapper.cpp @@ -47,8 +47,6 @@ namespace android { namespace { -static const bool ENABLE_POINTER_CHOREOGRAPHER = input_flags::enable_pointer_choreographer(); - /** * Log details of each gesture output by the gestures library. * Enable this via "adb shell setprop log.tag.TouchpadInputMapperGestures DEBUG" (requires @@ -237,20 +235,13 @@ private: TouchpadInputMapper::TouchpadInputMapper(InputDeviceContext& deviceContext, const InputReaderConfiguration& readerConfig) - : TouchpadInputMapper(deviceContext, readerConfig, ENABLE_POINTER_CHOREOGRAPHER) {} - -TouchpadInputMapper::TouchpadInputMapper(InputDeviceContext& deviceContext, - const InputReaderConfiguration& readerConfig, - bool enablePointerChoreographer) : InputMapper(deviceContext, readerConfig), mGestureInterpreter(NewGestureInterpreter(), DeleteGestureInterpreter), - mPointerController(getContext()->getPointerController(getDeviceId())), mTimerProvider(*getContext()), mStateConverter(deviceContext, mMotionAccumulator), mGestureConverter(*getContext(), deviceContext, getDeviceId()), mCapturedEventConverter(*getContext(), deviceContext, mMotionAccumulator, getDeviceId()), - mMetricsId(metricsIdFromInputDeviceIdentifier(deviceContext.getDeviceIdentifier())), - mEnablePointerChoreographer(enablePointerChoreographer) { + mMetricsId(metricsIdFromInputDeviceIdentifier(deviceContext.getDeviceIdentifier())) { RawAbsoluteAxisInfo slotAxisInfo; deviceContext.getAbsoluteAxisInfo(ABS_MT_SLOT, &slotAxisInfo); if (!slotAxisInfo.valid || slotAxisInfo.maxValue <= 0) { @@ -277,10 +268,6 @@ TouchpadInputMapper::TouchpadInputMapper(InputDeviceContext& deviceContext, } TouchpadInputMapper::~TouchpadInputMapper() { - if (mPointerController != nullptr) { - mPointerController->fade(PointerControllerInterface::Transition::IMMEDIATE); - } - // The gesture interpreter's destructor will try to free its property and timer providers, // calling PropertyProvider::freeProperty and TimerProvider::freeTimer using a raw pointers. // Depending on the declaration order in TouchpadInputMapper.h, those providers may have already @@ -342,33 +329,12 @@ std::list<NotifyArgs> TouchpadInputMapper::reconfigure(nsecs_t when, // Only generate events for the associated display. mDisplayId = assocViewport->displayId; resolvedViewport = *assocViewport; - if (!mEnablePointerChoreographer) { - const bool mismatchedPointerDisplay = - (assocViewport->displayId != mPointerController->getDisplayId()); - if (mismatchedPointerDisplay) { - ALOGW("Touchpad \"%s\" associated viewport display does not match pointer " - "controller", - mDeviceContext.getName().c_str()); - mDisplayId.reset(); - } - } } else { // The InputDevice is not associated with a viewport, but it controls the mouse pointer. - if (mEnablePointerChoreographer) { - // Always use DISPLAY_ID_NONE for touchpad events. - // PointerChoreographer will make it target the correct the displayId later. - resolvedViewport = - getContext()->getPolicy()->getPointerViewportForAssociatedDisplay(); - mDisplayId = resolvedViewport ? std::make_optional(ADISPLAY_ID_NONE) : std::nullopt; - } else { - mDisplayId = mPointerController->getDisplayId(); - if (auto v = config.getDisplayViewportById(*mDisplayId); v) { - resolvedViewport = *v; - } - if (auto bounds = mPointerController->getBounds(); bounds) { - boundsInLogicalDisplay = *bounds; - } - } + // Always use DISPLAY_ID_NONE for touchpad events. + // PointerChoreographer will make it target the correct the displayId later. + resolvedViewport = getContext()->getPolicy()->getPointerViewportForAssociatedDisplay(); + mDisplayId = resolvedViewport ? std::make_optional(ADISPLAY_ID_NONE) : std::nullopt; } mGestureConverter.setDisplayId(mDisplayId); @@ -422,7 +388,6 @@ std::list<NotifyArgs> TouchpadInputMapper::reconfigure(nsecs_t when, // The touchpad is being captured, so we need to tidy up any fake fingers etc. that are // still being reported for a gesture in progress. out += reset(when); - mPointerController->fade(PointerControllerInterface::Transition::IMMEDIATE); } else { // We're transitioning from captured to uncaptured. mCapturedEventConverter.reset(); diff --git a/services/inputflinger/reader/mapper/TouchpadInputMapper.h b/services/inputflinger/reader/mapper/TouchpadInputMapper.h index 9f272cf846..9f685ec6a8 100644 --- a/services/inputflinger/reader/mapper/TouchpadInputMapper.h +++ b/services/inputflinger/reader/mapper/TouchpadInputMapper.h @@ -72,10 +72,6 @@ private: void resetGestureInterpreter(nsecs_t when); explicit TouchpadInputMapper(InputDeviceContext& deviceContext, const InputReaderConfiguration& readerConfig); - // Constructor for testing. - explicit TouchpadInputMapper(InputDeviceContext& deviceContext, - const InputReaderConfiguration& readerConfig, - bool enablePointerChoreographer); void updatePalmDetectionMetrics(); [[nodiscard]] std::list<NotifyArgs> sendHardwareState(nsecs_t when, nsecs_t readTime, SelfContainedHardwareState schs); @@ -83,7 +79,6 @@ private: std::unique_ptr<gestures::GestureInterpreter, void (*)(gestures::GestureInterpreter*)> mGestureInterpreter; - std::shared_ptr<PointerControllerInterface> mPointerController; PropertyProvider mPropertyProvider; TimerProvider mTimerProvider; @@ -111,8 +106,6 @@ private: // Tracking IDs for touches that have at some point been reported as palms by the touchpad. std::set<int32_t> mPalmTrackingIds; - const bool mEnablePointerChoreographer; - // The display that events generated by this mapper should target. This can be set to // ADISPLAY_ID_NONE to target the focused display. If there is no display target (i.e. // std::nullopt), all events will be ignored. diff --git a/services/inputflinger/reader/mapper/gestures/GestureConverter.cpp b/services/inputflinger/reader/mapper/gestures/GestureConverter.cpp index 39a88e5570..ff95857e96 100644 --- a/services/inputflinger/reader/mapper/gestures/GestureConverter.cpp +++ b/services/inputflinger/reader/mapper/gestures/GestureConverter.cpp @@ -66,7 +66,6 @@ GestureConverter::GestureConverter(InputReaderContext& readerContext, const InputDeviceContext& deviceContext, int32_t deviceId) : mDeviceId(deviceId), mReaderContext(readerContext), - mPointerController(readerContext.getPointerController(deviceId)), mEnableFlingStop(input_flags::enable_touchpad_fling_stop()) { deviceContext.getAbsoluteAxisInfo(ABS_MT_POSITION_X, &mXAxisInfo); deviceContext.getAbsoluteAxisInfo(ABS_MT_POSITION_Y, &mYAxisInfo); @@ -174,7 +173,6 @@ std::list<NotifyArgs> GestureConverter::handleMove(nsecs_t when, nsecs_t readTim const Gesture& gesture) { float deltaX = gesture.details.move.dx; float deltaY = gesture.details.move.dy; - const auto [oldXCursorPosition, oldYCursorPosition] = mPointerController->getPosition(); if (ENABLE_TOUCHPAD_PALM_REJECTION_V2) { bool wasHoverCancelled = mIsHoverCancelled; // Gesture will be cancelled if it started before the user started typing and @@ -185,8 +183,7 @@ std::list<NotifyArgs> GestureConverter::handleMove(nsecs_t when, nsecs_t readTim if (!wasHoverCancelled && mIsHoverCancelled) { // This is the first event of the cancelled gesture, we won't return because we need to // generate a HOVER_EXIT event - mPointerController->fade(PointerControllerInterface::Transition::GRADUAL); - return exitHover(when, readTime, oldXCursorPosition, oldYCursorPosition); + return exitHover(when, readTime); } else if (mIsHoverCancelled) { return {}; } @@ -202,30 +199,23 @@ std::list<NotifyArgs> GestureConverter::handleMove(nsecs_t when, nsecs_t readTim (std::abs(deltaX) > 0 || std::abs(deltaY) > 0)) { enableTapToClick(when); } - mPointerController->setPresentation(PointerControllerInterface::Presentation::POINTER); - mPointerController->move(deltaX, deltaY); - mPointerController->unfade(PointerControllerInterface::Transition::IMMEDIATE); } std::list<NotifyArgs> out; const bool down = isPointerDown(mButtonState); if (!down) { - out += enterHover(when, readTime, oldXCursorPosition, oldYCursorPosition); + out += enterHover(when, readTime); } - const auto [newXCursorPosition, newYCursorPosition] = mPointerController->getPosition(); PointerCoords coords; coords.clear(); - coords.setAxisValue(AMOTION_EVENT_AXIS_X, newXCursorPosition); - coords.setAxisValue(AMOTION_EVENT_AXIS_Y, newYCursorPosition); coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX); coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY); coords.setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, down ? 1.0f : 0.0f); const int32_t action = down ? AMOTION_EVENT_ACTION_MOVE : AMOTION_EVENT_ACTION_HOVER_MOVE; out.push_back(makeMotionArgs(when, readTime, action, /*actionButton=*/0, mButtonState, - /*pointerCount=*/1, &coords, newXCursorPosition, - newYCursorPosition)); + /*pointerCount=*/1, &coords)); return out; } @@ -233,15 +223,8 @@ std::list<NotifyArgs> GestureConverter::handleButtonsChange(nsecs_t when, nsecs_ const Gesture& gesture) { std::list<NotifyArgs> out = {}; - mPointerController->setPresentation(PointerControllerInterface::Presentation::POINTER); - mPointerController->unfade(PointerControllerInterface::Transition::IMMEDIATE); - - const auto [xCursorPosition, yCursorPosition] = mPointerController->getPosition(); - PointerCoords coords; coords.clear(); - coords.setAxisValue(AMOTION_EVENT_AXIS_X, xCursorPosition); - coords.setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition); coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, 0); coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, 0); @@ -274,16 +257,15 @@ std::list<NotifyArgs> GestureConverter::handleButtonsChange(nsecs_t when, nsecs_ newButtonState |= actionButton; pressEvents.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_BUTTON_PRESS, actionButton, newButtonState, - /*pointerCount=*/1, &coords, xCursorPosition, - yCursorPosition)); + /*pointerCount=*/1, &coords)); } } if (!isPointerDown(mButtonState) && isPointerDown(newButtonState)) { mDownTime = when; - out += exitHover(when, readTime, xCursorPosition, yCursorPosition); + out += exitHover(when, readTime); out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_DOWN, /* actionButton= */ 0, newButtonState, /* pointerCount= */ 1, - &coords, xCursorPosition, yCursorPosition)); + &coords)); } out.splice(out.end(), pressEvents); @@ -299,16 +281,15 @@ std::list<NotifyArgs> GestureConverter::handleButtonsChange(nsecs_t when, nsecs_ newButtonState &= ~actionButton; out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_BUTTON_RELEASE, actionButton, newButtonState, /* pointerCount= */ 1, - &coords, xCursorPosition, yCursorPosition)); + &coords)); } } if (isPointerDown(mButtonState) && !isPointerDown(newButtonState)) { coords.setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 0.0f); out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_UP, /* actionButton= */ 0, - newButtonState, /* pointerCount= */ 1, &coords, - xCursorPosition, yCursorPosition)); + newButtonState, /* pointerCount= */ 1, &coords)); mButtonState = newButtonState; - out += enterHover(when, readTime, xCursorPosition, yCursorPosition); + out += enterHover(when, readTime); } mButtonState = newButtonState; return out; @@ -316,12 +297,9 @@ std::list<NotifyArgs> GestureConverter::handleButtonsChange(nsecs_t when, nsecs_ std::list<NotifyArgs> GestureConverter::releaseAllButtons(nsecs_t when, nsecs_t readTime) { std::list<NotifyArgs> out; - const auto [xCursorPosition, yCursorPosition] = mPointerController->getPosition(); PointerCoords coords; coords.clear(); - coords.setAxisValue(AMOTION_EVENT_AXIS_X, xCursorPosition); - coords.setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition); coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, 0); coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, 0); const bool pointerDown = isPointerDown(mButtonState); @@ -332,17 +310,15 @@ std::list<NotifyArgs> GestureConverter::releaseAllButtons(nsecs_t when, nsecs_t if (mButtonState & button) { newButtonState &= ~button; out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_BUTTON_RELEASE, - button, newButtonState, /*pointerCount=*/1, &coords, - xCursorPosition, yCursorPosition)); + button, newButtonState, /*pointerCount=*/1, &coords)); } } mButtonState = 0; if (pointerDown) { coords.setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 0.0f); out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_UP, /*actionButton=*/0, - mButtonState, /*pointerCount=*/1, &coords, xCursorPosition, - yCursorPosition)); - out += enterHover(when, readTime, xCursorPosition, yCursorPosition); + mButtonState, /*pointerCount=*/1, &coords)); + out += enterHover(when, readTime); } return out; } @@ -351,19 +327,15 @@ std::list<NotifyArgs> GestureConverter::handleScroll(nsecs_t when, nsecs_t readT const Gesture& gesture) { std::list<NotifyArgs> out; PointerCoords& coords = mFakeFingerCoords[0]; - const auto [xCursorPosition, yCursorPosition] = mPointerController->getPosition(); if (mCurrentClassification != MotionClassification::TWO_FINGER_SWIPE) { - out += exitHover(when, readTime, xCursorPosition, yCursorPosition); + out += exitHover(when, readTime); mCurrentClassification = MotionClassification::TWO_FINGER_SWIPE; - coords.setAxisValue(AMOTION_EVENT_AXIS_X, xCursorPosition); - coords.setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition); coords.setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 1.0f); mDownTime = when; NotifyMotionArgs args = makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_DOWN, /* actionButton= */ 0, - mButtonState, /* pointerCount= */ 1, mFakeFingerCoords.data(), - xCursorPosition, yCursorPosition); + mButtonState, /* pointerCount= */ 1, mFakeFingerCoords.data()); args.flags |= AMOTION_EVENT_FLAG_IS_GENERATED_GESTURE; out.push_back(args); } @@ -378,8 +350,7 @@ std::list<NotifyArgs> GestureConverter::handleScroll(nsecs_t when, nsecs_t readT coords.setAxisValue(AMOTION_EVENT_AXIS_GESTURE_SCROLL_Y_DISTANCE, -gesture.details.scroll.dy); NotifyMotionArgs args = makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_MOVE, /* actionButton= */ 0, - mButtonState, /* pointerCount= */ 1, mFakeFingerCoords.data(), - xCursorPosition, yCursorPosition); + mButtonState, /* pointerCount= */ 1, mFakeFingerCoords.data()); args.flags |= AMOTION_EVENT_FLAG_IS_GENERATED_GESTURE; out.push_back(args); return out; @@ -409,28 +380,22 @@ std::list<NotifyArgs> GestureConverter::handleFling(nsecs_t when, nsecs_t readTi // avoid side effects (e.g. activation of UI elements). // TODO(b/326056750): add an API for fling stops. mFlingMayBeInProgress = false; - const auto [xCursorPosition, yCursorPosition] = - mPointerController->getPosition(); PointerCoords coords; coords.clear(); - coords.setAxisValue(AMOTION_EVENT_AXIS_X, xCursorPosition); - coords.setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition); coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, 0); coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, 0); std::list<NotifyArgs> out; mDownTime = when; mCurrentClassification = MotionClassification::TWO_FINGER_SWIPE; - out += exitHover(when, readTime, xCursorPosition, yCursorPosition); + out += exitHover(when, readTime); out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_DOWN, /*actionButton=*/0, /*buttonState=*/0, - /*pointerCount=*/1, &coords, xCursorPosition, - yCursorPosition)); + /*pointerCount=*/1, &coords)); out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_CANCEL, /*actionButton=*/0, /*buttonState=*/0, - /*pointerCount=*/1, &coords, xCursorPosition, - yCursorPosition)); - out += enterHover(when, readTime, xCursorPosition, yCursorPosition); + /*pointerCount=*/1, &coords)); + out += enterHover(when, readTime); mCurrentClassification = MotionClassification::NONE; return out; } else { @@ -455,17 +420,15 @@ std::list<NotifyArgs> GestureConverter::handleFling(nsecs_t when, nsecs_t readTi std::list<NotifyArgs> GestureConverter::endScroll(nsecs_t when, nsecs_t readTime) { std::list<NotifyArgs> out; - const auto [xCursorPosition, yCursorPosition] = mPointerController->getPosition(); mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_GESTURE_SCROLL_X_DISTANCE, 0); mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_GESTURE_SCROLL_Y_DISTANCE, 0); NotifyMotionArgs args = makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_UP, /* actionButton= */ 0, - mButtonState, /* pointerCount= */ 1, mFakeFingerCoords.data(), - xCursorPosition, yCursorPosition); + mButtonState, /* pointerCount= */ 1, mFakeFingerCoords.data()); args.flags |= AMOTION_EVENT_FLAG_IS_GENERATED_GESTURE; out.push_back(args); mCurrentClassification = MotionClassification::NONE; - out += enterHover(when, readTime, xCursorPosition, yCursorPosition); + out += enterHover(when, readTime); return out; } @@ -475,26 +438,26 @@ std::list<NotifyArgs> GestureConverter::endScroll(nsecs_t when, nsecs_t readTime float dx, float dy) { std::list<NotifyArgs> out = {}; - const auto [xCursorPosition, yCursorPosition] = mPointerController->getPosition(); if (mCurrentClassification != MotionClassification::MULTI_FINGER_SWIPE) { // If the user changes the number of fingers mid-way through a swipe (e.g. they start with // three and then put a fourth finger down), the gesture library will treat it as two // separate swipes with an appropriate lift event between them, so we don't have to worry // about the finger count changing mid-swipe. - out += exitHover(when, readTime, xCursorPosition, yCursorPosition); + out += exitHover(when, readTime); mCurrentClassification = MotionClassification::MULTI_FINGER_SWIPE; mSwipeFingerCount = fingerCount; constexpr float FAKE_FINGER_SPACING = 100; - float xCoord = xCursorPosition - FAKE_FINGER_SPACING * (mSwipeFingerCount - 1) / 2; + float xCoord = 0.f - FAKE_FINGER_SPACING * (mSwipeFingerCount - 1) / 2; for (size_t i = 0; i < mSwipeFingerCount; i++) { PointerCoords& coords = mFakeFingerCoords[i]; coords.clear(); + // PointerChoreographer will add the cursor position to these pointers. coords.setAxisValue(AMOTION_EVENT_AXIS_X, xCoord); - coords.setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition); + coords.setAxisValue(AMOTION_EVENT_AXIS_Y, 0.f); coords.setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 1.0f); xCoord += FAKE_FINGER_SPACING; } @@ -504,14 +467,13 @@ std::list<NotifyArgs> GestureConverter::endScroll(nsecs_t when, nsecs_t readTime fingerCount); out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_DOWN, /* actionButton= */ 0, mButtonState, /* pointerCount= */ 1, - mFakeFingerCoords.data(), xCursorPosition, yCursorPosition)); + mFakeFingerCoords.data())); for (size_t i = 1; i < mSwipeFingerCount; i++) { out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_POINTER_DOWN | (i << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), /* actionButton= */ 0, mButtonState, - /* pointerCount= */ i + 1, mFakeFingerCoords.data(), - xCursorPosition, yCursorPosition)); + /* pointerCount= */ i + 1, mFakeFingerCoords.data())); } } float rotatedDeltaX = dx, rotatedDeltaY = -dy; @@ -529,7 +491,7 @@ std::list<NotifyArgs> GestureConverter::endScroll(nsecs_t when, nsecs_t readTime mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_GESTURE_Y_OFFSET, yOffset); out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_MOVE, /* actionButton= */ 0, mButtonState, /* pointerCount= */ mSwipeFingerCount, - mFakeFingerCoords.data(), xCursorPosition, yCursorPosition)); + mFakeFingerCoords.data())); return out; } @@ -539,7 +501,6 @@ std::list<NotifyArgs> GestureConverter::endScroll(nsecs_t when, nsecs_t readTime if (mCurrentClassification != MotionClassification::MULTI_FINGER_SWIPE) { return out; } - const auto [xCursorPosition, yCursorPosition] = mPointerController->getPosition(); mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_GESTURE_X_OFFSET, 0); mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_GESTURE_Y_OFFSET, 0); @@ -548,22 +509,20 @@ std::list<NotifyArgs> GestureConverter::endScroll(nsecs_t when, nsecs_t readTime AMOTION_EVENT_ACTION_POINTER_UP | ((i - 1) << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), /* actionButton= */ 0, mButtonState, /* pointerCount= */ i, - mFakeFingerCoords.data(), xCursorPosition, yCursorPosition)); + mFakeFingerCoords.data())); } out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_UP, /* actionButton= */ 0, mButtonState, /* pointerCount= */ 1, - mFakeFingerCoords.data(), xCursorPosition, yCursorPosition)); + mFakeFingerCoords.data())); mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_GESTURE_SWIPE_FINGER_COUNT, 0); mCurrentClassification = MotionClassification::NONE; - out += enterHover(when, readTime, xCursorPosition, yCursorPosition); + out += enterHover(when, readTime); mSwipeFingerCount = 0; return out; } [[nodiscard]] std::list<NotifyArgs> GestureConverter::handlePinch(nsecs_t when, nsecs_t readTime, const Gesture& gesture) { - const auto [xCursorPosition, yCursorPosition] = mPointerController->getPosition(); - // Pinch gesture phases are reported a little differently from others, in that the same details // struct is used for all phases of the gesture, just with different zoom_state values. When // zoom_state is START or END, dz will always be 1, so we don't need to move the pointers in @@ -575,28 +534,27 @@ std::list<NotifyArgs> GestureConverter::endScroll(nsecs_t when, nsecs_t readTime gesture.details.pinch.zoom_state); std::list<NotifyArgs> out; - out += exitHover(when, readTime, xCursorPosition, yCursorPosition); + out += exitHover(when, readTime); mCurrentClassification = MotionClassification::PINCH; mPinchFingerSeparation = INITIAL_PINCH_SEPARATION_PX; + // PointerChoreographer will add the cursor position to these pointers. mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_GESTURE_PINCH_SCALE_FACTOR, 1.0); - mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, - xCursorPosition - mPinchFingerSeparation / 2); - mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition); + mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, 0.f - mPinchFingerSeparation / 2); + mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, 0.f); mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 1.0f); - mFakeFingerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_X, - xCursorPosition + mPinchFingerSeparation / 2); - mFakeFingerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition); + mFakeFingerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_X, 0.f + mPinchFingerSeparation / 2); + mFakeFingerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_Y, 0.f); mFakeFingerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 1.0f); mDownTime = when; out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_DOWN, /* actionButton= */ 0, mButtonState, /* pointerCount= */ 1, - mFakeFingerCoords.data(), xCursorPosition, yCursorPosition)); + mFakeFingerCoords.data())); out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_POINTER_DOWN | 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT, /* actionButton= */ 0, mButtonState, /* pointerCount= */ 2, - mFakeFingerCoords.data(), xCursorPosition, yCursorPosition)); + mFakeFingerCoords.data())); return out; } @@ -605,77 +563,65 @@ std::list<NotifyArgs> GestureConverter::endScroll(nsecs_t when, nsecs_t readTime } mPinchFingerSeparation *= gesture.details.pinch.dz; + // PointerChoreographer will add the cursor position to these pointers. mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_GESTURE_PINCH_SCALE_FACTOR, gesture.details.pinch.dz); - mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, - xCursorPosition - mPinchFingerSeparation / 2); - mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition); - mFakeFingerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_X, - xCursorPosition + mPinchFingerSeparation / 2); - mFakeFingerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition); + mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, 0.f - mPinchFingerSeparation / 2); + mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, 0.f); + mFakeFingerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_X, 0.f + mPinchFingerSeparation / 2); + mFakeFingerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_Y, 0.f); return {makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_MOVE, /*actionButton=*/0, - mButtonState, /*pointerCount=*/2, mFakeFingerCoords.data(), - xCursorPosition, yCursorPosition)}; + mButtonState, /*pointerCount=*/2, mFakeFingerCoords.data())}; } std::list<NotifyArgs> GestureConverter::endPinch(nsecs_t when, nsecs_t readTime) { std::list<NotifyArgs> out; - const auto [xCursorPosition, yCursorPosition] = mPointerController->getPosition(); mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_GESTURE_PINCH_SCALE_FACTOR, 1.0); out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_POINTER_UP | 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT, /*actionButton=*/0, mButtonState, /*pointerCount=*/2, - mFakeFingerCoords.data(), xCursorPosition, yCursorPosition)); + mFakeFingerCoords.data())); out.push_back(makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_UP, /*actionButton=*/0, - mButtonState, /*pointerCount=*/1, mFakeFingerCoords.data(), - xCursorPosition, yCursorPosition)); + mButtonState, /*pointerCount=*/1, mFakeFingerCoords.data())); mFakeFingerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_GESTURE_PINCH_SCALE_FACTOR, 0); mCurrentClassification = MotionClassification::NONE; - out += enterHover(when, readTime, xCursorPosition, yCursorPosition); + out += enterHover(when, readTime); return out; } -std::list<NotifyArgs> GestureConverter::enterHover(nsecs_t when, nsecs_t readTime, - float xCursorPosition, float yCursorPosition) { +std::list<NotifyArgs> GestureConverter::enterHover(nsecs_t when, nsecs_t readTime) { if (!mIsHovering) { mIsHovering = true; - return {makeHoverEvent(when, readTime, AMOTION_EVENT_ACTION_HOVER_ENTER, xCursorPosition, - yCursorPosition)}; + return {makeHoverEvent(when, readTime, AMOTION_EVENT_ACTION_HOVER_ENTER)}; } else { return {}; } } -std::list<NotifyArgs> GestureConverter::exitHover(nsecs_t when, nsecs_t readTime, - float xCursorPosition, float yCursorPosition) { +std::list<NotifyArgs> GestureConverter::exitHover(nsecs_t when, nsecs_t readTime) { if (mIsHovering) { mIsHovering = false; - return {makeHoverEvent(when, readTime, AMOTION_EVENT_ACTION_HOVER_EXIT, xCursorPosition, - yCursorPosition)}; + return {makeHoverEvent(when, readTime, AMOTION_EVENT_ACTION_HOVER_EXIT)}; } else { return {}; } } -NotifyMotionArgs GestureConverter::makeHoverEvent(nsecs_t when, nsecs_t readTime, int32_t action, - float xCursorPosition, float yCursorPosition) { +NotifyMotionArgs GestureConverter::makeHoverEvent(nsecs_t when, nsecs_t readTime, int32_t action) { PointerCoords coords; coords.clear(); - coords.setAxisValue(AMOTION_EVENT_AXIS_X, xCursorPosition); - coords.setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition); coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, 0); coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, 0); return makeMotionArgs(when, readTime, action, /*actionButton=*/0, mButtonState, - /*pointerCount=*/1, &coords, xCursorPosition, yCursorPosition); + /*pointerCount=*/1, &coords); } NotifyMotionArgs GestureConverter::makeMotionArgs(nsecs_t when, nsecs_t readTime, int32_t action, int32_t actionButton, int32_t buttonState, uint32_t pointerCount, - const PointerCoords* pointerCoords, - float xCursorPosition, float yCursorPosition) { + const PointerCoords* pointerCoords) { return {mReaderContext.getNextId(), when, readTime, @@ -695,8 +641,8 @@ NotifyMotionArgs GestureConverter::makeMotionArgs(nsecs_t when, nsecs_t readTime pointerCoords, /* xPrecision= */ 1.0f, /* yPrecision= */ 1.0f, - xCursorPosition, - yCursorPosition, + /* xCursorPosition= */ 0.f, + /* yCursorPosition= */ 0.f, /* downTime= */ mDownTime, /* videoFrames= */ {}}; } diff --git a/services/inputflinger/reader/mapper/gestures/GestureConverter.h b/services/inputflinger/reader/mapper/gestures/GestureConverter.h index c8f437e0b8..e6ced0f02c 100644 --- a/services/inputflinger/reader/mapper/gestures/GestureConverter.h +++ b/services/inputflinger/reader/mapper/gestures/GestureConverter.h @@ -20,7 +20,6 @@ #include <list> #include <memory> -#include <PointerControllerInterface.h> #include <android/input.h> #include <utils/Timers.h> @@ -41,8 +40,7 @@ using std::chrono_literals::operator""ms; */ constexpr std::chrono::nanoseconds TAP_ENABLE_DELAY_NANOS = 400ms; -// Converts Gesture structs from the gestures library into NotifyArgs and the appropriate -// PointerController calls. +// Converts Gesture structs from the gestures library into NotifyArgs. class GestureConverter { public: GestureConverter(InputReaderContext& readerContext, const InputDeviceContext& deviceContext, @@ -85,18 +83,14 @@ private: const Gesture& gesture); [[nodiscard]] std::list<NotifyArgs> endPinch(nsecs_t when, nsecs_t readTime); - [[nodiscard]] std::list<NotifyArgs> enterHover(nsecs_t when, nsecs_t readTime, - float xCursorPosition, float yCursorPosition); - [[nodiscard]] std::list<NotifyArgs> exitHover(nsecs_t when, nsecs_t readTime, - float xCursorPosition, float yCursorPosition); + [[nodiscard]] std::list<NotifyArgs> enterHover(nsecs_t when, nsecs_t readTime); + [[nodiscard]] std::list<NotifyArgs> exitHover(nsecs_t when, nsecs_t readTime); - NotifyMotionArgs makeHoverEvent(nsecs_t when, nsecs_t readTime, int32_t action, - float xCursorPosition, float yCursorPosition); + NotifyMotionArgs makeHoverEvent(nsecs_t when, nsecs_t readTime, int32_t action); NotifyMotionArgs makeMotionArgs(nsecs_t when, nsecs_t readTime, int32_t action, int32_t actionButton, int32_t buttonState, - uint32_t pointerCount, const PointerCoords* pointerCoords, - float xCursorPosition, float yCursorPosition); + uint32_t pointerCount, const PointerCoords* pointerCoords); void enableTapToClick(nsecs_t when); bool mIsHoverCancelled{false}; @@ -104,7 +98,6 @@ private: const int32_t mDeviceId; InputReaderContext& mReaderContext; - std::shared_ptr<PointerControllerInterface> mPointerController; const bool mEnableFlingStop; std::optional<int32_t> mDisplayId; diff --git a/services/inputflinger/tests/GestureConverter_test.cpp b/services/inputflinger/tests/GestureConverter_test.cpp index 6a009b2918..f50f5173b8 100644 --- a/services/inputflinger/tests/GestureConverter_test.cpp +++ b/services/inputflinger/tests/GestureConverter_test.cpp @@ -51,13 +51,11 @@ using testing::Each; using testing::ElementsAre; using testing::VariantWith; -class GestureConverterTestBase : public testing::Test { +class GestureConverterTest : public testing::Test { protected: static constexpr int32_t DEVICE_ID = END_RESERVED_ID + 1000; static constexpr int32_t EVENTHUB_ID = 1; static constexpr stime_t ARBITRARY_GESTURE_TIME = 1.2; - static constexpr float POINTER_X = 500; - static constexpr float POINTER_Y = 200; void SetUp() { mFakeEventHub = std::make_unique<FakeEventHub>(); @@ -68,12 +66,6 @@ protected: mDevice = newDevice(); mFakeEventHub->addAbsoluteAxis(EVENTHUB_ID, ABS_MT_POSITION_X, -500, 500, 0, 0, 20); mFakeEventHub->addAbsoluteAxis(EVENTHUB_ID, ABS_MT_POSITION_Y, -500, 500, 0, 0, 20); - - mFakePointerController = std::make_shared<FakePointerController>( - /*enabled=*/!input_flags::enable_pointer_choreographer()); - mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); - mFakePointerController->setPosition(POINTER_X, POINTER_Y); - mFakePolicy->setPointerController(mFakePointerController); } std::shared_ptr<InputDevice> newDevice() { @@ -96,15 +88,6 @@ protected: std::unique_ptr<TestInputListener> mFakeListener; std::unique_ptr<InstrumentedInputReader> mReader; std::shared_ptr<InputDevice> mDevice; - std::shared_ptr<FakePointerController> mFakePointerController; -}; - -class GestureConverterTest : public GestureConverterTestBase { -protected: - void SetUp() override { - input_flags::enable_pointer_choreographer(false); - GestureConverterTestBase::SetUp(); - } }; TEST_F(GestureConverterTest, Move) { @@ -118,1453 +101,6 @@ TEST_F(GestureConverterTest, Move) { ASSERT_THAT(args, ElementsAre(VariantWith<NotifyMotionArgs>( AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithCoords(POINTER_X, POINTER_Y), - WithRelativeMotion(0, 0))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_MOVE), - WithCoords(POINTER_X - 5, POINTER_Y + 10), - WithRelativeMotion(-5, 10), WithButtonState(0), - WithPressure(0.0f))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - ASSERT_NO_FATAL_FAILURE(mFakePointerController->assertPosition(POINTER_X - 5, POINTER_Y + 10)); - - // The same gesture again should only repeat the HOVER_MOVE and cursor position change, not the - // HOVER_ENTER. - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, moveGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_MOVE), - WithCoords(POINTER_X - 10, POINTER_Y + 20), - WithRelativeMotion(-5, 10), WithToolType(ToolType::FINGER), - WithButtonState(0), WithPressure(0.0f), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - ASSERT_NO_FATAL_FAILURE(mFakePointerController->assertPosition(POINTER_X - 10, POINTER_Y + 20)); -} - -TEST_F(GestureConverterTest, Move_Rotated) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setOrientation(ui::ROTATION_90); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture moveGesture(kGestureMove, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, -5, 10); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, moveGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithCoords(POINTER_X, POINTER_Y), - WithRelativeMotion(0, 0))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_MOVE), - WithCoords(POINTER_X + 10, POINTER_Y + 5), - WithRelativeMotion(10, 5), WithButtonState(0), - WithPressure(0.0f))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - ASSERT_NO_FATAL_FAILURE(mFakePointerController->assertPosition(POINTER_X + 10, POINTER_Y + 5)); -} - -TEST_F(GestureConverterTest, ButtonsChange) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - // Press left and right buttons at once - Gesture downGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* down= */ GESTURES_BUTTON_LEFT | GESTURES_BUTTON_RIGHT, - /* up= */ GESTURES_BUTTON_NONE, /* is_tap= */ false); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, downGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY | - AMOTION_EVENT_BUTTON_SECONDARY))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_PRESS), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_PRESS), - WithActionButton(AMOTION_EVENT_BUTTON_SECONDARY), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY | - AMOTION_EVENT_BUTTON_SECONDARY))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithCoords(POINTER_X, POINTER_Y), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - // Then release the left button - Gesture leftUpGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* down= */ GESTURES_BUTTON_NONE, /* up= */ GESTURES_BUTTON_LEFT, - /* is_tap= */ false); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, leftUpGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_RELEASE), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithButtonState(AMOTION_EVENT_BUTTON_SECONDARY), - WithCoords(POINTER_X, POINTER_Y), WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - // Finally release the right button - Gesture rightUpGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* down= */ GESTURES_BUTTON_NONE, /* up= */ GESTURES_BUTTON_RIGHT, - /* is_tap= */ false); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, rightUpGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_RELEASE), - WithActionButton(AMOTION_EVENT_BUTTON_SECONDARY))), - VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_UP)), - VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER)))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithButtonState(0), - WithCoords(POINTER_X, POINTER_Y), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, ButtonDownAfterMoveExitsHover) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture moveGesture(kGestureMove, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, -5, 10); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, moveGesture); - - Gesture downGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /*down=*/GESTURES_BUTTON_LEFT, /*up=*/GESTURES_BUTTON_NONE, - /*is_tap=*/false); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, downGesture); - ASSERT_THAT(args.front(), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_EXIT), WithButtonState(0), - WithCoords(POINTER_X - 5, POINTER_Y + 10), - WithToolType(ToolType::FINGER), WithDisplayId(ADISPLAY_ID_DEFAULT)))); -} - -TEST_F(GestureConverterTest, DragWithButton) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - // Press the button - Gesture downGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* down= */ GESTURES_BUTTON_LEFT, /* up= */ GESTURES_BUTTON_NONE, - /* is_tap= */ false); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, downGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_PRESS), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithCoords(POINTER_X, POINTER_Y), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - // Move - Gesture moveGesture(kGestureMove, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, -5, 10); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, moveGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithCoords(POINTER_X - 5, POINTER_Y + 10), WithRelativeMotion(-5, 10), - WithToolType(ToolType::FINGER), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY), WithPressure(1.0f), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - ASSERT_NO_FATAL_FAILURE(mFakePointerController->assertPosition(POINTER_X - 5, POINTER_Y + 10)); - - // Release the button - Gesture upGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* down= */ GESTURES_BUTTON_NONE, /* up= */ GESTURES_BUTTON_LEFT, - /* is_tap= */ false); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, upGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_RELEASE), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY))), - VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_UP)), - VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER)))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithButtonState(0), - WithCoords(POINTER_X - 5, POINTER_Y + 10), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, Scroll) { - const nsecs_t downTime = 12345; - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGestureScroll, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 0, -10); - std::list<NotifyArgs> args = - converter.handleGesture(downTime, READ_TIME, ARBITRARY_TIME, startGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), - WithCoords(POINTER_X, POINTER_Y), - WithGestureScrollDistance(0, 0, EPSILON), - WithDownTime(downTime))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithCoords(POINTER_X, POINTER_Y - 10), - WithGestureScrollDistance(0, 10, EPSILON))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionClassification(MotionClassification::TWO_FINGER_SWIPE), - WithFlags(AMOTION_EVENT_FLAG_IS_GENERATED_GESTURE), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - Gesture continueGesture(kGestureScroll, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 0, -5); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, continueGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithCoords(POINTER_X, POINTER_Y - 15), - WithGestureScrollDistance(0, 5, EPSILON), - WithMotionClassification(MotionClassification::TWO_FINGER_SWIPE), - WithToolType(ToolType::FINGER), - WithFlags(AMOTION_EVENT_FLAG_IS_GENERATED_GESTURE), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - Gesture flingGesture(kGestureFling, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 1, 1, - GESTURES_FLING_START); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, flingGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithCoords(POINTER_X, POINTER_Y - 15), - WithGestureScrollDistance(0, 0, EPSILON), - WithMotionClassification( - MotionClassification::TWO_FINGER_SWIPE), - WithFlags(AMOTION_EVENT_FLAG_IS_GENERATED_GESTURE))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithCoords(POINTER_X, POINTER_Y), - WithMotionClassification(MotionClassification::NONE))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, Scroll_Rotated) { - const nsecs_t downTime = 12345; - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setOrientation(ui::ROTATION_90); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGestureScroll, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 0, -10); - std::list<NotifyArgs> args = - converter.handleGesture(downTime, READ_TIME, ARBITRARY_TIME, startGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), - WithCoords(POINTER_X, POINTER_Y), - WithGestureScrollDistance(0, 0, EPSILON), - WithDownTime(downTime))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithCoords(POINTER_X - 10, POINTER_Y), - WithGestureScrollDistance(0, 10, EPSILON))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionClassification(MotionClassification::TWO_FINGER_SWIPE), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - Gesture continueGesture(kGestureScroll, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 0, -5); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, continueGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithCoords(POINTER_X - 15, POINTER_Y), - WithGestureScrollDistance(0, 5, EPSILON), - WithMotionClassification(MotionClassification::TWO_FINGER_SWIPE), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - Gesture flingGesture(kGestureFling, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 1, 1, - GESTURES_FLING_START); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, flingGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithCoords(POINTER_X - 15, POINTER_Y), - WithGestureScrollDistance(0, 0, EPSILON), - WithMotionClassification( - MotionClassification::TWO_FINGER_SWIPE))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithCoords(POINTER_X, POINTER_Y), - WithMotionClassification(MotionClassification::NONE))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, Scroll_ClearsClassificationAfterGesture) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGestureScroll, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 0, -10); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - - Gesture continueGesture(kGestureScroll, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 0, -5); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, continueGesture); - - Gesture flingGesture(kGestureFling, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 1, 1, - GESTURES_FLING_START); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, flingGesture); - - Gesture moveGesture(kGestureMove, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, -5, 10); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, moveGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionClassification(MotionClassification::NONE), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, Scroll_ClearsScrollDistanceAfterGesture) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGestureScroll, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 0, -10); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - - Gesture continueGesture(kGestureScroll, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 0, -5); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, continueGesture); - - Gesture flingGesture(kGestureFling, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 1, 1, - GESTURES_FLING_START); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, flingGesture); - - // Move gestures don't use the fake finger array, so to test that gesture axes are cleared we - // need to use another gesture type, like pinch. - Gesture pinchGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dz=*/1, - GESTURES_ZOOM_START); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, pinchGesture); - ASSERT_FALSE(args.empty()); - EXPECT_THAT(std::get<NotifyMotionArgs>(args.front()), WithGestureScrollDistance(0, 0, EPSILON)); -} - -TEST_F(GestureConverterTest, ThreeFingerSwipe_ClearsClassificationAfterGesture) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGestureSwipe, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dx=*/0, - /*dy=*/0); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - - Gesture liftGesture(kGestureSwipeLift, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, liftGesture); - - Gesture moveGesture(kGestureMove, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dx=*/-5, - /*dy=*/10); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, moveGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - WithMotionClassification(MotionClassification::NONE)))); -} - -TEST_F(GestureConverterTest, ThreeFingerSwipe_ClearsGestureAxesAfterGesture) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGestureSwipe, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dx=*/5, - /*dy=*/5); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - - Gesture liftGesture(kGestureSwipeLift, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, liftGesture); - - // Move gestures don't use the fake finger array, so to test that gesture axes are cleared we - // need to use another gesture type, like pinch. - Gesture pinchGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dz=*/1, - GESTURES_ZOOM_START); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, pinchGesture); - ASSERT_FALSE(args.empty()); - EXPECT_THAT(std::get<NotifyMotionArgs>(args.front()), - AllOf(WithGestureOffset(0, 0, EPSILON), WithGestureSwipeFingerCount(0))); -} - -TEST_F(GestureConverterTest, ThreeFingerSwipe_Vertical) { - // The gestures library will "lock" a swipe into the dimension it starts in. For example, if you - // start swiping up and then start moving left or right, it'll return gesture events with only Y - // deltas until you lift your fingers and start swiping again. That's why each of these tests - // only checks movement in one dimension. - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGestureSwipe, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /* dx= */ 0, - /* dy= */ 10); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - ASSERT_EQ(4u, args.size()); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionClassification(MotionClassification::MULTI_FINGER_SWIPE), - WithGestureSwipeFingerCount(3), WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - // Three fake fingers should be created. We don't actually care where they are, so long as they - // move appropriately. - NotifyMotionArgs arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), WithGestureOffset(0, 0, EPSILON), - WithPointerCount(1u))); - PointerCoords finger0Start = arg.pointerCoords[0]; - args.pop_front(); - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_POINTER_DOWN | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), WithPointerCount(2u))); - PointerCoords finger1Start = arg.pointerCoords[1]; - args.pop_front(); - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_POINTER_DOWN | - 2 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), WithPointerCount(3u))); - PointerCoords finger2Start = arg.pointerCoords[2]; - args.pop_front(); - - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithGestureOffset(0, -0.01, EPSILON), WithPointerCount(3u))); - EXPECT_EQ(arg.pointerCoords[0].getX(), finger0Start.getX()); - EXPECT_EQ(arg.pointerCoords[1].getX(), finger1Start.getX()); - EXPECT_EQ(arg.pointerCoords[2].getX(), finger2Start.getX()); - EXPECT_EQ(arg.pointerCoords[0].getY(), finger0Start.getY() - 10); - EXPECT_EQ(arg.pointerCoords[1].getY(), finger1Start.getY() - 10); - EXPECT_EQ(arg.pointerCoords[2].getY(), finger2Start.getY() - 10); - - Gesture continueGesture(kGestureSwipe, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* dx= */ 0, /* dy= */ 5); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, continueGesture); - ASSERT_EQ(1u, args.size()); - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithGestureOffset(0, -0.005, EPSILON), WithGestureSwipeFingerCount(3), - WithMotionClassification(MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(3u), WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))); - EXPECT_EQ(arg.pointerCoords[0].getX(), finger0Start.getX()); - EXPECT_EQ(arg.pointerCoords[1].getX(), finger1Start.getX()); - EXPECT_EQ(arg.pointerCoords[2].getX(), finger2Start.getX()); - EXPECT_EQ(arg.pointerCoords[0].getY(), finger0Start.getY() - 15); - EXPECT_EQ(arg.pointerCoords[1].getY(), finger1Start.getY() - 15); - EXPECT_EQ(arg.pointerCoords[2].getY(), finger2Start.getY() - 15); - - Gesture liftGesture(kGestureSwipeLift, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, liftGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 2 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), - WithGestureSwipeFingerCount(3), - WithMotionClassification( - MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(3u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), - WithGestureSwipeFingerCount(3), - WithMotionClassification( - MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(2u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithGestureOffset(0, 0, EPSILON), - WithGestureSwipeFingerCount(3), - WithMotionClassification( - MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(1u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithCoords(POINTER_X, POINTER_Y), - WithMotionClassification(MotionClassification::NONE))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, ThreeFingerSwipe_Rotated) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setOrientation(ui::ROTATION_90); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGestureSwipe, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /* dx= */ 0, - /* dy= */ 10); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - ASSERT_EQ(4u, args.size()); - ASSERT_THAT(args, Each(VariantWith<NotifyMotionArgs>(WithDisplayId(ADISPLAY_ID_DEFAULT)))); - - // Three fake fingers should be created. We don't actually care where they are, so long as they - // move appropriately. - NotifyMotionArgs arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), WithGestureOffset(0, 0, EPSILON), - WithPointerCount(1u))); - PointerCoords finger0Start = arg.pointerCoords[0]; - args.pop_front(); - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_POINTER_DOWN | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), WithPointerCount(2u))); - PointerCoords finger1Start = arg.pointerCoords[1]; - args.pop_front(); - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_POINTER_DOWN | - 2 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), WithPointerCount(3u))); - PointerCoords finger2Start = arg.pointerCoords[2]; - args.pop_front(); - - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithGestureOffset(0, -0.01, EPSILON), WithPointerCount(3u))); - EXPECT_EQ(arg.pointerCoords[0].getX(), finger0Start.getX() - 10); - EXPECT_EQ(arg.pointerCoords[1].getX(), finger1Start.getX() - 10); - EXPECT_EQ(arg.pointerCoords[2].getX(), finger2Start.getX() - 10); - EXPECT_EQ(arg.pointerCoords[0].getY(), finger0Start.getY()); - EXPECT_EQ(arg.pointerCoords[1].getY(), finger1Start.getY()); - EXPECT_EQ(arg.pointerCoords[2].getY(), finger2Start.getY()); - - Gesture continueGesture(kGestureSwipe, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* dx= */ 0, /* dy= */ 5); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, continueGesture); - ASSERT_EQ(1u, args.size()); - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithGestureOffset(0, -0.005, EPSILON), WithPointerCount(3u), - WithDisplayId(ADISPLAY_ID_DEFAULT))); - EXPECT_EQ(arg.pointerCoords[0].getX(), finger0Start.getX() - 15); - EXPECT_EQ(arg.pointerCoords[1].getX(), finger1Start.getX() - 15); - EXPECT_EQ(arg.pointerCoords[2].getX(), finger2Start.getX() - 15); - EXPECT_EQ(arg.pointerCoords[0].getY(), finger0Start.getY()); - EXPECT_EQ(arg.pointerCoords[1].getY(), finger1Start.getY()); - EXPECT_EQ(arg.pointerCoords[2].getY(), finger2Start.getY()); - - Gesture liftGesture(kGestureSwipeLift, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, liftGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 2 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), WithPointerCount(3u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), WithPointerCount(2u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithGestureOffset(0, 0, EPSILON), WithPointerCount(1u))), - VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER)))); - ASSERT_THAT(args, Each(VariantWith<NotifyMotionArgs>(WithDisplayId(ADISPLAY_ID_DEFAULT)))); -} - -TEST_F(GestureConverterTest, FourFingerSwipe_Horizontal) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGestureFourFingerSwipe, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* dx= */ 10, /* dy= */ 0); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - ASSERT_EQ(5u, args.size()); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionClassification(MotionClassification::MULTI_FINGER_SWIPE), - WithGestureSwipeFingerCount(4), WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - // Four fake fingers should be created. We don't actually care where they are, so long as they - // move appropriately. - NotifyMotionArgs arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), WithGestureOffset(0, 0, EPSILON), - WithPointerCount(1u))); - PointerCoords finger0Start = arg.pointerCoords[0]; - args.pop_front(); - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_POINTER_DOWN | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), WithPointerCount(2u))); - PointerCoords finger1Start = arg.pointerCoords[1]; - args.pop_front(); - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_POINTER_DOWN | - 2 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), WithPointerCount(3u))); - PointerCoords finger2Start = arg.pointerCoords[2]; - args.pop_front(); - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_POINTER_DOWN | - 3 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), WithPointerCount(4u))); - PointerCoords finger3Start = arg.pointerCoords[3]; - args.pop_front(); - - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithGestureOffset(0.01, 0, EPSILON), WithPointerCount(4u))); - EXPECT_EQ(arg.pointerCoords[0].getX(), finger0Start.getX() + 10); - EXPECT_EQ(arg.pointerCoords[1].getX(), finger1Start.getX() + 10); - EXPECT_EQ(arg.pointerCoords[2].getX(), finger2Start.getX() + 10); - EXPECT_EQ(arg.pointerCoords[3].getX(), finger3Start.getX() + 10); - EXPECT_EQ(arg.pointerCoords[0].getY(), finger0Start.getY()); - EXPECT_EQ(arg.pointerCoords[1].getY(), finger1Start.getY()); - EXPECT_EQ(arg.pointerCoords[2].getY(), finger2Start.getY()); - EXPECT_EQ(arg.pointerCoords[3].getY(), finger3Start.getY()); - - Gesture continueGesture(kGestureFourFingerSwipe, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* dx= */ 5, /* dy= */ 0); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, continueGesture); - ASSERT_EQ(1u, args.size()); - arg = std::get<NotifyMotionArgs>(args.front()); - ASSERT_THAT(arg, - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithGestureOffset(0.005, 0, EPSILON), WithGestureSwipeFingerCount(4), - WithMotionClassification(MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(4u), WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))); - EXPECT_EQ(arg.pointerCoords[0].getX(), finger0Start.getX() + 15); - EXPECT_EQ(arg.pointerCoords[1].getX(), finger1Start.getX() + 15); - EXPECT_EQ(arg.pointerCoords[2].getX(), finger2Start.getX() + 15); - EXPECT_EQ(arg.pointerCoords[3].getX(), finger3Start.getX() + 15); - EXPECT_EQ(arg.pointerCoords[0].getY(), finger0Start.getY()); - EXPECT_EQ(arg.pointerCoords[1].getY(), finger1Start.getY()); - EXPECT_EQ(arg.pointerCoords[2].getY(), finger2Start.getY()); - EXPECT_EQ(arg.pointerCoords[3].getY(), finger3Start.getY()); - - Gesture liftGesture(kGestureSwipeLift, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, liftGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 3 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), - WithGestureSwipeFingerCount(4), - WithMotionClassification( - MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(4u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 2 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), - WithGestureSwipeFingerCount(4), - WithMotionClassification( - MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(3u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), - WithGestureSwipeFingerCount(4), - WithMotionClassification( - MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(2u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithGestureOffset(0, 0, EPSILON), - WithGestureSwipeFingerCount(4), - WithMotionClassification( - MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(1u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithCoords(POINTER_X, POINTER_Y), - WithMotionClassification(MotionClassification::NONE))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, Pinch_Inwards) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /* dz= */ 1, - GESTURES_ZOOM_START); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), - WithCoords(POINTER_X - 100, POINTER_Y), - WithPointerCount(1u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_DOWN | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithPointerCoords(1, POINTER_X + 100, POINTER_Y), - WithPointerCount(2u))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionClassification(MotionClassification::PINCH), - WithGesturePinchScaleFactor(1.0f, EPSILON), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - Gesture updateGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* dz= */ 0.8, GESTURES_ZOOM_UPDATE); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, updateGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithMotionClassification(MotionClassification::PINCH), - WithGesturePinchScaleFactor(0.8f, EPSILON), - WithPointerCoords(0, POINTER_X - 80, POINTER_Y), - WithPointerCoords(1, POINTER_X + 80, POINTER_Y), WithPointerCount(2u), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - Gesture endGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /* dz= */ 1, - GESTURES_ZOOM_END); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, endGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithMotionClassification(MotionClassification::PINCH), - WithGesturePinchScaleFactor(1.0f, EPSILON), - WithPointerCount(2u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithMotionClassification(MotionClassification::PINCH), - WithGesturePinchScaleFactor(1.0f, EPSILON), - WithPointerCount(1u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithCoords(POINTER_X, POINTER_Y), - WithMotionClassification(MotionClassification::NONE))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, Pinch_Outwards) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /* dz= */ 1, - GESTURES_ZOOM_START); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), - WithCoords(POINTER_X - 100, POINTER_Y), - WithPointerCount(1u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_DOWN | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithPointerCoords(1, POINTER_X + 100, POINTER_Y), - WithPointerCount(2u))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionClassification(MotionClassification::PINCH), - WithGesturePinchScaleFactor(1.0f, EPSILON), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - Gesture updateGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* dz= */ 1.2, GESTURES_ZOOM_UPDATE); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, updateGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_MOVE), - WithMotionClassification(MotionClassification::PINCH), - WithGesturePinchScaleFactor(1.2f, EPSILON), - WithPointerCoords(0, POINTER_X - 120, POINTER_Y), - WithPointerCoords(1, POINTER_X + 120, POINTER_Y), - WithPointerCount(2u), WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - Gesture endGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /* dz= */ 1, - GESTURES_ZOOM_END); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, endGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithMotionClassification(MotionClassification::PINCH), - WithGesturePinchScaleFactor(1.0f, EPSILON), - WithPointerCount(2u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithMotionClassification(MotionClassification::PINCH), - WithGesturePinchScaleFactor(1.0f, EPSILON), - WithPointerCount(1u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithCoords(POINTER_X, POINTER_Y), - WithMotionClassification(MotionClassification::NONE))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, Pinch_ClearsClassificationAfterGesture) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dz=*/1, - GESTURES_ZOOM_START); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - - Gesture updateGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /*dz=*/1.2, GESTURES_ZOOM_UPDATE); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, updateGesture); - - Gesture endGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dz=*/1, - GESTURES_ZOOM_END); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, endGesture); - - Gesture moveGesture(kGestureMove, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, -5, 10); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, moveGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - WithMotionClassification(MotionClassification::NONE)))); -} - -TEST_F(GestureConverterTest, Pinch_ClearsScaleFactorAfterGesture) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dz=*/1, - GESTURES_ZOOM_START); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - - Gesture updateGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /*dz=*/1.2, GESTURES_ZOOM_UPDATE); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, updateGesture); - - Gesture endGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dz=*/1, - GESTURES_ZOOM_END); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, endGesture); - - // Move gestures don't use the fake finger array, so to test that gesture axes are cleared we - // need to use another gesture type, like scroll. - Gesture scrollGesture(kGestureScroll, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dx=*/1, - /*dy=*/0); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, scrollGesture); - ASSERT_FALSE(args.empty()); - EXPECT_THAT(std::get<NotifyMotionArgs>(args.front()), WithGesturePinchScaleFactor(0, EPSILON)); -} - -TEST_F(GestureConverterTest, ResetWithButtonPressed) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture downGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /*down=*/GESTURES_BUTTON_LEFT | GESTURES_BUTTON_RIGHT, - /*up=*/GESTURES_BUTTON_NONE, /*is_tap=*/false); - (void)converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, downGesture); - - std::list<NotifyArgs> args = converter.reset(ARBITRARY_TIME); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_RELEASE), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithButtonState(AMOTION_EVENT_BUTTON_SECONDARY))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_RELEASE), - WithActionButton(AMOTION_EVENT_BUTTON_SECONDARY), - WithButtonState(0))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithButtonState(0))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithButtonState(0))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithCoords(POINTER_X, POINTER_Y), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, ResetDuringScroll) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGestureScroll, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 0, -10); - (void)converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - - std::list<NotifyArgs> args = converter.reset(ARBITRARY_TIME); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithCoords(POINTER_X, POINTER_Y - 10), - WithGestureScrollDistance(0, 0, EPSILON), - WithMotionClassification( - MotionClassification::TWO_FINGER_SWIPE), - WithFlags(AMOTION_EVENT_FLAG_IS_GENERATED_GESTURE))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithCoords(POINTER_X, POINTER_Y), - WithMotionClassification(MotionClassification::NONE))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, ResetDuringThreeFingerSwipe) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGestureSwipe, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dx=*/0, - /*dy=*/10); - (void)converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - - std::list<NotifyArgs> args = converter.reset(ARBITRARY_TIME); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 2 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), - WithMotionClassification( - MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(3u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithGestureOffset(0, 0, EPSILON), - WithMotionClassification( - MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(2u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithGestureOffset(0, 0, EPSILON), - WithMotionClassification( - MotionClassification::MULTI_FINGER_SWIPE), - WithPointerCount(1u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithMotionClassification(MotionClassification::NONE))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, ResetDuringPinch) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture startGesture(kGesturePinch, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /*dz=*/1, - GESTURES_ZOOM_START); - (void)converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, startGesture); - - std::list<NotifyArgs> args = converter.reset(ARBITRARY_TIME); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction( - AMOTION_EVENT_ACTION_POINTER_UP | - 1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), - WithMotionClassification(MotionClassification::PINCH), - WithGesturePinchScaleFactor(1.0f, EPSILON), - WithPointerCount(2u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithMotionClassification(MotionClassification::PINCH), - WithGesturePinchScaleFactor(1.0f, EPSILON), - WithPointerCount(1u))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithCoords(POINTER_X, POINTER_Y), - WithMotionClassification(MotionClassification::NONE))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, FlingTapDown) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture tapDownGesture(kGestureFling, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /*vx=*/0.f, /*vy=*/0.f, GESTURES_FLING_TAP_DOWN); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, tapDownGesture); - - ASSERT_THAT(std::get<NotifyMotionArgs>(args.front()), - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithCoords(POINTER_X, POINTER_Y), WithRelativeMotion(0.f, 0.f), - WithToolType(ToolType::FINGER), WithButtonState(0), WithPressure(0.0f), - WithDisplayId(ADISPLAY_ID_DEFAULT))); - - ASSERT_NO_FATAL_FAILURE(mFakePointerController->assertPosition(POINTER_X, POINTER_Y)); - ASSERT_TRUE(mFakePointerController->isPointerShown()); -} - -TEST_F(GestureConverterTest, FlingTapDownAfterScrollStopsFling) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - input_flags::enable_touchpad_fling_stop(true); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture scrollGesture(kGestureScroll, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 0, -10); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, scrollGesture); - Gesture flingGesture(kGestureFling, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, 1, 1, - GESTURES_FLING_START); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, flingGesture); - - Gesture tapDownGesture(kGestureFling, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /*vx=*/0.f, /*vy=*/0.f, GESTURES_FLING_TAP_DOWN); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, tapDownGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_HOVER_EXIT)), - VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_DOWN)), - VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_CANCEL)), - VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER)))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>( - AllOf(WithCoords(POINTER_X, POINTER_Y), WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT), - WithMotionClassification(MotionClassification::TWO_FINGER_SWIPE))))); -} - -TEST_F(GestureConverterTest, Tap) { - // Tap should produce button press/release events - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture flingGesture(kGestureFling, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /* vx= */ 0, - /* vy= */ 0, GESTURES_FLING_TAP_DOWN); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, flingGesture); - // We don't need to check args here, since it's covered by the FlingTapDown test. - - Gesture tapGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* down= */ GESTURES_BUTTON_LEFT, - /* up= */ GESTURES_BUTTON_LEFT, /* is_tap= */ true); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, tapGesture); - - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_EXIT), - WithButtonState(0), WithPressure(0.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY), - WithPressure(1.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_PRESS), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY), - WithPressure(1.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_RELEASE), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithButtonState(0), WithPressure(1.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithButtonState(0), WithPressure(0.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithButtonState(0), WithPressure(0.0f))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithCoords(POINTER_X, POINTER_Y), - WithRelativeMotion(0.f, 0.f), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F(GestureConverterTest, Click) { - // Click should produce button press/release events - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture flingGesture(kGestureFling, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /* vx= */ 0, - /* vy= */ 0, GESTURES_FLING_TAP_DOWN); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, flingGesture); - // We don't need to check args here, since it's covered by the FlingTapDown test. - - Gesture buttonDownGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* down= */ GESTURES_BUTTON_LEFT, - /* up= */ GESTURES_BUTTON_NONE, /* is_tap= */ false); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, buttonDownGesture); - - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_EXIT), - WithButtonState(0), WithPressure(0.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY), - WithPressure(1.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_PRESS), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY), - WithPressure(1.0f))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithCoords(POINTER_X, POINTER_Y), - WithRelativeMotion(0.f, 0.f), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - Gesture buttonUpGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* down= */ GESTURES_BUTTON_NONE, - /* up= */ GESTURES_BUTTON_LEFT, /* is_tap= */ false); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, buttonUpGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_RELEASE), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithPressure(1.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithPressure(0.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithPressure(0.0f))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>( - AllOf(WithButtonState(0), WithCoords(POINTER_X, POINTER_Y), - WithRelativeMotion(0.f, 0.f), WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); -} - -TEST_F_WITH_FLAGS(GestureConverterTest, TapWithTapToClickDisabled, - REQUIRES_FLAGS_ENABLED(TOUCHPAD_PALM_REJECTION), - REQUIRES_FLAGS_DISABLED(TOUCHPAD_PALM_REJECTION_V2)) { - nsecs_t currentTime = ARBITRARY_GESTURE_TIME; - - // Tap should be ignored when disabled - mReader->getContext()->setPreventingTouchpadTaps(true); - - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture flingGesture(kGestureFling, currentTime, currentTime, /* vx= */ 0, - /* vy= */ 0, GESTURES_FLING_TAP_DOWN); - std::list<NotifyArgs> args = - converter.handleGesture(currentTime, currentTime, currentTime, flingGesture); - // We don't need to check args here, since it's covered by the FlingTapDown test. - - Gesture tapGesture(kGestureButtonsChange, currentTime, currentTime, - /* down= */ GESTURES_BUTTON_LEFT, - /* up= */ GESTURES_BUTTON_LEFT, /* is_tap= */ true); - args = converter.handleGesture(currentTime, currentTime, currentTime, tapGesture); - - // no events should be generated - ASSERT_EQ(0u, args.size()); - - // Future taps should be re-enabled - ASSERT_FALSE(mReader->getContext()->isPreventingTouchpadTaps()); -} - -TEST_F_WITH_FLAGS(GestureConverterTest, TapWithTapToClickDisabledWithDelay, - REQUIRES_FLAGS_ENABLED(TOUCHPAD_PALM_REJECTION_V2)) { - nsecs_t currentTime = ARBITRARY_GESTURE_TIME; - - // Tap should be ignored when disabled - mReader->getContext()->setPreventingTouchpadTaps(true); - - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture flingGesture(kGestureFling, currentTime, currentTime, /* vx= */ 0, - /* vy= */ 0, GESTURES_FLING_TAP_DOWN); - std::list<NotifyArgs> args = - converter.handleGesture(currentTime, currentTime, currentTime, flingGesture); - // We don't need to check args here, since it's covered by the FlingTapDown test. - - Gesture tapGesture(kGestureButtonsChange, currentTime, currentTime, - /* down= */ GESTURES_BUTTON_LEFT, - /* up= */ GESTURES_BUTTON_LEFT, /* is_tap= */ true); - args = converter.handleGesture(currentTime, currentTime, currentTime, tapGesture); - - // no events should be generated - ASSERT_EQ(0u, args.size()); - - // Future taps should be re-enabled - ASSERT_FALSE(mReader->getContext()->isPreventingTouchpadTaps()); - - // taps before the threshold should still be ignored - currentTime += TAP_ENABLE_DELAY_NANOS.count(); - flingGesture = Gesture(kGestureFling, currentTime, currentTime, /* vx= */ 0, - /* vy= */ 0, GESTURES_FLING_TAP_DOWN); - args = converter.handleGesture(currentTime, currentTime, currentTime, flingGesture); - - ASSERT_EQ(1u, args.size()); - ASSERT_THAT(std::get<NotifyMotionArgs>(args.front()), - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_MOVE), WithRelativeMotion(0, 0))); - - tapGesture = Gesture(kGestureButtonsChange, currentTime, currentTime, - /* down= */ GESTURES_BUTTON_LEFT, - /* up= */ GESTURES_BUTTON_LEFT, /* is_tap= */ true); - args = converter.handleGesture(currentTime, currentTime, currentTime, tapGesture); - - // no events should be generated - ASSERT_EQ(0u, args.size()); - - // taps after the threshold should be recognised - currentTime += 1; - flingGesture = Gesture(kGestureFling, currentTime, currentTime, /* vx= */ 0, - /* vy= */ 0, GESTURES_FLING_TAP_DOWN); - args = converter.handleGesture(currentTime, currentTime, currentTime, flingGesture); - - ASSERT_EQ(1u, args.size()); - ASSERT_THAT(std::get<NotifyMotionArgs>(args.front()), - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_MOVE), WithRelativeMotion(0, 0))); - - tapGesture = Gesture(kGestureButtonsChange, currentTime, currentTime, - /* down= */ GESTURES_BUTTON_LEFT, - /* up= */ GESTURES_BUTTON_LEFT, /* is_tap= */ true); - args = converter.handleGesture(currentTime, currentTime, currentTime, tapGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_EXIT), - WithButtonState(0))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_PRESS), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_RELEASE), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithButtonState(0))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithButtonState(0))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithButtonState(0))))); - ASSERT_THAT(args, Each(VariantWith<NotifyMotionArgs>(WithRelativeMotion(0.f, 0.f)))); -} - -TEST_F_WITH_FLAGS(GestureConverterTest, ClickWithTapToClickDisabled, - REQUIRES_FLAGS_ENABLED(TOUCHPAD_PALM_REJECTION)) { - // Click should still produce button press/release events - mReader->getContext()->setPreventingTouchpadTaps(true); - - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture flingGesture(kGestureFling, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, /* vx= */ 0, - /* vy= */ 0, GESTURES_FLING_TAP_DOWN); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, flingGesture); - // We don't need to check args here, since it's covered by the FlingTapDown test. - - Gesture buttonDownGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* down= */ GESTURES_BUTTON_LEFT, - /* up= */ GESTURES_BUTTON_NONE, /* is_tap= */ false); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, buttonDownGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_EXIT), - WithButtonState(0), WithPressure(0.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_DOWN), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY), - WithPressure(1.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_PRESS), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithButtonState(AMOTION_EVENT_BUTTON_PRIMARY), - WithPressure(1.0f))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithCoords(POINTER_X, POINTER_Y), - WithRelativeMotion(0.f, 0.f), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - Gesture buttonUpGesture(kGestureButtonsChange, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, - /* down= */ GESTURES_BUTTON_NONE, - /* up= */ GESTURES_BUTTON_LEFT, /* is_tap= */ false); - args = converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, buttonUpGesture); - - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_BUTTON_RELEASE), - WithActionButton(AMOTION_EVENT_BUTTON_PRIMARY), - WithButtonState(0), WithPressure(1.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_UP), - WithButtonState(0), WithPressure(0.0f))), - VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), - WithButtonState(0), WithPressure(0.0f))))); - ASSERT_THAT(args, - Each(VariantWith<NotifyMotionArgs>(AllOf(WithCoords(POINTER_X, POINTER_Y), - WithRelativeMotion(0.f, 0.f), - WithToolType(ToolType::FINGER), - WithDisplayId(ADISPLAY_ID_DEFAULT))))); - - // Future taps should be re-enabled - ASSERT_FALSE(mReader->getContext()->isPreventingTouchpadTaps()); -} - -TEST_F_WITH_FLAGS(GestureConverterTest, MoveEnablesTapToClick, - REQUIRES_FLAGS_ENABLED(TOUCHPAD_PALM_REJECTION)) { - // initially disable tap-to-click - mReader->getContext()->setPreventingTouchpadTaps(true); - - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture moveGesture(kGestureMove, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, -5, 10); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, moveGesture); - // We don't need to check args here, since it's covered by the Move test. - - // Future taps should be re-enabled - ASSERT_FALSE(mReader->getContext()->isPreventingTouchpadTaps()); -} - -TEST_F_WITH_FLAGS(GestureConverterTest, KeypressCancelsHoverMove, - REQUIRES_FLAGS_ENABLED(TOUCHPAD_PALM_REJECTION_V2)) { - const nsecs_t gestureStartTime = 1000; - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - // Start a move gesture at gestureStartTime - Gesture moveGesture(kGestureMove, gestureStartTime, gestureStartTime, -5, 10); - std::list<NotifyArgs> args = - converter.handleGesture(gestureStartTime, READ_TIME, gestureStartTime, moveGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER)), - VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_HOVER_MOVE)))); - - // Key presses with IME connection should cancel ongoing move gesture - nsecs_t currentTime = gestureStartTime + 100; - mFakePolicy->setIsInputMethodConnectionActive(true); - mReader->getContext()->setLastKeyDownTimestamp(currentTime); - moveGesture = Gesture(kGestureMove, currentTime, currentTime, -5, 10); - args = converter.handleGesture(currentTime, READ_TIME, gestureStartTime, moveGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_HOVER_EXIT)))); - - // any updates in existing move gesture should be ignored - moveGesture = Gesture(kGestureMove, currentTime, currentTime, -5, 10); - args = converter.handleGesture(currentTime, READ_TIME, gestureStartTime, moveGesture); - ASSERT_EQ(0u, args.size()); - - // New gesture should not be affected - currentTime += 100; - moveGesture = Gesture(kGestureMove, currentTime, currentTime, -5, 10); - args = converter.handleGesture(currentTime, READ_TIME, currentTime, moveGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER)), - VariantWith<NotifyMotionArgs>( - WithMotionAction(AMOTION_EVENT_ACTION_HOVER_MOVE)))); -} - -// TODO(b/311416205): De-duplicate the test cases after the refactoring is complete and the flagging -// logic can be removed. -class GestureConverterTestWithChoreographer : public GestureConverterTestBase { -protected: - void SetUp() override { - input_flags::enable_pointer_choreographer(true); - GestureConverterTestBase::SetUp(); - } -}; - -TEST_F(GestureConverterTestWithChoreographer, Move) { - InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); - GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); - converter.setDisplayId(ADISPLAY_ID_DEFAULT); - - Gesture moveGesture(kGestureMove, ARBITRARY_GESTURE_TIME, ARBITRARY_GESTURE_TIME, -5, 10); - std::list<NotifyArgs> args = - converter.handleGesture(ARBITRARY_TIME, READ_TIME, ARBITRARY_TIME, moveGesture); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>( - AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER), WithRelativeMotion(0, 0))), VariantWith<NotifyMotionArgs>( AllOf(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_MOVE), @@ -1585,7 +121,7 @@ TEST_F(GestureConverterTestWithChoreographer, Move) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, Move_Rotated) { +TEST_F(GestureConverterTest, Move_Rotated) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setOrientation(ui::ROTATION_90); @@ -1608,7 +144,7 @@ TEST_F(GestureConverterTestWithChoreographer, Move_Rotated) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, ButtonsChange) { +TEST_F(GestureConverterTest, ButtonsChange) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -1670,7 +206,7 @@ TEST_F(GestureConverterTestWithChoreographer, ButtonsChange) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, ButtonDownAfterMoveExitsHover) { +TEST_F(GestureConverterTest, ButtonDownAfterMoveExitsHover) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -1690,7 +226,7 @@ TEST_F(GestureConverterTestWithChoreographer, ButtonDownAfterMoveExitsHover) { WithDisplayId(ADISPLAY_ID_DEFAULT)))); } -TEST_F(GestureConverterTestWithChoreographer, DragWithButton) { +TEST_F(GestureConverterTest, DragWithButton) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -1743,7 +279,7 @@ TEST_F(GestureConverterTestWithChoreographer, DragWithButton) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, Scroll) { +TEST_F(GestureConverterTest, Scroll) { const nsecs_t downTime = 12345; InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); @@ -1800,7 +336,7 @@ TEST_F(GestureConverterTestWithChoreographer, Scroll) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, Scroll_Rotated) { +TEST_F(GestureConverterTest, Scroll_Rotated) { const nsecs_t downTime = 12345; InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); @@ -1855,7 +391,7 @@ TEST_F(GestureConverterTestWithChoreographer, Scroll_Rotated) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, Scroll_ClearsClassificationAfterGesture) { +TEST_F(GestureConverterTest, Scroll_ClearsClassificationAfterGesture) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -1879,7 +415,7 @@ TEST_F(GestureConverterTestWithChoreographer, Scroll_ClearsClassificationAfterGe WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, Scroll_ClearsScrollDistanceAfterGesture) { +TEST_F(GestureConverterTest, Scroll_ClearsScrollDistanceAfterGesture) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -1904,7 +440,7 @@ TEST_F(GestureConverterTestWithChoreographer, Scroll_ClearsScrollDistanceAfterGe EXPECT_THAT(std::get<NotifyMotionArgs>(args.front()), WithGestureScrollDistance(0, 0, EPSILON)); } -TEST_F(GestureConverterTestWithChoreographer, ThreeFingerSwipe_ClearsClassificationAfterGesture) { +TEST_F(GestureConverterTest, ThreeFingerSwipe_ClearsClassificationAfterGesture) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -1925,7 +461,7 @@ TEST_F(GestureConverterTestWithChoreographer, ThreeFingerSwipe_ClearsClassificat WithMotionClassification(MotionClassification::NONE)))); } -TEST_F(GestureConverterTestWithChoreographer, ThreeFingerSwipe_ClearsGestureAxesAfterGesture) { +TEST_F(GestureConverterTest, ThreeFingerSwipe_ClearsGestureAxesAfterGesture) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -1948,7 +484,7 @@ TEST_F(GestureConverterTestWithChoreographer, ThreeFingerSwipe_ClearsGestureAxes AllOf(WithGestureOffset(0, 0, EPSILON), WithGestureSwipeFingerCount(0))); } -TEST_F(GestureConverterTestWithChoreographer, ThreeFingerSwipe_Vertical) { +TEST_F(GestureConverterTest, ThreeFingerSwipe_Vertical) { // The gestures library will "lock" a swipe into the dimension it starts in. For example, if you // start swiping up and then start moving left or right, it'll return gesture events with only Y // deltas until you lift your fingers and start swiping again. That's why each of these tests @@ -2057,7 +593,7 @@ TEST_F(GestureConverterTestWithChoreographer, ThreeFingerSwipe_Vertical) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, ThreeFingerSwipe_Rotated) { +TEST_F(GestureConverterTest, ThreeFingerSwipe_Rotated) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setOrientation(ui::ROTATION_90); @@ -2141,7 +677,7 @@ TEST_F(GestureConverterTestWithChoreographer, ThreeFingerSwipe_Rotated) { ASSERT_THAT(args, Each(VariantWith<NotifyMotionArgs>(WithDisplayId(ADISPLAY_ID_DEFAULT)))); } -TEST_F(GestureConverterTestWithChoreographer, FourFingerSwipe_Horizontal) { +TEST_F(GestureConverterTest, FourFingerSwipe_Horizontal) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -2266,7 +802,7 @@ TEST_F(GestureConverterTestWithChoreographer, FourFingerSwipe_Horizontal) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, Pinch_Inwards) { +TEST_F(GestureConverterTest, Pinch_Inwards) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -2328,7 +864,7 @@ TEST_F(GestureConverterTestWithChoreographer, Pinch_Inwards) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, Pinch_Outwards) { +TEST_F(GestureConverterTest, Pinch_Outwards) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -2390,7 +926,7 @@ TEST_F(GestureConverterTestWithChoreographer, Pinch_Outwards) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, Pinch_ClearsClassificationAfterGesture) { +TEST_F(GestureConverterTest, Pinch_ClearsClassificationAfterGesture) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -2415,7 +951,7 @@ TEST_F(GestureConverterTestWithChoreographer, Pinch_ClearsClassificationAfterGes WithMotionClassification(MotionClassification::NONE)))); } -TEST_F(GestureConverterTestWithChoreographer, Pinch_ClearsScaleFactorAfterGesture) { +TEST_F(GestureConverterTest, Pinch_ClearsScaleFactorAfterGesture) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -2442,7 +978,7 @@ TEST_F(GestureConverterTestWithChoreographer, Pinch_ClearsScaleFactorAfterGestur EXPECT_THAT(std::get<NotifyMotionArgs>(args.front()), WithGesturePinchScaleFactor(0, EPSILON)); } -TEST_F(GestureConverterTestWithChoreographer, ResetWithButtonPressed) { +TEST_F(GestureConverterTest, ResetWithButtonPressed) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -2474,7 +1010,7 @@ TEST_F(GestureConverterTestWithChoreographer, ResetWithButtonPressed) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, ResetDuringScroll) { +TEST_F(GestureConverterTest, ResetDuringScroll) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -2500,7 +1036,7 @@ TEST_F(GestureConverterTestWithChoreographer, ResetDuringScroll) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, ResetDuringThreeFingerSwipe) { +TEST_F(GestureConverterTest, ResetDuringThreeFingerSwipe) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -2541,7 +1077,7 @@ TEST_F(GestureConverterTestWithChoreographer, ResetDuringThreeFingerSwipe) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, ResetDuringPinch) { +TEST_F(GestureConverterTest, ResetDuringPinch) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -2573,7 +1109,7 @@ TEST_F(GestureConverterTestWithChoreographer, ResetDuringPinch) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, FlingTapDown) { +TEST_F(GestureConverterTest, FlingTapDown) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); converter.setDisplayId(ADISPLAY_ID_DEFAULT); @@ -2589,7 +1125,7 @@ TEST_F(GestureConverterTestWithChoreographer, FlingTapDown) { WithButtonState(0), WithPressure(0.0f), WithDisplayId(ADISPLAY_ID_DEFAULT))); } -TEST_F(GestureConverterTestWithChoreographer, FlingTapDownAfterScrollStopsFling) { +TEST_F(GestureConverterTest, FlingTapDownAfterScrollStopsFling) { InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); input_flags::enable_touchpad_fling_stop(true); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); @@ -2621,7 +1157,7 @@ TEST_F(GestureConverterTestWithChoreographer, FlingTapDownAfterScrollStopsFling) WithMotionClassification(MotionClassification::TWO_FINGER_SWIPE))))); } -TEST_F(GestureConverterTestWithChoreographer, Tap) { +TEST_F(GestureConverterTest, Tap) { // Tap should produce button press/release events InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); @@ -2668,7 +1204,7 @@ TEST_F(GestureConverterTestWithChoreographer, Tap) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F(GestureConverterTestWithChoreographer, Click) { +TEST_F(GestureConverterTest, Click) { // Click should produce button press/release events InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); GestureConverter converter(*mReader->getContext(), deviceContext, DEVICE_ID); @@ -2727,7 +1263,7 @@ TEST_F(GestureConverterTestWithChoreographer, Click) { WithDisplayId(ADISPLAY_ID_DEFAULT))))); } -TEST_F_WITH_FLAGS(GestureConverterTestWithChoreographer, TapWithTapToClickDisabled, +TEST_F_WITH_FLAGS(GestureConverterTest, TapWithTapToClickDisabled, REQUIRES_FLAGS_ENABLED(TOUCHPAD_PALM_REJECTION), REQUIRES_FLAGS_DISABLED(TOUCHPAD_PALM_REJECTION_V2)) { nsecs_t currentTime = ARBITRARY_GESTURE_TIME; @@ -2757,7 +1293,7 @@ TEST_F_WITH_FLAGS(GestureConverterTestWithChoreographer, TapWithTapToClickDisabl ASSERT_FALSE(mReader->getContext()->isPreventingTouchpadTaps()); } -TEST_F_WITH_FLAGS(GestureConverterTestWithChoreographer, TapWithTapToClickDisabledWithDelay, +TEST_F_WITH_FLAGS(GestureConverterTest, TapWithTapToClickDisabledWithDelay, REQUIRES_FLAGS_ENABLED(TOUCHPAD_PALM_REJECTION_V2)) { nsecs_t currentTime = ARBITRARY_GESTURE_TIME; @@ -2841,7 +1377,7 @@ TEST_F_WITH_FLAGS(GestureConverterTestWithChoreographer, TapWithTapToClickDisabl ASSERT_THAT(args, Each(VariantWith<NotifyMotionArgs>(WithRelativeMotion(0.f, 0.f)))); } -TEST_F_WITH_FLAGS(GestureConverterTestWithChoreographer, ClickWithTapToClickDisabled, +TEST_F_WITH_FLAGS(GestureConverterTest, ClickWithTapToClickDisabled, REQUIRES_FLAGS_ENABLED(TOUCHPAD_PALM_REJECTION)) { // Click should still produce button press/release events mReader->getContext()->setPreventingTouchpadTaps(true); @@ -2909,7 +1445,7 @@ TEST_F_WITH_FLAGS(GestureConverterTestWithChoreographer, ClickWithTapToClickDisa ASSERT_FALSE(mReader->getContext()->isPreventingTouchpadTaps()); } -TEST_F_WITH_FLAGS(GestureConverterTestWithChoreographer, MoveEnablesTapToClick, +TEST_F_WITH_FLAGS(GestureConverterTest, MoveEnablesTapToClick, REQUIRES_FLAGS_ENABLED(TOUCHPAD_PALM_REJECTION)) { // initially disable tap-to-click mReader->getContext()->setPreventingTouchpadTaps(true); @@ -2927,7 +1463,7 @@ TEST_F_WITH_FLAGS(GestureConverterTestWithChoreographer, MoveEnablesTapToClick, ASSERT_FALSE(mReader->getContext()->isPreventingTouchpadTaps()); } -TEST_F_WITH_FLAGS(GestureConverterTestWithChoreographer, KeypressCancelsHoverMove, +TEST_F_WITH_FLAGS(GestureConverterTest, KeypressCancelsHoverMove, REQUIRES_FLAGS_ENABLED(TOUCHPAD_PALM_REJECTION_V2)) { const nsecs_t gestureStartTime = 1000; InputDeviceContext deviceContext(*mDevice, EVENTHUB_ID); diff --git a/services/inputflinger/tests/TouchpadInputMapper_test.cpp b/services/inputflinger/tests/TouchpadInputMapper_test.cpp index a92dce5dd0..402654c7ac 100644 --- a/services/inputflinger/tests/TouchpadInputMapper_test.cpp +++ b/services/inputflinger/tests/TouchpadInputMapper_test.cpp @@ -19,9 +19,7 @@ #include <android-base/logging.h> #include <gtest/gtest.h> -#include <com_android_input_flags.h> #include <thread> -#include "FakePointerController.h" #include "InputMapperTest.h" #include "InterfaceMocks.h" #include "TestEventMatchers.h" @@ -44,12 +42,10 @@ constexpr int32_t DISPLAY_WIDTH = 480; constexpr int32_t DISPLAY_HEIGHT = 800; constexpr std::optional<uint8_t> NO_PORT = std::nullopt; // no physical port is specified -namespace input_flags = com::android::input::flags; - /** * Unit tests for TouchpadInputMapper. */ -class TouchpadInputMapperTestBase : public InputMapperUnitTest { +class TouchpadInputMapperTest : public InputMapperUnitTest { protected: void SetUp() override { InputMapperUnitTest::SetUp(); @@ -117,18 +113,7 @@ protected: return base::ResultError("Axis not supported", NAME_NOT_FOUND); }); createDevice(); - mMapper = createInputMapper<TouchpadInputMapper>(*mDeviceContext, mReaderConfiguration, - isPointerChoreographerEnabled()); - } - - virtual bool isPointerChoreographerEnabled() { return false; } -}; - -class TouchpadInputMapperTest : public TouchpadInputMapperTestBase { -protected: - void SetUp() override { - input_flags::enable_pointer_choreographer(false); - TouchpadInputMapperTestBase::SetUp(); + mMapper = createInputMapper<TouchpadInputMapper>(*mDeviceContext, mReaderConfiguration); } }; @@ -139,66 +124,6 @@ protected: * but only after the button is released. */ TEST_F(TouchpadInputMapperTest, HoverAndLeftButtonPress) { - std::list<NotifyArgs> args; - - args += process(EV_ABS, ABS_MT_TRACKING_ID, 1); - args += process(EV_KEY, BTN_TOUCH, 1); - setScanCodeState(KeyState::DOWN, {BTN_TOOL_FINGER}); - args += process(EV_KEY, BTN_TOOL_FINGER, 1); - args += process(EV_ABS, ABS_MT_POSITION_X, 50); - args += process(EV_ABS, ABS_MT_POSITION_Y, 50); - args += process(EV_ABS, ABS_MT_PRESSURE, 1); - args += process(EV_SYN, SYN_REPORT, 0); - ASSERT_THAT(args, testing::IsEmpty()); - - // Without this sleep, the test fails. - // TODO(b/284133337): Figure out whether this can be removed - std::this_thread::sleep_for(std::chrono::milliseconds(20)); - - args += process(EV_KEY, BTN_LEFT, 1); - setScanCodeState(KeyState::DOWN, {BTN_LEFT}); - args += process(EV_SYN, SYN_REPORT, 0); - - args += process(EV_KEY, BTN_LEFT, 0); - setScanCodeState(KeyState::UP, {BTN_LEFT}); - args += process(EV_SYN, SYN_REPORT, 0); - ASSERT_THAT(args, - ElementsAre(VariantWith<NotifyMotionArgs>(WithMotionAction(HOVER_ENTER)), - VariantWith<NotifyMotionArgs>(WithMotionAction(HOVER_MOVE)), - VariantWith<NotifyMotionArgs>(WithMotionAction(HOVER_EXIT)), - VariantWith<NotifyMotionArgs>(WithMotionAction(ACTION_DOWN)), - VariantWith<NotifyMotionArgs>(WithMotionAction(BUTTON_PRESS)), - VariantWith<NotifyMotionArgs>(WithMotionAction(BUTTON_RELEASE)), - VariantWith<NotifyMotionArgs>(WithMotionAction(ACTION_UP)), - VariantWith<NotifyMotionArgs>(WithMotionAction(HOVER_ENTER)))); - - // Liftoff - args.clear(); - args += process(EV_ABS, ABS_MT_PRESSURE, 0); - args += process(EV_ABS, ABS_MT_TRACKING_ID, -1); - args += process(EV_KEY, BTN_TOUCH, 0); - setScanCodeState(KeyState::UP, {BTN_TOOL_FINGER}); - args += process(EV_KEY, BTN_TOOL_FINGER, 0); - args += process(EV_SYN, SYN_REPORT, 0); - ASSERT_THAT(args, testing::IsEmpty()); -} - -class TouchpadInputMapperTestWithChoreographer : public TouchpadInputMapperTestBase { -protected: - void SetUp() override { TouchpadInputMapperTestBase::SetUp(); } - - bool isPointerChoreographerEnabled() override { return true; } -}; - -// TODO(b/311416205): De-duplicate the test cases after the refactoring is complete and the flagging -// logic can be removed. -/** - * Start moving the finger and then click the left touchpad button. Check whether HOVER_EXIT is - * generated when hovering stops. Currently, it is not. - * In the current implementation, HOVER_MOVE and ACTION_DOWN events are not sent out right away, - * but only after the button is released. - */ -TEST_F(TouchpadInputMapperTestWithChoreographer, HoverAndLeftButtonPress) { mFakePolicy->setDefaultPointerDisplayId(DISPLAY_ID); mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, ui::ROTATION_0, /*isActive=*/true, "local:0", NO_PORT, ViewportType::INTERNAL); |