Skip to content

Commit b6b6280

Browse files
committed
Poison Pill PIN now supports alpha-numeric PINs
1 parent 324a2a7 commit b6b6280

2 files changed

Lines changed: 27 additions & 10 deletions

File tree

app/src/main/kotlin/com/darkrockstudios/app/securecamera/settings/PoisonPillPinCreationDialog.kt

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,21 @@ fun PoisonPillPinCreationDialog(
7777
// PIN input
7878
OutlinedTextField(
7979
value = pin,
80-
onValueChange = {
81-
if (it.length <= uiState.pinSize.max() && it.all { char -> char.isDigit() }) {
82-
pin = it
80+
onValueChange = { newPin ->
81+
val isValid = if (uiState.alphanumericPinEnabled) {
82+
newPin.all { char -> char.isLetterOrDigit() }
83+
} else {
84+
newPin.all { char -> char.isDigit() }
85+
}
86+
if (newPin.length <= uiState.pinSize.max() && isValid) {
87+
pin = newPin
8388
showError = null
8489
}
8590
},
8691
label = { Text(stringResource(R.string.pin_creation_hint)) },
8792
visualTransformation = PasswordVisualTransformation(),
8893
keyboardOptions = KeyboardOptions(
89-
keyboardType = KeyboardType.NumberPassword,
94+
keyboardType = if (uiState.alphanumericPinEnabled) KeyboardType.Password else KeyboardType.NumberPassword,
9095
imeAction = ImeAction.Next
9196
),
9297
singleLine = true,
@@ -98,16 +103,21 @@ fun PoisonPillPinCreationDialog(
98103
// Confirm PIN input
99104
OutlinedTextField(
100105
value = confirmPin,
101-
onValueChange = {
102-
if (it.length <= uiState.pinSize.max() && it.all { char -> char.isDigit() }) {
103-
confirmPin = it
106+
onValueChange = { newConfirmPin ->
107+
val isValid = if (uiState.alphanumericPinEnabled) {
108+
newConfirmPin.all { char -> char.isLetterOrDigit() }
109+
} else {
110+
newConfirmPin.all { char -> char.isDigit() }
111+
}
112+
if (newConfirmPin.length <= uiState.pinSize.max() && isValid) {
113+
confirmPin = newConfirmPin
104114
showError = null
105115
}
106116
},
107117
label = { Text(stringResource(R.string.pin_creation_confirm_hint)) },
108118
visualTransformation = PasswordVisualTransformation(),
109119
keyboardOptions = KeyboardOptions(
110-
keyboardType = KeyboardType.NumberPassword,
120+
keyboardType = if (uiState.alphanumericPinEnabled) KeyboardType.Password else KeyboardType.NumberPassword,
111121
imeAction = ImeAction.Done
112122
),
113123
singleLine = true,
@@ -158,4 +168,4 @@ fun PoisonPillPinCreationDialog(
158168
}
159169
}
160170
}
161-
}
171+
}

app/src/main/kotlin/com/darkrockstudios/app/securecamera/settings/SettingsViewModel.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ class SettingsViewModel(
6565
_uiState.update { it.copy(locationPermissionStatus = status) }
6666
}
6767
}
68+
69+
viewModelScope.launch {
70+
preferences.alphanumericPinEnabled.collect { enabled ->
71+
_uiState.update { it.copy(alphanumericPinEnabled = enabled) }
72+
}
73+
}
6874
}
6975

7076
private fun checkPoisonPillStatus() {
@@ -193,7 +199,7 @@ class SettingsViewModel(
193199
}
194200

195201
suspend fun validatePoisonPillPin(pin: String, confirmPin: String): String? {
196-
val strongPin = pinStrengthCheck.isPinStrongEnough(pin)
202+
val strongPin = pinStrengthCheck.isPinStrongEnough(pin, uiState.value.alphanumericPinEnabled)
197203
return if (pin != confirmPin || (pin.length in uiState.value.pinSize).not()) {
198204
appContext.getString(R.string.pin_creation_error)
199205
} else if (isSameAsAuthPin(pin)) {
@@ -223,4 +229,5 @@ data class SettingsUiState(
223229
val poisonPillRemoved: Boolean = false,
224230
val securityLevel: SecurityLevel = SecurityLevel.SOFTWARE,
225231
val pinSize: IntRange,
232+
val alphanumericPinEnabled: Boolean = false,
226233
)

0 commit comments

Comments
 (0)