@@ -16,8 +16,11 @@ import androidx.compose.material3.TextField
16
16
import androidx.compose.ui.Alignment
17
17
import androidx.compose.ui.Modifier
18
18
import androidx.compose.ui.platform.testTag
19
+ import androidx.compose.ui.semantics.clearAndSetSemantics
20
+ import androidx.compose.ui.semantics.editableText
19
21
import androidx.compose.ui.semantics.invisibleToUser
20
22
import androidx.compose.ui.semantics.semantics
23
+ import androidx.compose.ui.text.AnnotatedString
21
24
import androidx.compose.ui.text.input.TextFieldValue
22
25
import androidx.compose.ui.unit.TextUnit
23
26
import androidx.compose.ui.unit.dp
@@ -55,6 +58,7 @@ class ComposeMaskingOptionsTest {
55
58
System .setProperty(" robolectric.areWindowsMarkedVisible" , " true" )
56
59
System .setProperty(" robolectric.pixelCopyRenderMode" , " hardware" )
57
60
ComposeMaskingOptionsActivity .textModifierApplier = null
61
+ ComposeMaskingOptionsActivity .textFieldModifierApplier = null
58
62
ComposeMaskingOptionsActivity .containerModifierApplier = null
59
63
ComposeMaskingOptionsActivity .fontSizeApplier = null
60
64
}
@@ -90,6 +94,23 @@ class ComposeMaskingOptionsTest {
90
94
assertEquals(" Random repo" , (textNodes.first().layout as ? ComposeTextLayout )?.layout?.layoutInput?.text?.text)
91
95
}
92
96
97
+ @Test
98
+ fun `when text input field is readOnly still masks it` () {
99
+ ComposeMaskingOptionsActivity .textFieldModifierApplier = {
100
+ // newer versions of compose basically do this when a TextField is readOnly
101
+ Modifier .clearAndSetSemantics { editableText = AnnotatedString (" Placeholder" ) }
102
+ }
103
+ val activity = buildActivity(ComposeMaskingOptionsActivity ::class .java).setup()
104
+ shadowOf(Looper .getMainLooper()).idle()
105
+
106
+ val options = SentryOptions ().apply {
107
+ sessionReplay.maskAllText = true
108
+ }
109
+
110
+ val textNodes = activity.get().collectNodesOfType<TextViewHierarchyNode >(options)
111
+ assertTrue(textNodes[1 ].shouldMask)
112
+ }
113
+
93
114
@Test
94
115
fun `when maskAllText is set to false all Text nodes are unmasked` () {
95
116
val activity = buildActivity(ComposeMaskingOptionsActivity ::class .java).setup()
@@ -231,6 +252,7 @@ private class ComposeMaskingOptionsActivity : ComponentActivity() {
231
252
232
253
companion object {
233
254
var textModifierApplier: (() -> Modifier )? = null
255
+ var textFieldModifierApplier: (() -> Modifier )? = null
234
256
var containerModifierApplier: (() -> Modifier )? = null
235
257
var fontSizeApplier: (() -> TextUnit )? = null
236
258
}
@@ -254,6 +276,7 @@ private class ComposeMaskingOptionsActivity : ComponentActivity() {
254
276
)
255
277
Text (" Random repo" , fontSize = fontSizeApplier?.invoke() ? : TextUnit .Unspecified )
256
278
TextField (
279
+ modifier = textFieldModifierApplier?.invoke() ? : Modifier ,
257
280
value = TextFieldValue (" Placeholder" ),
258
281
onValueChange = { _ -> }
259
282
)
0 commit comments