diff --git a/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/session/room/timeline/RoomDataHelper.kt b/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/session/room/timeline/RoomDataHelper.kt index 339b435b..7ff69358 100644 --- a/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/session/room/timeline/RoomDataHelper.kt +++ b/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/session/room/timeline/RoomDataHelper.kt @@ -59,7 +59,7 @@ object RoomDataHelper { eventId = Random.nextLong().toString(), content = content, prevContent = prevContent, - sender = sender, + senderId = sender, stateKey = stateKey ) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt index fe68e9a2..99479d87 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt @@ -71,12 +71,11 @@ data class Event( @Json(name = "content") val content: Content? = null, @Json(name = "prev_content") val prevContent: Content? = null, @Json(name = "origin_server_ts") val originServerTs: Long? = null, - @Json(name = "sender") val sender: String? = null, + @Json(name = "sender") val senderId: String? = null, @Json(name = "state_key") val stateKey: String? = null, @Json(name = "room_id") val roomId: String? = null, @Json(name = "unsigned") val unsignedData: UnsignedData? = null, @Json(name = "redacts") val redacts: String? = null - ) { /** diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/timeline/TimelineEvent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/timeline/TimelineEvent.kt index 76217027..c05bd138 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/timeline/TimelineEvent.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/timeline/TimelineEvent.kt @@ -31,6 +31,7 @@ data class TimelineEvent( val localId: String, val displayIndex: Int, val senderName: String?, + val isUniqueDisplayName: Boolean, val senderAvatar: String?, val sendState: SendState, val annotations: EventAnnotationsSummary? = null @@ -53,6 +54,18 @@ data class TimelineEvent( } } + fun getDisambiguatedDisplayName(): String { + return if (isUniqueDisplayName) { + senderName + } else { + senderName?.let { name -> + "$name (${root.senderId})" + } + } + ?: root.senderId + ?: "" + } + /** * Get the metadata associated with a key. * @param key the key to get the metadata diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/IncomingRoomKeyRequest.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/IncomingRoomKeyRequest.kt index 6587f546..056d9942 100755 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/IncomingRoomKeyRequest.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/IncomingRoomKeyRequest.kt @@ -65,7 +65,7 @@ open class IncomingRoomKeyRequest { * @param event the event */ constructor(event: Event) { - userId = event.sender + userId = event.senderId val roomKeyShareRequest = event.getClearContent().toModel()!! deviceId = roomKeyShareRequest.requestingDeviceId requestId = roomKeyShareRequest.requestId diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt index 6ba5ddaf..796d91d1 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt @@ -131,7 +131,7 @@ internal class MXMegolmDecryption(private val credentials: Credentials, * @param event the event */ private fun requestKeysForEvent(event: Event) { - val sender = event.sender!! + val sender = event.senderId!! val encryptedEventContent = event.content.toModel()!! val recipients = ArrayList>() diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/olm/MXOlmDecryption.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/olm/MXOlmDecryption.kt index 13292e27..1a00188c 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/olm/MXOlmDecryption.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/algorithms/olm/MXOlmDecryption.kt @@ -121,9 +121,9 @@ internal class MXOlmDecryption( MXCryptoError.UNABLE_TO_DECRYPT, String.format(MXCryptoError.ERROR_MISSING_PROPERTY_REASON, "sender"))) } - if (!TextUtils.equals(olmPayloadContent.sender, event.sender)) { + if (!TextUtils.equals(olmPayloadContent.sender, event.senderId)) { Timber.e("Event " + event.eventId + ": original sender " + olmPayloadContent.sender - + " does not match reported sender " + event.sender) + + " does not match reported sender " + event.senderId) throw MXDecryptionException(MXCryptoError(MXCryptoError.FORWARDED_MESSAGE_ERROR_CODE, MXCryptoError.UNABLE_TO_DECRYPT, String.format(MXCryptoError.FORWARDED_MESSAGE_REASON, olmPayloadContent.sender))) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultSasVerificationService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultSasVerificationService.kt index a1595c10..d13f13c4 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultSasVerificationService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultSasVerificationService.kt @@ -148,7 +148,7 @@ internal class DefaultSasVerificationService(private val credentials: Credential private suspend fun onStartRequestReceived(event: Event) { val startReq = event.getClearContent().toModel()!! - val otherUserId = event.sender + val otherUserId = event.senderId if (!startReq.isValid()) { Timber.e("## received invalid verification request") if (startReq.transactionID != null) { @@ -236,7 +236,7 @@ internal class DefaultSasVerificationService(private val credentials: Credential Timber.e("## Received invalid accept request") return } - val otherUserId = event.sender!! + val otherUserId = event.senderId!! Timber.v("## SAS onCancelReceived otherUser:$otherUserId reason:${cancelReq.reason}") val existing = getExistingTransaction(otherUserId, cancelReq.transactionID!!) @@ -258,7 +258,7 @@ internal class DefaultSasVerificationService(private val credentials: Credential Timber.e("## Received invalid accept request") return } - val otherUserId = event.sender!! + val otherUserId = event.senderId!! val existing = getExistingTransaction(otherUserId, acceptReq.transactionID!!) if (existing == null) { Timber.e("## Received invalid accept request") @@ -282,7 +282,7 @@ internal class DefaultSasVerificationService(private val credentials: Credential Timber.e("## Received invalid key request") return } - val otherUserId = event.sender!! + val otherUserId = event.senderId!! val existing = getExistingTransaction(otherUserId, keyReq.transactionID!!) if (existing == null) { Timber.e("## Received invalid accept request") @@ -303,7 +303,7 @@ internal class DefaultSasVerificationService(private val credentials: Credential Timber.e("## Received invalid key request") return } - val otherUserId = event.sender!! + val otherUserId = event.senderId!! val existing = getExistingTransaction(otherUserId, macReq.transactionID!!) if (existing == null) { Timber.e("## Received invalid accept request") 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 8d5fe49e..17df08e5 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 @@ -37,7 +37,7 @@ internal object EventMapper { eventEntity.prevContent = ContentMapper.map(resolvedPrevContent) eventEntity.stateKey = event.stateKey eventEntity.type = event.getClearType() - eventEntity.sender = event.sender + eventEntity.sender = event.senderId eventEntity.originServerTs = event.originServerTs eventEntity.redacts = event.redacts eventEntity.age = event.unsignedData?.age ?: event.originServerTs @@ -63,7 +63,7 @@ internal object EventMapper { content = ContentMapper.map(eventEntity.content), prevContent = ContentMapper.map(eventEntity.prevContent), originServerTs = eventEntity.originServerTs, - sender = eventEntity.sender, + senderId = eventEntity.sender, stateKey = eventEntity.stateKey, roomId = eventEntity.roomId, unsignedData = ud, diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/EventRelationsAggregationTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/EventRelationsAggregationTask.kt index e12d60ca..0067434d 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/EventRelationsAggregationTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/EventRelationsAggregationTask.kt @@ -227,7 +227,7 @@ internal class DefaultEventRelationsAggregationTask(private val monarchy: Monarc sum.count = 1 sum.sourceEvents.add(reactionEventId) } - sum.addedByMe = sum.addedByMe || (userId == event.sender) + sum.addedByMe = sum.addedByMe || (userId == event.senderId) eventSummary.reactionsSummary.add(sum) } else { //is this a known event (is possible? pagination?) @@ -249,7 +249,7 @@ internal class DefaultEventRelationsAggregationTask(private val monarchy: Monarc sum.sourceEvents.add(reactionEventId) } - sum.addedByMe = sum.addedByMe || (userId == event.sender) + sum.addedByMe = sum.addedByMe || (userId == event.senderId) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomMembers.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomMembers.kt index ff8b8ce4..41d5879c 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomMembers.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomMembers.kt @@ -54,7 +54,7 @@ internal class RoomMembers(private val realm: Realm, } return EventEntity .where(realm, roomId, EventType.STATE_ROOM_MEMBER) - .contains(EventEntityFields.CONTENT, displayName) + .contains(EventEntityFields.CONTENT, "\"displayname\":\"$displayName\"") .distinct(EventEntityFields.STATE_KEY) .findAll() .size == 1 diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EventFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EventFactory.kt deleted file mode 100644 index d42c7222..00000000 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EventFactory.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2019 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.matrix.android.internal.session.room.send - -import im.vector.matrix.android.api.auth.data.Credentials -import im.vector.matrix.android.api.session.events.model.Content -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.room.model.message.MessageTextContent -import im.vector.matrix.android.internal.di.MoshiProvider - -internal class EventFactory(private val credentials: Credentials) { - - private val moshi = MoshiProvider.providesMoshi() - - fun createTextEvent(roomId: String, msgType: String, text: String): Event { - val content = MessageTextContent(type = msgType, body = text) - - return Event( - roomId = roomId, - originServerTs = dummyOriginServerTs(), - sender = credentials.userId, - eventId = dummyEventId(roomId), - type = EventType.MESSAGE, - content = toContent(content) - ) - } - - private fun dummyOriginServerTs(): Long { - return System.currentTimeMillis() - } - - private fun dummyEventId(roomId: String): String { - return roomId + "-" + dummyOriginServerTs() - } - - @Suppress("UNCHECKED_CAST") - private inline fun toContent(data: T?): Content? { - val moshiAdapter = moshi.adapter(T::class.java) - val jsonValue = moshiAdapter.toJsonValue(data) - return jsonValue as? Content? - } - - -} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt index e54af1ca..c4d32190 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/LocalEchoEventFactory.kt @@ -130,7 +130,7 @@ internal class LocalEchoEventFactory(private val credentials: Credentials, priva return Event( roomId = roomId, originServerTs = dummyOriginServerTs(), - sender = credentials.userId, + senderId = credentials.userId, eventId = localId, type = EventType.REACTION, content = content.toContent(), @@ -221,7 +221,7 @@ internal class LocalEchoEventFactory(private val credentials: Credentials, priva return Event( roomId = roomId, originServerTs = dummyOriginServerTs(), - sender = credentials.userId, + senderId = credentials.userId, eventId = localID, type = EventType.MESSAGE, content = content.toContent(), @@ -241,7 +241,7 @@ internal class LocalEchoEventFactory(private val credentials: Credentials, priva //Fallbacks and event representation //TODO Add error/warning logs when any of this is null val permalink = PermalinkFactory.createPermalink(eventReplied) ?: return null - val userId = eventReplied.sender ?: return null + val userId = eventReplied.senderId ?: return null val userLink = PermalinkFactory.createPermalink(userId) ?: return null // //
@@ -330,7 +330,7 @@ internal class LocalEchoEventFactory(private val credentials: Credentials, priva return Event( roomId = roomId, originServerTs = dummyOriginServerTs(), - sender = credentials.userId, + senderId = credentials.userId, eventId = localID, type = EventType.REDACTION, redacts = eventId, diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt index 7c4cfff9..fe3bdcd4 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt @@ -26,6 +26,7 @@ import im.vector.matrix.android.internal.crypto.MXEventDecryptionResult import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.model.EventEntity import im.vector.matrix.android.internal.session.room.EventRelationExtractor +import im.vector.matrix.android.internal.session.room.membership.RoomMembers import im.vector.matrix.android.internal.session.room.membership.SenderRoomMemberExtractor import io.realm.Realm import timber.log.Timber @@ -49,7 +50,11 @@ internal class TimelineEventFactory( val cacheKey = sender + eventEntity.localId val senderData = senderCache.getOrPut(cacheKey) { val senderRoomMember = roomMemberExtractor.extractFrom(eventEntity, realm) - SenderData(senderRoomMember?.displayName, senderRoomMember?.avatarUrl) + val isUniqueDisplayName = RoomMembers(realm, eventEntity.roomId).isUniqueDisplayName(senderRoomMember?.displayName) + + SenderData(senderRoomMember?.displayName, + isUniqueDisplayName, + senderRoomMember?.avatarUrl) } val event = eventEntity.asDomain() if (event.getClearType() == EventType.ENCRYPTED) { @@ -62,6 +67,7 @@ internal class TimelineEventFactory( eventEntity.localId, eventEntity.displayIndex, senderData.senderName, + senderData.isUniqueDisplayName, senderData.senderAvatar, eventEntity.sendState, relations @@ -96,7 +102,7 @@ internal class TimelineEventFactory( private data class SenderData( val senderName: String?, + val isUniqueDisplayName: Boolean, val senderAvatar: String? ) - } \ No newline at end of file diff --git a/vector/src/gplay/java/im/vector/riotredesign/push/fcm/VectorFirebaseMessagingService.kt b/vector/src/gplay/java/im/vector/riotredesign/push/fcm/VectorFirebaseMessagingService.kt index 47d4c1b1..dfdfe6be 100755 --- a/vector/src/gplay/java/im/vector/riotredesign/push/fcm/VectorFirebaseMessagingService.kt +++ b/vector/src/gplay/java/im/vector/riotredesign/push/fcm/VectorFirebaseMessagingService.kt @@ -257,7 +257,7 @@ class VectorFirebaseMessagingService : FirebaseMessagingService() { try { return Event(eventId = data["event_id"], - sender = data["sender"], + senderId = data["sender"], roomId = data["room_id"], type = data.getValue("type"), // TODO content = data.getValue("content"), diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt index 3bf34534..c8030c25 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt @@ -222,8 +222,8 @@ class RoomDetailFragment : } //switch to expanded bar composerLayout.composerRelatedMessageTitle.apply { - text = event.senderName - setTextColor(ContextCompat.getColor(requireContext(), getColorFromUserId(event.root.sender))) + text = event.getDisambiguatedDisplayName() + setTextColor(ContextCompat.getColor(requireContext(), getColorFromUserId(event.root.senderId))) } //TODO this is used at several places, find way to refactor? @@ -255,7 +255,7 @@ class RoomDetailFragment : composerLayout.composerRelatedMessageActionIcon.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.ic_reply)) } - AvatarRenderer.render(event.senderAvatar, event.root.sender + AvatarRenderer.render(event.senderAvatar, event.root.senderId ?: "", event.senderName, composerLayout.composerRelatedMessageAvatar) composerLayout.composerEditText.setSelection(composerLayout.composerEditText.text.length) diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt index 476ff99b..eee29328 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt @@ -282,7 +282,7 @@ class RoomDetailViewModel(initialState: RoomDetailViewState, val dateFormat = SimpleDateFormat("EEE, d MMM yyyy HH:mm", Locale.getDefault()) _nonBlockingPopAlert.postValue(LiveEvent( Pair(R.string.last_edited_info_message, listOf( - lastReplace.senderName ?: "?", + lastReplace.getDisambiguatedDisplayName(), dateFormat.format(Date(lastReplace.root.originServerTs ?: 0))) )) ) @@ -429,7 +429,7 @@ class RoomDetailViewModel(initialState: RoomDetailViewState, private fun observeInvitationState() { asyncSubscribe(RoomDetailViewState::asyncRoomSummary) { summary -> if (summary.membership == Membership.INVITE) { - summary.lastMessage?.sender?.let { senderId -> + summary.lastMessage?.senderId?.let { senderId -> session.getUser(senderId) }?.also { setState { copy(asyncInviter = Success(it)) } diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineEventController.kt index 1b060883..0720fd23 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineEventController.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineEventController.kt @@ -238,7 +238,7 @@ class TimelineEventController(private val dateFormatter: TimelineDateFormatter, val senderAvatar = mergedEvent.senderAvatar() val senderName = mergedEvent.senderName() MergedHeaderItem.Data( - userId = mergedEvent.root.sender ?: "", + userId = mergedEvent.root.senderId ?: "", avatarUrl = senderAvatar, memberName = senderName ?: "", eventId = mergedEvent.localId diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsViewModel.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsViewModel.kt index 998ddf81..95cb4f52 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsViewModel.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsViewModel.kt @@ -90,7 +90,7 @@ class MessageActionsViewModel(initialState: MessageActionState) : VectorViewMode } } MessageActionState( - userId = event.root.sender ?: "", + userId = event.root.senderId ?: "", senderName = parcel.informationData.memberName?.toString() ?: "", messageBody = body, ts = dateFormat.format(Date(originTs ?: 0)), diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageMenuViewModel.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageMenuViewModel.kt index 0e27beb6..1d9c33f6 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageMenuViewModel.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageMenuViewModel.kt @@ -131,7 +131,7 @@ class MessageMenuViewModel(initialState: MessageMenuState) : VectorViewModel() - return event.root.sender == myUserId && ( + return event.root.senderId == myUserId && ( messageContent?.type == MessageType.MSGTYPE_TEXT || messageContent?.type == MessageType.MSGTYPE_EMOTE ) diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/ViewReactionViewModel.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/ViewReactionViewModel.kt index 88548865..de76132b 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/ViewReactionViewModel.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/ViewReactionViewModel.kt @@ -49,8 +49,8 @@ class ViewReactionViewModel(private val session: Session, sum.sourceEvents.mapNotNull { room.getTimeLineEvent(it) }.forEach { val localDate = it.root.localDateTime() - results.add(ReactionInfo(it.root.eventId!!, sum.key, it.root.sender - ?: "", it.senderName, timelineDateFormatter.formatMessageHour(localDate))) + results.add(ReactionInfo(it.root.eventId!!, sum.key, it.root.senderId + ?: "", it.getDisambiguatedDisplayName(), timelineDateFormatter.formatMessageHour(localDate))) } } setState { diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt index 6dc83c24..acd5162d 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt @@ -37,7 +37,7 @@ class EncryptionItemFactory(private val stringProvider: StringProvider) { val text = buildNoticeText(event.root, event.senderName) ?: return null val informationData = MessageInformationData( eventId = event.root.eventId ?: "?", - senderId = event.root.sender ?: "", + senderId = event.root.senderId ?: "", sendState = event.sendState, avatarUrl = event.senderAvatar(), memberName = event.senderName(), diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/NoticeItemFactory.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/NoticeItemFactory.kt index dabebd28..9a87b80f 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/NoticeItemFactory.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/NoticeItemFactory.kt @@ -32,7 +32,7 @@ class NoticeItemFactory(private val eventFormatter: NoticeEventFormatter) { val formattedText = eventFormatter.format(event) ?: return null val informationData = MessageInformationData( eventId = event.root.eventId ?: "?", - senderId = event.root.sender ?: "", + senderId = event.root.senderId ?: "", sendState = event.sendState, avatarUrl = event.senderAvatar(), memberName = event.senderName(), diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/TimelineItemFactory.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/TimelineItemFactory.kt index deff306d..f3a53ef7 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/TimelineItemFactory.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/factory/TimelineItemFactory.kt @@ -65,7 +65,7 @@ class TimelineItemFactory(private val messageItemFactory: MessageItemFactory, if (TimelineDisplayableEvents.DEBUG_HIDDEN_EVENT) { val informationData = MessageInformationData(eventId = event.root.eventId ?: "?", - senderId = event.root.sender ?: "", + senderId = event.root.senderId ?: "", sendState = event.sendState, time = "", avatarUrl = null, diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/format/NoticeEventFormatter.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/format/NoticeEventFormatter.kt index 70d0f68e..595fa766 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/format/NoticeEventFormatter.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/format/NoticeEventFormatter.kt @@ -32,13 +32,13 @@ class NoticeEventFormatter(private val stringProvider: StringProvider) { fun format(timelineEvent: TimelineEvent): CharSequence? { return when (val type = timelineEvent.root.getClearType()) { - EventType.STATE_ROOM_NAME -> formatRoomNameEvent(timelineEvent.root, timelineEvent.senderName) - EventType.STATE_ROOM_TOPIC -> formatRoomTopicEvent(timelineEvent.root, timelineEvent.senderName) + EventType.STATE_ROOM_NAME -> formatRoomNameEvent(timelineEvent.root, timelineEvent.getDisambiguatedDisplayName()) + EventType.STATE_ROOM_TOPIC -> formatRoomTopicEvent(timelineEvent.root, timelineEvent.getDisambiguatedDisplayName()) EventType.STATE_ROOM_MEMBER -> formatRoomMemberEvent(timelineEvent.root, timelineEvent.senderName()) - EventType.STATE_HISTORY_VISIBILITY -> formatRoomHistoryVisibilityEvent(timelineEvent.root, timelineEvent.senderName) + EventType.STATE_HISTORY_VISIBILITY -> formatRoomHistoryVisibilityEvent(timelineEvent.root, timelineEvent.getDisambiguatedDisplayName()) EventType.CALL_INVITE, EventType.CALL_HANGUP, - EventType.CALL_ANSWER -> formatCallEvent(timelineEvent.root, timelineEvent.senderName) + EventType.CALL_ANSWER -> formatCallEvent(timelineEvent.root, timelineEvent.getDisambiguatedDisplayName()) else -> { Timber.v("Type $type not handled by this formatter") null @@ -111,12 +111,12 @@ class NoticeEventFormatter(private val stringProvider: StringProvider) { if (!TextUtils.equals(eventContent?.displayName, prevEventContent?.displayName)) { val displayNameText = when { prevEventContent?.displayName.isNullOrEmpty() -> - stringProvider.getString(R.string.notice_display_name_set, event.sender, eventContent?.displayName) + stringProvider.getString(R.string.notice_display_name_set, event.senderId, eventContent?.displayName) eventContent?.displayName.isNullOrEmpty() -> - stringProvider.getString(R.string.notice_display_name_removed, event.sender, prevEventContent?.displayName) + stringProvider.getString(R.string.notice_display_name_removed, event.senderId, prevEventContent?.displayName) else -> stringProvider.getString(R.string.notice_display_name_changed_from, - event.sender, prevEventContent?.displayName, eventContent?.displayName) + event.senderId, prevEventContent?.displayName, eventContent?.displayName) } displayText.append(displayNameText) } @@ -134,8 +134,8 @@ class NoticeEventFormatter(private val stringProvider: StringProvider) { } private fun buildMembershipNotice(event: Event, senderName: String?, eventContent: RoomMember?, prevEventContent: RoomMember?): String? { - val senderDisplayName = senderName ?: event.sender - val targetDisplayName = eventContent?.displayName ?: event.sender + val senderDisplayName = senderName ?: event.senderId + val targetDisplayName = eventContent?.displayName ?: event.senderId return when { Membership.INVITE == eventContent?.membership -> { // TODO get userId @@ -156,7 +156,7 @@ class NoticeEventFormatter(private val stringProvider: StringProvider) { stringProvider.getString(R.string.notice_room_join, senderDisplayName) Membership.LEAVE == eventContent?.membership -> // 2 cases here: this member may have left voluntarily or they may have been "left" by someone else ie. kicked - return if (TextUtils.equals(event.sender, event.stateKey)) { + return if (TextUtils.equals(event.senderId, event.stateKey)) { if (prevEventContent?.membership == Membership.INVITE) { stringProvider.getString(R.string.notice_room_reject, senderDisplayName) } else { diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/helper/TimelineDisplayableEvents.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/helper/TimelineDisplayableEvents.kt index 858a8abc..1523ee6a 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/helper/TimelineDisplayableEvents.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/helper/TimelineDisplayableEvents.kt @@ -85,12 +85,11 @@ fun TimelineEvent.senderAvatar(): String? { fun TimelineEvent.senderName(): String? { // We might have no senderName when user leave, so we try to get it from prevContent - return senderName - ?: if (root.type == EventType.STATE_ROOM_MEMBER) { - root.prevContent.toModel()?.displayName - } else { - null - } + return when { + senderName != null -> getDisambiguatedDisplayName() + root.type == EventType.STATE_ROOM_MEMBER -> root.prevContent.toModel()?.displayName + else -> null + } } fun TimelineEvent.canBeMerged(): Boolean { diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/item/AbsMessageItem.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/item/AbsMessageItem.kt index 8a323968..26b3090b 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/item/AbsMessageItem.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/item/AbsMessageItem.kt @@ -83,7 +83,6 @@ abstract class AbsMessageItem : BaseEventItem() { override fun bind(holder: H) { super.bind(holder) if (informationData.showInformation) { - holder.avatarImageView.layoutParams = holder.avatarImageView.layoutParams?.apply { val size = dpToPx(avatarStyle.avatarSizeDP, holder.view.context) height = size diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/util/MessageInformationDataFactory.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/util/MessageInformationDataFactory.kt index 0ee5cd2f..34d27004 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/util/MessageInformationDataFactory.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/util/MessageInformationDataFactory.kt @@ -22,7 +22,6 @@ import im.vector.riotredesign.core.extensions.localDateTime import im.vector.riotredesign.core.resources.ColorProvider import im.vector.riotredesign.features.home.getColorFromUserId import im.vector.riotredesign.features.home.room.detail.timeline.helper.TimelineDateFormatter -import im.vector.riotredesign.features.home.room.detail.timeline.helper.senderAvatar import im.vector.riotredesign.features.home.room.detail.timeline.item.MessageInformationData import im.vector.riotredesign.features.home.room.detail.timeline.item.ReactionInfoData import me.gujun.android.span.span @@ -38,23 +37,23 @@ class MessageInformationDataFactory(private val timelineDateFormatter: TimelineD val eventId = event.root.eventId!! val date = event.root.localDateTime() - val nextDate = nextEvent?.root?.localDateTime() val addDaySeparator = date.toLocalDate() != nextDate?.toLocalDate() val isNextMessageReceivedMoreThanOneHourAgo = nextDate?.isBefore(date.minusMinutes(60)) ?: false + val showInformation = addDaySeparator || event.senderAvatar != nextEvent?.senderAvatar - || event.senderName != nextEvent?.senderName + || event.getDisambiguatedDisplayName() != nextEvent?.getDisambiguatedDisplayName() || (nextEvent?.root?.getClearType() != EventType.MESSAGE && nextEvent?.root?.getClearType() != EventType.ENCRYPTED) || isNextMessageReceivedMoreThanOneHourAgo val time = timelineDateFormatter.formatMessageHour(date) - val avatarUrl = event.senderAvatar() - val memberName = event.senderName ?: event.root.sender ?: "" + val avatarUrl = event.senderAvatar + val memberName = event.getDisambiguatedDisplayName() val formattedMemberName = span(memberName) { - textColor = colorProvider.getColor(getColorFromUserId(event.root.sender + textColor = colorProvider.getColor(getColorFromUserId(event.root.senderId ?: "")) } @@ -62,7 +61,7 @@ class MessageInformationDataFactory(private val timelineDateFormatter: TimelineD return MessageInformationData( eventId = eventId, - senderId = event.root.sender ?: "", + senderId = event.root.senderId ?: "", sendState = event.sendState, time = time, avatarUrl = avatarUrl,