Still WIP for Paging integration

This commit is contained in:
ganfra
2018-10-21 20:27:50 +02:00
parent 702abccb38
commit d71ae02162
11 changed files with 127 additions and 31 deletions

View File

@ -7,7 +7,10 @@ import io.realm.RealmQuery
import io.realm.RealmResults
fun ChunkEntity.Companion.where(realm: Realm, roomId: String): RealmQuery<ChunkEntity> {
return realm.where(ChunkEntity::class.java).equalTo("room.roomId", roomId)
return realm.where(ChunkEntity::class.java)
.equalTo("room.roomId", roomId)
.notEqualTo("prevToken", DBConstants.STATE_EVENTS_CHUNK_TOKEN)
.notEqualTo("nextToken", DBConstants.STATE_EVENTS_CHUNK_TOKEN)
}
fun ChunkEntity.Companion.findWithPrevToken(realm: Realm, roomId: String, prevToken: String?): ChunkEntity? {

View File

@ -25,13 +25,19 @@ data class DefaultRoom(
override fun liveTimeline(): LiveData<PagedList<Event>> {
val realmDataSourceFactory = monarchy.createDataSourceFactory { realm ->
ChunkEntity.where(realm, roomId).findAll().last(null).let { it?.events }?.where()
ChunkEntity.where(realm, roomId)
.findAll()
.last(null)
?.let { it.events }
?.where()
?.sort("originServerTs")
}
val domainSourceFactory = realmDataSourceFactory.map { EventMapper.map(it) }
val pagedListConfig = PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setPageSize(10)
.setInitialLoadSizeHint(30)
.setPrefetchDistance(5)
.build()

View File

@ -9,7 +9,6 @@ import im.vector.matrix.android.api.failure.Failure
import im.vector.matrix.android.api.util.Cancelable
import im.vector.matrix.android.internal.database.mapper.asEntity
import im.vector.matrix.android.internal.database.model.ChunkEntity
import im.vector.matrix.android.internal.database.model.EventEntity
import im.vector.matrix.android.internal.database.model.RoomEntity
import im.vector.matrix.android.internal.database.query.findAllIncludingEvents
import im.vector.matrix.android.internal.database.query.findWithNextToken
@ -87,34 +86,30 @@ class PaginationRequest(private val roomAPI: RoomAPI,
ChunkEntity()
}
val eventsToAdd = ArrayList<EventEntity>()
currentChunk.prevToken = chunkEvent.prevToken
mergedEvents.forEach { event ->
val eventEntity = event.asEntity().let {
realm.copyToRealmOrUpdate(it)
}
if (!currentChunk.events.contains(eventEntity)) {
eventsToAdd.add(0, eventEntity)
currentChunk.events.add(0, eventEntity)
}
}
if (prevChunk != null) {
eventsToAdd.addAll(0, prevChunk.events)
currentChunk.events.addAll(prevChunk.events)
roomEntity.chunks.remove(prevChunk)
} else if (hasOverlapped) {
chunksOverlapped.forEach { chunk ->
chunk.events.forEach { event ->
if (!currentChunk.events.contains(event)) {
eventsToAdd.add(0, event)
currentChunk.events.add(0, event)
}
}
roomEntity.chunks.remove(chunk)
}
}
currentChunk.events.addAll(0, eventsToAdd)
if (!roomEntity.chunks.contains(currentChunk)) {
roomEntity.chunks.add(currentChunk)
}

View File

@ -26,7 +26,15 @@ class TimelineBoundaryCallback(private val paginationRequest: PaginationRequest,
}
override fun onItemAtEndLoaded(itemAtEnd: Event) {
//Todo handle forward pagination
helper.runIfNotRunning(PagingRequestHelper.RequestType.AFTER) {
monarchy.doWithRealm { realm ->
if (itemAtEnd.eventId == null) {
return@doWithRealm
}
val chunkEntity = ChunkEntity.findAllIncludingEvents(realm, Collections.singletonList(itemAtEnd.eventId)).firstOrNull()
paginationRequest.execute(roomId, chunkEntity?.nextToken, PaginationDirection.FORWARDS, callback = createCallback(it))
}
}
}
override fun onItemAtFrontLoaded(itemAtFront: Event) {
@ -39,7 +47,6 @@ class TimelineBoundaryCallback(private val paginationRequest: PaginationRequest,
paginationRequest.execute(roomId, chunkEntity?.prevToken, PaginationDirection.BACKWARDS, callback = createCallback(it))
}
}
}
private fun createCallback(pagingRequestCallback: PagingRequestHelper.Request.Callback) = object : MatrixCallback<TokenChunkEvent> {