[TextField Selection] Drag Handle.
Bug: 139311556
Test: Manually tested.
Test: ./gradlew :ui:ui-text:testDebugUnitTest
Test: ./gradlew :ui:ui-core:testDebugUnitTest
RelNote: Implement Drag Selection Handles to change selection for TextField.
Change-Id: I27032ee670131726d579612591dafcf3d60680b6
diff --git a/ui/ui-text/src/test/kotlin/androidx/ui/text/selection/TextFieldSelectionManagerTest.kt b/ui/ui-text/src/test/kotlin/androidx/ui/text/selection/TextFieldSelectionManagerTest.kt
index ea7997c..7ed0c43 100644
--- a/ui/ui-text/src/test/kotlin/androidx/ui/text/selection/TextFieldSelectionManagerTest.kt
+++ b/ui/ui-text/src/test/kotlin/androidx/ui/text/selection/TextFieldSelectionManagerTest.kt
@@ -59,8 +59,8 @@
private val dragBeginPosition = Offset.Zero
private val dragDistance = Offset(300f, 15f)
private val beginOffset = 0
- private val dragOffset = text.indexOf('W')
- private val longPressTextRange = TextRange(0, "Hello".length)
+ private val dragOffset = text.indexOf('r')
+ private val fakeTextRange = TextRange(0, "Hello".length)
private val dragTextRange = TextRange("Hello".length + 1, text.length)
private val manager = TextFieldSelectionManager()
@@ -96,7 +96,7 @@
beginOffset
)
whenever(state.layoutResult!!.getOffsetForPosition(dragDistance)).thenReturn(dragOffset)
- whenever(state.layoutResult!!.getWordBoundary(beginOffset)).thenReturn(longPressTextRange)
+ whenever(state.layoutResult!!.getWordBoundary(beginOffset)).thenReturn(fakeTextRange)
whenever(state.layoutResult!!.getWordBoundary(dragOffset)).thenReturn(dragTextRange)
whenever(state.layoutResult!!.getBidiRunDirection(any()))
.thenReturn(ResolvedTextDirection.Ltr)
@@ -115,7 +115,7 @@
manager.longPressDragObserver.onLongPress(dragBeginPosition)
assertThat(state.selectionIsOn).isTrue()
- assertThat(value.selection).isEqualTo(longPressTextRange)
+ assertThat(value.selection).isEqualTo(fakeTextRange)
verify(
hapticFeedback,
times(1)
@@ -135,6 +135,72 @@
}
@Test
+ fun TextFieldSelectionManager_handleDragObserver_onStart_startHandle() {
+ manager.handleDragObserver(isStartHandle = true).onStart(Offset.Zero)
+
+ assertThat(state.draggingHandle).isTrue()
+ verify(spyLambda, times(0)).invoke(any())
+ verify(
+ hapticFeedback,
+ times(0)
+ ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+ }
+
+ @Test
+ fun TextFieldSelectionManager_handleDragObserver_onStart_endHandle() {
+ manager.handleDragObserver(isStartHandle = false).onStart(Offset.Zero)
+
+ assertThat(state.draggingHandle).isTrue()
+ verify(spyLambda, times(0)).invoke(any())
+ verify(
+ hapticFeedback,
+ times(0)
+ ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+ }
+
+ @Test
+ fun TextFieldSelectionManager_handleDragObserver_onDrag_startHandle() {
+ manager.value = TextFieldValue(text = text, selection = TextRange(0, "Hello".length))
+
+ val result = manager.handleDragObserver(isStartHandle = true).onDrag(dragDistance)
+
+ assertThat(result).isEqualTo(dragDistance)
+ assertThat(value.selection).isEqualTo(TextRange(dragOffset, "Hello".length))
+ verify(
+ hapticFeedback,
+ times(1)
+ ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+ }
+
+ @Test
+ fun TextFieldSelectionManager_handleDragObserver_onDrag_endHandle() {
+ manager.value = TextFieldValue(text = text, selection = TextRange(0, "Hello".length))
+
+ val result = manager.handleDragObserver(isStartHandle = false).onDrag(dragDistance)
+
+ assertThat(result).isEqualTo(dragDistance)
+ assertThat(value.selection).isEqualTo(TextRange(0, dragOffset))
+ verify(
+ hapticFeedback,
+ times(1)
+ ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+ }
+
+ @Test
+ fun TextFieldSelectionManager_handleDragObserver_onStop() {
+ manager.handleDragObserver(false).onStart(Offset.Zero)
+ manager.handleDragObserver(false).onDrag(Offset.Zero)
+
+ manager.handleDragObserver(false).onStop(Offset.Zero)
+
+ assertThat(state.draggingHandle).isFalse()
+ verify(
+ hapticFeedback,
+ times(0)
+ ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+ }
+
+ @Test
fun copy_selection_collapse() {
manager.value = TextFieldValue(text = text, selection = TextRange(4, 4))
@@ -200,7 +266,8 @@
fun cut_selection_not_null() {
manager.value = TextFieldValue(
text = text + text,
- selection = TextRange("Hello".length, text.length))
+ selection = TextRange("Hello".length, text.length)
+ )
manager.cut()