Skip to content

Commit 10dafd5

Browse files
committed
#41 feat: select all text when tapping latitude and longitude
Signed-off-by: sds100 <[email protected]>
1 parent 071857d commit 10dafd5

File tree

2 files changed

+62
-7
lines changed

2 files changed

+62
-7
lines changed

app/src/androidTest/java/com/mapcode/map/MapScreenTest.kt

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.mapcode.map
22

33
import android.Manifest
4+
import androidx.compose.ui.semantics.SemanticsProperties
45
import androidx.compose.ui.semantics.SemanticsPropertyKey
56
import androidx.compose.ui.test.*
67
import androidx.compose.ui.test.junit4.createComposeRule
8+
import androidx.compose.ui.text.TextRange
79
import androidx.test.rule.GrantPermissionRule
810
import assertk.assertThat
911
import assertk.assertions.isEqualTo
@@ -50,7 +52,7 @@ class MapScreenTest {
5052

5153
composeTestRule.onNodeWithText("Mapcode").performClick()
5254

53-
assertThat(useCase.clipboard).isEqualTo("AAA AB.XY")
55+
assertThat(useCase.clipboard).isEqualTo("AB.XY")
5456
}
5557

5658
@Test
@@ -64,9 +66,9 @@ class MapScreenTest {
6466
setMapScreenAsContent()
6567
viewModel.onCameraMoved(0.0, 0.0, 0f)
6668

67-
composeTestRule.onNodeWithText("AAA AB.XY").performClick()
69+
composeTestRule.onNodeWithText("AB.XY").performClick()
6870

69-
assertThat(useCase.clipboard).isEqualTo("AAA AB.XY")
71+
assertThat(useCase.clipboard).isEqualTo("AB.XY")
7072
}
7173

7274
@Test
@@ -81,7 +83,7 @@ class MapScreenTest {
8183

8284
setMapScreenAsContent()
8385

84-
composeTestRule.onNodeWithText("AAA AB.XY").performClick()
86+
composeTestRule.onNodeWithText("AB.XY").performClick()
8587

8688
composeTestRule.waitForIdle()
8789

@@ -388,7 +390,7 @@ class MapScreenTest {
388390

389391
composeTestRule.onNodeWithContentDescription("Share mapcode").performClick()
390392

391-
assertThat(useCase.sharedText).isEqualTo("AAA AB.XY")
393+
assertThat(useCase.sharedText).isEqualTo("AB.XY")
392394
}
393395

394396
@Test
@@ -569,6 +571,34 @@ class MapScreenTest {
569571
composeTestRule.onNodeWithText("Enter address or mapcode").assertIsNotFocused()
570572
}
571573

574+
@Test
575+
fun select_latitude_text_when_focussing() {
576+
useCase.knownLocations.add(
577+
FakeLocation(0.0, 0.0, emptyList(), mapcodes = emptyList())
578+
)
579+
setMapScreenAsContent()
580+
viewModel.onCameraMoved(0.0, 0.0, 1f)
581+
582+
composeTestRule.onNodeWithText("Latitude (Y)").apply {
583+
performClick()
584+
assert(SemanticsMatcher.expectValue(SemanticsProperties.TextSelectionRange, TextRange(0, 9)))
585+
}
586+
}
587+
588+
@Test
589+
fun select_longitude_text_when_focussing() {
590+
useCase.knownLocations.add(
591+
FakeLocation(0.0, 0.0, emptyList(), mapcodes = emptyList())
592+
)
593+
setMapScreenAsContent()
594+
viewModel.onCameraMoved(0.0, 0.0, 1f)
595+
596+
composeTestRule.onNodeWithText("Longitude (X)").apply {
597+
performClick()
598+
assert(SemanticsMatcher.expectValue(SemanticsProperties.TextSelectionRange, TextRange(0, 9)))
599+
}
600+
}
601+
572602
private fun setMapScreenAsContent() {
573603
composeTestRule.setContent {
574604
MapScreen(viewModel = viewModel, renderGoogleMaps = false)

app/src/main/java/com/mapcode/map/InfoScreenPart.kt

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
package com.mapcode.map
44

5+
import android.annotation.SuppressLint
56
import android.os.Build
67
import androidx.annotation.DrawableRes
78
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -16,14 +17,17 @@ import androidx.compose.runtime.*
1617
import androidx.compose.ui.Modifier
1718
import androidx.compose.ui.focus.FocusRequester
1819
import androidx.compose.ui.focus.focusRequester
20+
import androidx.compose.ui.focus.onFocusChanged
1921
import androidx.compose.ui.platform.LocalFocusManager
2022
import androidx.compose.ui.res.painterResource
2123
import androidx.compose.ui.res.stringResource
2224
import androidx.compose.ui.text.SpanStyle
25+
import androidx.compose.ui.text.TextRange
2326
import androidx.compose.ui.text.buildAnnotatedString
2427
import androidx.compose.ui.text.font.FontWeight
2528
import androidx.compose.ui.text.input.ImeAction
2629
import androidx.compose.ui.text.input.KeyboardType
30+
import androidx.compose.ui.text.input.TextFieldValue
2731
import androidx.compose.ui.tooling.preview.Preview
2832
import androidx.compose.ui.unit.dp
2933
import com.mapcode.R
@@ -336,6 +340,7 @@ private fun LongitudeTextBox(
336340
)
337341
}
338342

343+
@SuppressLint("UnrememberedMutableState")
339344
@Composable
340345
private fun LatLngTextField(
341346
modifier: Modifier = Modifier,
@@ -350,15 +355,35 @@ private fun LatLngTextField(
350355
Column(modifier) {
351356
val focusManager = LocalFocusManager.current
352357
val focusRequester = remember { FocusRequester() }
358+
var textSelection: TextRange by remember { mutableStateOf(TextRange.Zero) }
359+
360+
val textValue: TextFieldValue by derivedStateOf { TextFieldValue(text, textSelection) }
361+
362+
var selectAllText: Boolean by remember { mutableStateOf(false) }
363+
364+
if (selectAllText) {
365+
SideEffect {
366+
textSelection = TextRange(0, text.length)
367+
selectAllText = false
368+
}
369+
}
353370

354371
OutlinedTextField(
355372
modifier = Modifier
356373
.focusRequester(focusRequester)
374+
.onFocusChanged { state ->
375+
if (state.isFocused) {
376+
selectAllText = true
377+
}
378+
}
357379
.fillMaxWidth(),
358-
value = text,
380+
value = textValue,
359381
singleLine = true,
360382
label = { Text(label, maxLines = 1) },
361-
onValueChange = onChange,
383+
onValueChange = { value ->
384+
textSelection = value.selection
385+
onChange(value.text)
386+
},
362387
keyboardOptions = KeyboardOptions(
363388
imeAction = ImeAction.Go,
364389
keyboardType = KeyboardType.Decimal

0 commit comments

Comments
 (0)