forked from GitHub-Mirror/riotX-android
Makes the timeline a little more polished
This commit is contained in:
@ -1,5 +1,7 @@
|
||||
package im.vector.matrix.android.api.session.events.model
|
||||
|
||||
import im.vector.matrix.android.api.session.room.model.RoomMember
|
||||
|
||||
data class EnrichedEvent(val root: Event) {
|
||||
|
||||
val metadata = HashMap<String, Any>()
|
||||
@ -30,4 +32,8 @@ data class EnrichedEvent(val root: Event) {
|
||||
const val READ_RECEIPTS = "READ_RECEIPTS"
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
fun EnrichedEvent.roomMember(): RoomMember? {
|
||||
return getMetadata<Event>(EventType.STATE_ROOM_MEMBER)?.content<RoomMember>()
|
||||
}
|
||||
|
@ -1,37 +0,0 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -11,7 +11,6 @@ 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
|
||||
|
||||
@ -24,7 +23,6 @@ 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