diff options
| author | 2024-12-02 17:18:23 +0100 | |
|---|---|---|
| committer | 2024-12-05 16:10:23 +0100 | |
| commit | a3116a93bc59d20c227220f0aa5890ed9a5bd01b (patch) | |
| tree | 86dd4f6ed3c879f4dbe570ce5118320b50c86979 | |
| parent | 69c57057ec85ad6b5ca645751ab7752535909e45 (diff) | |
Add enabled parameter to Modifier.nestedDraggable()
Bug: 378470603
Test: atest NestedDraggableTest
Flag: EXEMPT new API not used anywhere yet
Change-Id: I975c6eac3951880e2c3196a0e0baad2677501a73
| -rw-r--r-- | packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt | 19 | ||||
| -rw-r--r-- | packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt | 39 |
2 files changed, 55 insertions, 3 deletions
diff --git a/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt index 58b883658b03..9fe85b7a7070 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt @@ -111,22 +111,24 @@ fun Modifier.nestedDraggable( draggable: NestedDraggable, orientation: Orientation, overscrollEffect: OverscrollEffect? = null, + enabled: Boolean = true, ): Modifier { return this.thenIf(overscrollEffect != null) { Modifier.overscroll(overscrollEffect) } - .then(NestedDraggableElement(draggable, orientation, overscrollEffect)) + .then(NestedDraggableElement(draggable, orientation, overscrollEffect, enabled)) } private data class NestedDraggableElement( private val draggable: NestedDraggable, private val orientation: Orientation, private val overscrollEffect: OverscrollEffect?, + private val enabled: Boolean, ) : ModifierNodeElement<NestedDraggableNode>() { override fun create(): NestedDraggableNode { - return NestedDraggableNode(draggable, orientation, overscrollEffect) + return NestedDraggableNode(draggable, orientation, overscrollEffect, enabled) } override fun update(node: NestedDraggableNode) { - node.update(draggable, orientation, overscrollEffect) + node.update(draggable, orientation, overscrollEffect, enabled) } } @@ -134,6 +136,7 @@ private class NestedDraggableNode( private var draggable: NestedDraggable, override var orientation: Orientation, private var overscrollEffect: OverscrollEffect?, + private var enabled: Boolean, ) : DelegatingNode(), PointerInputModifierNode, @@ -179,14 +182,22 @@ private class NestedDraggableNode( draggable: NestedDraggable, orientation: Orientation, overscrollEffect: OverscrollEffect?, + enabled: Boolean, ) { this.draggable = draggable this.orientation = orientation this.overscrollEffect = overscrollEffect + this.enabled = enabled trackDownPositionDelegate?.resetPointerInputHandler() detectDragsDelegate?.resetPointerInputHandler() nestedScrollController?.ensureOnDragStoppedIsCalled() + + if (!enabled && trackDownPositionDelegate != null) { + check(detectDragsDelegate != null) + trackDownPositionDelegate = null + detectDragsDelegate = null + } } override fun onPointerEvent( @@ -194,6 +205,8 @@ private class NestedDraggableNode( pass: PointerEventPass, bounds: IntSize, ) { + if (!enabled) return + if (trackDownPositionDelegate == null) { check(detectDragsDelegate == null) trackDownPositionDelegate = SuspendingPointerInputModifierNode { trackDownPosition() } diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt index f8561b8379f9..fd3902fa7dc8 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt +++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt @@ -344,6 +344,45 @@ class NestedDraggableTest(override val orientation: Orientation) : OrientationAw assertThat(draggable.onDragStoppedCalled).isTrue() } + @Test + fun enabled() { + val draggable = TestDraggable() + var enabled by mutableStateOf(false) + val touchSlop = + rule.setContentWithTouchSlop { + Box( + Modifier.fillMaxSize() + .nestedDraggable(draggable, orientation, enabled = enabled) + ) + } + + assertThat(draggable.onDragStartedCalled).isFalse() + + rule.onRoot().performTouchInput { + down(center) + moveBy(touchSlop.toOffset()) + } + + assertThat(draggable.onDragStartedCalled).isFalse() + assertThat(draggable.onDragStoppedCalled).isFalse() + + enabled = true + rule.onRoot().performTouchInput { + // Release previously up finger. + up() + + down(center) + moveBy(touchSlop.toOffset()) + } + + assertThat(draggable.onDragStartedCalled).isTrue() + assertThat(draggable.onDragStoppedCalled).isFalse() + + enabled = false + rule.waitForIdle() + assertThat(draggable.onDragStoppedCalled).isTrue() + } + private fun ComposeContentTestRule.setContentWithTouchSlop( content: @Composable () -> Unit ): Float { |