Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ import com.twofasapp.designsystem.common.TwOutlinedTextFieldPassword
import com.twofasapp.locale.TwLocale
import kotlinx.coroutines.android.awaitFrame

sealed class ValidationState {
object Valid : ValidationState()
data class LengthError(val message: String) : ValidationState()
data class ConfirmError(val message: String) : ValidationState()
data class ValidationError(val message: String) : ValidationState()
}

@Composable
fun PasswordDialog(
onDismissRequest: () -> Unit,
Expand All @@ -36,6 +43,7 @@ fun PasswordDialog(
onPositive: ((String) -> Unit)? = null,
onNegative: (() -> Unit)? = null,
validation: ((String) -> Boolean)? = null,
validationHint: String? = null,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
minLength: Int = 3,
maxLength: Int = Int.MAX_VALUE,
Expand All @@ -45,6 +53,24 @@ fun PasswordDialog(
var password by remember { mutableStateOf("") }
var passwordConfirm by remember { mutableStateOf("") }

val validationState by remember {
derivedStateOf {
when {
password.trim().length !in minLength..maxLength ->
ValidationState.LengthError(
TwLocale.strings.backupPasswordLengthError.format(minLength, maxLength)
)
confirmRequired && password != passwordConfirm ->
ValidationState.ConfirmError(TwLocale.strings.backupPasswordConfirmError)
validation != null && !validation.invoke(password) ->
ValidationState.ValidationError(
validationHint ?: TwLocale.strings.backupPasswordValidationError
)
else -> ValidationState.Valid
}
}
}

val positiveEnabledState by remember {
derivedStateOf {
when {
Expand Down Expand Up @@ -79,11 +105,16 @@ fun PasswordDialog(
.padding(horizontal = DialogPadding)
.focusRequester(focusRequester),
labelText = TwLocale.strings.password,
isError = error.isNullOrBlank().not(),
isError = validationState !is ValidationState.Valid,
keyboardOptions = keyboardOptions,
maxLines = 1,
enabled = enabled,
supportingText = if (error.isNullOrBlank()) null else error,
supportingText = when (validationState) {
is ValidationState.LengthError -> validationState.message
is ValidationState.ValidationError -> validationState.message
ValidationState.Valid -> null
else -> null
},
)

if (confirmRequired) {
Expand All @@ -94,10 +125,14 @@ fun PasswordDialog(
modifier = Modifier
.padding(horizontal = DialogPadding),
labelText = TwLocale.strings.passwordConfirm,
isError = error.isNullOrBlank().not(),
isError = validationState is ValidationState.ConfirmError,
keyboardOptions = keyboardOptions,
maxLines = 1,
enabled = enabled,
supportingText = when (validationState) {
is ValidationState.ConfirmError -> validationState.message
else -> null
},
)
}

Expand All @@ -119,4 +154,4 @@ private fun Preview() {
title = "Password",
body = TwLocale.strings.placeholderMedium,
)
}
}
6 changes: 5 additions & 1 deletion core/locale/src/main/java/com/twofasapp/locale/Strings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,10 @@ class Strings(c: Context) {
val backupSetPasswordDescription = c.getString(R.string.backup__set_password_title)
val backupEnterPassword = c.getString(R.string.backup__enter_password_dialog_title)
val backupEnterPasswordDescription = c.getString(R.string.backup__enter_password_title)
val backupPasswordLengthError = c.getString(R.string.backup__password_length_error)
val backupPasswordConfirmError = c.getString(R.string.backup__password_confirm_error)
val backupPasswordValidationError = c.getString(R.string.backup__password_validation_error)
val backupPasswordValidationHint = c.getString(R.string.backup__password_validation_hint)
val backupShareError = c.getString(R.string.backup__share_result_failure)
val backupDownloadError = c.getString(R.string.commons__unknown_error)
val backupDownloadSuccess = c.getString(R.string.backup__export_result_success)
Expand Down Expand Up @@ -354,4 +358,4 @@ class Strings(c: Context) {
val widgetSelectMsg = c.getString(R.string.widgets_select_msg)
val widgetNoServices = c.getString(R.string.widgets_empty_msg)

}
}
5 changes: 5 additions & 0 deletions core/locale/src/main/res/values-de-rDE/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,11 @@
<string name="backup__set_password_title">Um den Schutz deiner Sicherungsdatei zu erhöhen, lege bitte das Passwort fest</string>
<string name="backup__enter_password_title">Gib ein Passwort für diese Sicherungsdatei ein, um mit dem Importvorgang fortzufahren</string>
<string name="backup__backup_file_password_title">Ein Passwort für diese Sicherungsdatei festlegen</string>
<!-- Password validation errors -->
<string name="backup__password_length_error">Das Passwort muss zwischen %1$d und %2$d Zeichen lang sein</string>
<string name="backup__password_confirm_error">Die Passwörter stimmen nicht überein</string>
<string name="backup__password_validation_error">Das Passwort enthält ungültige Zeichen</string>
<string name="backup__password_validation_hint">Das Passwort darf nur Buchstaben, Zahlen und diese Symbole enthalten: _/!#$%&amp;+*~@?=^.,(){}[]&lt;&gt;|-</string>
<string name="backup__incorrect_password">Falsches Passwort</string>
<!-- %d - number -->
<string name="backup__new_services">%d neue Dienste</string>
Expand Down
5 changes: 5 additions & 0 deletions core/locale/src/main/res/values-es-rES/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,11 @@
<string name="backup__set_password_title">Para aumentar la protección de su archivo de copia de seguridad, establezca una contraseña.</string>
<string name="backup__enter_password_title">Escriba una contraseña para este archivo de copia de seguridad para continuar con el proceso de importación</string>
<string name="backup__backup_file_password_title">Establecer una contraseña para este archivo de copia de seguridad</string>
<!-- Password validation errors -->
<string name="backup__password_length_error">La contraseña debe tener entre %1$d y %2$d caracteres</string>
<string name="backup__password_confirm_error">Las contraseñas no coinciden</string>
<string name="backup__password_validation_error">La contraseña contiene caracteres no válidos</string>
<string name="backup__password_validation_hint">La contraseña solo puede contener letras, números y estos símbolos: _/!#$%&amp;+*~@?=^.,(){}[]&lt;&gt;|-</string>
<string name="backup__incorrect_password">Contraseña incorrecta</string>
<!-- %d - number -->
<string name="backup__new_services">%d nuevos servicios</string>
Expand Down
5 changes: 5 additions & 0 deletions core/locale/src/main/res/values-fr-rFR/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,11 @@
<string name="backup__set_password_title">Pour renforcer la protection de votre fichier de sauvegarde, veuillez définir un mot de passe.</string>
<string name="backup__enter_password_title">Saisissez un mot de passe pour ce fichier de sauvegarde afin de poursuivre le processus d\'importation</string>
<string name="backup__backup_file_password_title">Définir un mot de passe pour le fichier de sauvegarde</string>
<!-- Password validation errors -->
<string name="backup__password_length_error">Le mot de passe doit contenir entre %1$d et %2$d caractères</string>
<string name="backup__password_confirm_error">Les mots de passe ne correspondent pas</string>
<string name="backup__password_validation_error">Le mot de passe contient des caractères non valides</string>
<string name="backup__password_validation_hint">Le mot de passe ne peut contenir que des lettres, des chiffres et ces symboles : _/!#$%&amp;+*~@?=^.,(){}[]&lt;&gt;|-</string>
<string name="backup__incorrect_password">Mot de passe incorrect</string>
<!-- %d - number -->
<string name="backup__new_services">%d nouveaux services</string>
Expand Down
5 changes: 5 additions & 0 deletions core/locale/src/main/res/values-it-rIT/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,11 @@
<string name="backup__set_password_title">Per aumentare la protezione del tuo file di backup imposta la password</string>
<string name="backup__enter_password_title">Digita la password per questo file di backup per procedere con il processo di importazione</string>
<string name="backup__backup_file_password_title">Imposta una password per questo file di backup</string>
<!-- Password validation errors -->
<string name="backup__password_length_error">La password deve essere compresa tra %1$d e %2$d caratteri</string>
<string name="backup__password_confirm_error">Le password non corrispondono</string>
<string name="backup__password_validation_error">La password contiene caratteri non validi</string>
<string name="backup__password_validation_hint">La password può contenere solo lettere, numeri e i simboli: _/!#$%&amp;+*~@?=^.,(){}[]&lt;&gt;|-</string>
<string name="backup__incorrect_password">Password errata</string>
<!-- %d - number -->
<string name="backup__new_services">%d nuovi servizi</string>
Expand Down
5 changes: 5 additions & 0 deletions core/locale/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,11 @@
<string name="backup__set_password_title">To increase the protection of your backup file, please set the password</string>
<string name="backup__enter_password_title">Type in a password for this backup file to proceed with the import process</string>
<string name="backup__backup_file_password_title">Set a password for this backup file</string>
<!-- Password validation errors -->
<string name="backup__password_length_error">Password must be between %1$d and %2$d characters</string>
<string name="backup__password_confirm_error">Passwords don\'t match</string>
<string name="backup__password_validation_error">Password contains invalid characters</string>
<string name="backup__password_validation_hint">Password can only contain letters, numbers, and these symbols: _/!#$%&amp;+*~@?=^.,(){}[]&lt;&gt;|-</string>
<string name="backup__incorrect_password">Incorrect Password</string>
<!-- %d - number -->
<string name="backup__new_services">%d new services</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ private fun ScreenContent(
title = TwLocale.strings.backupSetPassword,
body = TwLocale.strings.backupSetPasswordDescription,
validation = { text -> ExportPasswordRegex.matches(text) },
validationHint = TwLocale.strings.backupPasswordValidationHint,
onPositive = {
onPasswordConfirm(it)

Expand Down Expand Up @@ -263,4 +264,4 @@ private fun Preview() {
ScreenContent(
uiState = BackupExportUiState(),
)
}
}