diff --git a/app/src/main/java/sh/sar/basedbank/LockActivity.kt b/app/src/main/java/sh/sar/basedbank/LockActivity.kt index 663abe4..3c67d96 100644 --- a/app/src/main/java/sh/sar/basedbank/LockActivity.kt +++ b/app/src/main/java/sh/sar/basedbank/LockActivity.kt @@ -32,6 +32,8 @@ class LockActivity : AppCompatActivity() { private lateinit var salt: String private lateinit var storedHash: String private var biometricsEnabled = false + private var autoUnlockPin = false + private var pinLength = 4 private var isVerifying = false private val lockPrefs get() = getSharedPreferences("lock_attempts", MODE_PRIVATE) @@ -61,6 +63,8 @@ class LockActivity : AppCompatActivity() { val prefs = getSharedPreferences("prefs", MODE_PRIVATE) method = prefs.getString("security_method", "pin") ?: "pin" biometricsEnabled = prefs.getBoolean("biometrics_enabled", false) + autoUnlockPin = prefs.getBoolean("auto_unlock_pin", false) + pinLength = prefs.getInt("pin_length", 4) val stored = CredentialStore(this).loadSecurityHash() ?: run { finish(); return } salt = stored.first @@ -134,13 +138,18 @@ class LockActivity : AppCompatActivity() { when (key) { "⌫" -> if (pinDigits.isNotEmpty()) { pinDigits.removeLast(); updateDots() } "✓" -> if (pinDigits.size >= 4) verifyPin() - else -> if (pinDigits.size < 8) { pinDigits.add(key.toInt()); updateDots() } + else -> if (pinDigits.size < 8) { + pinDigits.add(key.toInt()) + updateDots() + if (autoUnlockPin && pinDigits.size == pinLength) verifyPin() + } } } private fun updateDots() { val n = pinDigits.size - binding.tvLockPinDots.text = "●".repeat(n) + "○".repeat(maxOf(4 - n, 0)) + val total = if (autoUnlockPin) pinLength else maxOf(n, 4) + binding.tvLockPinDots.text = "●".repeat(n) + "○".repeat(maxOf(total - n, 0)) } private fun verifyPin() { diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/SettingsSecurityFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/SettingsSecurityFragment.kt index b61e3e4..7b717ce 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/SettingsSecurityFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/SettingsSecurityFragment.kt @@ -31,6 +31,15 @@ class SettingsSecurityFragment : Fragment() { ) } + // Auto unlock on correct PIN (only for pin method) + if (prefs.getString("security_method", null) == "pin") { + binding.rowAutoUnlockPin.visibility = View.VISIBLE + binding.switchAutoUnlockPin.isChecked = prefs.getBoolean("auto_unlock_pin", false) + binding.switchAutoUnlockPin.setOnCheckedChangeListener { _, isChecked -> + prefs.edit().putBoolean("auto_unlock_pin", isChecked).apply() + } + } + // Biometrics val canUseBiometrics = BiometricManager.from(requireContext()) .canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK) == BiometricManager.BIOMETRIC_SUCCESS diff --git a/app/src/main/java/sh/sar/basedbank/ui/onboarding/SecuritySetupFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/onboarding/SecuritySetupFragment.kt index 71a42fe..bd7c155 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/onboarding/SecuritySetupFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/onboarding/SecuritySetupFragment.kt @@ -215,9 +215,10 @@ class SecuritySetupFragment : Fragment() { val salt = ByteArray(16).also { SecureRandom().nextBytes(it) } val saltB64 = Base64.encodeToString(salt, Base64.NO_WRAP) val hash = pbkdf2(input, salt) - requireContext().getSharedPreferences("prefs", Context.MODE_PRIVATE).edit() + val edit = requireContext().getSharedPreferences("prefs", Context.MODE_PRIVATE).edit() .putString("security_method", method) - .apply() + if (method == "pin") edit.putInt("pin_length", input.length) + edit.apply() CredentialStore(requireContext()).saveSecurityHash(saltB64, hash) } diff --git a/app/src/main/res/layout/fragment_settings_security.xml b/app/src/main/res/layout/fragment_settings_security.xml index f87f9c1..c7fb353 100644 --- a/app/src/main/res/layout/fragment_settings_security.xml +++ b/app/src/main/res/layout/fragment_settings_security.xml @@ -96,6 +96,46 @@ + + + + + + + + + + + + + + English ދިވެހި ޕްރައިވެސީ + ރަނގަޅު ޕިން އެޅުމުން ހުޅުވޭ + ޕިންގެ ދިގުމިނާ އެއްވަރަށް ޑިޖިޓް ލިޔުމުން ހުޅުވިދާ ސްކްރީންޝޮޓް ބްލޮކްކުރޭ ރިސެންޓްސް ސްކްރީނުންނާއި ސްކްރީން ކެޕްޗާ ހުއްޓުވައިދޭ ކޭޝް diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a53d4f9..7040fc3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,6 +155,8 @@ Privacy Hide sensitive information Masks account balances and financial figures across the app + Auto unlock on correct PIN + Unlock automatically when the entered digits match your PIN length Block Screenshots Prevents the app from appearing in the recents screen and blocks screen capture Cache