@@ -15,8 +15,11 @@ import androidx.compose.material3.TextField
1515import androidx.compose.ui.Alignment
1616import androidx.compose.ui.Modifier
1717import androidx.compose.ui.platform.testTag
18+ import androidx.compose.ui.semantics.clearAndSetSemantics
19+ import androidx.compose.ui.semantics.editableText
1820import androidx.compose.ui.semantics.invisibleToUser
1921import androidx.compose.ui.semantics.semantics
22+ import androidx.compose.ui.text.AnnotatedString
2023import androidx.compose.ui.text.input.TextFieldValue
2124import androidx.compose.ui.unit.TextUnit
2225import androidx.compose.ui.unit.dp
@@ -52,6 +55,7 @@ class ComposeMaskingOptionsTest {
5255 fun setup () {
5356 System .setProperty(" robolectric.areWindowsMarkedVisible" , " true" )
5457 ComposeMaskingOptionsActivity .textModifierApplier = null
58+ ComposeMaskingOptionsActivity .textFieldModifierApplier = null
5559 ComposeMaskingOptionsActivity .containerModifierApplier = null
5660 ComposeMaskingOptionsActivity .fontSizeApplier = null
5761 }
@@ -86,6 +90,23 @@ class ComposeMaskingOptionsTest {
8690 assertEquals(" Random repo" , (textNodes.first().layout as ? ComposeTextLayout )?.layout?.layoutInput?.text?.text)
8791 }
8892
93+ @Test
94+ fun `when text input field is readOnly still masks it` () {
95+ ComposeMaskingOptionsActivity .textFieldModifierApplier = {
96+ // newer versions of compose basically do this when a TextField is readOnly
97+ Modifier .clearAndSetSemantics { editableText = AnnotatedString (" Placeholder" ) }
98+ }
99+ val activity = buildActivity(ComposeMaskingOptionsActivity ::class .java).setup()
100+ shadowOf(Looper .getMainLooper()).idle()
101+
102+ val options = SentryOptions ().apply {
103+ sessionReplay.maskAllText = true
104+ }
105+
106+ val textNodes = activity.get().collectNodesOfType<TextViewHierarchyNode >(options)
107+ assertTrue(textNodes[1 ].shouldMask)
108+ }
109+
89110 @Test
90111 fun `when maskAllText is set to false all Text nodes are unmasked` () {
91112 val activity = buildActivity(ComposeMaskingOptionsActivity ::class .java).setup()
@@ -220,6 +241,7 @@ private class ComposeMaskingOptionsActivity : ComponentActivity() {
220241
221242 companion object {
222243 var textModifierApplier: (() -> Modifier )? = null
244+ var textFieldModifierApplier: (() -> Modifier )? = null
223245 var containerModifierApplier: (() -> Modifier )? = null
224246 var fontSizeApplier: (() -> TextUnit )? = null
225247 }
@@ -243,6 +265,7 @@ private class ComposeMaskingOptionsActivity : ComponentActivity() {
243265 )
244266 Text (" Random repo" , fontSize = fontSizeApplier?.invoke() ? : TextUnit .Unspecified )
245267 TextField (
268+ modifier = textFieldModifierApplier?.invoke() ? : Modifier ,
246269 value = TextFieldValue (" Placeholder" ),
247270 onValueChange = { _ -> }
248271 )
0 commit comments