Manrope (variable wght, instanced at 600/700/800) for display/headline/ title roles; Inter static Regular/Medium/SemiBold for body/label. M3 baseline metrics retained — only family and weight change, so component layouts and accessibility text scaling are untouched. Both fonts are OFL (THIRD_PARTY_LICENSES.md added) with full æøå/µ coverage, verified by emulator screenshot. ScheduleText.daysCount fixes 'lager for 1 dager' spotted in that screenshot. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
51 lines
1.8 KiB
Kotlin
51 lines
1.8 KiB
Kotlin
package no.naiv.meddetsamme.domain
|
||
|
||
import no.naiv.meddetsamme.data.DoseTime
|
||
|
||
/**
|
||
* Human-readable schedule descriptions (Norwegian, 24h) for the doctor
|
||
* summary and the UI. Pure — unit-tested like the engine, since a wrong
|
||
* description on a doctor's desk is a clinical communication error.
|
||
*/
|
||
object ScheduleText {
|
||
|
||
/** Mask bit order matches ScheduleEngine: bit 0 = Sunday. */
|
||
private val DAY_ABBREV = listOf("søn", "man", "tir", "ons", "tor", "fre", "lør")
|
||
|
||
fun describe(doseTime: DoseTime): String {
|
||
val time = "%02d:%02d".format(doseTime.minuteOfDay / 60, doseTime.minuteOfDay % 60)
|
||
return "$time ${daysText(doseTime)}"
|
||
}
|
||
|
||
fun daysText(doseTime: DoseTime): String {
|
||
if (doseTime.intervalDays > 1) {
|
||
return "(hver ${doseTime.intervalDays}. dag)"
|
||
}
|
||
return when (val mask = doseTime.daysOfWeekMask and 0x7F) {
|
||
0x7F -> "(daglig)"
|
||
0x3E -> "(man–fre)"
|
||
0x41 -> "(lør–søn)"
|
||
0 -> "(aldri)"
|
||
else -> {
|
||
// Week listed Monday-first for humans, despite bit 0 = Sunday.
|
||
val days = (1..7).map { it % 7 }
|
||
.filter { mask and (1 shl it) != 0 }
|
||
.map { DAY_ABBREV[it] }
|
||
"(${days.joinToString(", ")})"
|
||
}
|
||
}
|
||
}
|
||
|
||
/** "1 dag", "3 dager" — norsk flertall. */
|
||
fun daysCount(days: Int): String = if (days == 1) "1 dag" else "$days dager"
|
||
|
||
/** "1 tablett", "2,5 ml" — norsk desimalkomma. */
|
||
fun amountText(amount: Double, unit: String): String {
|
||
val number = if (amount == amount.toLong().toDouble()) {
|
||
amount.toLong().toString()
|
||
} else {
|
||
amount.toString().replace('.', ',')
|
||
}
|
||
return "$number $unit"
|
||
}
|
||
}
|