Fix Dendrite sync response support

This commit is contained in:
Valere 2021-01-13 14:23:02 +01:00
parent 1d449c84fe
commit 36b1a1471a
5 changed files with 21 additions and 17 deletions

View File

@ -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) }
}
}
}

View File

@ -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

View File

@ -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
}

View File

@ -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)

View File

@ -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>()