forked from GitHub-Mirror/riotX-android
Introduce a displayIndex to keep insertion order when querying...
This commit is contained in:
parent
bb0a70f3c0
commit
40fa326771
@ -9,3 +9,10 @@ internal fun RoomEntity.deleteOnCascade(chunkEntity: ChunkEntity) {
|
|||||||
chunkEntity.events.deleteAllFromRealm()
|
chunkEntity.events.deleteAllFromRealm()
|
||||||
chunkEntity.deleteFromRealm()
|
chunkEntity.deleteFromRealm()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun RoomEntity.addOrUpdate(chunkEntity: ChunkEntity) {
|
||||||
|
chunkEntity.events.forEachIndexed { index, eventEntity -> eventEntity.displayIndex = index }
|
||||||
|
if (!chunks.contains(chunkEntity)) {
|
||||||
|
chunks.add(chunkEntity)
|
||||||
|
}
|
||||||
|
}
|
@ -13,7 +13,8 @@ internal open class EventEntity(var eventId: String = "",
|
|||||||
var sender: String? = null,
|
var sender: String? = null,
|
||||||
var age: Long? = 0,
|
var age: Long? = 0,
|
||||||
var redacts: String? = null,
|
var redacts: String? = null,
|
||||||
var stateIndex: Int = 0
|
var stateIndex: Int = 0,
|
||||||
|
var displayIndex: Int = 0
|
||||||
) : RealmObject() {
|
) : RealmObject() {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -5,12 +5,11 @@ import com.zhuinden.monarchy.Monarchy
|
|||||||
import im.vector.matrix.android.api.MatrixCallback
|
import im.vector.matrix.android.api.MatrixCallback
|
||||||
import im.vector.matrix.android.api.session.room.model.Membership
|
import im.vector.matrix.android.api.session.room.model.Membership
|
||||||
import im.vector.matrix.android.api.util.Cancelable
|
import im.vector.matrix.android.api.util.Cancelable
|
||||||
import im.vector.matrix.android.internal.database.model.EventEntity
|
import im.vector.matrix.android.internal.database.helper.addOrUpdate
|
||||||
import im.vector.matrix.android.internal.database.model.RoomEntity
|
import im.vector.matrix.android.internal.database.model.RoomEntity
|
||||||
import im.vector.matrix.android.internal.database.query.where
|
import im.vector.matrix.android.internal.database.query.where
|
||||||
import im.vector.matrix.android.internal.network.executeRequest
|
import im.vector.matrix.android.internal.network.executeRequest
|
||||||
import im.vector.matrix.android.internal.session.room.RoomAPI
|
import im.vector.matrix.android.internal.session.room.RoomAPI
|
||||||
import im.vector.matrix.android.internal.session.room.timeline.PaginationDirection
|
|
||||||
import im.vector.matrix.android.internal.session.sync.StateEventsChunkHandler
|
import im.vector.matrix.android.internal.session.sync.StateEventsChunkHandler
|
||||||
import im.vector.matrix.android.internal.util.CancelableCoroutine
|
import im.vector.matrix.android.internal.util.CancelableCoroutine
|
||||||
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
|
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
|
||||||
@ -59,9 +58,7 @@ internal class LoadRoomMembersRequest(private val roomAPI: RoomAPI,
|
|||||||
val eventsToInsert = response.roomMemberEvents.filter { !roomMembers.containsKey(it.stateKey) }
|
val eventsToInsert = response.roomMemberEvents.filter { !roomMembers.containsKey(it.stateKey) }
|
||||||
|
|
||||||
val chunk = stateEventsChunkHandler.handle(realm, roomId, eventsToInsert)
|
val chunk = stateEventsChunkHandler.handle(realm, roomId, eventsToInsert)
|
||||||
if (!roomEntity.chunks.contains(chunk)) {
|
roomEntity.addOrUpdate(chunk)
|
||||||
roomEntity.chunks.add(chunk)
|
|
||||||
}
|
|
||||||
roomEntity.areAllMembersLoaded = true
|
roomEntity.areAllMembersLoaded = true
|
||||||
}
|
}
|
||||||
.map { response }
|
.map { response }
|
||||||
|
@ -8,8 +8,10 @@ import im.vector.matrix.android.api.session.events.interceptor.EnrichedEventInte
|
|||||||
import im.vector.matrix.android.api.session.events.model.EnrichedEvent
|
import im.vector.matrix.android.api.session.events.model.EnrichedEvent
|
||||||
import im.vector.matrix.android.api.session.room.TimelineHolder
|
import im.vector.matrix.android.api.session.room.TimelineHolder
|
||||||
import im.vector.matrix.android.internal.database.mapper.asDomain
|
import im.vector.matrix.android.internal.database.mapper.asDomain
|
||||||
import im.vector.matrix.android.internal.database.model.ChunkEntity
|
import im.vector.matrix.android.internal.database.model.ChunkEntityFields
|
||||||
import im.vector.matrix.android.internal.database.query.findLastLiveChunkFromRoom
|
import im.vector.matrix.android.internal.database.model.EventEntity
|
||||||
|
import im.vector.matrix.android.internal.database.model.EventEntityFields
|
||||||
|
import im.vector.matrix.android.internal.database.query.where
|
||||||
import im.vector.matrix.android.internal.session.events.interceptor.MessageEventInterceptor
|
import im.vector.matrix.android.internal.session.events.interceptor.MessageEventInterceptor
|
||||||
|
|
||||||
private const val PAGE_SIZE = 30
|
private const val PAGE_SIZE = 30
|
||||||
@ -28,9 +30,10 @@ internal class DefaultTimelineHolder(private val roomId: String,
|
|||||||
|
|
||||||
override fun liveTimeline(): LiveData<PagedList<EnrichedEvent>> {
|
override fun liveTimeline(): LiveData<PagedList<EnrichedEvent>> {
|
||||||
val realmDataSourceFactory = monarchy.createDataSourceFactory { realm ->
|
val realmDataSourceFactory = monarchy.createDataSourceFactory { realm ->
|
||||||
ChunkEntity.findLastLiveChunkFromRoom(realm, roomId = roomId)
|
EventEntity
|
||||||
?.events
|
.where(realm, roomId = roomId)
|
||||||
?.where()
|
.equalTo("${EventEntityFields.CHUNK}.${ChunkEntityFields.IS_LAST}", true)
|
||||||
|
.sort(EventEntityFields.DISPLAY_INDEX)
|
||||||
}
|
}
|
||||||
val domainSourceFactory = realmDataSourceFactory
|
val domainSourceFactory = realmDataSourceFactory
|
||||||
.map { it.asDomain() }
|
.map { it.asDomain() }
|
||||||
|
@ -6,6 +6,7 @@ import com.zhuinden.monarchy.Monarchy
|
|||||||
import im.vector.matrix.android.api.MatrixCallback
|
import im.vector.matrix.android.api.MatrixCallback
|
||||||
import im.vector.matrix.android.api.util.Cancelable
|
import im.vector.matrix.android.api.util.Cancelable
|
||||||
import im.vector.matrix.android.internal.database.helper.addAll
|
import im.vector.matrix.android.internal.database.helper.addAll
|
||||||
|
import im.vector.matrix.android.internal.database.helper.addOrUpdate
|
||||||
import im.vector.matrix.android.internal.database.helper.deleteOnCascade
|
import im.vector.matrix.android.internal.database.helper.deleteOnCascade
|
||||||
import im.vector.matrix.android.internal.database.helper.merge
|
import im.vector.matrix.android.internal.database.helper.merge
|
||||||
import im.vector.matrix.android.internal.database.model.ChunkEntity
|
import im.vector.matrix.android.internal.database.model.ChunkEntity
|
||||||
@ -90,15 +91,11 @@ internal class PaginationRequest(private val roomAPI: RoomAPI,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!roomEntity.chunks.contains(currentChunk)) {
|
roomEntity.addOrUpdate(currentChunk)
|
||||||
roomEntity.chunks.add(currentChunk)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO : there is an issue with the pagination sending unwanted room member events
|
// TODO : there is an issue with the pagination sending unwanted room member events
|
||||||
val stateEventsChunk = stateEventsChunkHandler.handle(realm, roomId, receivedChunk.stateEvents)
|
val stateEventsChunk = stateEventsChunkHandler.handle(realm, roomId, receivedChunk.stateEvents)
|
||||||
if (!roomEntity.chunks.contains(stateEventsChunk)) {
|
roomEntity.addOrUpdate(stateEventsChunk)
|
||||||
roomEntity.chunks.add(stateEventsChunk)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.map { receivedChunk }
|
.map { receivedChunk }
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import im.vector.matrix.android.api.session.events.model.Event
|
|||||||
import im.vector.matrix.android.api.session.events.model.EventType
|
import im.vector.matrix.android.api.session.events.model.EventType
|
||||||
import im.vector.matrix.android.api.session.room.model.MyMembership
|
import im.vector.matrix.android.api.session.room.model.MyMembership
|
||||||
import im.vector.matrix.android.internal.database.helper.addAll
|
import im.vector.matrix.android.internal.database.helper.addAll
|
||||||
|
import im.vector.matrix.android.internal.database.helper.addOrUpdate
|
||||||
import im.vector.matrix.android.internal.database.model.ChunkEntity
|
import im.vector.matrix.android.internal.database.model.ChunkEntity
|
||||||
import im.vector.matrix.android.internal.database.model.RoomEntity
|
import im.vector.matrix.android.internal.database.model.RoomEntity
|
||||||
import im.vector.matrix.android.internal.database.model.RoomSummaryEntity
|
import im.vector.matrix.android.internal.database.model.RoomSummaryEntity
|
||||||
@ -65,16 +66,12 @@ internal class RoomSyncHandler(private val monarchy: Monarchy,
|
|||||||
|
|
||||||
if (roomSync.state != null && roomSync.state.events.isNotEmpty()) {
|
if (roomSync.state != null && roomSync.state.events.isNotEmpty()) {
|
||||||
val chunkEntity = stateEventsChunkHandler.handle(realm, roomId, roomSync.state.events)
|
val chunkEntity = stateEventsChunkHandler.handle(realm, roomId, roomSync.state.events)
|
||||||
if (!roomEntity.chunks.contains(chunkEntity)) {
|
roomEntity.addOrUpdate(chunkEntity)
|
||||||
roomEntity.chunks.add(chunkEntity)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (roomSync.timeline != null && roomSync.timeline.events.isNotEmpty()) {
|
if (roomSync.timeline != null && roomSync.timeline.events.isNotEmpty()) {
|
||||||
val chunkEntity = handleTimelineEvents(realm, roomId, roomSync.timeline.events, roomSync.timeline.prevToken, isLimited = roomSync.timeline.limited)
|
val chunkEntity = handleTimelineEvents(realm, roomId, roomSync.timeline.events, roomSync.timeline.prevToken, isLimited = roomSync.timeline.limited)
|
||||||
if (!roomEntity.chunks.contains(chunkEntity)) {
|
roomEntity.addOrUpdate(chunkEntity)
|
||||||
roomEntity.chunks.add(chunkEntity)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (roomSync.summary != null) {
|
if (roomSync.summary != null) {
|
||||||
@ -96,9 +93,7 @@ internal class RoomSyncHandler(private val monarchy: Monarchy,
|
|||||||
roomEntity.membership = MyMembership.INVITED
|
roomEntity.membership = MyMembership.INVITED
|
||||||
if (roomSync.inviteState != null && roomSync.inviteState.events.isNotEmpty()) {
|
if (roomSync.inviteState != null && roomSync.inviteState.events.isNotEmpty()) {
|
||||||
val chunkEntity = handleTimelineEvents(realm, roomId, roomSync.inviteState.events)
|
val chunkEntity = handleTimelineEvents(realm, roomId, roomSync.inviteState.events)
|
||||||
if (!roomEntity.chunks.contains(chunkEntity)) {
|
roomEntity.addOrUpdate(chunkEntity)
|
||||||
roomEntity.chunks.add(chunkEntity)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return roomEntity
|
return roomEntity
|
||||||
}
|
}
|
||||||
@ -112,26 +107,6 @@ internal class RoomSyncHandler(private val monarchy: Monarchy,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleRoomSummary(realm: Realm,
|
|
||||||
roomId: String,
|
|
||||||
roomSummary: RoomSyncSummary) {
|
|
||||||
|
|
||||||
val roomSummaryEntity = RoomSummaryEntity.where(realm, roomId).findFirst()
|
|
||||||
?: RoomSummaryEntity(roomId)
|
|
||||||
|
|
||||||
if (roomSummary.heroes.isNotEmpty()) {
|
|
||||||
roomSummaryEntity.heroes.clear()
|
|
||||||
roomSummaryEntity.heroes.addAll(roomSummary.heroes)
|
|
||||||
}
|
|
||||||
if (roomSummary.invitedMembersCount != null) {
|
|
||||||
roomSummaryEntity.invitedMembersCount = roomSummary.invitedMembersCount
|
|
||||||
}
|
|
||||||
if (roomSummary.joinedMembersCount != null) {
|
|
||||||
roomSummaryEntity.joinedMembersCount = roomSummary.joinedMembersCount
|
|
||||||
}
|
|
||||||
realm.insertOrUpdate(roomSummaryEntity)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun handleTimelineEvents(realm: Realm,
|
private fun handleTimelineEvents(realm: Realm,
|
||||||
roomId: String,
|
roomId: String,
|
||||||
eventList: List<Event>,
|
eventList: List<Event>,
|
||||||
@ -155,6 +130,26 @@ internal class RoomSyncHandler(private val monarchy: Monarchy,
|
|||||||
return chunkEntity
|
return chunkEntity
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun handleRoomSummary(realm: Realm,
|
||||||
|
roomId: String,
|
||||||
|
roomSummary: RoomSyncSummary) {
|
||||||
|
|
||||||
|
val roomSummaryEntity = RoomSummaryEntity.where(realm, roomId).findFirst()
|
||||||
|
?: RoomSummaryEntity(roomId)
|
||||||
|
|
||||||
|
if (roomSummary.heroes.isNotEmpty()) {
|
||||||
|
roomSummaryEntity.heroes.clear()
|
||||||
|
roomSummaryEntity.heroes.addAll(roomSummary.heroes)
|
||||||
|
}
|
||||||
|
if (roomSummary.invitedMembersCount != null) {
|
||||||
|
roomSummaryEntity.invitedMembersCount = roomSummary.invitedMembersCount
|
||||||
|
}
|
||||||
|
if (roomSummary.joinedMembersCount != null) {
|
||||||
|
roomSummaryEntity.joinedMembersCount = roomSummary.joinedMembersCount
|
||||||
|
}
|
||||||
|
realm.insertOrUpdate(roomSummaryEntity)
|
||||||
|
}
|
||||||
|
|
||||||
private fun handleEphemeral(realm: Realm,
|
private fun handleEphemeral(realm: Realm,
|
||||||
roomId: String,
|
roomId: String,
|
||||||
ephemeral: RoomSyncEphemeral) {
|
ephemeral: RoomSyncEphemeral) {
|
||||||
|
Loading…
Reference in New Issue
Block a user