forked from GitHub-Mirror/riotX-android
Handle epoxy timeline manually : get off the cache at the moment, will need to be improved
This commit is contained in:
@ -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"
|
||||
}
|
||||
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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 {
|
||||
|
@ -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>> {
|
||||
|
Reference in New Issue
Block a user