diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt index f4e771a32d..c08c8d65a3 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt @@ -26,6 +26,7 @@ import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.flow.MutableStateFlow @@ -45,7 +46,7 @@ class TimelineItemsFactory @Inject constructor( private val timelineItemGrouper: TimelineItemGrouper, ) { - private val timelineItems = MutableStateFlow(emptyList().toImmutableList()) + private val timelineItems = MutableStateFlow(persistentListOf()) private val timelineItemsCache = arrayListOf() // Items from rust sdk, used for diffing @@ -95,7 +96,7 @@ class TimelineItemsFactory @Inject constructor( Timber.v("Time to apply diff on new list of ${newTimelineItems.size} items: $timeToDiff ms") } - private suspend fun buildAndCacheItem( + private fun buildAndCacheItem( timelineItems: List, index: Int ): TimelineItem? { diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/MatrixTimeline.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/MatrixTimeline.kt index 091691b0ec..4eaf04d775 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/MatrixTimeline.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/MatrixTimeline.kt @@ -42,4 +42,6 @@ interface MatrixTimeline { suspend fun editMessage(originalEventId: EventId, message: String): Result suspend fun replyMessage(inReplyToEventId: EventId, message: String): Result + + suspend fun fetchDetailsForEvent(eventId: EventId): Result } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index 63d54892f7..177076ed28 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -34,7 +34,6 @@ import io.element.android.libraries.matrix.impl.media.map import io.element.android.libraries.matrix.impl.timeline.RustMatrixTimeline import io.element.android.services.toolbox.api.systemclock.SystemClock import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -259,7 +258,7 @@ class RustMatrixRoom( } } - override suspend fun sendReaction(emoji: String, eventId: EventId): Result = withContext(Dispatchers.IO) { + override suspend fun sendReaction(emoji: String, eventId: EventId): Result = withContext(coroutineDispatchers.io) { runCatching { innerRoom.sendReaction(key = emoji, eventId = eventId.value) } @@ -267,28 +266,28 @@ class RustMatrixRoom( @OptIn(ExperimentalUnsignedTypes::class) override suspend fun updateAvatar(mimeType: String, data: ByteArray): Result = - withContext(Dispatchers.IO) { + withContext(coroutineDispatchers.io) { runCatching { innerRoom.uploadAvatar(mimeType, data.toUByteArray().toList()) } } override suspend fun removeAvatar(): Result = - withContext(Dispatchers.IO) { + withContext(coroutineDispatchers.io) { runCatching { innerRoom.removeAvatar() } } override suspend fun setName(name: String): Result = - withContext(Dispatchers.IO) { + withContext(coroutineDispatchers.io) { runCatching { innerRoom.setName(name) } } override suspend fun setTopic(topic: String): Result = - withContext(Dispatchers.IO) { + withContext(coroutineDispatchers.io) { runCatching { innerRoom.setTopic(topic) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineItemMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineItemMapper.kt index c90e672f28..f7cf728691 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineItemMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineItemMapper.kt @@ -22,15 +22,13 @@ import io.element.android.libraries.matrix.impl.timeline.item.event.EventTimelin import io.element.android.libraries.matrix.impl.timeline.item.virtual.VirtualTimelineItemMapper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import org.matrix.rustcomponents.sdk.Room import org.matrix.rustcomponents.sdk.TimelineItem -import timber.log.Timber class MatrixTimelineItemMapper( - private val room: Room, + private val fetchDetailsForEvent: suspend (EventId) -> Result, private val coroutineScope: CoroutineScope, private val virtualTimelineItemMapper: VirtualTimelineItemMapper = VirtualTimelineItemMapper(), - private val eventTimelineItemMapper: EventTimelineItemMapper= EventTimelineItemMapper(), + private val eventTimelineItemMapper: EventTimelineItemMapper = EventTimelineItemMapper(), ) { fun map(timelineItem: TimelineItem): MatrixTimelineItem = timelineItem.use { @@ -40,7 +38,7 @@ class MatrixTimelineItemMapper( if (eventTimelineItem.hasNotLoadedInReplyTo() && eventTimelineItem.eventId != null) { - fetchDetailsForEvent(eventTimelineItem.eventId!!) + fetchEventDetails(eventTimelineItem.eventId!!) } return MatrixTimelineItem.Event(eventTimelineItem) @@ -53,12 +51,7 @@ class MatrixTimelineItemMapper( return MatrixTimelineItem.Other } - private fun fetchDetailsForEvent(eventId: EventId) = coroutineScope.launch { - runCatching { - room.fetchDetailsForEvent(eventId.value) - }.onFailure { - Timber.e(it) - } + private fun fetchEventDetails(eventId: EventId) = coroutineScope.launch { + fetchDetailsForEvent(eventId) } - } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustMatrixTimeline.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustMatrixTimeline.kt index 79b92e3c29..4b07d59970 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustMatrixTimeline.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustMatrixTimeline.kt @@ -63,7 +63,7 @@ class RustMatrixTimeline( ) private val timelineItemFactory = MatrixTimelineItemMapper( - room = innerRoom, + fetchDetailsForEvent = this::fetchDetailsForEvent, coroutineScope = coroutineScope, virtualTimelineItemMapper = VirtualTimelineItemMapper(), eventTimelineItemMapper = EventTimelineItemMapper( @@ -130,6 +130,12 @@ class RustMatrixTimeline( return matrixRoom.replyMessage(inReplyToEventId, message) } + override suspend fun fetchDetailsForEvent(eventId: EventId): Result = withContext(coroutineDispatchers.io) { + runCatching { + innerRoom.fetchDetailsForEvent(eventId.value) + } + } + override suspend fun paginateBackwards(requestSize: Int, untilNumberOfItems: Int): Result = withContext(coroutineDispatchers.io) { runCatching { Timber.v("Start back paginating for room ${matrixRoom.roomId} ") diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeMatrixTimeline.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeMatrixTimeline.kt index bb5c0157b6..696a778df2 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeMatrixTimeline.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeMatrixTimeline.kt @@ -82,4 +82,8 @@ class FakeMatrixTimeline( override suspend fun replyMessage(inReplyToEventId: EventId, message: String): Result { return Result.success(Unit) } + + override suspend fun fetchDetailsForEvent(eventId: EventId): Result { + return Result.success(Unit) + } }