From b5c2930609150f5341abfecf5e369ca1346a601a Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Sun, 19 Jul 2026 11:42:15 +0200 Subject: [PATCH] feat(agenda): spell out multi-day time line instead of arrows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The "→" arrow convention read as unclear. Spell each day out instead: the first day names the start ("Starts 14:00"), the last day the end ("Ends 10:00"), and whole days in between read as "All day". All-day multi-day events stay "All day" on every day. Single-day rows unchanged. Adds agenda_span_starts / agenda_span_ends (owes Weblate backfill). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../calendula/ui/agenda/AgendaScreen.kt | 26 +++++++------------ app/src/main/res/values/strings.xml | 3 +++ 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/de/jeanlucmakiola/calendula/ui/agenda/AgendaScreen.kt b/app/src/main/java/de/jeanlucmakiola/calendula/ui/agenda/AgendaScreen.kt index b512f9d..697daf5 100644 --- a/app/src/main/java/de/jeanlucmakiola/calendula/ui/agenda/AgendaScreen.kt +++ b/app/src/main/java/de/jeanlucmakiola/calendula/ui/agenda/AgendaScreen.kt @@ -562,11 +562,10 @@ private fun agendaDayLabel(date: LocalDate, today: LocalDate): String { /** * Time line under the title: "09:00 – 10:00 · Location", "All day", etc. * - * A multi-day event shows only the part relevant to [day], with a "→" marking - * that it carries past this day's boundary: its first day shows the start - * ("14:00 →"), its last day the end ("→ 10:00"), and any whole day in between - * reads as an all-day span arriving from and continuing into its neighbours - * ("→ All day →"). + * A multi-day event shows only the part relevant to [day], spelled out so each + * day reads on its own: its first day names the start ("Starts 14:00"), its last + * day the end ("Ends 10:00"), and any whole day in between reads as "All day". + * An all-day multi-day event is simply "All day" on every day it covers. */ @Composable private fun agendaTimeSummary(event: EventInstance, day: LocalDate): String { @@ -575,18 +574,13 @@ private fun agendaTimeSummary(event: EventInstance, day: LocalDate): String { val locale = currentLocale() val time = if (event.spansMultipleDays(zone)) { - val continuesBefore = day > event.spanFirstDay(zone) - val continuesAfter = day < event.spanLastDay(zone) - val core = when { + val isFirstDay = day <= event.spanFirstDay(zone) + val isLastDay = day >= event.spanLastDay(zone) + when { event.isAllDay -> allDayLabel - !continuesBefore -> formatTime(event.start, is24Hour, locale) // the first day - !continuesAfter -> formatTime(event.end, is24Hour, locale) // the last day - else -> allDayLabel // a full middle day - } - buildString { - if (continuesBefore) append("→ ") - append(core) - if (continuesAfter) append(" →") + isFirstDay -> stringResource(R.string.agenda_span_starts, formatTime(event.start, is24Hour, locale)) + isLastDay -> stringResource(R.string.agenda_span_ends, formatTime(event.end, is24Hour, locale)) + else -> allDayLabel // a full middle day } } else if (event.isAllDay) { allDayLabel diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 06f995d..5c22fb3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -257,6 +257,9 @@ Tomorrow You\'re all caught up No more events today + + Starts %1$s + Ends %1$s Search