-
Notifications
You must be signed in to change notification settings - Fork 12
/
FingerprintDialogFragment.kt
121 lines (102 loc) · 4.09 KB
/
FingerprintDialogFragment.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package me.shkschneider.skeleton.android.security.fingerprint
import android.app.Dialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
import kotlinx.android.synthetic.main.sk_fingerprint_dialog.*
import me.shkschneider.skeleton.android.R
import me.shkschneider.skeleton.android.app.cancelable
import me.shkschneider.skeleton.android.app.dimBehind
import me.shkschneider.skeleton.android.provider.SystemServices
import me.shkschneider.skeleton.android.view.Notify
import me.shkschneider.skeleton.android.widget.tint
import me.shkschneider.skeleton.kotlin.jvm.TAG
import me.shkschneider.skeleton.kotlin.jvm.exhaustive
import me.shkschneider.skeleton.kotlin.log.Logger
import java.util.concurrent.TimeUnit
private const val TITLE = "TITLE"
private val DELAY = TimeUnit.SECONDS.toMillis(1.toLong())
// <https://github.com/android/security>
@Suppress("DEPRECATION")
class FingerprintDialogFragment : DialogFragment() {
companion object {
@JvmStatic
fun newInstance(title: String) = FingerprintDialogFragment().apply {
arguments = bundleOf(
(TITLE to title)
)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
retainInstance = true
setStyle(STYLE_NORMAL, android.R.style.Theme_Material_Light_Dialog)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) =
inflater.inflate(R.layout.sk_fingerprint_dialog, container, false) as View
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
super.onCreateDialog(savedInstanceState).also { dialog ->
dialog.dimBehind(true)
dialog.setTitle(requireNotNull(arguments?.getString(TITLE)))
dialog.cancelable(cancelable = true, canceledOnTouchOutside = true) {
onFingerprintState(FingerprintState.Cancel)
}
}
override fun onResume() {
super.onResume()
fingerprintHandler.onResume()
}
override fun onPause() {
super.onPause()
fingerprintHandler.onPause()
}
// region State
private val fingerprintHandler: FingerprintHandler by lazy {
FingerprintHandler(SystemServices.fingerprintManager(requireNotNull(context))) { onFingerprintState(it) }
}
lateinit var callback: FingerprintCallback
private fun onFingerprintState(state: FingerprintState) {
Logger.debug("onFingerprintState: ${state.TAG}")
when (state) {
is FingerprintState.Success -> {
skFingerprintIcon.tint(ContextCompat.getColor(skFingerprintIcon.context, R.color.sk_material_green))
dismissWithState(state)
}
is FingerprintState.Failure -> {
skFingerprintIcon.tint(ContextCompat.getColor(skFingerprintIcon.context, R.color.sk_material_orange))
state.help?.let { Notify.toast(it) }
}
is FingerprintState.Error -> {
skFingerprintIcon.tint(ContextCompat.getColor(skFingerprintIcon.context, R.color.sk_material_red))
state.error?.let { Notify.toast(it) }
dismissWithState(state)
}
is FingerprintState.Cancel -> {
dismissWithState(state)
}
is FingerprintState.Unavailable -> {
callback(state)
dismissNowWithState(state)
}
}.exhaustive
callback(state)
}
fun dismissWithState(state: FingerprintState) {
skFingerprintIcon.postDelayed({
dismissNowWithState(state)
}, DELAY)
}
fun dismissNowWithState(state: FingerprintState) {
callback(state)
super.dismiss()
}
@Deprecated("dismissWithState()", ReplaceWith("dismissWithState()"))
override fun dismiss() {
super.dismiss()
}
// endregion
}