diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouper.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouper.kt index bee2b055f3..e9e9af6445 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouper.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouper.kt @@ -16,6 +16,7 @@ package io.element.android.features.messages.impl.timeline.groups +import androidx.annotation.VisibleForTesting import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.SingleIn @@ -86,8 +87,11 @@ private fun MutableMap.getOrPutGroupId(timelineItems: List - this[itemIdentifier] = groupId + val timelineItem = timelineItems.first() + return computeGroupIdWith(timelineItem).also { groupId -> + this[timelineItem.identifier()] = groupId } } + +@VisibleForTesting +internal fun computeGroupIdWith(timelineItem: TimelineItem): String = "${timelineItem.identifier()}_group" diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/timeline/groups/TimelineItemGrouperTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/timeline/groups/TimelineItemGrouperTest.kt index 71836e9f5e..d5ce31f87a 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/timeline/groups/TimelineItemGrouperTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/timeline/groups/TimelineItemGrouperTest.kt @@ -20,13 +20,13 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.messages.fixtures.aMessageEvent import io.element.android.features.messages.impl.timeline.aTimelineItemReactions import io.element.android.features.messages.impl.timeline.groups.TimelineItemGrouper +import io.element.android.features.messages.impl.timeline.groups.computeGroupIdWith import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStateEventContent import io.element.android.features.messages.impl.timeline.model.virtual.aTimelineItemDaySeparatorModel import io.element.android.libraries.designsystem.components.avatar.anAvatarData import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.matrix.test.AN_EVENT_ID -import io.element.android.libraries.matrix.test.AN_EVENT_ID_2 import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.room.aTimelineItemDebugInfo import kotlinx.collections.immutable.toImmutableList @@ -36,7 +36,7 @@ class TimelineItemGrouperTest { private val sut = TimelineItemGrouper() private val aGroupableItem = TimelineItem.Event( - id = AN_EVENT_ID.value, + id = "0", senderId = A_USER_ID, senderAvatar = anAvatarData(), senderDisplayName = "", @@ -76,16 +76,17 @@ class TimelineItemGrouperTest { fun `test groupables and ensure reordering`() { val result = sut.group( listOf( - aGroupableItem.copy(id = AN_EVENT_ID_2.value), - aGroupableItem, + aGroupableItem.copy(id = "1"), + aGroupableItem.copy(id = "0"), ), ) assertThat(result).isEqualTo( listOf( TimelineItem.GroupedEvents( + computeGroupIdWith(aGroupableItem), events = listOf( - aGroupableItem, - aGroupableItem.copy(id = AN_EVENT_ID_2.value), + aGroupableItem.copy("0"), + aGroupableItem.copy(id = "1"), ).toImmutableList() ), ) @@ -128,6 +129,7 @@ class TimelineItemGrouperTest { assertThat(result).isEqualTo( listOf( TimelineItem.GroupedEvents( + computeGroupIdWith(aGroupableItem), events = listOf( aGroupableItem, aGroupableItem, @@ -135,6 +137,7 @@ class TimelineItemGrouperTest { ), aNonGroupableItem, TimelineItem.GroupedEvents( + computeGroupIdWith(aGroupableItem), events = listOf( aGroupableItem, aGroupableItem, @@ -144,4 +147,20 @@ class TimelineItemGrouperTest { ) ) } + + @Test + fun `when calling multiple time the method group over a growing list of groupable items, then groupId is stable`() { + // When + val groupableItems = mutableListOf( + aGroupableItem.copy(id = "1"), + aGroupableItem.copy(id = "2") + ) + val expectedGroupId = sut.group(groupableItems).first().identifier() + groupableItems.add(0, aGroupableItem.copy("3")) + groupableItems.add(2, aGroupableItem.copy("4")) + groupableItems.add(aGroupableItem.copy("5")) + val actualGroupId = sut.group(groupableItems).first().identifier() + // Then + assertThat(actualGroupId).isEqualTo(expectedGroupId) + } }