Stop prompting system password restore on PIN entry in regV5.

This commit is contained in:
Greyson Parrelli
2026-06-26 16:57:17 -04:00
committed by Michelle Tang
parent 495b5ef9be
commit 8536504318
3 changed files with 33 additions and 4 deletions
@@ -0,0 +1,29 @@
/*
* Copyright 2026 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.registration.screens
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.input.OffsetMapping
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.TransformedText
import androidx.compose.ui.text.input.VisualTransformation
/**
* Masks input with bullets exactly like [PasswordVisualTransformation], but is intentionally a
* distinct type. Compose flags a field with password semantics whenever its transformation is a
* [PasswordVisualTransformation], which makes the system autofill framework offer to save/fill a
* password. We never want that prompt for PIN entry.
*/
object PinVisualTransformation : VisualTransformation {
private const val MASK = '•'
override fun filter(text: AnnotatedString): TransformedText {
return TransformedText(
AnnotatedString(MASK.toString().repeat(text.text.length)),
OffsetMapping.Identity
)
}
}
@@ -57,7 +57,6 @@ import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.withStyle
@@ -71,6 +70,7 @@ import org.signal.core.ui.compose.Previews
import org.signal.core.ui.compose.Scaffolds
import org.signal.core.ui.compose.SignalIcons
import org.signal.registration.R
import org.signal.registration.screens.PinVisualTransformation
import org.signal.registration.screens.RegistrationScaffold
import org.signal.registration.screens.TwoPaneRegistrationScaffold
import org.signal.registration.screens.attachDebugLogHelper
@@ -399,7 +399,7 @@ private fun PinInputField(
imeAction = ImeAction.Done
),
keyboardActions = KeyboardActions(onDone = { if (canSubmitPin) onSubmit() }),
visualTransformation = PasswordVisualTransformation()
visualTransformation = PinVisualTransformation
)
}
@@ -43,7 +43,6 @@ import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import org.signal.core.ui.compose.AllDevicePreviews
@@ -52,6 +51,7 @@ import org.signal.core.ui.compose.Dialogs
import org.signal.core.ui.compose.Previews
import org.signal.core.ui.compose.SignalIcons
import org.signal.registration.R
import org.signal.registration.screens.PinVisualTransformation
import org.signal.registration.screens.RegistrationScaffold
import org.signal.registration.screens.TwoPaneRegistrationScaffold
import org.signal.registration.screens.attachDebugLogHelper
@@ -326,7 +326,7 @@ private fun PinInputField(
),
keyboardActions = KeyboardActions(onDone = { if (canSubmitPin) onSubmit() }),
isError = state.triesRemaining != null,
visualTransformation = PasswordVisualTransformation()
visualTransformation = PinVisualTransformation
)
if (state.triesRemaining != null) {