Disambiguate display name in notifications #2224

This commit is contained in:
Benoit Marty 2024-01-25 18:33:48 +01:00
parent f88d96fbc5
commit 0d35e60dac
6 changed files with 93 additions and 5 deletions

View file

@ -27,7 +27,9 @@ data class NotificationData(
val roomId: RoomId,
// mxc url
val senderAvatarUrl: String?,
val senderDisplayName: String?,
// private, must use `getSenderName`
private val senderDisplayName: String?,
private val senderIsNameAmbiguous: Boolean,
val roomAvatarUrl: String?,
val roomDisplayName: String?,
val isDirect: Boolean,
@ -36,7 +38,13 @@ data class NotificationData(
val timestamp: Long,
val content: NotificationContent,
val hasMention: Boolean,
)
) {
fun getSenderName(userId: UserId): String = when {
senderDisplayName.isNullOrBlank() -> userId.value
senderIsNameAmbiguous -> "$senderDisplayName ($userId)"
else -> senderDisplayName
}
}
sealed interface NotificationContent {
sealed interface MessageLike : NotificationContent {
@ -54,11 +62,13 @@ sealed interface NotificationContent {
data class ReactionContent(
val relatedEventId: String
) : MessageLike
data object RoomEncrypted : MessageLike
data class RoomMessage(
val senderId: UserId,
val messageType: MessageType
) : MessageLike
data object RoomRedaction : MessageLike
data object Sticker : MessageLike
data class Poll(
@ -83,6 +93,7 @@ sealed interface NotificationContent {
val userId: String,
val membershipState: RoomMembershipState
) : StateEvent
data object RoomName : StateEvent
data object RoomPinnedEvents : StateEvent
data object RoomPowerLevels : StateEvent

View file

@ -0,0 +1,73 @@
/*
* Copyright (c) 2023 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 io.element.android.libraries.matrix.api.notification
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.matrix.test.AN_EVENT_ID
import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.A_USER_ID
import org.junit.Test
class NotificationDataTest {
@Test
fun `getSenderName should return user id if there is no sender name`() {
val sut = aNotificationData(
senderDisplayName = null,
senderIsNameAmbiguous = false,
)
assertThat(sut.getSenderName(A_USER_ID)).isEqualTo("@alice:server.org")
}
@Test
fun `getSenderName should return sender name if defined`() {
val sut = aNotificationData(
senderDisplayName = "Alice",
senderIsNameAmbiguous = false,
)
assertThat(sut.getSenderName(A_USER_ID)).isEqualTo("Alice")
}
@Test
fun `getSenderName should return sender name and user id in case of ambiguous display name`() {
val sut = aNotificationData(
senderDisplayName = "Alice",
senderIsNameAmbiguous = true,
)
assertThat(sut.getSenderName(A_USER_ID)).isEqualTo("Alice (@alice:server.org)")
}
private fun aNotificationData(
senderDisplayName: String?,
senderIsNameAmbiguous: Boolean,
): NotificationData {
return NotificationData(
eventId = AN_EVENT_ID,
roomId = A_ROOM_ID,
senderAvatarUrl = null,
senderDisplayName = senderDisplayName,
senderIsNameAmbiguous = senderIsNameAmbiguous,
roomAvatarUrl = null,
roomDisplayName = null,
isDirect = false,
isEncrypted = false,
isNoisy = false,
timestamp = 0L,
content = NotificationContent.MessageLike.RoomEncrypted,
hasMention = false,
)
}
}