That fuck shit the fascists are using
at master 101 lines 3.1 kB view raw
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}