From 981c9ac4ac59a6e252d6ed4c4642b68f5510c645 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 21 Feb 2020 13:56:15 +0100 Subject: [PATCH 01/10] Invite sync: assign eventId and remove the primaryKey constraint --- .../api/session/room/model/RoomSummary.kt | 5 ++- .../internal/database/mapper/EventMapper.kt | 3 +- .../database/mapper/RoomSummaryMapper.kt | 3 +- .../internal/database/model/EventEntity.kt | 2 +- .../database/model/RoomSummaryEntity.kt | 3 +- .../database/query/EventEntityQueries.kt | 7 ++++ .../session/room/RoomSummaryUpdater.kt | 4 ++- .../room/membership/LoadRoomMembersTask.kt | 5 ++- .../room/timeline/TokenChunkEventPersistor.kt | 9 ++--- .../internal/session/sync/RoomSyncHandler.kt | 33 ++++++++++--------- .../home/room/detail/RoomDetailViewModel.kt | 4 +-- .../home/room/list/RoomSummaryItemFactory.kt | 4 +-- 12 files changed, 48 insertions(+), 34 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt index 28c56125f1..3cba06fcac 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt @@ -45,7 +45,8 @@ data class RoomSummary constructor( val versioningState: VersioningState = VersioningState.NONE, val readMarkerId: String? = null, val userDrafts: List = emptyList(), - var isEncrypted: Boolean, + val isEncrypted: Boolean, + val inviterId: String? = null, val typingRoomMemberIds: List = emptyList(), val breadcrumbsIndex: Int = NOT_IN_BREADCRUMBS, // TODO Plug it @@ -62,3 +63,5 @@ data class RoomSummary constructor( const val NOT_IN_BREADCRUMBS = -1 } } + + diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt index 75eb61274d..3793b3c33f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt @@ -32,7 +32,8 @@ internal object EventMapper { val uds = if (event.unsignedData == null) null else MoshiProvider.providesMoshi().adapter(UnsignedData::class.java).toJson(event.unsignedData) val eventEntity = EventEntity() - eventEntity.eventId = event.eventId ?: "" + //TODO change this as we shouldn't use event everywhere + eventEntity.eventId = event.eventId ?: "$roomId-${System.currentTimeMillis()}-${event.hashCode()}" eventEntity.roomId = event.roomId ?: roomId eventEntity.content = ContentMapper.map(event.content) val resolvedPrevContent = event.prevContent ?: event.unsignedData?.prevContent diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt index 617dc6acfa..de01aab4e8 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt @@ -77,7 +77,8 @@ internal class RoomSummaryMapper @Inject constructor( isEncrypted = roomSummaryEntity.isEncrypted, typingRoomMemberIds = roomSummaryEntity.typingUserIds.toList(), breadcrumbsIndex = roomSummaryEntity.breadcrumbsIndex, - roomEncryptionTrustLevel = roomSummaryEntity.roomEncryptionTrustLevel + roomEncryptionTrustLevel = roomSummaryEntity.roomEncryptionTrustLevel, + inviterId = roomSummaryEntity.inviterId ) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt index d7bb49b1fe..b8e2954e3f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt @@ -24,7 +24,7 @@ import io.realm.RealmObject import io.realm.annotations.Index import io.realm.annotations.PrimaryKey -internal open class EventEntity(@PrimaryKey var eventId: String = "", +internal open class EventEntity(@Index var eventId: String = "", @Index var roomId: String = "", @Index var type: String = "", var content: String? = null, diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt index c4ebe3cbaa..7009e762fb 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt @@ -49,7 +49,8 @@ internal open class RoomSummaryEntity( var flatAliases: String = "", var isEncrypted: Boolean = false, var typingUserIds: RealmList = RealmList(), - var roomEncryptionTrustLevelStr: String? = null + var roomEncryptionTrustLevelStr: String? = null, + var inviterId: String? = null ) : RealmObject() { private var membershipStr: String = Membership.NONE.name diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/EventEntityQueries.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/EventEntityQueries.kt index 59908aa990..d998c41ccb 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/EventEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/EventEntityQueries.kt @@ -23,6 +23,13 @@ import io.realm.RealmList import io.realm.RealmQuery import io.realm.kotlin.where +internal fun EventEntity.copyToRealmOrIgnore(realm: Realm): EventEntity { + return realm.where() + .equalTo(EventEntityFields.EVENT_ID, eventId) + .equalTo(EventEntityFields.ROOM_ID, roomId) + .findFirst() ?: realm.copyToRealm(this) +} + internal fun EventEntity.Companion.where(realm: Realm, eventId: String): RealmQuery { return realm.where() .equalTo(EventEntityFields.EVENT_ID, eventId) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt index a441d17196..864f25cf12 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt @@ -81,7 +81,8 @@ internal class RoomSummaryUpdater @Inject constructor( roomSummary: RoomSyncSummary? = null, unreadNotifications: RoomSyncUnreadNotifications? = null, updateMembers: Boolean = false, - ephemeralResult: RoomSyncHandler.EphemeralResult? = null) { + ephemeralResult: RoomSyncHandler.EphemeralResult? = null, + inviterId: String? = null) { val roomSummaryEntity = RoomSummaryEntity.getOrCreate(realm, roomId) if (roomSummary != null) { if (roomSummary.heroes.isNotEmpty()) { @@ -133,6 +134,7 @@ internal class RoomSummaryUpdater @Inject constructor( roomSummaryEntity.isEncrypted = encryptionEvent != null roomSummaryEntity.typingUserIds.clear() roomSummaryEntity.typingUserIds.addAll(ephemeralResult?.typingUserIds.orEmpty()) + roomSummaryEntity.inviterId = inviterId if (updateMembers) { val otherRoomMembers = RoomMemberHelper(realm, roomId) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/LoadRoomMembersTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/LoadRoomMembersTask.kt index 5dfe54a7bb..41993c323a 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/LoadRoomMembersTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/LoadRoomMembersTask.kt @@ -22,6 +22,7 @@ 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.CurrentStateEventEntity import im.vector.matrix.android.internal.database.model.RoomEntity +import im.vector.matrix.android.internal.database.query.copyToRealmOrIgnore import im.vector.matrix.android.internal.database.query.getOrCreate import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.network.executeRequest @@ -73,9 +74,7 @@ internal class DefaultLoadRoomMembersTask @Inject constructor( if (roomMemberEvent.eventId == null || roomMemberEvent.stateKey == null) { continue } - val eventEntity = roomMemberEvent.toEntity(roomId, SendState.SYNCED).let { - realm.copyToRealmOrUpdate(it) - } + val eventEntity = roomMemberEvent.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) CurrentStateEventEntity.getOrCreate(realm, roomId, roomMemberEvent.stateKey, roomMemberEvent.type).apply { eventId = roomMemberEvent.eventId root = eventEntity 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 41920158c4..164626224b 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 @@ -31,6 +31,7 @@ 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.RoomSummaryEntity import im.vector.matrix.android.internal.database.model.TimelineEventEntity +import im.vector.matrix.android.internal.database.query.copyToRealmOrIgnore 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 @@ -199,9 +200,7 @@ internal class TokenChunkEventPersistor @Inject constructor(private val monarchy val stateEvents = receivedChunk.stateEvents for (stateEvent in stateEvents) { - val stateEventEntity = stateEvent.toEntity(roomId, SendState.SYNCED).let { - realm.copyToRealmOrUpdate(it) - } + val stateEventEntity = stateEvent.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) currentChunk.addStateEvent(roomId, stateEventEntity, direction) if (stateEvent.type == EventType.STATE_ROOM_MEMBER && stateEvent.stateKey != null) { roomMemberContentsByUser[stateEvent.stateKey] = stateEvent.content.toModel() @@ -213,9 +212,7 @@ internal class TokenChunkEventPersistor @Inject constructor(private val monarchy continue } eventIds.add(event.eventId) - val eventEntity = event.toEntity(roomId, SendState.SYNCED).let { - realm.copyToRealmOrUpdate(it) - } + val eventEntity = event.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) if (event.type == EventType.STATE_ROOM_MEMBER && event.stateKey != null) { val contentToUse = if (direction == PaginationDirection.BACKWARDS) { event.prevContent 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 ab2c9a48a6..2ab9c07ec7 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 @@ -32,6 +32,7 @@ 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.RoomEntity +import im.vector.matrix.android.internal.database.query.copyToRealmOrIgnore 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 @@ -93,7 +94,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle } is HandlingStrategy.INVITED -> handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_invited_rooms, 0.1f) { - handleInvitedRoom(realm, it.key, it.value, syncLocalTimeStampMillis) + handleInvitedRoom(realm, it.key, it.value) } is HandlingStrategy.LEFT -> { @@ -134,9 +135,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle if (event.eventId == null || event.stateKey == null) { continue } - val eventEntity = event.toEntity(roomId, SendState.SYNCED).let { - realm.copyToRealmOrUpdate(it) - } + val eventEntity = event.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply { eventId = event.eventId root = eventEntity @@ -177,19 +176,26 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle private fun handleInvitedRoom(realm: Realm, roomId: String, - roomSync: InvitedRoomSync, - syncLocalTimestampMillis: Long): RoomEntity { + roomSync: InvitedRoomSync): RoomEntity { Timber.v("Handle invited sync for room $roomId") val roomEntity = RoomEntity.where(realm, roomId).findFirst() ?: realm.createObject(roomId) roomEntity.membership = Membership.INVITE if (roomSync.inviteState != null && roomSync.inviteState.events.isNotEmpty()) { - val chunkEntity = handleTimelineEvents(realm, roomId, roomEntity, roomSync.inviteState.events, syncLocalTimestampMillis = syncLocalTimestampMillis) - roomEntity.addOrUpdate(chunkEntity) + roomSync.inviteState.events.forEach { + if (it.stateKey == null) { + return@forEach + } + val eventEntity = it.toEntity(roomId, SendState.SYNCED).copyToRealmOrIgnore(realm) + CurrentStateEventEntity.getOrCreate(realm, roomId, it.stateKey, it.type).apply { + eventId = eventEntity.eventId + root = eventEntity + } + } } - val hasRoomMember = roomSync.inviteState?.events?.firstOrNull { + val inviterEvent = roomSync.inviteState?.events?.lastOrNull { it.type == EventType.STATE_ROOM_MEMBER - } != null - roomSummaryUpdater.update(realm, roomId, Membership.INVITE, updateMembers = hasRoomMember) + } + roomSummaryUpdater.update(realm, roomId, Membership.INVITE, updateMembers = true, inviterId = inviterEvent?.senderId) return roomEntity } @@ -197,7 +203,6 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle roomId: String, roomSync: RoomSync): RoomEntity { val roomEntity = RoomEntity.where(realm, roomId).findFirst() ?: realm.createObject(roomId) - roomEntity.membership = Membership.LEAVE roomEntity.chunks.deleteAllFromRealm() roomSummaryUpdater.update(realm, roomId, Membership.LEAVE, roomSync.summary, roomSync.unreadNotifications) @@ -229,9 +234,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle } eventIds.add(event.eventId) val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } - val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).let { - realm.copyToRealmOrUpdate(it) - } + val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm) if (event.isStateEvent() && event.stateKey != null) { CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply { eventId = event.eventId 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 4e112ab6dc..8a231fb25d 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 @@ -950,8 +950,8 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro private fun observeSummaryState() { asyncSubscribe(RoomDetailViewState::asyncRoomSummary) { summary -> if (summary.membership == Membership.INVITE) { - summary.latestPreviewableEvent?.root?.senderId?.let { senderId -> - session.getUser(senderId) + summary.inviterId?.let { inviterId -> + session.getUser(inviterId) }?.also { setState { copy(asyncInviter = Success(it)) } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt index baa93f96e3..7d8cf0b6c1 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt @@ -60,9 +60,9 @@ class RoomSummaryItemFactory @Inject constructor(private val displayableEventFor rejectingErrorRoomsIds: Set, listener: RoomSummaryController.Listener?): VectorEpoxyModel<*> { val secondLine = if (roomSummary.isDirect) { - roomSummary.latestPreviewableEvent?.root?.senderId + roomSummary.inviterId } else { - roomSummary.latestPreviewableEvent?.root?.senderId?.let { + roomSummary.inviterId?.let { stringProvider.getString(R.string.invited_by, it) } } From 9cdb1da614e777136c95df6ed4f2a1de381037b3 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 21 Feb 2020 13:56:39 +0100 Subject: [PATCH 02/10] Start fixing notif for invites --- .../notifications/NotifiableEventResolver.kt | 12 ++++++------ .../notifications/NotificationDrawerManager.kt | 7 +++---- .../features/notifications/NotificationUtils.kt | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/notifications/NotifiableEventResolver.kt b/vector/src/main/java/im/vector/riotx/features/notifications/NotifiableEventResolver.kt index 6f881f2b8e..1f9f54127b 100644 --- a/vector/src/main/java/im/vector/riotx/features/notifications/NotifiableEventResolver.kt +++ b/vector/src/main/java/im/vector/riotx/features/notifications/NotifiableEventResolver.kt @@ -51,20 +51,20 @@ class NotifiableEventResolver @Inject constructor(private val stringProvider: St fun resolveEvent(event: Event/*, roomState: RoomState?, bingRule: PushRule?*/, session: Session): NotifiableEvent? { val roomID = event.roomId ?: return null val eventId = event.eventId ?: return null + if (event.getClearType() == EventType.STATE_ROOM_MEMBER) { + return resolveStateRoomEvent(event, session) + } val timelineEvent = session.getRoom(roomID)?.getTimeLineEvent(eventId) ?: return null when (event.getClearType()) { - EventType.MESSAGE -> { + EventType.MESSAGE -> { return resolveMessageEvent(timelineEvent, session) } - EventType.ENCRYPTED -> { + EventType.ENCRYPTED -> { val messageEvent = resolveMessageEvent(timelineEvent, session) messageEvent?.lockScreenVisibility = NotificationCompat.VISIBILITY_PRIVATE return messageEvent } - EventType.STATE_ROOM_MEMBER -> { - return resolveStateRoomEvent(event, session) - } - else -> { + else -> { // If the event can be displayed, display it as is Timber.w("NotifiableEventResolver Received an unsupported event matching a bing rule") // TODO Better event text display diff --git a/vector/src/main/java/im/vector/riotx/features/notifications/NotificationDrawerManager.kt b/vector/src/main/java/im/vector/riotx/features/notifications/NotificationDrawerManager.kt index 24ae0e722a..8173d24550 100644 --- a/vector/src/main/java/im/vector/riotx/features/notifications/NotificationDrawerManager.kt +++ b/vector/src/main/java/im/vector/riotx/features/notifications/NotificationDrawerManager.kt @@ -130,9 +130,9 @@ class NotificationDrawerManager @Inject constructor(private val context: Context fun onEventRedacted(eventId: String) { synchronized(eventList) { - eventList.filter { it.eventId == eventId }.map { notifiableEvent -> - notifiableEvent.isRedacted = true - notifiableEvent.hasBeenDisplayed = false + eventList.find { it.eventId == eventId }?.apply { + isRedacted = true + hasBeenDisplayed = false } } } @@ -182,7 +182,6 @@ class NotificationDrawerManager @Inject constructor(private val context: Context e is InviteNotifiableEvent && e.roomId == roomId } } - notificationUtils.cancelNotificationMessage(roomId, ROOM_INVITATION_NOTIFICATION_ID) } diff --git a/vector/src/main/java/im/vector/riotx/features/notifications/NotificationUtils.kt b/vector/src/main/java/im/vector/riotx/features/notifications/NotificationUtils.kt index 7d8e43d0be..ff0947598f 100755 --- a/vector/src/main/java/im/vector/riotx/features/notifications/NotificationUtils.kt +++ b/vector/src/main/java/im/vector/riotx/features/notifications/NotificationUtils.kt @@ -515,7 +515,7 @@ class NotificationUtils @Inject constructor(private val context: Context, val joinIntent = Intent(context, NotificationBroadcastReceiver::class.java) joinIntent.action = JOIN_ACTION joinIntent.data = Uri.parse("foobar://$roomId&$matrixId") - rejectIntent.putExtra(NotificationBroadcastReceiver.KEY_ROOM_ID, roomId) + joinIntent.putExtra(NotificationBroadcastReceiver.KEY_ROOM_ID, roomId) val joinIntentPendingIntent = PendingIntent.getBroadcast(context, System.currentTimeMillis().toInt(), joinIntent, PendingIntent.FLAG_UPDATE_CURRENT) addAction( From 133d8d7f147643ed7db20d745f029026f4e3a044 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 21 Feb 2020 14:03:11 +0100 Subject: [PATCH 03/10] RoomList: fix joining/rejecting state --- .../features/home/room/list/RoomListViewModel.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt index 7886bf844b..cc1970dadc 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt @@ -101,7 +101,18 @@ class RoomListViewModel @Inject constructor(initialState: RoomListViewState, .observeOn(Schedulers.computation()) .map { buildRoomSummaries(it) } .execute { async -> - copy(asyncFilteredRooms = async) + val invitedRooms = async()?.get(RoomCategory.INVITE)?.map { it.roomId } ?: emptyList() + val remainingJoining = joiningRoomsIds.intersect(invitedRooms) + val remainingRejecting = rejectingRoomsIds.intersect(invitedRooms) + val remainingRejectErrors = rejectingErrorRoomsIds.intersect(invitedRooms) + val remainingJoinErrors = joiningErrorRoomsIds.intersect(invitedRooms) + copy( + asyncFilteredRooms = async, + joiningRoomsIds = remainingJoining, + rejectingRoomsIds = remainingRejecting, + rejectingErrorRoomsIds = remainingRejectErrors, + joiningErrorRoomsIds = remainingJoinErrors + ) } } @@ -229,7 +240,6 @@ class RoomListViewModel @Inject constructor(initialState: RoomListViewState, else -> groupRooms.add(room) } } - return RoomSummaries().apply { put(RoomCategory.INVITE, invites) put(RoomCategory.FAVOURITE, favourites) From 8b0305c91d8eb6f7512ff92689a0387842e36d03 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 21 Feb 2020 14:04:33 +0100 Subject: [PATCH 04/10] Clean code --- .../vector/matrix/android/api/session/room/model/RoomSummary.kt | 2 -- .../matrix/android/internal/database/mapper/EventMapper.kt | 2 +- .../matrix/android/internal/database/model/EventEntity.kt | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt index 3cba06fcac..6171b2633b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt @@ -63,5 +63,3 @@ data class RoomSummary constructor( const val NOT_IN_BREADCRUMBS = -1 } } - - diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt index 3793b3c33f..575f78edaf 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt @@ -32,7 +32,7 @@ internal object EventMapper { val uds = if (event.unsignedData == null) null else MoshiProvider.providesMoshi().adapter(UnsignedData::class.java).toJson(event.unsignedData) val eventEntity = EventEntity() - //TODO change this as we shouldn't use event everywhere + // TODO change this as we shouldn't use event everywhere eventEntity.eventId = event.eventId ?: "$roomId-${System.currentTimeMillis()}-${event.hashCode()}" eventEntity.roomId = event.roomId ?: roomId eventEntity.content = ContentMapper.map(event.content) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt index b8e2954e3f..72015afc43 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/EventEntity.kt @@ -22,7 +22,6 @@ import im.vector.matrix.android.internal.crypto.algorithms.olm.OlmDecryptionResu import im.vector.matrix.android.internal.di.MoshiProvider import io.realm.RealmObject import io.realm.annotations.Index -import io.realm.annotations.PrimaryKey internal open class EventEntity(@Index var eventId: String = "", @Index var roomId: String = "", From b694721728ec287a76992df0c66ce83e10f753c8 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 21 Feb 2020 14:06:05 +0100 Subject: [PATCH 05/10] Update CHANGES --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 709e347bf0..21c5dba8bb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -19,6 +19,7 @@ Bugfix 🐛: - Fix rotation of full-size image (#647) - Fix joining rooms from directory via federation isn't working. (#808) - Leaving a room creates a stuck "leaving room" loading screen. (#1041) + - Fix some invitation handling issues Translations 🗣: - From 9c566b19f7808865e2f89d7360c9ffa49626a5e7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 24 Feb 2020 17:35:43 +0100 Subject: [PATCH 06/10] Ensure all eventId start with `$`, even ids for local echo --- .../vector/matrix/android/api/session/events/model/LocalEcho.kt | 2 +- .../matrix/android/internal/database/mapper/EventMapper.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/LocalEcho.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/LocalEcho.kt index 1dbee475e0..67ae3b2d73 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/LocalEcho.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/LocalEcho.kt @@ -20,7 +20,7 @@ import java.util.UUID object LocalEcho { - private const val PREFIX = "local." + private const val PREFIX = "\$local." fun isLocalEchoId(eventId: String) = eventId.startsWith(PREFIX) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt index 575f78edaf..e6a082c720 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/EventMapper.kt @@ -33,7 +33,7 @@ internal object EventMapper { else MoshiProvider.providesMoshi().adapter(UnsignedData::class.java).toJson(event.unsignedData) val eventEntity = EventEntity() // TODO change this as we shouldn't use event everywhere - eventEntity.eventId = event.eventId ?: "$roomId-${System.currentTimeMillis()}-${event.hashCode()}" + eventEntity.eventId = event.eventId ?: "$$roomId-${System.currentTimeMillis()}-${event.hashCode()}" eventEntity.roomId = event.roomId ?: roomId eventEntity.content = ContentMapper.map(event.content) val resolvedPrevContent = event.prevContent ?: event.unsignedData?.prevContent From 10239828589c1251a66c62f81b9b327a62066452 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 24 Feb 2020 17:40:28 +0100 Subject: [PATCH 07/10] Code readability --- .../riotx/features/home/room/list/RoomListViewModel.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt index cc1970dadc..81c75ed1d7 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt @@ -101,17 +101,17 @@ class RoomListViewModel @Inject constructor(initialState: RoomListViewState, .observeOn(Schedulers.computation()) .map { buildRoomSummaries(it) } .execute { async -> - val invitedRooms = async()?.get(RoomCategory.INVITE)?.map { it.roomId } ?: emptyList() + val invitedRooms = async()?.get(RoomCategory.INVITE)?.map { it.roomId }.orEmpty() val remainingJoining = joiningRoomsIds.intersect(invitedRooms) + val remainingJoinErrors = joiningErrorRoomsIds.intersect(invitedRooms) val remainingRejecting = rejectingRoomsIds.intersect(invitedRooms) val remainingRejectErrors = rejectingErrorRoomsIds.intersect(invitedRooms) - val remainingJoinErrors = joiningErrorRoomsIds.intersect(invitedRooms) copy( asyncFilteredRooms = async, joiningRoomsIds = remainingJoining, + joiningErrorRoomsIds = remainingJoinErrors, rejectingRoomsIds = remainingRejecting, - rejectingErrorRoomsIds = remainingRejectErrors, - joiningErrorRoomsIds = remainingJoinErrors + rejectingErrorRoomsIds = remainingRejectErrors ) } } From d710a5955485035087dff32ecd2e183468af75a3 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 24 Feb 2020 17:44:51 +0100 Subject: [PATCH 08/10] Update change log --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 21c5dba8bb..90246416af 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -19,7 +19,7 @@ Bugfix 🐛: - Fix rotation of full-size image (#647) - Fix joining rooms from directory via federation isn't working. (#808) - Leaving a room creates a stuck "leaving room" loading screen. (#1041) - - Fix some invitation handling issues + - Fix some invitation handling issues (#1013) Translations 🗣: - From 483256093aadf319ff0e8e284280dd6484e71756 Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 24 Feb 2020 18:27:18 +0100 Subject: [PATCH 09/10] Invite: fix room member not saved --- .../matrix/android/internal/session/sync/RoomSyncHandler.kt | 1 + 1 file changed, 1 insertion(+) 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 2ab9c07ec7..5b7c39a3d9 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 @@ -190,6 +190,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle eventId = eventEntity.eventId root = eventEntity } + roomMemberEventHandler.handle(realm, roomId, it) } } val inviterEvent = roomSync.inviteState?.events?.lastOrNull { From 19b9617a09e604aa2ddb4e3c11252e81afa365fd Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 25 Feb 2020 10:53:47 +0100 Subject: [PATCH 10/10] Invite: fix inviterId being overrided --- .../android/internal/session/room/RoomSummaryUpdater.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt index 864f25cf12..e6e2b16477 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt @@ -134,7 +134,12 @@ internal class RoomSummaryUpdater @Inject constructor( roomSummaryEntity.isEncrypted = encryptionEvent != null roomSummaryEntity.typingUserIds.clear() roomSummaryEntity.typingUserIds.addAll(ephemeralResult?.typingUserIds.orEmpty()) - roomSummaryEntity.inviterId = inviterId + + if (roomSummaryEntity.membership == Membership.INVITE && inviterId != null) { + roomSummaryEntity.inviterId = inviterId + } else if (roomSummaryEntity.membership != Membership.INVITE) { + roomSummaryEntity.inviterId = null + } if (updateMembers) { val otherRoomMembers = RoomMemberHelper(realm, roomId)