Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 683104b9 authored by Michal Brzezinski's avatar Michal Brzezinski Committed by Michał Brzeziński
Browse files

Adding error state when gesture is using incorrect number of fingers

Doing 2 or 4 finger gesture in tutorial that requires 3 fingers will result in error state.

Bug: 381831607
Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial
Test: ThreeFingerGestureRecognizerTest
Test: go to any 3-finger tutorial and do 4 finger gesture -> see error state
Change-Id: Iac75c596e9f393e7349f85d3930c605e851fba16
parent bd4fc429
Loading
Loading
Loading
Loading
+31 −4
Original line number Diff line number Diff line
@@ -83,13 +83,40 @@ class ThreeFingerGestureRecognizerTest(
    }

    @Test
    fun doesntTriggerGestureFinished_onTwoFingersSwipe() {
        assertStateAfterEvents(events = TwoFingerGesture.swipeRight(), expectedState = NotStarted)
    fun triggersGestureError_onTwoFingersSwipe() {
        assertStateAfterEvents(events = TwoFingerGesture.swipeRight(), expectedState = Error)
    }

    @Test
    fun doesntTriggerGestureFinished_onFourFingersSwipe() {
        assertStateAfterEvents(events = FourFingerGesture.swipeRight(), expectedState = NotStarted)
    fun doesntTriggerGestureError_TwoFingerSwipeInProgress() {
        assertStateAfterEvents(
            events = TwoFingerGesture.eventsForGestureInProgress { move(deltaX = SWIPE_DISTANCE) },
            expectedState = NotStarted,
        )
    }

    @Test
    fun triggersGestureError_onFourFingersSwipe() {
        assertStateAfterEvents(events = FourFingerGesture.swipeRight(), expectedState = Error)
    }

    @Test
    fun doesntTriggerGestureError_FourFingerSwipeInProgress() {
        assertStateAfterEvents(
            events = FourFingerGesture.eventsForGestureInProgress { move(deltaX = SWIPE_DISTANCE) },
            expectedState = NotStarted,
        )
    }

    @Test
    fun ignoresOneFingerSwipes() {
        val oneFingerSwipe =
            listOf(
                touchpadEvent(MotionEvent.ACTION_DOWN, 50f, 50f),
                touchpadEvent(MotionEvent.ACTION_MOVE, 55f, 55f),
                touchpadEvent(MotionEvent.ACTION_UP, 60f, 60f),
            )
        assertStateAfterEvents(events = oneFingerSwipe, expectedState = NotStarted)
    }

    private fun assertStateAfterEvents(events: List<MotionEvent>, expectedState: GestureState) {
+7 −1
Original line number Diff line number Diff line
@@ -41,7 +41,13 @@ class BackGestureRecognizer(private val gestureDistanceThresholdPx: Int) : Gestu
    }

    override fun accept(event: MotionEvent) {
        if (!isThreeFingerTouchpadSwipe(event)) return
        if (!isMultifingerTouchpadSwipe(event)) return
        if (!isThreeFingerTouchpadSwipe(event)) {
            if (event.actionMasked == MotionEvent.ACTION_UP) {
                gestureStateChangedCallback(GestureState.Error)
            }
            return
        }
        val gestureState = distanceTracker.processEvent(event)
        updateGestureState(
            gestureStateChangedCallback,
+5 −0
Original line number Diff line number Diff line
@@ -35,6 +35,11 @@ private fun isNFingerTouchpadSwipe(event: MotionEvent, fingerCount: Int): Boolea
        event.getAxisValue(MotionEvent.AXIS_GESTURE_SWIPE_FINGER_COUNT) == fingerCount.toFloat()
}

fun isMultifingerTouchpadSwipe(event: MotionEvent): Boolean {
    return event.classification == MotionEvent.CLASSIFICATION_MULTI_FINGER_SWIPE ||
        event.classification == MotionEvent.CLASSIFICATION_TWO_FINGER_SWIPE
}

fun isTwoFingerSwipe(event: MotionEvent): Boolean {
    return event.classification == MotionEvent.CLASSIFICATION_TWO_FINGER_SWIPE
}
+7 −1
Original line number Diff line number Diff line
@@ -40,7 +40,13 @@ class HomeGestureRecognizer(
    }

    override fun accept(event: MotionEvent) {
        if (!isThreeFingerTouchpadSwipe(event)) return
        if (!isMultifingerTouchpadSwipe(event)) return
        if (!isThreeFingerTouchpadSwipe(event)) {
            if (event.actionMasked == MotionEvent.ACTION_UP) {
                gestureStateChangedCallback(GestureState.Error)
            }
            return
        }
        val gestureState = distanceTracker.processEvent(event)
        velocityTracker.accept(event)
        updateGestureState(
+7 −1
Original line number Diff line number Diff line
@@ -43,7 +43,13 @@ class RecentAppsGestureRecognizer(
    }

    override fun accept(event: MotionEvent) {
        if (!isThreeFingerTouchpadSwipe(event)) return
        if (!isMultifingerTouchpadSwipe(event)) return
        if (!isThreeFingerTouchpadSwipe(event)) {
            if (event.actionMasked == MotionEvent.ACTION_UP) {
                gestureStateChangedCallback(GestureState.Error)
            }
            return
        }
        val gestureState = distanceTracker.processEvent(event)
        velocityTracker.accept(event)

Loading