Merge pull request #2665 from vector-im/feature/bca/dendrite_sync_fix
Fix Dendrite sync response support
This commit is contained in:
commit
e55178612c
@ -21,16 +21,34 @@ import com.squareup.moshi.JsonClass
|
|||||||
import org.matrix.android.sdk.api.session.events.model.Event
|
import org.matrix.android.sdk.api.session.events.model.Event
|
||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class EventContextResponse(
|
internal data class EventContextResponse(
|
||||||
|
/**
|
||||||
|
* Details of the requested event.
|
||||||
|
*/
|
||||||
@Json(name = "event") val event: Event,
|
@Json(name = "event") val event: Event,
|
||||||
|
/**
|
||||||
|
* A token that can be used to paginate backwards with.
|
||||||
|
*/
|
||||||
@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_after") val eventsAfter: List<Event> = emptyList(),
|
* A list of room events that happened just before the requested event, in reverse-chronological order.
|
||||||
|
*/
|
||||||
|
@Json(name = "events_before") val eventsBefore: List<Event>? = null,
|
||||||
|
/**
|
||||||
|
* A list of room events that happened just after the requested event, in chronological order.
|
||||||
|
*/
|
||||||
|
@Json(name = "events_after") val eventsAfter: List<Event>? = null,
|
||||||
|
/**
|
||||||
|
* A token that can be used to paginate forwards with.
|
||||||
|
*/
|
||||||
@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()
|
/**
|
||||||
|
* The state of the room at the last event returned.
|
||||||
|
*/
|
||||||
|
@Json(name = "state") override val stateEvents: List<Event>? = null
|
||||||
) : TokenChunkEvent {
|
) : TokenChunkEvent {
|
||||||
|
|
||||||
override val events: List<Event> by lazy {
|
override val events: List<Event> by lazy {
|
||||||
eventsAfter.reversed() + listOf(event) + eventsBefore
|
eventsAfter.orEmpty().reversed() + event + eventsBefore.orEmpty()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,8 +22,28 @@ import org.matrix.android.sdk.api.session.events.model.Event
|
|||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
internal data class PaginationResponse(
|
internal data class PaginationResponse(
|
||||||
|
/**
|
||||||
|
* The token the pagination starts from. If dir=b this will be the token supplied in from.
|
||||||
|
*/
|
||||||
@Json(name = "start") override val start: String? = null,
|
@Json(name = "start") override val start: String? = null,
|
||||||
|
/**
|
||||||
|
* The token the pagination ends at. If dir=b this token should be used again to request even earlier events.
|
||||||
|
*/
|
||||||
@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 = "state") override val stateEvents: List<Event> = emptyList()
|
* A list of room events. The order depends on the dir parameter. For dir=b events will be in
|
||||||
) : TokenChunkEvent
|
* reverse-chronological order, for dir=f in chronological order, so that events start at the from point.
|
||||||
|
*/
|
||||||
|
@Json(name = "chunk") val chunk: List<Event>? = null,
|
||||||
|
/**
|
||||||
|
* A list of state events relevant to showing the chunk. For example, if lazy_load_members is enabled
|
||||||
|
* in the filter then this may contain the membership events for the senders of events in the chunk.
|
||||||
|
*
|
||||||
|
* Unless include_redundant_members is true, the server may remove membership events which would have
|
||||||
|
* already been sent to the client in prior calls to this endpoint, assuming the membership of those members has not changed.
|
||||||
|
*/
|
||||||
|
@Json(name = "state") override val stateEvents: List<Event>? = null
|
||||||
|
) : TokenChunkEvent {
|
||||||
|
override val events: List<Event>
|
||||||
|
get() = chunk.orEmpty()
|
||||||
|
}
|
||||||
|
@ -22,7 +22,7 @@ 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
|
||||||
}
|
}
|
||||||
|
@ -156,7 +156,7 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return if (receivedChunk.events.isEmpty()) {
|
return if (receivedChunk.events.isEmpty()) {
|
||||||
if (receivedChunk.start != receivedChunk.end) {
|
if (receivedChunk.hasMore()) {
|
||||||
Result.SHOULD_FETCH_MORE
|
Result.SHOULD_FETCH_MORE
|
||||||
} else {
|
} else {
|
||||||
Result.REACHED_END
|
Result.REACHED_END
|
||||||
@ -196,7 +196,7 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
|
|||||||
|
|
||||||
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)
|
||||||
@ -205,9 +205,9 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
val eventIds = ArrayList<String>(eventList.size)
|
val eventIds = ArrayList<String>(eventList.size)
|
||||||
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)
|
||||||
|
@ -56,8 +56,8 @@ internal class DefaultGetUploadsTask @Inject constructor(
|
|||||||
private val roomAPI: RoomAPI,
|
private val roomAPI: RoomAPI,
|
||||||
private val tokenStore: SyncTokenStore,
|
private val tokenStore: SyncTokenStore,
|
||||||
@SessionDatabase private val monarchy: Monarchy,
|
@SessionDatabase private val monarchy: Monarchy,
|
||||||
private val globalErrorReceiver: GlobalErrorReceiver)
|
private val globalErrorReceiver: GlobalErrorReceiver
|
||||||
: GetUploadsTask {
|
) : GetUploadsTask {
|
||||||
|
|
||||||
override suspend fun execute(params: GetUploadsTask.Params): GetUploadsResult {
|
override suspend fun execute(params: GetUploadsTask.Params): GetUploadsResult {
|
||||||
val result: GetUploadsResult
|
val result: GetUploadsResult
|
||||||
|
Loading…
Reference in New Issue
Block a user