diff --git a/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxRoom.kt b/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxRoom.kt index ef55b090b7..be74b9f21b 100644 --- a/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxRoom.kt +++ b/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxRoom.kt @@ -61,10 +61,10 @@ class RxRoom(private val room: Room) { } } - fun liveStateEvent(eventType: String): Observable> { - return room.getStateEventLive(eventType).asObservable() + fun liveStateEvent(eventType: String, stateKey: String): Observable> { + return room.getStateEventLive(eventType, stateKey).asObservable() .startWithCallable { - room.getStateEvent(eventType).toOptional() + room.getStateEvent(eventType, stateKey).toOptional() } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/state/StateService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/state/StateService.kt index 55bf816b7a..f7556f3ce2 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/state/StateService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/state/StateService.kt @@ -33,7 +33,7 @@ interface StateService { */ fun enableEncryption(algorithm: String, callback: MatrixCallback) - fun getStateEvent(eventType: String): Event? + fun getStateEvent(eventType: String, stateKey: String): Event? - fun getStateEventLive(eventType: String): LiveData> + fun getStateEventLive(eventType: String, stateKey: String): LiveData> } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/ChunkEntityHelper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/ChunkEntityHelper.kt index 1ae381e014..bccbea93d5 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/ChunkEntityHelper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/ChunkEntityHelper.kt @@ -16,9 +16,7 @@ package im.vector.matrix.android.internal.database.helper -import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.room.model.RoomMemberContent -import im.vector.matrix.android.internal.database.mapper.ContentMapper import im.vector.matrix.android.internal.database.model.ChunkEntity import im.vector.matrix.android.internal.database.model.CurrentStateEventEntityFields import im.vector.matrix.android.internal.database.model.EventAnnotationsSummaryEntity @@ -89,7 +87,7 @@ internal fun ChunkEntity.addStateEvent(roomId: String, stateEvent: EventEntity, internal fun ChunkEntity.addTimelineEvent(roomId: String, eventEntity: EventEntity, direction: PaginationDirection, - roomMemberEvent: EventEntity?) { + roomMemberContentsByUser: HashMap) { val eventId = eventEntity.eventId if (timelineEvents.find(eventId) != null) { @@ -128,12 +126,15 @@ internal fun ChunkEntity.addTimelineEvent(roomId: String, this.annotations = EventAnnotationsSummaryEntity.where(realm, eventId).findFirst() this.readReceipts = readReceiptsSummaryEntity this.displayIndex = displayIndex - if (roomMemberEvent != null) { - val roomMemberContent = ContentMapper.map(roomMemberEvent.content).toModel() - this.senderAvatar = roomMemberContent?.avatarUrl - this.senderName = roomMemberContent?.displayName - this.senderMembershipEventId = roomMemberEvent.eventId - } + + val roomMemberContent = roomMemberContentsByUser[senderId] + val isUnique = roomMemberContentsByUser.values.find { + roomMemberContent != it && + it?.displayName == roomMemberContent?.displayName + } == null + this.senderAvatar = roomMemberContent?.avatarUrl + this.senderName = roomMemberContent?.displayName + this.isUniqueDisplayName = isUnique } timelineEvents.add(timelineEventEntity) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/RoomEntityHelper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/RoomEntityHelper.kt index aa3490d2c4..81e4d30abe 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/RoomEntityHelper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/helper/RoomEntityHelper.kt @@ -16,14 +16,8 @@ package im.vector.matrix.android.internal.database.helper -import im.vector.matrix.android.api.session.events.model.Event -import im.vector.matrix.android.api.session.room.send.SendState -import im.vector.matrix.android.internal.database.mapper.toEntity import im.vector.matrix.android.internal.database.model.ChunkEntity import im.vector.matrix.android.internal.database.model.RoomEntity -import im.vector.matrix.android.internal.database.model.TimelineEventEntity -import im.vector.matrix.android.internal.session.room.membership.RoomMemberHelper -import io.realm.Realm internal fun RoomEntity.deleteOnCascade(chunkEntity: ChunkEntity) { chunks.remove(chunkEntity) @@ -35,21 +29,3 @@ internal fun RoomEntity.addOrUpdate(chunkEntity: ChunkEntity) { chunks.add(chunkEntity) } } - -internal fun RoomEntity.addSendingEvent(realm: Realm, event: Event) { - val senderId = event.senderId ?: return - val eventEntity = event.toEntity(roomId, SendState.UNSENT) - val roomMembers = RoomMemberHelper(realm, roomId) - val myUser = roomMembers.getLastRoomMember(senderId) - val localId = TimelineEventEntity.nextId(realm) - val timelineEventEntity = TimelineEventEntity(localId).also { - it.root = eventEntity - it.eventId = event.eventId ?: "" - it.roomId = roomId - it.senderName = myUser?.displayName - it.senderAvatar = myUser?.avatarUrl - it.isUniqueDisplayName = roomMembers.isUniqueDisplayName() - } - sendingTimelineEvents.add(0, timelineEventEntity) -} - diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/CurrentStateEventEntityQueries.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/CurrentStateEventEntityQueries.kt index 25dec57e46..0ca24b5ece 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/CurrentStateEventEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/CurrentStateEventEntityQueries.kt @@ -23,19 +23,23 @@ import io.realm.Realm import io.realm.RealmQuery import io.realm.kotlin.createObject -internal fun CurrentStateEventEntity.Companion.where(realm: Realm, roomId: String, stateKey: String, type: String): RealmQuery { +internal fun CurrentStateEventEntity.Companion.where(realm: Realm, roomId: String, type: String): RealmQuery { return realm.where(CurrentStateEventEntity::class.java) .equalTo(CurrentStateEventEntityFields.ROOM_ID, roomId) - .equalTo(CurrentStateEventEntityFields.STATE_KEY, stateKey) .equalTo(CurrentStateEventEntityFields.TYPE, type) } +internal fun CurrentStateEventEntity.Companion.whereStateKey(realm: Realm, roomId: String, type: String, stateKey: String): RealmQuery { + return where(realm = realm, roomId = roomId, type = type) + .equalTo(CurrentStateEventEntityFields.STATE_KEY, stateKey) +} + internal fun CurrentStateEventEntity.Companion.getOrNull(realm: Realm, roomId: String, stateKey: String, type: String): CurrentStateEventEntity? { - return where(realm, roomId, stateKey, type).findFirst() + return whereStateKey(realm = realm, roomId = roomId, type = type, stateKey = stateKey).findFirst() } internal fun CurrentStateEventEntity.Companion.getOrCreate(realm: Realm, roomId: String, stateKey: String, type: String): CurrentStateEventEntity { - return getOrNull(realm, roomId, stateKey, type) ?: create(realm, roomId, stateKey, type) + return getOrNull(realm = realm, roomId = roomId, stateKey = stateKey, type = type) ?: create(realm, roomId, stateKey, type) } private fun create(realm: Realm, roomId: String, stateKey: String, type: String): CurrentStateEventEntity { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomDisplayNameResolver.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomDisplayNameResolver.kt index 4056de1052..feb05a3275 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomDisplayNameResolver.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomDisplayNameResolver.kt @@ -129,7 +129,7 @@ internal class RoomDisplayNameResolver @Inject constructor(private val context: private fun resolveRoomMemberName(roomMemberSummary: RoomMemberSummaryEntity?, roomMemberHelper: RoomMemberHelper): String? { if (roomMemberSummary == null) return null - val isUnique = roomMemberHelper.isUniqueDisplayName() + val isUnique = roomMemberHelper.isUniqueDisplayName(roomMemberSummary.displayName) return if (isUnique) { roomMemberSummary.displayName } else { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomMemberHelper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomMemberHelper.kt index 094b4d2530..05f6fdff23 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomMemberHelper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomMemberHelper.kt @@ -18,9 +18,10 @@ package im.vector.matrix.android.internal.session.room.membership import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.room.model.Membership -import im.vector.matrix.android.internal.database.model.* +import im.vector.matrix.android.internal.database.model.CurrentStateEventEntity import im.vector.matrix.android.internal.database.model.EventEntity import im.vector.matrix.android.internal.database.model.RoomMemberSummaryEntity +import im.vector.matrix.android.internal.database.model.RoomMemberSummaryEntityFields import im.vector.matrix.android.internal.database.model.RoomSummaryEntity import im.vector.matrix.android.internal.database.query.getOrNull import im.vector.matrix.android.internal.database.query.where @@ -50,8 +51,14 @@ internal class RoomMemberHelper(private val realm: Realm, .findFirst() } - fun isUniqueDisplayName(): Boolean { - return false + fun isUniqueDisplayName(displayName: String?): Boolean { + if (displayName.isNullOrEmpty()) { + return true + } + return RoomMemberSummaryEntity.where(realm, roomId) + .equalTo(RoomMemberSummaryEntityFields.DISPLAY_NAME, displayName) + .findAll() + .size == 1 } fun queryRoomMembersEvent(): RealmQuery { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoRepository.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoRepository.kt index ab014596b0..a78ae3cdec 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoRepository.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoRepository.kt @@ -62,7 +62,7 @@ internal class LocalEchoRepository @Inject constructor(private val monarchy: Mon it.roomId = roomId it.senderName = myUser?.displayName it.senderAvatar = myUser?.avatarUrl - it.isUniqueDisplayName = roomMemberHelper.isUniqueDisplayName() + it.isUniqueDisplayName = roomMemberHelper.isUniqueDisplayName(myUser?.displayName) } roomEntity.sendingTimelineEvents.add(0, timelineEventEntity) roomSummaryUpdater.update(realm, roomId) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt index 9b027ede6f..efa698d3d4 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt @@ -31,7 +31,7 @@ import im.vector.matrix.android.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.model.CurrentStateEventEntity import im.vector.matrix.android.internal.database.query.getOrNull -import im.vector.matrix.android.internal.database.query.where +import im.vector.matrix.android.internal.database.query.whereStateKey import im.vector.matrix.android.internal.task.TaskExecutor import im.vector.matrix.android.internal.task.configureWith import io.realm.Realm @@ -48,15 +48,15 @@ internal class DefaultStateService @AssistedInject constructor(@Assisted private fun create(roomId: String): StateService } - override fun getStateEvent(eventType: String): Event? { + override fun getStateEvent(eventType: String, stateKey: String): Event? { return Realm.getInstance(monarchy.realmConfiguration).use { realm -> - CurrentStateEventEntity.getOrNull(realm, roomId, type = eventType, stateKey = "")?.root?.asDomain() + CurrentStateEventEntity.getOrNull(realm, roomId, type = eventType, stateKey = stateKey)?.root?.asDomain() } } - override fun getStateEventLive(eventType: String): LiveData> { + override fun getStateEventLive(eventType: String, stateKey: String): LiveData> { val liveData = monarchy.findAllMappedWithChanges( - { realm -> CurrentStateEventEntity.where(realm, roomId, type = eventType, stateKey = "") }, + { realm -> CurrentStateEventEntity.whereStateKey(realm, roomId, type = eventType, stateKey = "") }, { it.root?.asDomain() } ) return Transformations.map(liveData) { results -> diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TokenChunkEventPersistor.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TokenChunkEventPersistor.kt index 4362f5d84d..45b1cbc471 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TokenChunkEventPersistor.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TokenChunkEventPersistor.kt @@ -17,19 +17,20 @@ package im.vector.matrix.android.internal.session.room.timeline import com.zhuinden.monarchy.Monarchy -import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.events.model.EventType +import im.vector.matrix.android.api.session.events.model.toModel +import im.vector.matrix.android.api.session.room.model.RoomMemberContent import im.vector.matrix.android.api.session.room.send.SendState import im.vector.matrix.android.internal.database.helper.addOrUpdate import im.vector.matrix.android.internal.database.helper.addStateEvent import im.vector.matrix.android.internal.database.helper.addTimelineEvent import im.vector.matrix.android.internal.database.helper.deleteOnCascade import im.vector.matrix.android.internal.database.helper.merge -import im.vector.matrix.android.internal.database.mapper.asDomain +import im.vector.matrix.android.internal.database.mapper.ContentMapper import im.vector.matrix.android.internal.database.mapper.toEntity import im.vector.matrix.android.internal.database.model.ChunkEntity import im.vector.matrix.android.internal.database.model.CurrentStateEventEntity -import im.vector.matrix.android.internal.database.model.EventEntity +import im.vector.matrix.android.internal.database.model.CurrentStateEventEntityFields import im.vector.matrix.android.internal.database.model.RoomEntity import im.vector.matrix.android.internal.database.model.RoomSummaryEntity import im.vector.matrix.android.internal.database.model.TimelineEventEntity @@ -37,14 +38,11 @@ import im.vector.matrix.android.internal.database.query.create import im.vector.matrix.android.internal.database.query.find import im.vector.matrix.android.internal.database.query.findAllIncludingEvents import im.vector.matrix.android.internal.database.query.findLastLiveChunkFromRoom -import im.vector.matrix.android.internal.database.query.getOrNull import im.vector.matrix.android.internal.database.query.latestEvent import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.session.room.RoomSummaryUpdater import im.vector.matrix.android.internal.util.awaitTransaction import io.realm.Realm -import io.realm.RealmList -import io.realm.kotlin.createObject import timber.log.Timber import javax.inject.Inject @@ -193,24 +191,29 @@ internal class TokenChunkEventPersistor @Inject constructor(private val monarchy currentChunk: ChunkEntity ) { Timber.v("Add ${receivedChunk.events.size} events in chunk(${currentChunk.nextToken} | ${currentChunk.prevToken}") - val roomMemberEventsByUser = HashMap() - val eventList = if (direction == PaginationDirection.FORWARDS) { - receivedChunk.events - } else { - receivedChunk.events.asReversed() - } + val roomMemberContentsByUser = HashMap() + val eventList = receivedChunk.events val stateEvents = receivedChunk.stateEvents + + realm.where(CurrentStateEventEntity::class.java) + .equalTo(CurrentStateEventEntityFields.ROOM_ID, roomId) + .equalTo(CurrentStateEventEntityFields.TYPE, EventType.STATE_ROOM_MEMBER) + .findAll() + .forEach { + val roomMember = ContentMapper.map(it.root?.content).toModel() + roomMemberContentsByUser[it.stateKey] = roomMember + } + for (stateEvent in stateEvents) { val stateEventEntity = stateEvent.toEntity(roomId, SendState.SYNCED).let { realm.copyToRealmOrUpdate(it) } currentChunk.addStateEvent(roomId, stateEventEntity, direction) if (stateEvent.type == EventType.STATE_ROOM_MEMBER && stateEvent.stateKey != null && !stateEvent.isRedacted()) { - roomMemberEventsByUser[stateEvent.stateKey] = stateEventEntity + roomMemberContentsByUser[stateEvent.stateKey] = stateEvent.content.toModel() } } val eventIds = ArrayList(eventList.size) - val eventEntities = ArrayList(eventList.size) for (event in eventList) { if (event.eventId == null || event.senderId == null) { continue @@ -219,23 +222,16 @@ internal class TokenChunkEventPersistor @Inject constructor(private val monarchy val eventEntity = event.toEntity(roomId, SendState.SYNCED).let { realm.copyToRealmOrUpdate(it) } - if (direction == PaginationDirection.FORWARDS) { - eventEntities.add(eventEntity) - } else { - eventEntities.add(0, eventEntity) - } if (event.type == EventType.STATE_ROOM_MEMBER && event.stateKey != null && !event.isRedacted()) { - roomMemberEventsByUser[event.stateKey] = eventEntity + val contentToUse = if (direction == PaginationDirection.FORWARDS) { + event.content + } else { + event.prevContent + } + roomMemberContentsByUser[event.stateKey] = contentToUse.toModel() } + currentChunk.addTimelineEvent(roomId, eventEntity, direction, roomMemberContentsByUser) } - for (eventEntity in eventEntities) { - val senderId = eventEntity.sender ?: continue - val roomMemberEvent = roomMemberEventsByUser.getOrPut(senderId) { - CurrentStateEventEntity.getOrNull(realm, roomId, senderId, EventType.STATE_ROOM_MEMBER)?.root - } - currentChunk.addTimelineEvent(roomId, eventEntity, direction, roomMemberEvent) - } - val chunks = ChunkEntity.findAllIncludingEvents(realm, eventIds) val chunksToDelete = ArrayList() chunks.forEach { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt index 670529074e..9cf91ed28b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt @@ -21,20 +21,21 @@ import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.room.model.Membership +import im.vector.matrix.android.api.session.room.model.RoomMemberContent import im.vector.matrix.android.api.session.room.model.tag.RoomTagContent import im.vector.matrix.android.api.session.room.send.SendState import im.vector.matrix.android.internal.crypto.DefaultCryptoService -import im.vector.matrix.android.internal.database.helper.* -import im.vector.matrix.android.internal.database.mapper.asDomain +import im.vector.matrix.android.internal.database.helper.addOrUpdate +import im.vector.matrix.android.internal.database.helper.addTimelineEvent +import im.vector.matrix.android.internal.database.mapper.ContentMapper import im.vector.matrix.android.internal.database.mapper.toEntity import im.vector.matrix.android.internal.database.model.ChunkEntity import im.vector.matrix.android.internal.database.model.CurrentStateEventEntity -import im.vector.matrix.android.internal.database.model.EventEntity +import im.vector.matrix.android.internal.database.model.CurrentStateEventEntityFields import im.vector.matrix.android.internal.database.model.RoomEntity import im.vector.matrix.android.internal.database.query.find import im.vector.matrix.android.internal.database.query.findLastLiveChunkFromRoom import im.vector.matrix.android.internal.database.query.getOrCreate -import im.vector.matrix.android.internal.database.query.getOrNull import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.session.DefaultInitialSyncProgressService import im.vector.matrix.android.internal.session.mapWithProgress @@ -44,7 +45,11 @@ import im.vector.matrix.android.internal.session.room.read.FullyReadContent import im.vector.matrix.android.internal.session.room.timeline.DefaultTimeline import im.vector.matrix.android.internal.session.room.timeline.PaginationDirection import im.vector.matrix.android.internal.session.room.typing.TypingEventContent -import im.vector.matrix.android.internal.session.sync.model.* +import im.vector.matrix.android.internal.session.sync.model.InvitedRoomSync +import im.vector.matrix.android.internal.session.sync.model.RoomSync +import im.vector.matrix.android.internal.session.sync.model.RoomSyncAccountData +import im.vector.matrix.android.internal.session.sync.model.RoomSyncEphemeral +import im.vector.matrix.android.internal.session.sync.model.RoomsSyncResponse import io.realm.Realm import io.realm.kotlin.createObject import org.greenrobot.eventbus.EventBus @@ -211,7 +216,16 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle chunkEntity.isLastForward = true val eventIds = ArrayList(eventList.size) - val roomMemberEventsByUser = HashMap() + val roomMemberContentsByUser = HashMap() + + realm.where(CurrentStateEventEntity::class.java) + .equalTo(CurrentStateEventEntityFields.ROOM_ID, roomId) + .equalTo(CurrentStateEventEntityFields.TYPE, EventType.STATE_ROOM_MEMBER) + .findAll() + .forEach { + val roomMember = ContentMapper.map(it.root?.content).toModel() + roomMemberContentsByUser[it.stateKey] = roomMember + } for (event in eventList) { if (event.eventId == null || event.senderId == null) { @@ -227,14 +241,11 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle root = eventEntity } if (event.type == EventType.STATE_ROOM_MEMBER) { - roomMemberEventsByUser[event.stateKey] = eventEntity + roomMemberContentsByUser[event.stateKey] = event.content.toModel() roomMemberEventHandler.handle(realm, roomEntity.roomId, event) } } - val roomMemberEvent = roomMemberEventsByUser.getOrPut(event.senderId) { - CurrentStateEventEntity.getOrNull(realm, roomId, event.senderId, EventType.STATE_ROOM_MEMBER)?.root - } - chunkEntity.addTimelineEvent(roomId, eventEntity, PaginationDirection.FORWARDS, roomMemberEvent) + chunkEntity.addTimelineEvent(roomId, eventEntity, PaginationDirection.FORWARDS, roomMemberContentsByUser) // Give info to crypto module cryptoService.onLiveEvent(roomEntity.roomId, event) // Try to remove local echo diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt index 70f6745871..60443f6412 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt @@ -901,7 +901,7 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro setState { copy(asyncInviter = Success(it)) } } } - room.getStateEvent(EventType.STATE_ROOM_TOMBSTONE)?.also { + room.getStateEvent(EventType.STATE_ROOM_TOMBSTONE, "")?.also { setState { copy(tombstoneEvent = it) } } } diff --git a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewModel.kt b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewModel.kt index 88f394e865..e4a15724b4 100644 --- a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewModel.kt @@ -147,7 +147,7 @@ class RoomMemberProfileViewModel @AssistedInject constructor(@Assisted private v private fun observeRoomSummaryAndPowerLevels(room: Room) { val roomSummaryLive = room.rx().liveRoomSummary().unwrap() - val powerLevelsContentLive = room.rx().liveStateEvent(EventType.STATE_ROOM_POWER_LEVELS) + val powerLevelsContentLive = room.rx().liveStateEvent(EventType.STATE_ROOM_POWER_LEVELS, "") .mapOptional { it.content.toModel() } .unwrap() diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt index 42ef8f285d..c27afaceb0 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt @@ -72,7 +72,7 @@ class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState .combineLatest, PowerLevelsContent, RoomMemberSummaries>( room.rx().liveRoomMembers(roomMemberQueryParams), room.rx() - .liveStateEvent(EventType.STATE_ROOM_POWER_LEVELS) + .liveStateEvent(EventType.STATE_ROOM_POWER_LEVELS, "") .mapOptional { it.content.toModel() } .unwrap(), BiFunction { roomMembers, powerLevelsContent ->