Handle epoxy timeline manually : get off the cache at the moment, will need to be improved

This commit is contained in:
ganfra
2018-10-31 11:22:42 +01:00
parent bc8055c3cd
commit ecf728aef8
10 changed files with 123 additions and 127 deletions

View File

@ -2,7 +2,7 @@ package im.vector.matrix.android.api.session.events.model
data class EnrichedEvent(val root: Event) {
private val metaEventsByType = HashMap<String, ArrayList<Event>>()
val metadata = HashMap<String, Any>()
fun enrichWith(events: List<Event>) {
events.forEach { enrichWith(it) }
@ -12,24 +12,22 @@ data class EnrichedEvent(val root: Event) {
if (event == null) {
return
}
var currentEventsForType = metaEventsByType[event.type]
if (currentEventsForType == null) {
currentEventsForType = ArrayList()
metaEventsByType[event.type] = currentEventsForType
enrichWith(event.type, event)
}
fun enrichWith(key: String, data: Any) {
if (!metadata.containsKey(key)) {
metadata[key] = data
}
currentEventsForType.add(event)
}
fun getMetaEvents(type: String): List<Event> {
return metaEventsByType[type] ?: emptyList()
inline fun <reified T> getMetadata(key: String): T? {
return metadata[key] as T?
}
fun getMetaEvents(): List<Event> {
return metaEventsByType.values.flatten()
}
override fun toString(): String {
return super.toString()
companion object {
const val IS_LAST_EVENT = "IS_LAST_EVENT"
const val READ_RECEIPTS = "READ_RECEIPTS"
}
}

View File

@ -0,0 +1,37 @@
package im.vector.matrix.android.internal.session.events.interceptor
import com.zhuinden.monarchy.Monarchy
import im.vector.matrix.android.api.session.events.interceptor.EnrichedEventInterceptor
import im.vector.matrix.android.api.session.events.model.EnrichedEvent
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.EventEntityFields
import im.vector.matrix.android.internal.database.query.findAllIncludingEvents
import im.vector.matrix.android.internal.database.query.where
import io.realm.Sort
import java.util.*
class IsLastEventInterceptor(val monarchy: Monarchy) : EnrichedEventInterceptor {
override fun canEnrich(event: EnrichedEvent): Boolean {
return true
}
override fun enrich(roomId: String, event: EnrichedEvent) {
monarchy.doWithRealm { realm ->
if (event.root.eventId == null) {
return@doWithRealm
}
val eventEntity = EventEntity.where(realm, event.root.eventId).findFirst()
val chunkEntity = ChunkEntity.findAllIncludingEvents(realm, Collections.singletonList(event.root.eventId)).firstOrNull()
if (eventEntity == null || chunkEntity == null) {
return@doWithRealm
}
val sortedChunkEvents = chunkEntity.events.where().sort(EventEntityFields.ORIGIN_SERVER_TS, Sort.ASCENDING).findAll()
val isLastEvent = chunkEntity.prevToken == null && sortedChunkEvents?.indexOf(eventEntity) == 0
event.enrichWith(EnrichedEvent.IS_LAST_EVENT, isLastEvent)
}
}
}

View File

@ -10,6 +10,7 @@ import im.vector.matrix.android.internal.database.model.EventEntityFields
import im.vector.matrix.android.internal.database.query.last
import im.vector.matrix.android.internal.database.query.where
class MessageEventInterceptor(val monarchy: Monarchy) : EnrichedEventInterceptor {
override fun canEnrich(event: EnrichedEvent): Boolean {

View File

@ -11,6 +11,7 @@ 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.EventEntityFields
import im.vector.matrix.android.internal.database.query.where
import im.vector.matrix.android.internal.session.events.interceptor.IsLastEventInterceptor
import im.vector.matrix.android.internal.session.events.interceptor.MessageEventInterceptor
import io.realm.Sort
@ -23,6 +24,7 @@ class DefaultTimelineHolder(private val roomId: String,
init {
eventInterceptors.add(MessageEventInterceptor(monarchy))
eventInterceptors.add(IsLastEventInterceptor(monarchy))
}
override fun liveTimeline(): LiveData<PagedList<EnrichedEvent>> {