Update rust sdk to 0.1.31: new uniqueId on timeline
This commit is contained in:
parent
03c29817c3
commit
655c5a5ed5
10 changed files with 26 additions and 28 deletions
|
|
@ -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"),
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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…
Add table
Add a link
Reference in a new issue