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

Commit 7a8c96d5 authored by Andreas Miko's avatar Andreas Miko
Browse files

Refactor SwipeTransition to have immutable from and to Scene

SwipeTransition could change from and to during an ongoing transition.
e.g. BOUNCER -> LOCKSCREEN, then LOCKSCREEN -> SHADE. This makes it hard
for observers of the TransitionState to notice when a transition was
updated. Now the TransitionState has to be updated with a new transition
when to or from have changed.

Test: new and old tests in SceneGestureHandlerTest
Bug: b/310915136
Flag: NONE
Change-Id: If4c1a61eb1b92e85bd9f054d404b9dc4b312d781
parent fdd83a36
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -2,10 +2,9 @@ package com.android.compose.animation.scene

import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.unit.IntSize

interface DraggableHandler {
    fun onDragStarted(layoutSize: IntSize, startedPosition: Offset, pointersDown: Int = 1)
    fun onDragStarted(startedPosition: Offset, overSlop: Float, pointersDown: Int = 1)
    fun onDelta(pixels: Float)
    fun onDragStopped(velocity: Float)
}
+8 −8
Original line number Diff line number Diff line
@@ -66,8 +66,8 @@ internal fun Modifier.multiPointerDraggable(
    orientation: Orientation,
    enabled: Boolean,
    startDragImmediately: Boolean,
    onDragStarted: (layoutSize: IntSize, startedPosition: Offset, pointersDown: Int) -> Unit,
    onDragDelta: (Float) -> Unit,
    onDragStarted: (startedPosition: Offset, overSlop: Float, pointersDown: Int) -> Unit,
    onDragDelta: (delta: Float) -> Unit,
    onDragStopped: (velocity: Float) -> Unit,
): Modifier =
    this.then(
@@ -86,7 +86,7 @@ private data class MultiPointerDraggableElement(
    private val enabled: Boolean,
    private val startDragImmediately: Boolean,
    private val onDragStarted:
        (layoutSize: IntSize, startedPosition: Offset, pointersDown: Int) -> Unit,
        (startedPosition: Offset, overSlop: Float, pointersDown: Int) -> Unit,
    private val onDragDelta: (Float) -> Unit,
    private val onDragStopped: (velocity: Float) -> Unit,
) : ModifierNodeElement<MultiPointerDraggableNode>() {
@@ -114,7 +114,7 @@ private class MultiPointerDraggableNode(
    orientation: Orientation,
    enabled: Boolean,
    var startDragImmediately: Boolean,
    var onDragStarted: (layoutSize: IntSize, startedPosition: Offset, pointersDown: Int) -> Unit,
    var onDragStarted: (startedPosition: Offset, overSlop: Float, pointersDown: Int) -> Unit,
    var onDragDelta: (Float) -> Unit,
    var onDragStopped: (velocity: Float) -> Unit,
) : PointerInputModifierNode, DelegatingNode(), CompositionLocalConsumerModifierNode {
@@ -153,9 +153,9 @@ private class MultiPointerDraggableNode(
            return
        }

        val onDragStart: (Offset, Int) -> Unit = { startedPosition, pointersDown ->
        val onDragStart: (Offset, Float, Int) -> Unit = { startedPosition, overSlop, pointersDown ->
            velocityTracker.resetTracking()
            onDragStarted(size, startedPosition, pointersDown)
            onDragStarted(startedPosition, overSlop, pointersDown)
        }

        val onDragCancel: () -> Unit = { onDragStopped(/* velocity= */ 0f) }
@@ -203,7 +203,7 @@ private class MultiPointerDraggableNode(
private suspend fun PointerInputScope.detectDragGestures(
    orientation: Orientation,
    startDragImmediately: () -> Boolean,
    onDragStart: (startedPosition: Offset, pointersDown: Int) -> Unit,
    onDragStart: (startedPosition: Offset, overSlop: Float, pointersDown: Int) -> Unit,
    onDragEnd: () -> Unit,
    onDragCancel: () -> Unit,
    onDrag: (change: PointerInputChange, dragAmount: Float) -> Unit,
@@ -241,7 +241,7 @@ private suspend fun PointerInputScope.detectDragGestures(
                }
            }

            onDragStart(drag.position, pressed.size)
            onDragStart(drag.position, overSlop, pressed.size)
            onDrag(drag, overSlop)

            val successful =
+133 −168

File changed.

Preview size limit exceeded, changes collapsed.

+1 −1
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ internal fun Modifier.swipeToScene(gestureHandler: SceneGestureHandler): Modifie
        // user can't swipe in the other direction.
        startDragImmediately =
            gestureHandler.isDrivingTransition &&
                gestureHandler.isAnimatingOffset &&
                gestureHandler.swipeTransition.isAnimatingOffset &&
                !canOppositeSwipe,
        onDragStarted = gestureHandler.draggable::onDragStarted,
        onDragDelta = gestureHandler.draggable::onDelta,
+4 −4
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ class PriorityNestedScrollConnection(
    private val canStartPostScroll: (offsetAvailable: Offset, offsetBeforeStart: Offset) -> Boolean,
    private val canStartPostFling: (velocityAvailable: Velocity) -> Boolean,
    private val canContinueScroll: () -> Boolean,
    private val onStart: () -> Unit,
    private val onStart: (offsetAvailable: Offset) -> Unit,
    private val onScroll: (offsetAvailable: Offset) -> Offset,
    private val onStop: (velocityAvailable: Velocity) -> Velocity,
) : NestedScrollConnection {
@@ -131,7 +131,7 @@ class PriorityNestedScrollConnection(

        // Note: onStop will be called if we cannot continue to scroll (step 3a), or the finger is
        // lifted (step 3b), or this object has been destroyed (step 3c).
        onStart()
        onStart(available)

        return onScroll(available)
    }
@@ -156,7 +156,7 @@ fun PriorityNestedScrollConnection(
    canStartPostScroll: (offsetAvailable: Float, offsetBeforeStart: Float) -> Boolean,
    canStartPostFling: (velocityAvailable: Float) -> Boolean,
    canContinueScroll: () -> Boolean,
    onStart: () -> Unit,
    onStart: (offsetAvailable: Float) -> Unit,
    onScroll: (offsetAvailable: Float) -> Float,
    onStop: (velocityAvailable: Float) -> Float,
) =
@@ -172,7 +172,7 @@ fun PriorityNestedScrollConnection(
                canStartPostFling(velocityAvailable.toFloat())
            },
            canContinueScroll = canContinueScroll,
            onStart = onStart,
            onStart = { offsetAvailable -> onStart(offsetAvailable.toFloat()) },
            onScroll = { offsetAvailable: Offset ->
                onScroll(offsetAvailable.toFloat()).toOffset()
            },
Loading