Allow to use biometric unlock manually (closes #999)

This commit is contained in:
Koitharu
2024-08-03 13:35:28 +03:00
parent 1a17324d26
commit b7741ce2af
2 changed files with 27 additions and 2 deletions

View File

@@ -17,6 +17,7 @@ import androidx.biometric.BiometricManager.BIOMETRIC_SUCCESS
import androidx.biometric.BiometricPrompt
import androidx.biometric.BiometricPrompt.AuthenticationCallback
import androidx.core.graphics.Insets
import com.google.android.material.textfield.TextInputLayout
import dagger.hilt.android.AndroidEntryPoint
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.ui.BaseActivity
@@ -25,6 +26,7 @@ import org.koitharu.kotatsu.core.util.ext.getParcelableExtraCompat
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.observeEvent
import org.koitharu.kotatsu.databinding.ActivityProtectBinding
import com.google.android.material.R as materialR
@AndroidEntryPoint
class ProtectActivity :
@@ -34,6 +36,7 @@ class ProtectActivity :
View.OnClickListener {
private val viewModel by viewModels<ProtectViewModel>()
private var canUseBiometric = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -61,7 +64,9 @@ class ProtectActivity :
override fun onStart() {
super.onStart()
if (!useFingerprint()) {
canUseBiometric = useFingerprint()
updateEndIcon()
if (!canUseBiometric) {
viewBinding.editPassword.requestFocus()
}
}
@@ -80,6 +85,7 @@ class ProtectActivity :
when (v.id) {
R.id.button_next -> viewModel.tryUnlock(viewBinding.editPassword.text?.toString().orEmpty())
R.id.button_cancel -> finish()
materialR.id.text_input_end_icon -> useFingerprint()
}
}
@@ -99,6 +105,7 @@ class ProtectActivity :
override fun afterTextChanged(s: Editable?) {
viewBinding.layoutPassword.error = null
viewBinding.buttonNext.isEnabled = !s.isNullOrEmpty()
updateEndIcon()
}
private fun onError(e: Throwable) {
@@ -127,6 +134,24 @@ class ProtectActivity :
return true
}
private fun updateEndIcon() = with(viewBinding.layoutPassword) {
val isFingerprintIcon = canUseBiometric && viewBinding.editPassword.text.isNullOrEmpty()
if (isFingerprintIcon == (endIconMode == TextInputLayout.END_ICON_CUSTOM)) {
return@with
}
if (isFingerprintIcon) {
endIconMode = TextInputLayout.END_ICON_CUSTOM
setEndIconDrawable(androidx.biometric.R.drawable.fingerprint_dialog_fp_icon)
endIconContentDescription = getString(androidx.biometric.R.string.use_biometric_label)
setEndIconOnClickListener(this@ProtectActivity)
} else {
setEndIconOnClickListener(null)
setEndIconDrawable(0)
endIconContentDescription = null
endIconMode = TextInputLayout.END_ICON_PASSWORD_TOGGLE
}
}
private inner class BiometricCallback : AuthenticationCallback() {
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
super.onAuthenticationSucceeded(result)

View File

@@ -267,7 +267,7 @@
<string name="status_on_hold">On hold</string>
<string name="status_dropped">Dropped</string>
<string name="disable_all">Disable all</string>
<string name="use_fingerprint">Use fingerprint if available</string>
<string name="use_fingerprint">Use biometric if available</string>
<string name="appwidget_shelf_description">Manga from your favourites</string>
<string name="appwidget_recent_description">Your recently read manga</string>
<string name="report">Report</string>