Merge pull request #2041 from element-hq/feature/fga/fix_timeline_back_pagination_loop

Fix timeline back pagination loop in encrypted room.
This commit is contained in:
Benoit Marty 2023-12-21 15:42:23 +01:00 committed by GitHub
commit 7273abd42b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 84 additions and 123 deletions

View file

@ -80,7 +80,7 @@ class TimelineItemEventFactory @Inject constructor(
)
currentTimelineItem.event
return TimelineItem.Event(
id = currentTimelineItem.uniqueId.toString(),
id = currentTimelineItem.uniqueId,
eventId = currentTimelineItem.eventId,
transactionId = currentTimelineItem.transactionId,
senderId = currentSender,

View file

@ -31,13 +31,8 @@ class TimelineItemVirtualFactory @Inject constructor(
fun create(
virtualTimelineItem: MatrixTimelineItem.Virtual,
): TimelineItem.Virtual {
val id = if (virtualTimelineItem.virtual is VirtualTimelineItem.EncryptedHistoryBanner) {
"encrypted_history_banner"
} else {
virtualTimelineItem.uniqueId.toString()
}
return TimelineItem.Virtual(
id = id,
id = virtualTimelineItem.uniqueId,
model = virtualTimelineItem.computeModel()
)
}

View file

@ -60,6 +60,8 @@ import org.junit.Rule
import org.junit.Test
import java.util.Date
private const val FAKE_UNIQUE_ID = "FAKE_UNIQUE_ID"
class TimelinePresenterTest {
@get:Rule
@ -120,7 +122,7 @@ class TimelinePresenterTest {
fun `present - on scroll finished send read receipt if an event is before the index`() = runTest {
val timeline = FakeMatrixTimeline(
initialTimelineItems = listOf(
MatrixTimelineItem.Event(0, anEventTimelineItem())
MatrixTimelineItem.Event(FAKE_UNIQUE_ID, anEventTimelineItem())
)
)
val presenter = createTimelinePresenter(timeline)
@ -144,7 +146,7 @@ class TimelinePresenterTest {
fun `present - on scroll finished will not send read receipt if no event is before the index`() = runTest {
val timeline = FakeMatrixTimeline(
initialTimelineItems = listOf(
MatrixTimelineItem.Event(0, anEventTimelineItem())
MatrixTimelineItem.Event(FAKE_UNIQUE_ID, anEventTimelineItem())
)
)
val presenter = createTimelinePresenter(timeline)
@ -168,7 +170,7 @@ class TimelinePresenterTest {
fun `present - on scroll finished will not send read receipt only virtual events exist before the index`() = runTest {
val timeline = FakeMatrixTimeline(
initialTimelineItems = listOf(
MatrixTimelineItem.Virtual(0, VirtualTimelineItem.ReadMarker)
MatrixTimelineItem.Virtual(FAKE_UNIQUE_ID, VirtualTimelineItem.ReadMarker)
)
)
val presenter = createTimelinePresenter(timeline)
@ -199,13 +201,13 @@ class TimelinePresenterTest {
assertThat(initialState.newEventState).isEqualTo(NewEventState.None)
assertThat(initialState.timelineItems.size).isEqualTo(0)
timeline.updateTimelineItems {
listOf(MatrixTimelineItem.Event(0, anEventTimelineItem(content = aMessageContent())))
listOf(MatrixTimelineItem.Event("0", anEventTimelineItem(content = aMessageContent())))
}
consumeItemsUntilPredicate { it.timelineItems.size == 1 }
// Mimics sending a message, and assert newEventState is FromMe
timeline.updateTimelineItems { items ->
val event = anEventTimelineItem(content = aMessageContent(), isOwn = true)
items + listOf(MatrixTimelineItem.Event(1, event))
items + listOf(MatrixTimelineItem.Event("1", event))
}
consumeItemsUntilPredicate { it.timelineItems.size == 2 }
awaitLastSequentialItem().also { state ->
@ -214,7 +216,7 @@ class TimelinePresenterTest {
// Mimics receiving a message without clearing the previous FromMe
timeline.updateTimelineItems { items ->
val event = anEventTimelineItem(content = aMessageContent())
items + listOf(MatrixTimelineItem.Event(2, event))
items + listOf(MatrixTimelineItem.Event("2", event))
}
consumeItemsUntilPredicate { it.timelineItems.size == 3 }
@ -226,7 +228,7 @@ class TimelinePresenterTest {
// Mimics receiving a message and assert newEventState is FromOther
timeline.updateTimelineItems { items ->
val event = anEventTimelineItem(content = aMessageContent())
items + listOf(MatrixTimelineItem.Event(3, event))
items + listOf(MatrixTimelineItem.Event("3", event))
}
consumeItemsUntilPredicate { it.timelineItems.size == 4 }
awaitLastSequentialItem().also { state ->
@ -267,7 +269,7 @@ class TimelinePresenterTest {
),
)
timeline.updateTimelineItems {
listOf(MatrixTimelineItem.Event(0, anEventTimelineItem(reactions = oneReaction)))
listOf(MatrixTimelineItem.Event(FAKE_UNIQUE_ID, anEventTimelineItem(reactions = oneReaction)))
}
skipItems(1)
val item = awaitItem().timelineItems.first()

View file

@ -80,7 +80,7 @@ fun TestScope.aDefaultRedactedVoiceMessageManager(
fun aRedactedMatrixTimeline(eventId: EventId) = listOf<MatrixTimelineItem>(
MatrixTimelineItem.Event(
uniqueId = 0,
uniqueId = "0",
event = EventTimelineItem(
eventId = eventId,
transactionId = null,