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