Skip to content

Commit 3a2f8ce

Browse files
committed
feat: Add setting to display ISO date and time in message list.
1 parent c5461a7 commit 3a2f8ce

File tree

6 files changed

+47
-9
lines changed

6 files changed

+47
-9
lines changed

core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/display/visualSettings/message/list/MessageListDateTimeFormat.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,11 @@ enum class MessageListDateTimeFormat {
2121
* - Examples: "1/23/2026 1:23PM" "23/1/2026 13:23"
2222
*/
2323
Full,
24+
25+
/**
26+
* ISO 8601 option, which is often requested by power users who prefer a
27+
* deterministic, unambiguous format over the system locale defaults.
28+
* - Examples: "2026-01-23 13:23"
29+
*/
30+
ISO,
2431
}

legacy/ui/legacy/src/main/java/com/fsck/k9/ui/helper/RelativeDateTimeFormatter.kt

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,25 @@ constructor(
3131
@OptIn(ExperimentalTime::class)
3232
val now = clock.now().toCalendar()
3333
val date = timestamp.toCalendar()
34-
val format = if (dateTimeFormat == MessageListDateTimeFormat.Full) {
35-
FORMAT_SHOW_DATE or FORMAT_SHOW_YEAR or FORMAT_NUMERIC_DATE or FORMAT_SHOW_TIME
36-
} else {
37-
when {
38-
date.isToday() -> FORMAT_SHOW_TIME
39-
date.isWithinPastSevenDaysOf(now) -> FORMAT_SHOW_WEEKDAY or FORMAT_ABBREV_WEEKDAY
40-
date.isSameYearAs(now) -> FORMAT_SHOW_DATE or FORMAT_ABBREV_MONTH
41-
else -> FORMAT_SHOW_DATE or FORMAT_SHOW_YEAR or FORMAT_NUMERIC_DATE
34+
return when (dateTimeFormat) {
35+
MessageListDateTimeFormat.Contextual -> {
36+
val flags = when {
37+
date.isToday() -> FORMAT_SHOW_TIME
38+
date.isWithinPastSevenDaysOf(now) -> FORMAT_SHOW_WEEKDAY or FORMAT_ABBREV_WEEKDAY
39+
date.isSameYearAs(now) -> FORMAT_SHOW_DATE or FORMAT_ABBREV_MONTH
40+
else -> FORMAT_SHOW_DATE or FORMAT_SHOW_YEAR or FORMAT_NUMERIC_DATE
41+
}
42+
DateUtils.formatDateRange(context, timestamp, timestamp, flags)
43+
}
44+
MessageListDateTimeFormat.Full -> {
45+
val flags = FORMAT_SHOW_TIME or FORMAT_SHOW_DATE or FORMAT_SHOW_YEAR or FORMAT_NUMERIC_DATE
46+
DateUtils.formatDateRange(context, timestamp, timestamp, flags)
47+
}
48+
MessageListDateTimeFormat.ISO -> {
49+
val sdf = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm", java.util.Locale.US)
50+
sdf.format(java.util.Date(timestamp))
4251
}
4352
}
44-
return DateUtils.formatDateRange(context, timestamp, timestamp, format)
4553
}
4654
}
4755

legacy/ui/legacy/src/main/res/values/arrays.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,6 @@
4747
<string-array name="message_list_date_time_format_values">
4848
<item>Contextual</item>
4949
<item>Full</item>
50+
<item>ISO</item>
5051
</string-array>
5152
</resources>

legacy/ui/legacy/src/main/res/values/arrays_general_settings_strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@
175175
<string-array name="message_list_date_time_format_entries">
176176
<item>@string/general_settings_message_list_date_time_format_contextual</item>
177177
<item>@string/general_settings_message_list_date_time_format_full</item>
178+
<item>@string/general_settings_message_list_date_time_format_iso</item>
178179
</string-array>
179180

180181
<string-array name="post_remove_navigation_entries">

legacy/ui/legacy/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,8 @@
320320
<string name="general_settings_message_list_date_time_format_contextual">Contextual</string>
321321
<!-- Message List Date/Time format setting option: full -->
322322
<string name="general_settings_message_list_date_time_format_full">Full</string>
323+
<!-- Message List Date/Time format setting option: ISO -->
324+
<string name="general_settings_message_list_date_time_format_iso">ISO</string>
323325

324326
<string name="global_settings_privacy_hide_useragent">Hide mail client</string>
325327
<string name="global_settings_privacy_hide_useragent_detail">Remove User-Agent from mail headers</string>

legacy/ui/legacy/src/test/java/com/fsck/k9/ui/helper/RelativeDateTimeFormatterTest.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,25 @@ class RelativeDateTimeFormatterTest : RobolectricTest() {
159159
assertThat(displayDate).isEqualTo("12/31/2019, 11:59 PM")
160160
}
161161

162+
@Test
163+
fun oneMinuteAgo_shouldReturnISODate() {
164+
setClockTo("2020-05-17T15:42")
165+
val date = "2020-05-17T15:41".toEpochMillis()
166+
167+
val displayDate = dateTimeFormatter.formatDate(date, MessageListDateTimeFormat.ISO)
168+
169+
assertThat(displayDate).isEqualTo("2020-05-17 15:41")
170+
}
171+
172+
@Test
173+
fun endOfLastYear_shouldReturnISODate() {
174+
setClockTo("2020-05-17T15:42")
175+
val date = LocalDateTime.parse("2019-12-31T23:59").toEpochMillis()
176+
177+
val displayDate = dateTimeFormatter.formatDate(date, MessageListDateTimeFormat.ISO)
178+
179+
assertThat(displayDate).isEqualTo("2019-12-31 23:59")
180+
}
162181
private fun setClockTo(time: String) {
163182
val dateTime = LocalDateTime.parse(time)
164183
val timeInMillis = dateTime.toEpochMillis()

0 commit comments

Comments
 (0)