From 03eb81e056aff6c59566c8faa07b3911033cb580 Mon Sep 17 00:00:00 2001 From: David Perez Date: Wed, 9 Sep 2026 14:49:17 -0500 Subject: [PATCH] PM-42349: bug: Hide static password mask when field is blank --- .../util/BitwardenPasswordVisualTransformation.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/util/BitwardenPasswordVisualTransformation.kt b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/util/BitwardenPasswordVisualTransformation.kt index 30e1eab18a3..b8791cc9731 100644 --- a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/util/BitwardenPasswordVisualTransformation.kt +++ b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/util/BitwardenPasswordVisualTransformation.kt @@ -6,10 +6,12 @@ import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.input.OffsetMapping import androidx.compose.ui.text.input.TransformedText import androidx.compose.ui.text.input.VisualTransformation +import com.bitwarden.ui.platform.base.util.toAnnotatedString /** * Returns a [VisualTransformation] that masks text with [mask]. When [staticCharacterCount] is - * non-null, the transformed text always contains that number of mask characters. + * non-null and the text is non-empty, the transformed text contains that number of mask + * characters. Blank text is never masked. */ @Composable fun passwordVisualTransformation( @@ -30,10 +32,11 @@ private class BitwardenPasswordVisualTransformation( override fun filter( text: AnnotatedString, ): TransformedText = TransformedText( - AnnotatedString( - mask.toString().repeat(n = staticCharacterCount ?: text.text.length), - ), - object : OffsetMapping { + text = mask + .toString() + .repeat(staticCharacterCount?.takeIf { text.text.isNotEmpty() } ?: text.text.length) + .toAnnotatedString(), + offsetMapping = object : OffsetMapping { override fun originalToTransformed( offset: Int, ): Int = staticCharacterCount?.let { offset.coerceAtMost(it) } ?: offset