Use reverse ordering for FilterEmptyDayPostProcessor (#6927)

It turns out the previous ordering was right: timestamp ordering is ascending, not descending
This commit is contained in:
Jorge Martin Espinosa
2026-06-01 17:25:33 +02:00
committed by GitHub
parent abb1b2ad50
commit 1df94a563c
2 changed files with 19 additions and 17 deletions
@@ -18,10 +18,10 @@ class FilterEmptyDayPostProcessor {
* Filters out day separators from [items] for days that don't contain any events. * Filters out day separators from [items] for days that don't contain any events.
*/ */
fun process(items: List<MatrixTimelineItem>): List<MatrixTimelineItem> = buildList { fun process(items: List<MatrixTimelineItem>): List<MatrixTimelineItem> = buildList {
// The timeline is ordered by descending timestamp, so events that happened during a day appear before the day separator for that day. // The timeline is ordered by ascending timestamp, so events that happened during a day appear after the day separator for that day.
// We can use this to determine if a day separator should be kept or not. // We can use this to determine if a day separator should be kept or not by traversing the list in reverse.
var hasEvent = false var hasEvent = false
for (item in items) { for (item in items.asReversed()) {
if (item is MatrixTimelineItem.Event) { if (item is MatrixTimelineItem.Event) {
hasEvent = true hasEvent = true
add(item) add(item)
@@ -35,4 +35,6 @@ class FilterEmptyDayPostProcessor {
} }
} }
} }
// Then reverse the result to restore the original order, minus the empty day separators.
.asReversed()
} }
@@ -32,36 +32,36 @@ class FilterEmptyDayPostProcessorTest {
@Test @Test
fun `filterEmptyDaySeparators keeps day separator with events after it`() { fun `filterEmptyDaySeparators keeps day separator with events after it`() {
val items = listOf( val items = listOf(
anEvent,
aDaySeparator(TODAY), aDaySeparator(TODAY),
anEvent,
) )
val result = FilterEmptyDayPostProcessor().process(items) val result = FilterEmptyDayPostProcessor().process(items)
assertThat(result).hasSize(2) assertThat(result).hasSize(2)
assertThat(result[0]).isEqualTo(anEvent) assertThat(result[0]).isEqualTo(aDaySeparator(TODAY))
assertThat(result[1]).isEqualTo(aDaySeparator(TODAY)) assertThat(result[1]).isEqualTo(anEvent)
} }
@Test @Test
fun `filterEmptyDaySeparators removes day separator with no events after it`() { fun `filterEmptyDaySeparators removes day separator with no events after it`() {
val items = listOf( val items = listOf(
aDaySeparator(TODAY),
aDaySeparator(YESTERDAY), aDaySeparator(YESTERDAY),
aDaySeparator(TODAY),
) )
val result = FilterEmptyDayPostProcessor().process(items) val result = FilterEmptyDayPostProcessor().process(items)
assertThat(result).isEmpty() assertThat(result).isEmpty()
} }
@Test @Test
fun `filterEmptyDaySeparators removes first day separator and keeps second when only second has events`() { fun `filterEmptyDaySeparators removes second day separator and keeps first when only first has events`() {
val items = listOf( val items = listOf(
aDaySeparator(TODAY),
anEvent,
aDaySeparator(YESTERDAY), aDaySeparator(YESTERDAY),
anEvent,
aDaySeparator(TODAY),
) )
val result = FilterEmptyDayPostProcessor().process(items) val result = FilterEmptyDayPostProcessor().process(items)
assertThat(result).hasSize(2) assertThat(result).hasSize(2)
assertThat(result[0]).isEqualTo(anEvent) assertThat(result[0]).isEqualTo(aDaySeparator(YESTERDAY))
assertThat(result[1]).isEqualTo(aDaySeparator(YESTERDAY)) assertThat(result[1]).isEqualTo(anEvent)
} }
@Test @Test
@@ -78,15 +78,15 @@ class FilterEmptyDayPostProcessorTest {
@Test @Test
fun `filterEmptyDaySeparators keeps all items when no day separators`() { fun `filterEmptyDaySeparators keeps all items when no day separators`() {
val items = listOf( val items = listOf(
anEvent,
anEvent.copy(uniqueId = UniqueId("event2")), anEvent.copy(uniqueId = UniqueId("event2")),
anEvent,
) )
val result = FilterEmptyDayPostProcessor().process(items) val result = FilterEmptyDayPostProcessor().process(items)
assertThat(result).hasSize(2) assertThat(result).hasSize(2)
} }
@Test @Test
fun `filterEmptyDaySeparators removes day separator followed by non-event virtual item`() { fun `filterEmptyDaySeparators removes day separator preceded by non-event virtual item`() {
val readMarker = MatrixTimelineItem.Virtual( val readMarker = MatrixTimelineItem.Virtual(
uniqueId = UniqueId("readMarker"), uniqueId = UniqueId("readMarker"),
virtual = VirtualTimelineItem.ReadMarker virtual = VirtualTimelineItem.ReadMarker
@@ -107,12 +107,12 @@ class FilterEmptyDayPostProcessorTest {
virtual = VirtualTimelineItem.ReadMarker virtual = VirtualTimelineItem.ReadMarker
) )
val items = listOf( val items = listOf(
anEvent,
readMarker,
aDaySeparator(TODAY), aDaySeparator(TODAY),
readMarker,
anEvent,
) )
val result = FilterEmptyDayPostProcessor().process(items) val result = FilterEmptyDayPostProcessor().process(items)
assertThat(result).hasSize(3) assertThat(result).hasSize(3)
assertThat(result[2]).isEqualTo(aDaySeparator(TODAY)) assertThat(result[0]).isEqualTo(aDaySeparator(TODAY))
} }
} }