Browse Source

Update rust sdk to 0.1.31: new uniqueId on timeline

pull/856/head
ganfra 1 year ago
parent
commit
beb10cbfc4
  1. 5
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt
  2. 2
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt
  3. 3
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/virtual/TimelineItemVirtualFactory.kt
  4. 12
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt
  5. 5
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/MatrixTimelineItem.kt
  6. 1
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt
  7. 2
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSummaryDetailsFactory.kt
  8. 12
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSummaryListProcessor.kt
  9. 7
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineItemMapper.kt
  10. 5
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt

5
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt

@ -36,6 +36,7 @@ import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf 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 java.util.UUID
import kotlin.random.Random import kotlin.random.Random
fun aTimelineState(timelineItems: ImmutableList<TimelineItem> = persistentListOf()) = TimelineState( fun aTimelineState(timelineItems: ImmutableList<TimelineItem> = persistentListOf()) = TimelineState(
@ -96,7 +97,7 @@ internal fun aTimelineItemList(content: TimelineItemEventContent): ImmutableList
} }
fun aTimelineItemDaySeparator(): TimelineItem.Virtual { fun aTimelineItemDaySeparator(): TimelineItem.Virtual {
return TimelineItem.Virtual("virtual_day", aTimelineItemDaySeparatorModel("Today")) return TimelineItem.Virtual(UUID.randomUUID().mostSignificantBits, aTimelineItemDaySeparatorModel("Today"))
} }
internal fun aTimelineItemEvent( internal fun aTimelineItemEvent(
@ -111,7 +112,7 @@ internal fun aTimelineItemEvent(
timelineItemReactions: TimelineItemReactions = aTimelineItemReactions(), timelineItemReactions: TimelineItemReactions = aTimelineItemReactions(),
): TimelineItem.Event { ): TimelineItem.Event {
return TimelineItem.Event( return TimelineItem.Event(
id = eventId.value, id = UUID.randomUUID().mostSignificantBits,
eventId = eventId, eventId = eventId,
transactionId = transactionId, transactionId = transactionId,
senderId = UserId("@senderId:domain"), senderId = UserId("@senderId:domain"),

2
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt

@ -106,7 +106,7 @@ class TimelineItemsFactory @Inject constructor(
val timelineItemState = val timelineItemState =
when (val currentTimelineItem = timelineItems[index]) { when (val currentTimelineItem = timelineItems[index]) {
is MatrixTimelineItem.Event -> eventItemFactory.create(currentTimelineItem, index, timelineItems) is MatrixTimelineItem.Event -> eventItemFactory.create(currentTimelineItem, index, timelineItems)
is MatrixTimelineItem.Virtual -> virtualItemFactory.create(currentTimelineItem, index) is MatrixTimelineItem.Virtual -> virtualItemFactory.create(currentTimelineItem)
MatrixTimelineItem.Other -> null MatrixTimelineItem.Other -> null
} }
timelineItemsCache[index] = timelineItemState timelineItemsCache[index] = timelineItemState

3
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/virtual/TimelineItemVirtualFactory.kt

@ -29,10 +29,9 @@ class TimelineItemVirtualFactory @Inject constructor(
fun create( fun create(
virtualTimelineItem: MatrixTimelineItem.Virtual, virtualTimelineItem: MatrixTimelineItem.Virtual,
index: Int,
): TimelineItem.Virtual { ): TimelineItem.Virtual {
return TimelineItem.Virtual( return TimelineItem.Virtual(
id = "virtual_item_$index", id = virtualTimelineItem.uniqueId,
model = virtualTimelineItem.computeModel() model = virtualTimelineItem.computeModel()
) )
} }

12
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt

@ -24,16 +24,16 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
@Immutable @Immutable
sealed interface TimelineItem { sealed interface TimelineItem {
fun identifier(): String = when (this) { fun identifier(): String = when (this) {
is Event -> id is Event -> id.toString()
is Virtual -> id is Virtual -> id.toString()
is GroupedEvents -> id is GroupedEvents -> id
} }
@ -45,13 +45,13 @@ sealed interface TimelineItem {
@Immutable @Immutable
data class Virtual( data class Virtual(
val id: String, val id: Long,
val model: TimelineItemVirtualModel val model: TimelineItemVirtualModel
) : TimelineItem ) : TimelineItem
@Immutable @Immutable
data class Event( data class Event(
val id: String, val id: Long,
val eventId: EventId? = null, val eventId: EventId? = null,
val transactionId: String? = null, val transactionId: String? = null,
val senderId: UserId, val senderId: UserId,
@ -83,6 +83,6 @@ sealed interface TimelineItem {
val events: ImmutableList<Event>, val events: ImmutableList<Event>,
) : TimelineItem { ) : TimelineItem {
// use last id with a suffix. Last will not change in cas of new event from backpagination. // use last id with a suffix. Last will not change in cas of new event from backpagination.
val id = events.last().id + "_group" val id = "${events.last().id}_group"
} }
} }

5
libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/MatrixTimelineItem.kt

@ -21,13 +21,12 @@ import io.element.android.libraries.matrix.api.timeline.item.event.EventTimeline
import io.element.android.libraries.matrix.api.timeline.item.virtual.VirtualTimelineItem import io.element.android.libraries.matrix.api.timeline.item.virtual.VirtualTimelineItem
sealed interface MatrixTimelineItem { sealed interface MatrixTimelineItem {
data class Event(val event: EventTimelineItem) : MatrixTimelineItem { data class Event(val uniqueId: Long, val event: EventTimelineItem) : MatrixTimelineItem {
val uniqueId: String = event.uniqueIdentifier
val eventId: EventId? = event.eventId val eventId: EventId? = event.eventId
val transactionId: String? = event.transactionId val transactionId: String? = event.transactionId
} }
data class Virtual(val virtual: VirtualTimelineItem) : MatrixTimelineItem data class Virtual(val uniqueId: Long, val virtual: VirtualTimelineItem) : MatrixTimelineItem
object Other : MatrixTimelineItem object Other : MatrixTimelineItem
} }

1
libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt

@ -21,7 +21,6 @@ import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
data class EventTimelineItem( data class EventTimelineItem(
val uniqueIdentifier: String,
val eventId: EventId?, val eventId: EventId?,
val transactionId: String?, val transactionId: String?,
val isEditable: Boolean, val isEditable: Boolean,

2
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSummaryDetailsFactory.kt

@ -24,7 +24,7 @@ import org.matrix.rustcomponents.sdk.RoomListItem
class RoomSummaryDetailsFactory(private val roomMessageFactory: RoomMessageFactory = RoomMessageFactory()) { class RoomSummaryDetailsFactory(private val roomMessageFactory: RoomMessageFactory = RoomMessageFactory()) {
fun create(roomListItem: RoomListItem, room: Room?): RoomSummaryDetails { suspend fun create(roomListItem: RoomListItem, room: Room?): RoomSummaryDetails {
val latestRoomMessage = roomListItem.latestEvent()?.use { val latestRoomMessage = roomListItem.latestEvent()?.use {
roomMessageFactory.create(it) roomMessageFactory.create(it)
} }

12
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSummaryListProcessor.kt

@ -16,6 +16,7 @@
package io.element.android.libraries.matrix.impl.room package io.element.android.libraries.matrix.impl.room
import io.element.android.libraries.core.coroutine.parallelMap
import io.element.android.libraries.matrix.api.room.RoomSummary import io.element.android.libraries.matrix.api.room.RoomSummary
import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@ -43,7 +44,8 @@ class RoomSummaryListProcessor(
suspend fun postEntries(entries: List<RoomListEntry>) { suspend fun postEntries(entries: List<RoomListEntry>) {
updateRoomSummaries { updateRoomSummaries {
Timber.v("Update rooms from postEntries (with ${entries.size} items) on ${Thread.currentThread()}") Timber.v("Update rooms from postEntries (with ${entries.size} items) on ${Thread.currentThread()}")
addAll(entries.map(::buildSummaryForRoomListEntry)) val roomSummaries = entries.parallelMap(::buildSummaryForRoomListEntry)
addAll(roomSummaries)
} }
initLatch.complete(Unit) initLatch.complete(Unit)
} }
@ -57,7 +59,7 @@ class RoomSummaryListProcessor(
} }
} }
private fun MutableList<RoomSummary>.applyUpdate(update: RoomListEntriesUpdate) { private suspend fun MutableList<RoomSummary>.applyUpdate(update: RoomListEntriesUpdate) {
when (update) { when (update) {
is RoomListEntriesUpdate.Append -> { is RoomListEntriesUpdate.Append -> {
val roomSummaries = update.values.map { val roomSummaries = update.values.map {
@ -100,7 +102,7 @@ class RoomSummaryListProcessor(
} }
} }
private fun buildSummaryForRoomListEntry(entry: RoomListEntry): RoomSummary { private suspend fun buildSummaryForRoomListEntry(entry: RoomListEntry): RoomSummary {
return when (entry) { return when (entry) {
RoomListEntry.Empty -> buildEmptyRoomSummary() RoomListEntry.Empty -> buildEmptyRoomSummary()
is RoomListEntry.Filled -> buildAndCacheRoomSummaryForIdentifier(entry.roomId) is RoomListEntry.Filled -> buildAndCacheRoomSummaryForIdentifier(entry.roomId)
@ -114,7 +116,7 @@ class RoomSummaryListProcessor(
return RoomSummary.Empty(UUID.randomUUID().toString()) return RoomSummary.Empty(UUID.randomUUID().toString())
} }
private fun buildAndCacheRoomSummaryForIdentifier(identifier: String): RoomSummary { private suspend fun buildAndCacheRoomSummaryForIdentifier(identifier: String): RoomSummary {
val builtRoomSummary = roomListService.roomOrNull(identifier)?.use { roomListItem -> val builtRoomSummary = roomListService.roomOrNull(identifier)?.use { roomListItem ->
roomListItem.fullRoomOrNull().use { fullRoom -> roomListItem.fullRoomOrNull().use { fullRoom ->
RoomSummary.Filled( RoomSummary.Filled(
@ -134,7 +136,7 @@ class RoomSummaryListProcessor(
} }
} }
private suspend fun updateRoomSummaries(block: MutableList<RoomSummary>.() -> Unit) = private suspend fun updateRoomSummaries(block: suspend MutableList<RoomSummary>.() -> Unit) =
mutex.withLock { mutex.withLock {
val mutableRoomSummaries = roomSummaries.value.toMutableList() val mutableRoomSummaries = roomSummaries.value.toMutableList()
block(mutableRoomSummaries) block(mutableRoomSummaries)

7
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineItemMapper.kt

@ -32,21 +32,20 @@ class MatrixTimelineItemMapper(
) { ) {
fun map(timelineItem: TimelineItem): MatrixTimelineItem = timelineItem.use { fun map(timelineItem: TimelineItem): MatrixTimelineItem = timelineItem.use {
val uniqueId = timelineItem.uniqueId().toLong()
val asEvent = it.asEvent() val asEvent = it.asEvent()
if (asEvent != null) { if (asEvent != null) {
val eventTimelineItem = eventTimelineItemMapper.map(asEvent) val eventTimelineItem = eventTimelineItemMapper.map(asEvent)
if (eventTimelineItem.hasNotLoadedInReplyTo() && eventTimelineItem.eventId != null) { if (eventTimelineItem.hasNotLoadedInReplyTo() && eventTimelineItem.eventId != null) {
fetchEventDetails(eventTimelineItem.eventId!!) fetchEventDetails(eventTimelineItem.eventId!!)
} }
return MatrixTimelineItem.Event(eventTimelineItem) return MatrixTimelineItem.Event(uniqueId, eventTimelineItem)
} }
val asVirtual = it.asVirtual() val asVirtual = it.asVirtual()
if (asVirtual != null) { if (asVirtual != null) {
val virtualTimelineItem = virtualTimelineItemMapper.map(asVirtual) val virtualTimelineItem = virtualTimelineItemMapper.map(asVirtual)
return MatrixTimelineItem.Virtual(virtualTimelineItem) return MatrixTimelineItem.Virtual(uniqueId, virtualTimelineItem)
} }
return MatrixTimelineItem.Other return MatrixTimelineItem.Other
} }

5
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt

@ -20,8 +20,8 @@ import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
import io.element.android.libraries.matrix.api.timeline.item.event.EventReaction import io.element.android.libraries.matrix.api.timeline.item.event.EventReaction
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem 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.ProfileTimelineDetails import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails
import org.matrix.rustcomponents.sdk.Reaction import org.matrix.rustcomponents.sdk.Reaction
import org.matrix.rustcomponents.sdk.EventSendState as RustEventSendState import org.matrix.rustcomponents.sdk.EventSendState as RustEventSendState
@ -33,7 +33,6 @@ class EventTimelineItemMapper(private val contentMapper: TimelineEventContentMap
fun map(eventTimelineItem: RustEventTimelineItem): EventTimelineItem = eventTimelineItem.use { fun map(eventTimelineItem: RustEventTimelineItem): EventTimelineItem = eventTimelineItem.use {
EventTimelineItem( EventTimelineItem(
uniqueIdentifier = it.uniqueIdentifier(),
eventId = it.eventId()?.let(::EventId), eventId = it.eventId()?.let(::EventId),
transactionId = it.transactionId(), transactionId = it.transactionId(),
isEditable = it.isEditable(), isEditable = it.isEditable(),
@ -79,7 +78,7 @@ private fun List<Reaction>?.map(): List<EventReaction> {
EventReaction( EventReaction(
key = it.key, key = it.key,
count = it.count.toLong(), count = it.count.toLong(),
senderIds = it.senders.map { sender -> UserId(sender) } senderIds = it.senders.map { sender -> UserId(sender.senderId) }
) )
} ?: emptyList() } ?: emptyList()
} }

Loading…
Cancel
Save