Extrahiere TimePicker-Logik in eigene Klassen (Fix #5)
parent
ba2cad2f25
commit
cfe926a999
@ -0,0 +1,40 @@
|
||||
package com.cyb3rko.techniklogger.data
|
||||
|
||||
data class HourMinute(
|
||||
internal val hours: Int,
|
||||
internal val minutes: Int
|
||||
) {
|
||||
internal val millis = hours.toLong() * 3600000 + minutes.toLong() * 60000
|
||||
|
||||
override fun toString(): String {
|
||||
return "${hours.toPrettyString()}:${minutes.toPrettyString()}"
|
||||
}
|
||||
|
||||
private fun Int.toPrettyString(): String {
|
||||
val intString = this.toString()
|
||||
return if (intString.length != 1) {
|
||||
intString
|
||||
} else {
|
||||
"0$intString"
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
internal fun fromString(hourMinute: String): HourMinute {
|
||||
val parts = hourMinute.split(":")
|
||||
val hours = parts[0].toInt()
|
||||
val minutes = parts[1].toInt()
|
||||
return HourMinute(hours, minutes)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal operator fun HourMinute.compareTo(b: HourMinute): Int {
|
||||
return if (this.hours == b.hours && this.minutes == b.minutes) {
|
||||
0
|
||||
} else if (this.hours == b.hours && this.minutes < b.minutes) {
|
||||
-1
|
||||
} else if (this.hours < b.hours) {
|
||||
-1
|
||||
} else 1
|
||||
}
|
||||
@ -0,0 +1,78 @@
|
||||
package com.cyb3rko.techniklogger.modals
|
||||
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import com.cyb3rko.techniklogger.data.HourMinute
|
||||
import com.cyb3rko.techniklogger.data.compareTo
|
||||
import com.cyb3rko.techniklogger.showWarningToast
|
||||
import com.google.android.material.timepicker.MaterialTimePicker
|
||||
import com.google.android.material.timepicker.TimeFormat
|
||||
import java.text.DecimalFormat
|
||||
import java.text.DecimalFormatSymbols
|
||||
import java.util.*
|
||||
|
||||
internal class TimePickerBuilder {
|
||||
companion object {
|
||||
private const val TAG = "TimePickerDialog"
|
||||
}
|
||||
|
||||
internal var initialStart = HourMinute(0, 0)
|
||||
internal var initialEnd = HourMinute(0, 0)
|
||||
|
||||
internal fun show(
|
||||
activity: FragmentActivity,
|
||||
missionTime: String,
|
||||
action: (time: String, duration: Float) -> Unit
|
||||
) {
|
||||
if (!missionTime.contains("Uhr")) {
|
||||
activity.showWarningToast("Ändern der Arbeitszeit bei fehlendem Einsatz-Zeitraum nicht möglich")
|
||||
return
|
||||
}
|
||||
|
||||
val builder1 = MaterialTimePicker.Builder()
|
||||
.setTimeFormat(TimeFormat.CLOCK_24H)
|
||||
.setTitleText("Von")
|
||||
|
||||
val builder2 = MaterialTimePicker.Builder()
|
||||
.setTimeFormat(TimeFormat.CLOCK_24H)
|
||||
.setTitleText("Bis")
|
||||
|
||||
builder1.setHour(initialStart.hours)
|
||||
builder1.setMinute(initialStart.minutes)
|
||||
builder2.setHour(initialEnd.hours)
|
||||
builder2.setMinute(initialEnd.minutes)
|
||||
|
||||
val picker1 = builder1.build()
|
||||
val picker2 = builder2.build()
|
||||
|
||||
val missionTimes = missionTime.split(" Uhr")[0].split(" - ")
|
||||
val missionStart = HourMinute.fromString(missionTimes[0])
|
||||
val missionEnd = HourMinute.fromString(missionTimes[1])
|
||||
var start = HourMinute(0, 0)
|
||||
picker1.addOnPositiveButtonClickListener {
|
||||
start = HourMinute(picker1.hour, picker1.minute)
|
||||
if (start < missionStart) {
|
||||
activity.showWarningToast("Start muss im Einsatz-Zeitraum liegen")
|
||||
} else {
|
||||
picker2.show(activity.supportFragmentManager, "$TAG von")
|
||||
}
|
||||
}
|
||||
|
||||
var end: HourMinute
|
||||
picker2.addOnPositiveButtonClickListener {
|
||||
end = HourMinute(picker2.hour, picker2.minute)
|
||||
if (end > missionEnd) {
|
||||
activity.showWarningToast("Ende muss im Einsatz-Zeitraum liegen")
|
||||
} else if (start >= end) {
|
||||
activity.showWarningToast("Ungültige Arbeitszeit erkannt")
|
||||
} else {
|
||||
val time = "$start - $end"
|
||||
val duration = ((end.millis - start.millis).toFloat() / 3600000f)
|
||||
val floatFormat = DecimalFormat("#.#", DecimalFormatSymbols(Locale.ENGLISH))
|
||||
val roundedDuration = floatFormat.format(duration)
|
||||
action(time, roundedDuration.toFloat())
|
||||
}
|
||||
}
|
||||
|
||||
picker1.show(activity.supportFragmentManager, "$TAG bis")
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue