-
-
Notifications
You must be signed in to change notification settings - Fork 8
/
CredentialChooserDialog.kt
86 lines (70 loc) · 2.99 KB
/
CredentialChooserDialog.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
package me.henneke.wearauthn.ui
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView
import kotlinx.android.synthetic.main.credential_chooser_dialog.*
import kotlinx.coroutines.*
import me.henneke.wearauthn.R
import me.henneke.wearauthn.fido.context.WebAuthnCredential
private const val TAG = "CredentialChooserDialog"
@ExperimentalUnsignedTypes
class CredentialChooserDialog(
val credentials: Array<WebAuthnCredential>,
context: Context,
val callback: (WebAuthnCredential?) -> Unit
) : Dialog(context), CoroutineScope {
private val TIMEOUT_MS = 30_000L
override val coroutineContext = Dispatchers.Main + SupervisorJob()
private var chosenCredential: WebAuthnCredential? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.credential_chooser_dialog)
credentialList.apply {
val header = layoutInflater.inflate(R.layout.credential_list_header, this, false)
addHeaderView(header)
addFooterView(TextView(context).apply { height = header.height })
adapter = credentialListAdapter
setOnItemClickListener { _, _, position, _ ->
val adapterPosition = position - headerViewsCount
if (adapterPosition in 0 until adapter.count) {
if (chosenCredential == null)
chosenCredential = credentialListAdapter.getItem(adapterPosition)
dismiss()
}
}
}
setOnDismissListener { callback(chosenCredential) }
}
override fun onStart() {
super.onStart()
launch {
delay(TIMEOUT_MS)
}
}
override fun onStop() {
super.onStop()
coroutineContext.cancelChildren()
}
private val credentialListAdapter = object : BaseAdapter() {
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val credentialView =
convertView ?: layoutInflater.inflate(R.layout.credential_view, parent, false)
val titleView = credentialView.findViewById<TextView>(R.id.title)
val summaryView = credentialView.findViewById<TextView>(R.id.summary)
val credential = getItem(position)
val credentialInfo = credential.getTwoLineInfo(position + 1)
titleView.text = credentialInfo.first
summaryView.text = credentialInfo.second
summaryView.visibility = if (summaryView.text == null) View.GONE else View.VISIBLE
return credentialView
}
override fun getItem(position: Int) = credentials[position]
override fun getItemId(position: Int) = getItem(position).hashCode().toLong()
override fun getCount() = credentials.size
}
}