Extract fetchDetailsForEvent and use coroutineDispatchers.io

This commit is contained in:
ganfra 2023-06-12 20:23:58 +02:00
parent afb3e33f84
commit 92adef5384
6 changed files with 26 additions and 21 deletions

View file

@ -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.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@ -45,7 +46,7 @@ class TimelineItemsFactory @Inject constructor(
private val timelineItemGrouper: TimelineItemGrouper, private val timelineItemGrouper: TimelineItemGrouper,
) { ) {
private val timelineItems = MutableStateFlow(emptyList<TimelineItem>().toImmutableList()) private val timelineItems = MutableStateFlow(persistentListOf<TimelineItem>())
private val timelineItemsCache = arrayListOf<TimelineItem?>() private val timelineItemsCache = arrayListOf<TimelineItem?>()
// Items from rust sdk, used for diffing // 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") Timber.v("Time to apply diff on new list of ${newTimelineItems.size} items: $timeToDiff ms")
} }
private suspend fun buildAndCacheItem( private fun buildAndCacheItem(
timelineItems: List<MatrixTimelineItem>, timelineItems: List<MatrixTimelineItem>,
index: Int index: Int
): TimelineItem? { ): TimelineItem? {

View file

@ -42,4 +42,6 @@ interface MatrixTimeline {
suspend fun editMessage(originalEventId: EventId, message: String): Result<Unit> suspend fun editMessage(originalEventId: EventId, message: String): Result<Unit>
suspend fun replyMessage(inReplyToEventId: EventId, message: String): Result<Unit> suspend fun replyMessage(inReplyToEventId: EventId, message: String): Result<Unit>
suspend fun fetchDetailsForEvent(eventId: EventId): Result<Unit>
} }

View file

@ -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.libraries.matrix.impl.timeline.RustMatrixTimeline
import io.element.android.services.toolbox.api.systemclock.SystemClock import io.element.android.services.toolbox.api.systemclock.SystemClock
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
@ -259,7 +258,7 @@ class RustMatrixRoom(
} }
} }
override suspend fun sendReaction(emoji: String, eventId: EventId): Result<Unit> = withContext(Dispatchers.IO) { override suspend fun sendReaction(emoji: String, eventId: EventId): Result<Unit> = withContext(coroutineDispatchers.io) {
runCatching { runCatching {
innerRoom.sendReaction(key = emoji, eventId = eventId.value) innerRoom.sendReaction(key = emoji, eventId = eventId.value)
} }
@ -267,28 +266,28 @@ class RustMatrixRoom(
@OptIn(ExperimentalUnsignedTypes::class) @OptIn(ExperimentalUnsignedTypes::class)
override suspend fun updateAvatar(mimeType: String, data: ByteArray): Result<Unit> = override suspend fun updateAvatar(mimeType: String, data: ByteArray): Result<Unit> =
withContext(Dispatchers.IO) { withContext(coroutineDispatchers.io) {
runCatching { runCatching {
innerRoom.uploadAvatar(mimeType, data.toUByteArray().toList()) innerRoom.uploadAvatar(mimeType, data.toUByteArray().toList())
} }
} }
override suspend fun removeAvatar(): Result<Unit> = override suspend fun removeAvatar(): Result<Unit> =
withContext(Dispatchers.IO) { withContext(coroutineDispatchers.io) {
runCatching { runCatching {
innerRoom.removeAvatar() innerRoom.removeAvatar()
} }
} }
override suspend fun setName(name: String): Result<Unit> = override suspend fun setName(name: String): Result<Unit> =
withContext(Dispatchers.IO) { withContext(coroutineDispatchers.io) {
runCatching { runCatching {
innerRoom.setName(name) innerRoom.setName(name)
} }
} }
override suspend fun setTopic(topic: String): Result<Unit> = override suspend fun setTopic(topic: String): Result<Unit> =
withContext(Dispatchers.IO) { withContext(coroutineDispatchers.io) {
runCatching { runCatching {
innerRoom.setTopic(topic) innerRoom.setTopic(topic)
} }

View file

@ -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 io.element.android.libraries.matrix.impl.timeline.item.virtual.VirtualTimelineItemMapper
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.matrix.rustcomponents.sdk.Room
import org.matrix.rustcomponents.sdk.TimelineItem import org.matrix.rustcomponents.sdk.TimelineItem
import timber.log.Timber
class MatrixTimelineItemMapper( class MatrixTimelineItemMapper(
private val room: Room, private val fetchDetailsForEvent: suspend (EventId) -> Result<Unit>,
private val coroutineScope: CoroutineScope, private val coroutineScope: CoroutineScope,
private val virtualTimelineItemMapper: VirtualTimelineItemMapper = VirtualTimelineItemMapper(), private val virtualTimelineItemMapper: VirtualTimelineItemMapper = VirtualTimelineItemMapper(),
private val eventTimelineItemMapper: EventTimelineItemMapper= EventTimelineItemMapper(), private val eventTimelineItemMapper: EventTimelineItemMapper = EventTimelineItemMapper(),
) { ) {
fun map(timelineItem: TimelineItem): MatrixTimelineItem = timelineItem.use { fun map(timelineItem: TimelineItem): MatrixTimelineItem = timelineItem.use {
@ -40,7 +38,7 @@ class MatrixTimelineItemMapper(
if (eventTimelineItem.hasNotLoadedInReplyTo() && eventTimelineItem.eventId != null) { if (eventTimelineItem.hasNotLoadedInReplyTo() && eventTimelineItem.eventId != null) {
fetchDetailsForEvent(eventTimelineItem.eventId!!) fetchEventDetails(eventTimelineItem.eventId!!)
} }
return MatrixTimelineItem.Event(eventTimelineItem) return MatrixTimelineItem.Event(eventTimelineItem)
@ -53,12 +51,7 @@ class MatrixTimelineItemMapper(
return MatrixTimelineItem.Other return MatrixTimelineItem.Other
} }
private fun fetchDetailsForEvent(eventId: EventId) = coroutineScope.launch { private fun fetchEventDetails(eventId: EventId) = coroutineScope.launch {
runCatching { fetchDetailsForEvent(eventId)
room.fetchDetailsForEvent(eventId.value)
}.onFailure {
Timber.e(it)
}
} }
} }

View file

@ -63,7 +63,7 @@ class RustMatrixTimeline(
) )
private val timelineItemFactory = MatrixTimelineItemMapper( private val timelineItemFactory = MatrixTimelineItemMapper(
room = innerRoom, fetchDetailsForEvent = this::fetchDetailsForEvent,
coroutineScope = coroutineScope, coroutineScope = coroutineScope,
virtualTimelineItemMapper = VirtualTimelineItemMapper(), virtualTimelineItemMapper = VirtualTimelineItemMapper(),
eventTimelineItemMapper = EventTimelineItemMapper( eventTimelineItemMapper = EventTimelineItemMapper(
@ -130,6 +130,12 @@ class RustMatrixTimeline(
return matrixRoom.replyMessage(inReplyToEventId, message) return matrixRoom.replyMessage(inReplyToEventId, message)
} }
override suspend fun fetchDetailsForEvent(eventId: EventId): Result<Unit> = withContext(coroutineDispatchers.io) {
runCatching {
innerRoom.fetchDetailsForEvent(eventId.value)
}
}
override suspend fun paginateBackwards(requestSize: Int, untilNumberOfItems: Int): Result<Unit> = withContext(coroutineDispatchers.io) { override suspend fun paginateBackwards(requestSize: Int, untilNumberOfItems: Int): Result<Unit> = withContext(coroutineDispatchers.io) {
runCatching { runCatching {
Timber.v("Start back paginating for room ${matrixRoom.roomId} ") Timber.v("Start back paginating for room ${matrixRoom.roomId} ")

View file

@ -82,4 +82,8 @@ class FakeMatrixTimeline(
override suspend fun replyMessage(inReplyToEventId: EventId, message: String): Result<Unit> { override suspend fun replyMessage(inReplyToEventId: EventId, message: String): Result<Unit> {
return Result.success(Unit) return Result.success(Unit)
} }
override suspend fun fetchDetailsForEvent(eventId: EventId): Result<Unit> {
return Result.success(Unit)
}
} }