Merge pull request #584 from vector-im/feature/fga/fix_work_on_main_thread
Extract fetchDetailsForEvent and use coroutineDispatchers.io
This commit is contained in:
commit
1734b3ec60
6 changed files with 26 additions and 21 deletions
|
|
@ -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? {
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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} ")
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue