Skip to content

Commit 31c6e84

Browse files
committed
expose EditableText on Clickable field
1 parent 6eda9af commit 31c6e84

File tree

2 files changed

+84
-1
lines changed

2 files changed

+84
-1
lines changed

ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/ClickableField.kt

+15-1
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,16 @@ import androidx.compose.runtime.remember
1515
import androidx.compose.ui.Modifier
1616
import androidx.compose.ui.draw.clip
1717
import androidx.compose.ui.graphics.Color
18+
import androidx.compose.ui.res.stringResource
19+
import androidx.compose.ui.semantics.editableText
20+
import androidx.compose.ui.semantics.error
21+
import androidx.compose.ui.semantics.semantics
22+
import androidx.compose.ui.text.AnnotatedString
1823
import androidx.compose.ui.text.style.TextOverflow
1924
import androidx.compose.ui.unit.dp
2025
import kiwi.orbit.compose.icons.Icons
2126
import kiwi.orbit.compose.ui.OrbitTheme
27+
import kiwi.orbit.compose.ui.R
2228
import kiwi.orbit.compose.ui.controls.field.FieldContent
2329
import kiwi.orbit.compose.ui.controls.field.FieldLabel
2430
import kiwi.orbit.compose.ui.controls.field.FieldMessage
@@ -42,7 +48,15 @@ public fun ClickableField(
4248
minLines: Int = 1,
4349
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
4450
) {
45-
ColumnWithMinConstraints(modifier) {
51+
val errorMessage = stringResource(R.string.orbit_field_default_error)
52+
ColumnWithMinConstraints(
53+
modifier.semantics(mergeDescendants = true) {
54+
editableText = AnnotatedString(value)
55+
if (error != null) {
56+
error(errorMessage)
57+
}
58+
},
59+
) {
4660
if (label != null) {
4761
FieldLabel(label)
4862
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package kiwi.orbit.compose.ui.controls
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.getValue
5+
import androidx.compose.runtime.mutableIntStateOf
6+
import androidx.compose.runtime.setValue
7+
import androidx.compose.ui.Modifier
8+
import androidx.compose.ui.platform.testTag
9+
import androidx.compose.ui.semantics.SemanticsProperties
10+
import androidx.compose.ui.semantics.getOrNull
11+
import androidx.compose.ui.test.SemanticsMatcher
12+
import androidx.compose.ui.test.assert
13+
import androidx.compose.ui.test.junit4.createComposeRule
14+
import androidx.compose.ui.test.onNodeWithTag
15+
import androidx.compose.ui.test.performClick
16+
import org.junit.Rule
17+
import org.junit.Test
18+
import org.junit.runner.RunWith
19+
import org.robolectric.RobolectricTestRunner
20+
21+
@RunWith(RobolectricTestRunner::class)
22+
internal class ClickableFieldTest {
23+
@get:Rule
24+
val composeTestRule = createComposeRule()
25+
26+
@Test
27+
fun testBasics() {
28+
var clicked by mutableIntStateOf(0)
29+
composeTestRule.setContent {
30+
ClickableField(
31+
modifier = Modifier.testTag("clickable"),
32+
value = if (clicked > 0) "Clicked" else "Empty",
33+
label = { Text("Pick letter") },
34+
error = if (clicked > 1) {
35+
@Composable { Text("Err") }
36+
} else null,
37+
onClick = { clicked += 1 },
38+
)
39+
}
40+
val clickable = composeTestRule.onNodeWithTag("clickable")
41+
clickable.assert(hasEditTextExactly("Empty"))
42+
clickable.assert(hasErrorText(null))
43+
clickable.performClick()
44+
clickable.assert(hasEditTextExactly("Clicked"))
45+
clickable.assert(hasErrorText(null))
46+
clickable.performClick()
47+
clickable.assert(hasErrorText("Invalid input"))
48+
}
49+
50+
private fun hasErrorText(expected: String?): SemanticsMatcher {
51+
val propertyName = SemanticsProperties.Error.name
52+
return SemanticsMatcher(
53+
"$propertyName = [$expected]",
54+
) { node ->
55+
val actual = node.config.getOrNull(SemanticsProperties.Error)
56+
actual == expected
57+
}
58+
}
59+
60+
private fun hasEditTextExactly(expected: String): SemanticsMatcher {
61+
val propertyName = SemanticsProperties.EditableText.name
62+
return SemanticsMatcher(
63+
"$propertyName = [$expected]",
64+
) { node ->
65+
val actual = node.config.getOrNull(SemanticsProperties.EditableText)
66+
actual?.text == expected
67+
}
68+
}
69+
}

0 commit comments

Comments
 (0)