2018-10-17 16:21:09 +00:00
|
|
|
package im.vector.matrix.android.internal.session.room
|
|
|
|
|
2018-10-18 16:38:11 +00:00
|
|
|
import android.arch.lifecycle.LiveData
|
|
|
|
import android.arch.paging.LivePagedListBuilder
|
|
|
|
import android.arch.paging.PagedList
|
|
|
|
import com.zhuinden.monarchy.Monarchy
|
|
|
|
import im.vector.matrix.android.api.session.events.model.Event
|
2018-10-17 16:21:09 +00:00
|
|
|
import im.vector.matrix.android.api.session.room.Room
|
2018-10-18 16:38:11 +00:00
|
|
|
import im.vector.matrix.android.internal.database.mapper.EventMapper
|
|
|
|
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.query.where
|
|
|
|
import im.vector.matrix.android.internal.session.room.timeline.PaginationRequest
|
|
|
|
import im.vector.matrix.android.internal.session.room.timeline.TimelineBoundaryCallback
|
|
|
|
import org.koin.standalone.KoinComponent
|
|
|
|
import org.koin.standalone.inject
|
|
|
|
import java.util.concurrent.Executors
|
2018-10-17 16:21:09 +00:00
|
|
|
|
|
|
|
data class DefaultRoom(
|
|
|
|
override val roomId: String
|
2018-10-18 16:38:11 +00:00
|
|
|
) : Room, KoinComponent {
|
|
|
|
|
|
|
|
private val paginationRequest by inject<PaginationRequest>()
|
|
|
|
private val monarchy by inject<Monarchy>()
|
|
|
|
private val boundaryCallback = TimelineBoundaryCallback(paginationRequest, roomId, monarchy, Executors.newSingleThreadExecutor())
|
|
|
|
|
2018-10-19 12:26:13 +00:00
|
|
|
override fun liveTimeline(): LiveData<PagedList<Event>> {
|
2018-10-18 16:38:11 +00:00
|
|
|
val realmDataSourceFactory = monarchy.createDataSourceFactory { realm ->
|
2018-10-19 15:18:24 +00:00
|
|
|
val lastChunk = ChunkEntity.where(realm, roomId).findAll().last(null)
|
2018-10-19 13:30:40 +00:00
|
|
|
if (lastChunk == null) {
|
|
|
|
EventEntity.where(realm, roomId)
|
|
|
|
} else {
|
|
|
|
EventEntity.where(realm, lastChunk)
|
|
|
|
}
|
2018-10-18 16:38:11 +00:00
|
|
|
}
|
|
|
|
val domainSourceFactory = realmDataSourceFactory.map { EventMapper.map(it) }
|
|
|
|
val livePagedListBuilder = LivePagedListBuilder(domainSourceFactory, 20).setBoundaryCallback(boundaryCallback)
|
|
|
|
return monarchy.findAllPagedWithChanges(realmDataSourceFactory, livePagedListBuilder)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|