Fix Dendrite sync response support
This commit is contained in:
parent
1d449c84fe
commit
36b1a1471a
@ -24,13 +24,17 @@ import org.matrix.android.sdk.api.session.events.model.Event
|
||||
data class EventContextResponse(
|
||||
@Json(name = "event") val event: Event,
|
||||
@Json(name = "start") override val start: String? = null,
|
||||
@Json(name = "events_before") val eventsBefore: List<Event> = emptyList(),
|
||||
@Json(name = "events_after") val eventsAfter: List<Event> = emptyList(),
|
||||
@Json(name = "events_before") val eventsBefore: List<Event>? = emptyList(),
|
||||
@Json(name = "events_after") val eventsAfter: List<Event>? = emptyList(),
|
||||
@Json(name = "end") override val end: String? = null,
|
||||
@Json(name = "state") override val stateEvents: List<Event> = emptyList()
|
||||
@Json(name = "state") override val stateEvents: List<Event>? = emptyList()
|
||||
) : TokenChunkEvent {
|
||||
|
||||
override val events: List<Event> by lazy {
|
||||
eventsAfter.reversed() + listOf(event) + eventsBefore
|
||||
mutableListOf<Event>().apply {
|
||||
eventsAfter?.let { addAll(it.reversed()) }
|
||||
add(event)
|
||||
eventsBefore?.let { addAll(it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,6 +24,6 @@ import org.matrix.android.sdk.api.session.events.model.Event
|
||||
internal data class PaginationResponse(
|
||||
@Json(name = "start") override val start: String? = null,
|
||||
@Json(name = "end") override val end: String? = null,
|
||||
@Json(name = "chunk") override val events: List<Event> = emptyList(),
|
||||
@Json(name = "state") override val stateEvents: List<Event> = emptyList()
|
||||
@Json(name = "chunk") override val events: List<Event>? = emptyList(),
|
||||
@Json(name = "state") override val stateEvents: List<Event>? = emptyList()
|
||||
) : TokenChunkEvent
|
||||
|
@ -21,8 +21,8 @@ import org.matrix.android.sdk.api.session.events.model.Event
|
||||
internal interface TokenChunkEvent {
|
||||
val start: String?
|
||||
val end: String?
|
||||
val events: List<Event>
|
||||
val stateEvents: List<Event>
|
||||
val events: List<Event>?
|
||||
val stateEvents: List<Event>?
|
||||
|
||||
fun hasMore() = start != end
|
||||
}
|
||||
|
@ -124,7 +124,7 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
|
||||
direction: PaginationDirection): Result {
|
||||
monarchy
|
||||
.awaitTransaction { realm ->
|
||||
Timber.v("Start persisting ${receivedChunk.events.size} events in $roomId towards $direction")
|
||||
Timber.v("Start persisting ${receivedChunk.events?.size} events in $roomId towards $direction")
|
||||
|
||||
val nextToken: String?
|
||||
val prevToken: String?
|
||||
@ -149,13 +149,13 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
|
||||
}
|
||||
?: ChunkEntity.create(realm, prevToken, nextToken)
|
||||
|
||||
if (receivedChunk.events.isEmpty() && !receivedChunk.hasMore()) {
|
||||
if (receivedChunk.events.isNullOrEmpty() && !receivedChunk.hasMore()) {
|
||||
handleReachEnd(realm, roomId, direction, currentChunk)
|
||||
} else {
|
||||
handlePagination(realm, roomId, direction, receivedChunk, currentChunk)
|
||||
}
|
||||
}
|
||||
return if (receivedChunk.events.isEmpty()) {
|
||||
return if (receivedChunk.events.isNullOrEmpty()) {
|
||||
if (receivedChunk.start != receivedChunk.end) {
|
||||
Result.SHOULD_FETCH_MORE
|
||||
} else {
|
||||
@ -189,14 +189,14 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
|
||||
receivedChunk: TokenChunkEvent,
|
||||
currentChunk: ChunkEntity
|
||||
) {
|
||||
Timber.v("Add ${receivedChunk.events.size} events in chunk(${currentChunk.nextToken} | ${currentChunk.prevToken}")
|
||||
Timber.v("Add ${receivedChunk.events?.size} events in chunk(${currentChunk.nextToken} | ${currentChunk.prevToken}")
|
||||
val roomMemberContentsByUser = HashMap<String, RoomMemberContent?>()
|
||||
val eventList = receivedChunk.events
|
||||
val stateEvents = receivedChunk.stateEvents
|
||||
|
||||
val now = System.currentTimeMillis()
|
||||
|
||||
for (stateEvent in stateEvents) {
|
||||
stateEvents?.forEach { stateEvent ->
|
||||
val ageLocalTs = stateEvent.unsignedData?.age?.let { now - it }
|
||||
val stateEventEntity = stateEvent.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
|
||||
currentChunk.addStateEvent(roomId, stateEventEntity, direction)
|
||||
@ -204,10 +204,10 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
|
||||
roomMemberContentsByUser[stateEvent.stateKey] = stateEvent.content.toModel<RoomMemberContent>()
|
||||
}
|
||||
}
|
||||
val eventIds = ArrayList<String>(eventList.size)
|
||||
for (event in eventList) {
|
||||
val eventIds = ArrayList<String>(eventList?.size ?: 0)
|
||||
eventList?.forEach { event ->
|
||||
if (event.eventId == null || event.senderId == null) {
|
||||
continue
|
||||
return@forEach
|
||||
}
|
||||
val ageLocalTs = event.unsignedData?.age?.let { now - it }
|
||||
eventIds.add(event.eventId)
|
||||
|
@ -95,7 +95,7 @@ internal class DefaultGetUploadsTask @Inject constructor(
|
||||
nextToken = chunk.end ?: "",
|
||||
hasMore = chunk.hasMore()
|
||||
)
|
||||
events = chunk.events
|
||||
events = chunk.events ?: emptyList()
|
||||
}
|
||||
|
||||
var uploadEvents = listOf<UploadEvent>()
|
||||
|
Loading…
Reference in New Issue
Block a user