Try to add new biometric states from the doc #724

This commit is contained in:
J-Jamet
2020-10-08 23:10:28 +02:00
parent f1e675d662
commit 267f4273ee
3 changed files with 28 additions and 20 deletions

View File

@@ -30,7 +30,6 @@ import android.view.View
import android.widget.CompoundButton import android.widget.CompoundButton
import android.widget.TextView import android.widget.TextView
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.biometric.BiometricConstants
import androidx.biometric.BiometricManager import androidx.biometric.BiometricManager
import androidx.biometric.BiometricPrompt import androidx.biometric.BiometricPrompt
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
@@ -229,8 +228,8 @@ class AdvancedUnlockedManager(var context: FragmentActivity,
setAdvancedUnlockedMessageView("") setAdvancedUnlockedMessageView("")
advancedUnlockInfoView?.setIconViewClickListener(false) { advancedUnlockInfoView?.setIconViewClickListener(false) {
biometricAuthenticationCallback.onAuthenticationError( biometricAuthenticationCallback.onAuthenticationError(BiometricPrompt.ERROR_UNABLE_TO_PROCESS,
BiometricConstants.ERROR_UNABLE_TO_PROCESS, context.getString(R.string.credential_before_click_biometric_button)) context.getString(R.string.credential_before_click_biometric_button))
} }
} }

View File

@@ -31,7 +31,6 @@ import androidx.annotation.RequiresApi
import androidx.biometric.BiometricManager import androidx.biometric.BiometricManager
import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG
import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_WEAK import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_WEAK
import androidx.biometric.BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE
import androidx.biometric.BiometricPrompt import androidx.biometric.BiometricPrompt
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
@@ -94,12 +93,8 @@ class BiometricUnlockDatabaseHelper(private val context: FragmentActivity) {
} }
init { init {
if (canAuthenticate(context) != BiometricManager.BIOMETRIC_SUCCESS) { if (allowInitKeyStore(context)) {
// really not much to do when no fingerprint support found
isKeyManagerInit = false
} else {
this.keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager? this.keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager?
try { try {
this.keyStore = KeyStore.getInstance(BIOMETRIC_KEYSTORE) this.keyStore = KeyStore.getInstance(BIOMETRIC_KEYSTORE)
this.keyGenerator = KeyGenerator.getInstance(BIOMETRIC_KEY_ALGORITHM, BIOMETRIC_KEYSTORE) this.keyGenerator = KeyGenerator.getInstance(BIOMETRIC_KEY_ALGORITHM, BIOMETRIC_KEYSTORE)
@@ -116,6 +111,9 @@ class BiometricUnlockDatabaseHelper(private val context: FragmentActivity) {
isKeyManagerInit = false isKeyManagerInit = false
biometricUnlockCallback?.onBiometricException(e) biometricUnlockCallback?.onBiometricException(e)
} }
} else {
// really not much to do when no fingerprint support found
isKeyManagerInit = false
} }
} }
@@ -307,11 +305,28 @@ class BiometricUnlockDatabaseHelper(private val context: FragmentActivity) {
BiometricManager.from(context).canAuthenticate(BIOMETRIC_WEAK) BiometricManager.from(context).canAuthenticate(BIOMETRIC_WEAK)
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "Unable to authenticate with weak biometric.", e) Log.e(TAG, "Unable to authenticate with weak biometric.", e)
BIOMETRIC_ERROR_HW_UNAVAILABLE BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE
} }
} }
} }
fun allowInitKeyStore(context: Context): Boolean {
val biometricCanAuthenticate = canAuthenticate(context)
return ( biometricCanAuthenticate == BiometricManager.BIOMETRIC_SUCCESS
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_STATUS_UNKNOWN
)
}
fun unlockSupported(context: Context): Boolean {
val biometricCanAuthenticate = canAuthenticate(context)
return ( biometricCanAuthenticate == BiometricManager.BIOMETRIC_SUCCESS
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_STATUS_UNKNOWN
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED
)
}
/** /**
* Remove entry key in keystore * Remove entry key in keystore
*/ */

View File

@@ -209,13 +209,11 @@ class NestedAppSettingsFragment : NestedSettingsFragment() {
activity?.let { activity -> activity?.let { activity ->
val biometricUnlockEnablePreference: SwitchPreference? = findPreference(getString(R.string.biometric_unlock_enable_key)) val biometricUnlockEnablePreference: SwitchPreference? = findPreference(getString(R.string.biometric_unlock_enable_key))
val deleteKeysFingerprints: Preference? = findPreference(getString(R.string.biometric_delete_all_key_key))
// < M solve verifyError exception // < M solve verifyError exception
var biometricUnlockSupported = false val biometricUnlockSupported = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { BiometricUnlockDatabaseHelper.unlockSupported(activity)
val biometricCanAuthenticate = BiometricUnlockDatabaseHelper.canAuthenticate(activity) } else false
biometricUnlockSupported = biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_SUCCESS
}
if (!biometricUnlockSupported) { if (!biometricUnlockSupported) {
// False if under Marshmallow // False if under Marshmallow
biometricUnlockEnablePreference?.apply { biometricUnlockEnablePreference?.apply {
@@ -227,10 +225,6 @@ class NestedAppSettingsFragment : NestedSettingsFragment() {
false false
} }
} }
}
val deleteKeysFingerprints: Preference? = findPreference(getString(R.string.biometric_delete_all_key_key))
if (!biometricUnlockSupported) {
deleteKeysFingerprints?.isEnabled = false deleteKeysFingerprints?.isEnabled = false
} else { } else {
deleteKeysFingerprints?.setOnPreferenceClickListener { deleteKeysFingerprints?.setOnPreferenceClickListener {