Merge pull request #1534 from vector-im/feature/fix_agelocalts_paginate

Pagination do not set ageLocalTs
This commit is contained in:
Valere 2020-06-26 14:40:09 +02:00 committed by GitHub
commit 84272f5b5d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 18 deletions

View File

@ -93,7 +93,7 @@ internal fun EventEntity.asDomain(): Event {
return EventMapper.map(this) return EventMapper.map(this)
} }
internal fun Event.toEntity(roomId: String, sendState: SendState, ageLocalTs: Long? = null): EventEntity { internal fun Event.toEntity(roomId: String, sendState: SendState, ageLocalTs: Long?): EventEntity {
return EventMapper.map(this, roomId).apply { return EventMapper.map(this, roomId).apply {
this.sendState = sendState this.sendState = sendState
this.ageLocalTs = ageLocalTs this.ageLocalTs = ageLocalTs

View File

@ -70,12 +70,13 @@ internal class DefaultLoadRoomMembersTask @Inject constructor(
// We ignore all the already known members // We ignore all the already known members
val roomEntity = RoomEntity.where(realm, roomId).findFirst() val roomEntity = RoomEntity.where(realm, roomId).findFirst()
?: realm.createObject(roomId) ?: realm.createObject(roomId)
val now = System.currentTimeMillis()
for (roomMemberEvent in response.roomMemberEvents) { for (roomMemberEvent in response.roomMemberEvents) {
if (roomMemberEvent.eventId == null || roomMemberEvent.stateKey == null) { if (roomMemberEvent.eventId == null || roomMemberEvent.stateKey == null) {
continue continue
} }
val eventEntity = roomMemberEvent.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) val ageLocalTs = roomMemberEvent.unsignedData?.age?.let { now - it }
val eventEntity = roomMemberEvent.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm)
CurrentStateEventEntity.getOrCreate(realm, roomId, roomMemberEvent.stateKey, roomMemberEvent.type).apply { CurrentStateEventEntity.getOrCreate(realm, roomId, roomMemberEvent.stateKey, roomMemberEvent.type).apply {
eventId = roomMemberEvent.eventId eventId = roomMemberEvent.eventId
root = eventEntity root = eventEntity

View File

@ -55,7 +55,7 @@ internal class LocalEchoRepository @Inject constructor(@SessionDatabase private
throw IllegalStateException("You should have set an eventId for your event") throw IllegalStateException("You should have set an eventId for your event")
} }
val timelineEventEntity = Realm.getInstance(monarchy.realmConfiguration).use { realm -> val timelineEventEntity = Realm.getInstance(monarchy.realmConfiguration).use { realm ->
val eventEntity = event.toEntity(roomId, SendState.UNSENT) val eventEntity = event.toEntity(roomId, SendState.UNSENT, System.currentTimeMillis())
val roomMemberHelper = RoomMemberHelper(realm, roomId) val roomMemberHelper = RoomMemberHelper(realm, roomId)
val myUser = roomMemberHelper.getLastRoomMember(senderId) val myUser = roomMemberHelper.getLastRoomMember(senderId)
val localId = TimelineEventEntity.nextId(realm) val localId = TimelineEventEntity.nextId(realm)

View File

@ -200,8 +200,11 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
val eventList = receivedChunk.events val eventList = receivedChunk.events
val stateEvents = receivedChunk.stateEvents val stateEvents = receivedChunk.stateEvents
val now = System.currentTimeMillis()
for (stateEvent in stateEvents) { for (stateEvent in stateEvents) {
val stateEventEntity = stateEvent.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) val ageLocalTs = stateEvent.unsignedData?.age?.let { now - it }
val stateEventEntity = stateEvent.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm)
currentChunk.addStateEvent(roomId, stateEventEntity, direction) currentChunk.addStateEvent(roomId, stateEventEntity, direction)
if (stateEvent.type == EventType.STATE_ROOM_MEMBER && stateEvent.stateKey != null) { if (stateEvent.type == EventType.STATE_ROOM_MEMBER && stateEvent.stateKey != null) {
roomMemberContentsByUser[stateEvent.stateKey] = stateEvent.content.toModel<RoomMemberContent>() roomMemberContentsByUser[stateEvent.stateKey] = stateEvent.content.toModel<RoomMemberContent>()
@ -212,8 +215,9 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
if (event.eventId == null || event.senderId == null) { if (event.eventId == null || event.senderId == null) {
continue continue
} }
val ageLocalTs = event.unsignedData?.age?.let { now - it }
eventIds.add(event.eventId) eventIds.add(event.eventId)
val eventEntity = event.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm)
if (event.type == EventType.STATE_ROOM_MEMBER && event.stateKey != null) { if (event.type == EventType.STATE_ROOM_MEMBER && event.stateKey != null) {
val contentToUse = if (direction == PaginationDirection.BACKWARDS) { val contentToUse = if (direction == PaginationDirection.BACKWARDS) {
event.prevContent event.prevContent

View File

@ -102,12 +102,12 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
} }
is HandlingStrategy.INVITED -> is HandlingStrategy.INVITED ->
handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_invited_rooms, 0.1f) { handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_invited_rooms, 0.1f) {
handleInvitedRoom(realm, it.key, it.value) handleInvitedRoom(realm, it.key, it.value, syncLocalTimeStampMillis)
} }
is HandlingStrategy.LEFT -> { is HandlingStrategy.LEFT -> {
handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_left_rooms, 0.3f) { handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_left_rooms, 0.3f) {
handleLeftRoom(realm, it.key, it.value) handleLeftRoom(realm, it.key, it.value, syncLocalTimeStampMillis)
} }
} }
} }
@ -143,7 +143,8 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
if (event.eventId == null || event.stateKey == null) { if (event.eventId == null || event.stateKey == null) {
continue continue
} }
val eventEntity = event.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it }
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm)
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply { CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
eventId = event.eventId eventId = event.eventId
root = eventEntity root = eventEntity
@ -185,21 +186,23 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
private fun handleInvitedRoom(realm: Realm, private fun handleInvitedRoom(realm: Realm,
roomId: String, roomId: String,
roomSync: InvitedRoomSync): RoomEntity { roomSync: InvitedRoomSync,
syncLocalTimestampMillis: Long): RoomEntity {
Timber.v("Handle invited sync for room $roomId") Timber.v("Handle invited sync for room $roomId")
val roomEntity = RoomEntity.where(realm, roomId).findFirst() ?: realm.createObject(roomId) val roomEntity = RoomEntity.where(realm, roomId).findFirst() ?: realm.createObject(roomId)
roomEntity.membership = Membership.INVITE roomEntity.membership = Membership.INVITE
if (roomSync.inviteState != null && roomSync.inviteState.events.isNotEmpty()) { if (roomSync.inviteState != null && roomSync.inviteState.events.isNotEmpty()) {
roomSync.inviteState.events.forEach { roomSync.inviteState.events.forEach { event ->
if (it.stateKey == null) { if (event.stateKey == null) {
return@forEach return@forEach
} }
val eventEntity = it.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it }
CurrentStateEventEntity.getOrCreate(realm, roomId, it.stateKey, it.type).apply { val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm)
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
eventId = eventEntity.eventId eventId = eventEntity.eventId
root = eventEntity root = eventEntity
} }
roomMemberEventHandler.handle(realm, roomId, it) roomMemberEventHandler.handle(realm, roomId, event)
} }
} }
val inviterEvent = roomSync.inviteState?.events?.lastOrNull { val inviterEvent = roomSync.inviteState?.events?.lastOrNull {
@ -211,13 +214,15 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
private fun handleLeftRoom(realm: Realm, private fun handleLeftRoom(realm: Realm,
roomId: String, roomId: String,
roomSync: RoomSync): RoomEntity { roomSync: RoomSync,
syncLocalTimestampMillis: Long): RoomEntity {
val roomEntity = RoomEntity.where(realm, roomId).findFirst() ?: realm.createObject(roomId) val roomEntity = RoomEntity.where(realm, roomId).findFirst() ?: realm.createObject(roomId)
for (event in roomSync.state?.events.orEmpty()) { for (event in roomSync.state?.events.orEmpty()) {
if (event.eventId == null || event.stateKey == null) { if (event.eventId == null || event.stateKey == null) {
continue continue
} }
val eventEntity = event.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it }
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm)
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply { CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
eventId = event.eventId eventId = event.eventId
root = eventEntity root = eventEntity
@ -228,7 +233,8 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
if (event.eventId == null || event.senderId == null) { if (event.eventId == null || event.senderId == null) {
continue continue
} }
val eventEntity = event.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it }
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm)
if (event.stateKey != null) { if (event.stateKey != null) {
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply { CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
eventId = event.eventId eventId = event.eventId