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

Commit ffe787e6 authored by Alejandro Nijamkin's avatar Alejandro Nijamkin
Browse files

[flexiglass] Adds pointerCount and fromEdge to the UserAction model.

This should help us support cases like:
- When Gone, swiping down from the top edge with two fingers --> quick
  settings
- When on Lockscreen, swiping down from the top edge --> quick settings

Work still needs to happen in SceneTransitionLayout to actually support
detecting how many input pointers are down and which edge (if any) the
swipe started from.

Bug: 291055080
Test: built and launched with Flexiglass, can still navigate from Gone
to Shade and from Lockscreen to Shade. Two finger or edge swiping
doesn't work yet but it should work once the SceneTransitionLayout parts
are added.

Change-Id: I333a8c540051adffcf04e3b15cecc062bb2ebdfe
parent fb7db269
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -130,10 +130,23 @@ interface SceneScope {
sealed interface UserAction

/** The user navigated back, either using a gesture or by triggering a KEYCODE_BACK event. */
object Back : UserAction
data object Back : UserAction

/** The user swiped on the container. */
enum class Swipe : UserAction {
data class Swipe(
    val direction: SwipeDirection,
    val pointerCount: Int = 1,
    val fromEdge: Edge? = null,
) : UserAction {
    companion object {
        val Left = Swipe(SwipeDirection.Left)
        val Up = Swipe(SwipeDirection.Up)
        val Right = Swipe(SwipeDirection.Right)
        val Down = Swipe(SwipeDirection.Down)
    }
}

enum class SwipeDirection {
    Up,
    Down,
    Left,
+5 −2
Original line number Diff line number Diff line
@@ -36,13 +36,14 @@ import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.view.isVisible
import com.android.compose.animation.scene.SceneScope
import com.android.systemui.res.R
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.qualifiers.KeyguardRootView
import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel
import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneViewModel
import com.android.systemui.res.R
import com.android.systemui.scene.shared.model.Direction
import com.android.systemui.scene.shared.model.Edge
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.scene.shared.model.SceneModel
import com.android.systemui.scene.shared.model.UserAction
@@ -99,7 +100,9 @@ constructor(
        return buildMap {
            up?.let { this[UserAction.Swipe(Direction.UP)] = SceneModel(up) }
            left?.let { this[UserAction.Swipe(Direction.LEFT)] = SceneModel(left) }
            this[UserAction.Swipe(Direction.DOWN)] = SceneModel(SceneKey.Shade)
            this[UserAction.Swipe(fromEdge = Edge.TOP, direction = Direction.DOWN)] =
                SceneModel(SceneKey.QuickSettings)
            this[UserAction.Swipe(direction = Direction.DOWN)] = SceneModel(SceneKey.Shade)
        }
    }
}
+7 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import androidx.compose.ui.Modifier
import com.android.compose.animation.scene.SceneScope
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.scene.shared.model.Direction
import com.android.systemui.scene.shared.model.Edge
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.scene.shared.model.SceneModel
import com.android.systemui.scene.shared.model.UserAction
@@ -41,7 +42,12 @@ class GoneScene @Inject constructor() : ComposableScene {
    override val destinationScenes: StateFlow<Map<UserAction, SceneModel>> =
        MutableStateFlow<Map<UserAction, SceneModel>>(
                mapOf(
                    UserAction.Swipe(Direction.DOWN) to SceneModel(SceneKey.Shade),
                    UserAction.Swipe(
                        pointerCount = 2,
                        fromEdge = Edge.TOP,
                        direction = Direction.DOWN,
                    ) to SceneModel(SceneKey.QuickSettings),
                    UserAction.Swipe(direction = Direction.DOWN) to SceneModel(SceneKey.Shade),
                )
            )
            .asStateFlow()
+21 −6
Original line number Diff line number Diff line
@@ -35,15 +35,18 @@ import androidx.compose.ui.input.pointer.PointerEventPass
import androidx.compose.ui.input.pointer.motionEventSpy
import androidx.compose.ui.input.pointer.pointerInput
import com.android.compose.animation.scene.Back
import com.android.compose.animation.scene.Edge as SceneTransitionEdge
import com.android.compose.animation.scene.ObservableTransitionState as SceneTransitionObservableTransitionState
import com.android.compose.animation.scene.SceneKey as SceneTransitionSceneKey
import com.android.compose.animation.scene.SceneTransitionLayout
import com.android.compose.animation.scene.SceneTransitionLayoutState
import com.android.compose.animation.scene.Swipe
import com.android.compose.animation.scene.SwipeDirection
import com.android.compose.animation.scene.UserAction as SceneTransitionUserAction
import com.android.compose.animation.scene.observableTransitionState
import com.android.systemui.ribbon.ui.composable.BottomRightCornerRibbon
import com.android.systemui.scene.shared.model.Direction
import com.android.systemui.scene.shared.model.Edge
import com.android.systemui.scene.shared.model.ObservableTransitionState
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.scene.shared.model.SceneModel
@@ -180,12 +183,24 @@ private fun SceneTransitionSceneKey.toModel(): SceneModel {
private fun UserAction.toTransitionUserAction(): SceneTransitionUserAction {
    return when (this) {
        is UserAction.Swipe ->
            Swipe(
                pointerCount = pointerCount,
                fromEdge =
                    when (this.fromEdge) {
                        null -> null
                        Edge.LEFT -> SceneTransitionEdge.Left
                        Edge.TOP -> SceneTransitionEdge.Top
                        Edge.RIGHT -> SceneTransitionEdge.Right
                        Edge.BOTTOM -> SceneTransitionEdge.Bottom
                    },
                direction =
                    when (this.direction) {
                Direction.LEFT -> Swipe.Left
                Direction.UP -> Swipe.Up
                Direction.RIGHT -> Swipe.Right
                Direction.DOWN -> Swipe.Down
                        Direction.LEFT -> SwipeDirection.Left
                        Direction.UP -> SwipeDirection.Up
                        Direction.RIGHT -> SwipeDirection.Right
                        Direction.DOWN -> SwipeDirection.Down
                    }
            )
        is UserAction.Back -> Back
    }
}
+14 −1
Original line number Diff line number Diff line
@@ -61,12 +61,17 @@ sealed interface UserAction {
    data class Swipe(
        /** The direction of the swipe. */
        val direction: Direction,
        /**
         * The edge from which the swipe originated or `null`, if the swipe didn't start close to an
         * edge.
         */
        val fromEdge: Edge? = null,
        /** The number of pointers that were used (for example, one or two fingers). */
        val pointerCount: Int = 1,
    ) : UserAction

    /** The user has hit the back button or performed the back navigation gesture. */
    object Back : UserAction
    data object Back : UserAction
}

/** Enumerates all known "cardinal" directions for user actions. */
@@ -76,3 +81,11 @@ enum class Direction {
    RIGHT,
    DOWN,
}

/** Enumerates all known edges from which a swipe can start. */
enum class Edge {
    LEFT,
    TOP,
    RIGHT,
    BOTTOM,
}