From 567eec8bc5f6c05445a6ef73fdedf87816de4cde Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 20 Jun 2020 23:23:07 +0900 Subject: [PATCH] Added Fingerprint Lock --- .../java/xyz/quaver/pupil/ui/LockActivity.kt | 41 ++++++++++++++++++- .../xyz/quaver/pupil/ui/SettingsActivity.kt | 4 +- ...ockFragment.kt => LockSettingsFragment.kt} | 22 +++++++++- app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/lock_preferences.xml | 2 +- 7 files changed, 67 insertions(+), 5 deletions(-) rename app/src/main/java/xyz/quaver/pupil/ui/fragment/{LockFragment.kt => LockSettingsFragment.kt} (86%) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt index 990ae08f..010397d9 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt @@ -24,6 +24,10 @@ import android.os.Bundle import android.view.animation.Animation import android.view.animation.AnimationUtils import androidx.appcompat.app.AppCompatActivity +import androidx.biometric.BiometricManager +import androidx.biometric.BiometricPrompt +import androidx.core.content.ContextCompat +import androidx.preference.PreferenceManager import com.andrognito.patternlockview.PatternLockView import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.activity_lock.* @@ -140,6 +144,29 @@ class LockActivity : AppCompatActivity() { } } + private fun showBiometricPrompt() { + val promptInfo = BiometricPrompt.PromptInfo.Builder() + .setTitle("Biometric login for my app") + .setSubtitle("Log in using your biometric credential") + .setNegativeButtonText("Cancel") + .setConfirmationRequired(false) + .build() + + val biometricPrompt = BiometricPrompt(this, ContextCompat.getMainExecutor(this), + object : BiometricPrompt.AuthenticationCallback() { + override fun onAuthenticationSucceeded( + result: BiometricPrompt.AuthenticationResult) { + super.onAuthenticationSucceeded(result) + setResult(RESULT_OK) + finish() + return + } + }) + + // Displays the "log in" prompt. + biometricPrompt.authenticate(promptInfo) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_lock) @@ -167,6 +194,19 @@ class LockActivity : AppCompatActivity() { return } + if ( + PreferenceManager.getDefaultSharedPreferences(this).getBoolean("lock_fingerprint", false) + && BiometricManager.from(this).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS + ) { + lock_fingerprint.apply { + isEnabled = true + setOnClickListener { + showBiometricPrompt() + } + } + showBiometricPrompt() + } + lock_pattern.apply { isEnabled = lockManager.contains(Lock.Type.PATTERN) setOnClickListener { @@ -183,7 +223,6 @@ class LockActivity : AppCompatActivity() { ).commit() } } - lock_fingerprint.isEnabled = false lock_password.isEnabled = false when (lockManager.locks!!.first().type) { diff --git a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt index 20621e38..7bc79d66 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt @@ -35,7 +35,7 @@ import kotlinx.serialization.builtins.serializer import net.rdrei.android.dirchooser.DirectoryChooserActivity import xyz.quaver.pupil.Pupil import xyz.quaver.pupil.R -import xyz.quaver.pupil.ui.fragment.LockFragment +import xyz.quaver.pupil.ui.fragment.LockSettingsFragment import xyz.quaver.pupil.ui.fragment.SettingsFragment import xyz.quaver.pupil.util.* import java.io.File @@ -84,7 +84,7 @@ class SettingsActivity : AppCompatActivity() { if (resultCode == Activity.RESULT_OK) { supportFragmentManager .beginTransaction() - .replace(R.id.settings, LockFragment()) + .replace(R.id.settings, LockSettingsFragment()) .addToBackStack("Lock") .commitAllowingStateLoss() } diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockSettingsFragment.kt similarity index 86% rename from app/src/main/java/xyz/quaver/pupil/ui/fragment/LockFragment.kt rename to app/src/main/java/xyz/quaver/pupil/ui/fragment/LockSettingsFragment.kt index 022fe5ae..4b0c8f26 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/LockSettingsFragment.kt @@ -20,15 +20,17 @@ package xyz.quaver.pupil.ui.fragment import android.content.Intent import android.os.Bundle +import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreferenceCompat import xyz.quaver.pupil.R import xyz.quaver.pupil.ui.LockActivity import xyz.quaver.pupil.util.Lock import xyz.quaver.pupil.util.LockManager -class LockFragment : +class LockSettingsFragment : PreferenceFragmentCompat() { override fun onResume() { @@ -117,5 +119,23 @@ class LockFragment : true } } + + with(findPreference("lock_fingerprint")) { + this!! + + setOnPreferenceChangeListener { _, newValue -> + this as SwitchPreferenceCompat + + if (newValue == true && LockManager(requireContext()).isEmpty()) { + isChecked = false + + Toast.makeText(requireContext(), R.string.settings_lock_fingerprint_without_lock, Toast.LENGTH_SHORT).show() + } + + isChecked = newValue as Boolean + + false + } + } } } \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 710540e2..ed2e442e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -141,4 +141,5 @@ 旧ギャラリーインポート中… インポート完了 ランダムギャラリーを開く + 予備のロックが設定されていないと指紋ロックは使用できません \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 598da2cc..e5a50e62 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -141,4 +141,5 @@ 이전 버전 갤러리 가져오는 중… 가져오기 완료 무작위 갤러리 열기 + 지문 잠금은 다른 잠금 방식이 활성화 되어 있을 때만 사용 가능합니다 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e43da536..cb068cf7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -188,6 +188,7 @@ Password Biometrics Fingerprint + Fingerprint can be only enabled if one of the other locks are enabled Enabled Input same lock once more to confirm Lock Do you want to remove lock? diff --git a/app/src/main/res/xml/lock_preferences.xml b/app/src/main/res/xml/lock_preferences.xml index 3c3baab3..f17e5c01 100644 --- a/app/src/main/res/xml/lock_preferences.xml +++ b/app/src/main/res/xml/lock_preferences.xml @@ -17,7 +17,7 @@ -