That fuck shit the fascists are using
1package org.tm.archive.components
2
3import android.app.Dialog
4import android.os.Bundle
5import androidx.core.os.bundleOf
6import androidx.fragment.app.DialogFragment
7import androidx.fragment.app.setFragmentResult
8import com.google.android.material.dialog.MaterialAlertDialogBuilder
9import org.tm.archive.R
10import org.tm.archive.databinding.TimeDurationPickerDialogBinding
11import kotlin.time.Duration
12import kotlin.time.Duration.Companion.hours
13import kotlin.time.Duration.Companion.milliseconds
14import kotlin.time.Duration.Companion.minutes
15
16/**
17 * Time duration dialog for selection a duration of hours and minutes. Currently
18 * designed specifically for screen lock but could easily be generalized in the future
19 * if needed.
20 *
21 * Uses [setFragmentResult] to pass the provided duration back in milliseconds.
22 */
23class TimeDurationPickerDialog : DialogFragment(), NumericKeyboardView.Listener {
24
25 private var _binding: TimeDurationPickerDialogBinding? = null
26 private val binding: TimeDurationPickerDialogBinding
27 get() = _binding!!
28
29 private var duration: String = "0000"
30 private var full: Boolean = false
31
32 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
33 _binding = TimeDurationPickerDialogBinding.inflate(layoutInflater)
34
35 binding.durationKeyboard.listener = this
36
37 setDuration(requireArguments().getLong(ARGUMENT_DURATION).milliseconds)
38
39 return MaterialAlertDialogBuilder(requireContext())
40 .setView(binding.root)
41 .setPositiveButton(R.string.TimeDurationPickerDialog_positive_button) { _, _ ->
42 setFragmentResult(
43 RESULT_DURATION,
44 bundleOf(
45 RESULT_KEY_DURATION_MILLISECONDS to getDuration().inWholeMilliseconds
46 )
47 )
48 }
49 .setNegativeButton(android.R.string.cancel, null)
50 .show()
51 }
52
53 override fun onKeyPress(keyCode: Int) {
54 if (full && keyCode != -1) {
55 return
56 }
57
58 duration = if (keyCode == -1) {
59 "0" + duration.substring(0, 3)
60 } else {
61 duration.substring(1) + keyCode
62 }
63
64 updateDuration()
65 }
66
67 private fun updateDuration() {
68 binding.durationHour.text = duration.substring(0, 2)
69 binding.durationMinute.text = duration.substring(2)
70 full = duration.toInt() > 1000
71 }
72
73 private fun setDuration(duration: Duration) {
74 val hour = duration.inWholeMinutes / 60
75 val minute = duration.inWholeMinutes.mod(60)
76 this.duration = String.format("%02d%02d", hour, minute)
77 updateDuration()
78 }
79
80 private fun getDuration(): Duration {
81 val hours = duration.substring(0, 2).toInt()
82 val minutes = duration.substring(2).toInt()
83
84 return hours.hours.plus(minutes.minutes)
85 }
86
87 companion object {
88 const val RESULT_DURATION = "RESULT_DURATION"
89 const val RESULT_KEY_DURATION_MILLISECONDS = "RESULT_KEY_DURATION_MILLISECONDS"
90
91 private const val ARGUMENT_DURATION = "ARGUMENT_DURATION"
92
93 fun create(duration: Duration): TimeDurationPickerDialog {
94 return TimeDurationPickerDialog().apply {
95 arguments = bundleOf(
96 ARGUMENT_DURATION to duration.inWholeMilliseconds
97 )
98 }
99 }
100 }
101}