forked from GitHub-Mirror/riotX-android
Manage display name disambiguation (Fixes #172)
This commit is contained in:
@ -71,6 +71,7 @@ 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,
|
||||
// MatrixId of the sender (TODO rename)
|
||||
@Json(name = "sender") val sender: String? = null,
|
||||
@Json(name = "state_key") val stateKey: String? = null,
|
||||
@Json(name = "room_id") val roomId: String? = null,
|
||||
|
@ -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 ?: root.sender
|
||||
} else {
|
||||
senderName?.let {
|
||||
it + " (" + root.sender + ")"
|
||||
}
|
||||
?: root.sender
|
||||
}
|
||||
?: ""
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the metadata associated with a key.
|
||||
* @param key the key to get the metadata
|
||||
|
@ -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
|
||||
|
@ -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?
|
||||
)
|
||||
|
||||
}
|
Reference in New Issue
Block a user