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