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

Commit 2c5c7d9b authored by Michal Brzezinski's avatar Michal Brzezinski
Browse files

Adding optional gesture direction to gesture state

Required as for live tracking of back gesture we need to know which direction user is swiping.

Bug: 369817369
Test: BackGestureRecognizerTest
Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial
Change-Id: Ib83da984155b53970373e8ad110168f4be556170
parent 5c4e6576
Loading
Loading
Loading
Loading
+33 −8
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import android.view.MotionEvent
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection.LEFT
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection.RIGHT
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.Finished
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted
@@ -61,23 +63,46 @@ class BackGestureRecognizerTest : SysuiTestCase() {
    }

    @Test
    fun triggersProgressRelativeToDistance() {
        assertProgressWhileMovingFingers(deltaX = -SWIPE_DISTANCE / 2, expectedProgress = 0.5f)
        assertProgressWhileMovingFingers(deltaX = SWIPE_DISTANCE / 2, expectedProgress = 0.5f)
        assertProgressWhileMovingFingers(deltaX = -SWIPE_DISTANCE, expectedProgress = 1f)
        assertProgressWhileMovingFingers(deltaX = SWIPE_DISTANCE, expectedProgress = 1f)
    fun triggersProgressRelativeToDistanceWhenSwipingLeft() {
        assertProgressWhileMovingFingers(
            deltaX = -SWIPE_DISTANCE / 2,
            expected = InProgress(progress = 0.5f, direction = LEFT),
        )
        assertProgressWhileMovingFingers(
            deltaX = -SWIPE_DISTANCE,
            expected = InProgress(progress = 1f, direction = LEFT),
        )
    }

    private fun assertProgressWhileMovingFingers(deltaX: Float, expectedProgress: Float) {
    @Test
    fun triggersProgressRelativeToDistanceWhenSwipingRight() {
        assertProgressWhileMovingFingers(
            deltaX = SWIPE_DISTANCE / 2,
            expected = InProgress(progress = 0.5f, direction = RIGHT),
        )
        assertProgressWhileMovingFingers(
            deltaX = SWIPE_DISTANCE,
            expected = InProgress(progress = 1f, direction = RIGHT),
        )
    }

    private fun assertProgressWhileMovingFingers(deltaX: Float, expected: InProgress) {
        assertStateAfterEvents(
            events = ThreeFingerGesture.eventsForGestureInProgress { move(deltaX = deltaX) },
            expectedState = InProgress(progress = expectedProgress),
            expectedState = expected,
        )
    }

    @Test
    fun triggeredProgressIsNoBiggerThanOne() {
        assertProgressWhileMovingFingers(deltaX = SWIPE_DISTANCE * 2, expectedProgress = 1f)
        assertProgressWhileMovingFingers(
            deltaX = SWIPE_DISTANCE * 2,
            expected = InProgress(progress = 1f, direction = RIGHT),
        )
        assertProgressWhileMovingFingers(
            deltaX = -SWIPE_DISTANCE * 2,
            expected = InProgress(progress = 1f, direction = LEFT),
        )
    }

    @Test
+10 −1
Original line number Diff line number Diff line
@@ -18,6 +18,9 @@ package com.android.systemui.touchpad.tutorial.ui.gesture

import android.util.MathUtils
import android.view.MotionEvent
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection.LEFT
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection.RIGHT
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress
import kotlin.math.abs

/**
@@ -44,7 +47,13 @@ class BackGestureRecognizer(private val gestureDistanceThresholdPx: Int) : Gestu
            gestureStateChangedCallback,
            gestureState,
            isFinished = { abs(it.deltaX) >= gestureDistanceThresholdPx },
            progress = { MathUtils.saturate(abs(it.deltaX / gestureDistanceThresholdPx)) },
            progress = ::getProgress,
        )
    }

    private fun getProgress(it: Moving): InProgress {
        val direction = if (it.deltaX > 0) RIGHT else LEFT
        val value = MathUtils.saturate(abs(it.deltaX / gestureDistanceThresholdPx))
        return InProgress(value, direction)
    }
}
+7 −1
Original line number Diff line number Diff line
@@ -21,5 +21,11 @@ sealed interface GestureState {

    data object Finished : GestureState

    data class InProgress(val progress: Float = 0f) : GestureState
    data class InProgress(val progress: Float = 0f, val direction: GestureDirection? = null) :
        GestureState
}

enum class GestureDirection {
    LEFT,
    RIGHT,
}
+2 −2
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ inline fun updateGestureState(
    gestureStateChangedCallback: (GestureState) -> Unit,
    gestureState: DistanceGestureState?,
    isFinished: (Finished) -> Boolean,
    progress: (Moving) -> Float,
    progress: (Moving) -> GestureState.InProgress,
) {
    when (gestureState) {
        is Finished -> {
@@ -32,7 +32,7 @@ inline fun updateGestureState(
            }
        }
        is Moving -> {
            gestureStateChangedCallback(GestureState.InProgress(progress(gestureState)))
            gestureStateChangedCallback(progress(gestureState))
        }
        is Started -> gestureStateChangedCallback(GestureState.InProgress())
        else -> {}
+2 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.touchpad.tutorial.ui.gesture

import android.util.MathUtils
import android.view.MotionEvent
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress

/** Recognizes touchpad home gesture, that is - using three fingers on touchpad - swiping up. */
class HomeGestureRecognizer(private val gestureDistanceThresholdPx: Int) : GestureRecognizer {
@@ -40,7 +41,7 @@ class HomeGestureRecognizer(private val gestureDistanceThresholdPx: Int) : Gestu
            gestureStateChangedCallback,
            gestureState,
            isFinished = { -it.deltaY >= gestureDistanceThresholdPx },
            progress = { MathUtils.saturate(-it.deltaY / gestureDistanceThresholdPx) },
            progress = { InProgress(MathUtils.saturate(-it.deltaY / gestureDistanceThresholdPx)) },
        )
    }
}
Loading