Skip to content

Commit

Permalink
feat: improve formatting of day of week ranges
Browse files Browse the repository at this point in the history
  • Loading branch information
JanMalch committed Mar 16, 2024
1 parent 9c0f742 commit 9c04b65
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.github.janmalch.woroboro.ui.reminder

import androidx.annotation.VisibleForTesting
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
Expand All @@ -26,6 +27,7 @@ import androidx.compose.ui.unit.dp
import io.github.janmalch.woroboro.R
import io.github.janmalch.woroboro.models.Reminder
import kotlinx.collections.immutable.ImmutableList
import java.time.DayOfWeek
import java.time.format.DateTimeFormatter
import java.time.format.TextStyle
import java.util.Locale
Expand Down Expand Up @@ -78,13 +80,7 @@ fun ReminderList(
headlineContent = { Text(reminder.name) },
supportingContent = {
Text(text = buildString {
// TODO: be smart and join ranges
val weekdays = reminder.weekdays.joinToString {
it.getDisplayName(
TextStyle.SHORT,
Locale.getDefault()
)
}
val weekdays = reminder.weekdays.joinRangesToString()
append(weekdays)
append(" Β· ")
append(
Expand All @@ -101,3 +97,31 @@ fun ReminderList(
}
}
}

@VisibleForTesting
fun Set<DayOfWeek>.joinRangesToString(locale: Locale = Locale.getDefault()): String {
if (isEmpty()) return ""
if (size == 1) return first().getDisplayName(TextStyle.SHORT, locale)

val sorted = sortedBy { it.value }
val ranges = mutableListOf(mutableListOf(sorted.first()))
for (next in sorted.drop(1)) {
val adjacent = next.value == (ranges.last().last().value + 1)
if (adjacent) {
ranges.last().add(next)
} else {
ranges.add(mutableListOf(next))
}
}
if (ranges.last().size == 1 && sorted.last() != ranges.last().last()) {
ranges.last().add(sorted.last())
}
return ranges.joinToString {
if (it.size == 1) {
it.first().getDisplayName(TextStyle.SHORT, locale)
} else {
it.first().getDisplayName(TextStyle.SHORT, locale) + " – " + it.last()
.getDisplayName(TextStyle.SHORT, locale)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package io.github.janmalch.woroboro.ui.reminder

import org.junit.Assert.assertEquals
import org.junit.Test
import java.time.DayOfWeek
import java.util.Locale

class ReminderListTest {

private val locale = Locale.GERMAN

@Test
fun `joinRangesToString should work for a single day`() {
assertEquals(
"Mo.",
setOf(DayOfWeek.MONDAY).joinRangesToString(locale)
)
}

@Test
fun `joinRangesToString should work for an entire week`() {
assertEquals(
"Mo. – So.",
DayOfWeek.entries.toSet().joinRangesToString(locale)
)
}

@Test
fun `joinRangesToString should work for every other day`() {
assertEquals(
"Mo., Mi., Fr., So.",
setOf(
DayOfWeek.MONDAY,
DayOfWeek.WEDNESDAY,
DayOfWeek.FRIDAY,
DayOfWeek.SUNDAY
).joinRangesToString(locale)
)
}

@Test
fun `joinRangesToString should work for a single range`() {
assertEquals(
"Mo. – Fr.",
setOf(
DayOfWeek.MONDAY,
DayOfWeek.TUESDAY,
DayOfWeek.WEDNESDAY,
DayOfWeek.THURSDAY,
DayOfWeek.FRIDAY
).joinRangesToString(locale)
)
}

@Test
fun `joinRangesToString should work for two ranges`() {
assertEquals(
"Mo. – Mi., Fr. – So.",
setOf(
DayOfWeek.MONDAY,
DayOfWeek.TUESDAY,
DayOfWeek.WEDNESDAY,
DayOfWeek.FRIDAY,
DayOfWeek.SATURDAY,
DayOfWeek.SUNDAY
).joinRangesToString(locale)
)
}

@Test
fun `joinRangesToString should work for range and single Sunday`() {
assertEquals(
"Mo. – Mi., So.",
setOf(
DayOfWeek.MONDAY,
DayOfWeek.TUESDAY,
DayOfWeek.WEDNESDAY,
DayOfWeek.SUNDAY
).joinRangesToString(locale)
)
}

@Test
fun `joinRangesToString should work for range and single Saturday`() {
assertEquals(
"Mo. – Mi., Sa.",
setOf(
DayOfWeek.MONDAY,
DayOfWeek.TUESDAY,
DayOfWeek.WEDNESDAY,
DayOfWeek.SATURDAY
).joinRangesToString(locale)
)
}
}

0 comments on commit 9c04b65

Please sign in to comment.