1+ package eu.pretix.pretixscan.droid.ui
2+
3+ import android.app.Dialog
4+ import android.content.DialogInterface
5+ import android.os.Bundle
6+ import android.view.KeyEvent
7+ import android.view.View
8+ import androidx.core.os.bundleOf
9+ import androidx.databinding.ObservableField
10+ import androidx.fragment.app.DialogFragment
11+ import androidx.fragment.app.FragmentManager
12+ import androidx.fragment.app.setFragmentResult
13+ import com.google.android.material.dialog.MaterialAlertDialogBuilder
14+ import eu.pretix.pretixscan.droid.databinding.DialogPinBinding
15+ import java.util.Collections
16+
17+
18+ class PINInputDataHolder () {
19+ val input = ObservableField (" " )
20+ val text = ObservableField (" " )
21+ }
22+
23+ class PinDialog : DialogFragment () {
24+ companion object {
25+ const val TAG = " PinDialogFragment"
26+ const val RESULT_PIN = " pin"
27+ const val RESULT_DISMISS = " dismiss"
28+ }
29+
30+ val data = PINInputDataHolder ()
31+
32+ override fun onCreateDialog (savedInstanceState : Bundle ? ): Dialog {
33+ data.input.set(" " )
34+
35+ val binding = DialogPinBinding .inflate(layoutInflater)
36+ binding.data = data
37+
38+ binding.keyboardButtonView0.setOnClickListener { pushDigit(" 0" ) }
39+ binding.keyboardButtonView00.visibility = View .INVISIBLE
40+ binding.keyboardButtonView1.setOnClickListener { pushDigit(" 1" ) }
41+ binding.keyboardButtonView2.setOnClickListener { pushDigit(" 2" ) }
42+ binding.keyboardButtonView3.setOnClickListener { pushDigit(" 3" ) }
43+ binding.keyboardButtonView4.setOnClickListener { pushDigit(" 4" ) }
44+ binding.keyboardButtonView5.setOnClickListener { pushDigit(" 5" ) }
45+ binding.keyboardButtonView6.setOnClickListener { pushDigit(" 6" ) }
46+ binding.keyboardButtonView7.setOnClickListener { pushDigit(" 7" ) }
47+ binding.keyboardButtonView8.setOnClickListener { pushDigit(" 8" ) }
48+ binding.keyboardButtonView9.setOnClickListener { pushDigit(" 9" ) }
49+ binding.keyboardButtonViewBackspace.setOnClickListener { pushBackspace() }
50+
51+ return MaterialAlertDialogBuilder (requireContext())
52+ .setView(binding.root)
53+ .setOnKeyListener { _, keyCode, event ->
54+ if (event.action != KeyEvent .ACTION_DOWN ) return @setOnKeyListener false
55+
56+ if (event.displayLabel.toString().matches(Regex (" ^[0-9]$" ))) {
57+ pushDigit(event.displayLabel.toString())
58+ return @setOnKeyListener true
59+ }
60+ if (keyCode == KeyEvent .KEYCODE_DEL ) {
61+ pushBackspace()
62+ return @setOnKeyListener true
63+ }
64+ if (keyCode == KeyEvent .KEYCODE_ESCAPE ) {
65+ dismiss()
66+ return @setOnKeyListener true
67+ }
68+
69+ return @setOnKeyListener false
70+ }
71+ .create()
72+ }
73+
74+ protected fun pushBackspace () {
75+ val current = data.input.get()!!
76+ if (current.isNotBlank()) {
77+ data.input.set(current.substring(0 , current.length - 1 ))
78+ }
79+ data.text.set(Collections .nCopies(data.input.get()!! .length, " *" ).joinToString(" " ))
80+ }
81+
82+ protected fun pushDigit (digit : String ) {
83+ val current = data.input.get()!!
84+ data.input.set(current + digit)
85+ data.text.set(Collections .nCopies(data.input.get()!! .length, " *" ).joinToString(" " ))
86+ setFragmentResult(RESULT_PIN , bundleOf(RESULT_PIN to data.input.get()!! ))
87+ }
88+
89+ override fun onDismiss (dialog : DialogInterface ) {
90+ setFragmentResult(RESULT_DISMISS , bundleOf())
91+ super .onDismiss(dialog)
92+ }
93+
94+ fun show (manager : FragmentManager ) {
95+ super .show(manager, TAG )
96+ }
97+ }
0 commit comments