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