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

Commit 05cea279 authored by Michał Brzeziński's avatar Michał Brzeziński Committed by Android (Google) Code Review
Browse files

Merge "Adding optional gesture direction to gesture state" into main

parents 1f632685 2c5c7d9b
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