forked from GitHub-Mirror/riotX-android
Still WIP for Paging integration
This commit is contained in:
@ -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? {
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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> {
|
||||
|
Reference in New Issue
Block a user