summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jordan Demeulenaere <jdemeulenaere@google.com> 2024-12-02 17:18:23 +0100
committer Jordan Demeulenaere <jdemeulenaere@google.com> 2024-12-05 16:10:23 +0100
commita3116a93bc59d20c227220f0aa5890ed9a5bd01b (patch)
tree86dd4f6ed3c879f4dbe570ce5118320b50c86979
parent69c57057ec85ad6b5ca645751ab7752535909e45 (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.kt19
-rw-r--r--packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt39
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 {