misc : use new_latest_event api (+ some renaming)

This commit is contained in:
ganfra 2025-11-17 20:53:55 +01:00
parent ec6f615a68
commit b04524e566
42 changed files with 352 additions and 290 deletions

View file

@ -1,28 +0,0 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
* Copyright 2023-2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.matrix.impl.room.message
import io.element.android.libraries.matrix.api.room.message.RoomMessage
import io.element.android.libraries.matrix.impl.timeline.item.event.EventTimelineItemMapper
import org.matrix.rustcomponents.sdk.EventTimelineItem as RustEventTimelineItem
class RoomMessageFactory(
private val eventTimelineItemMapper: EventTimelineItemMapper = EventTimelineItemMapper(),
) {
fun create(eventTimelineItem: RustEventTimelineItem?): RoomMessage? {
eventTimelineItem ?: return null
val mappedTimelineItem = eventTimelineItemMapper.map(eventTimelineItem)
return RoomMessage(
eventId = mappedTimelineItem.eventId ?: return null,
event = mappedTimelineItem,
sender = mappedTimelineItem.sender,
originServerTs = mappedTimelineItem.timestamp,
)
}
}

View file

@ -40,7 +40,7 @@ internal class RoomListFactory(
private val sessionCoroutineScope: CoroutineScope,
private val analyticsService: AnalyticsService,
) {
private val roomSummaryDetailsFactory: RoomSummaryFactory = RoomSummaryFactory()
private val roomSummaryFactory: RoomSummaryFactory = RoomSummaryFactory()
/**
* Creates a room list that can be used to load more rooms and filter them dynamically.
@ -55,7 +55,7 @@ internal class RoomListFactory(
val loadingStateFlow: MutableStateFlow<RoomList.LoadingState> = MutableStateFlow(RoomList.LoadingState.NotLoaded)
val filteredSummariesFlow = MutableSharedFlow<List<RoomSummary>>(replay = 1, extraBufferCapacity = 1)
val summariesFlow = MutableSharedFlow<List<RoomSummary>>(replay = 1, extraBufferCapacity = 1)
val processor = RoomSummaryListProcessor(summariesFlow, innerRoomListService, coroutineContext, roomSummaryDetailsFactory)
val processor = RoomSummaryListProcessor(summariesFlow, innerRoomListService, coroutineContext, roomSummaryFactory)
// Makes sure we don't miss any events
val dynamicEvents = MutableSharedFlow<RoomListDynamicEvents>(replay = 100)
val currentFilter = MutableStateFlow(initialFilter)

View file

@ -8,24 +8,44 @@
package io.element.android.libraries.matrix.impl.roomlist
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.roomlist.LatestEventValue
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
import io.element.android.libraries.matrix.impl.room.RoomInfoMapper
import io.element.android.libraries.matrix.impl.room.message.RoomMessageFactory
import io.element.android.libraries.matrix.impl.timeline.item.event.TimelineEventContentMapper
import io.element.android.libraries.matrix.impl.timeline.item.event.map
import org.matrix.rustcomponents.sdk.Room
import org.matrix.rustcomponents.sdk.use
import org.matrix.rustcomponents.sdk.LatestEventValue as RustLatestEventValue
class RoomSummaryFactory(
private val roomMessageFactory: RoomMessageFactory = RoomMessageFactory(),
private val contentMapper: TimelineEventContentMapper = TimelineEventContentMapper(),
private val roomInfoMapper: RoomInfoMapper = RoomInfoMapper(),
) {
suspend fun create(room: Room): RoomSummary {
val roomInfo = room.roomInfo().let(roomInfoMapper::map)
val latestRoomMessage = room.latestEvent().use { event ->
roomMessageFactory.create(event)
val latestEvent = room.newLatestEvent().use { event ->
when (event) {
is RustLatestEventValue.None -> LatestEventValue.None
is RustLatestEventValue.Local -> LatestEventValue.Local(
timestamp = event.timestamp.toLong(),
content = contentMapper.map(event.content),
isSending = event.isSending,
senderId = UserId(event.sender),
senderProfile = event.profile.map(),
)
is RustLatestEventValue.Remote -> LatestEventValue.Remote(
timestamp = event.timestamp.toLong(),
content = contentMapper.map(event.content),
senderId = UserId(event.sender),
senderProfile = event.profile.map(),
isOwn = event.isOwn,
)
}
}
return RoomSummary(
info = roomInfo,
lastMessage = latestRoomMessage,
latestEvent = latestEvent,
)
}
}

View file

@ -24,7 +24,7 @@ class RoomSummaryListProcessor(
private val roomSummaries: MutableSharedFlow<List<RoomSummary>>,
private val roomListService: RoomListServiceInterface,
private val coroutineContext: CoroutineContext,
private val roomSummaryDetailsFactory: RoomSummaryFactory = RoomSummaryFactory(),
private val roomSummaryFactory: RoomSummaryFactory,
) {
private val mutex = Mutex()
@ -103,7 +103,7 @@ class RoomSummaryListProcessor(
}
private suspend fun buildSummaryForRoomListEntry(entry: Room): RoomSummary {
return entry.use { roomSummaryDetailsFactory.create(room = it) }
return entry.use { roomSummaryFactory.create(room = it) }
}
private suspend fun buildRoomSummaryForIdentifier(identifier: String): RoomSummary? {

View file

@ -17,7 +17,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.EventReaction
import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileDetails
import io.element.android.libraries.matrix.api.timeline.item.event.ReactionSender
import io.element.android.libraries.matrix.api.timeline.item.event.Receipt
import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemEventOrigin
@ -64,12 +64,12 @@ class EventTimelineItemMapper(
}
}
fun RustProfileDetails.map(): ProfileTimelineDetails {
fun RustProfileDetails.map(): ProfileDetails {
return when (this) {
RustProfileDetails.Pending -> ProfileTimelineDetails.Pending
RustProfileDetails.Unavailable -> ProfileTimelineDetails.Unavailable
is RustProfileDetails.Error -> ProfileTimelineDetails.Error(message)
is RustProfileDetails.Ready -> ProfileTimelineDetails.Ready(
RustProfileDetails.Pending -> ProfileDetails.Pending
RustProfileDetails.Unavailable -> ProfileDetails.Unavailable
is RustProfileDetails.Error -> ProfileDetails.Error(message)
is RustProfileDetails.Ready -> ProfileDetails.Ready(
displayName = displayName,
displayNameAmbiguous = displayNameAmbiguous,
avatarUrl = avatarUrl

View file

@ -192,6 +192,6 @@ class RoomSummaryListProcessorTest {
summaries,
FakeFfiRoomListService(),
coroutineContext = StandardTestDispatcher(testScheduler),
roomSummaryDetailsFactory = RoomSummaryFactory(),
roomSummaryFactory = RoomSummaryFactory(),
)
}