diff --git a/changelog.d/2125.bugfix b/changelog.d/2125.bugfix new file mode 100644 index 0000000000..95e6fb769d --- /dev/null +++ b/changelog.d/2125.bugfix @@ -0,0 +1 @@ +Use the display name only once in display name change events. The user should be referenced by `userId` instead. diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt index e9066681c5..cfc54e5ed1 100644 --- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt +++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt @@ -97,7 +97,7 @@ class DefaultRoomLastMessageFormatter @Inject constructor( roomMembershipContentFormatter.format(content, senderDisplayName, isOutgoing) } is ProfileChangeContent -> { - profileChangeContentFormatter.format(content, senderDisplayName, isOutgoing) + profileChangeContentFormatter.format(content, event.sender, senderDisplayName, isOutgoing) } is StateContent -> { stateContentFormatter.format(content, senderDisplayName, isOutgoing, RenderingMode.RoomList) diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt index e147f25e16..efd91270d3 100644 --- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt +++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt @@ -54,7 +54,7 @@ class DefaultTimelineEventFormatter @Inject constructor( roomMembershipContentFormatter.format(content, senderDisplayName, isOutgoing) } is ProfileChangeContent -> { - profileChangeContentFormatter.format(content, senderDisplayName, isOutgoing) + profileChangeContentFormatter.format(content, event.sender, senderDisplayName, isOutgoing) } is StateContent -> { stateContentFormatter.format(content, senderDisplayName, isOutgoing, RenderingMode.Timeline) diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/ProfileChangeContentFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/ProfileChangeContentFormatter.kt index aea43298f9..1b27c4ec15 100644 --- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/ProfileChangeContentFormatter.kt +++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/ProfileChangeContentFormatter.kt @@ -16,6 +16,7 @@ package io.element.android.libraries.eventformatter.impl +import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.timeline.item.event.ProfileChangeContent import io.element.android.services.toolbox.api.strings.StringProvider import javax.inject.Inject @@ -25,6 +26,7 @@ class ProfileChangeContentFormatter @Inject constructor( ) { fun format( profileChangeContent: ProfileChangeContent, + senderId: UserId, senderDisplayName: String, senderIsYou: Boolean, ): String? = profileChangeContent.run { @@ -32,7 +34,7 @@ class ProfileChangeContentFormatter @Inject constructor( val avatarChanged = avatarUrl != prevAvatarUrl return when { avatarChanged && displayNameChanged -> { - val message = format(profileChangeContent.copy(avatarUrl = null, prevAvatarUrl = null), senderDisplayName, senderIsYou) + val message = format(profileChangeContent.copy(avatarUrl = null, prevAvatarUrl = null), senderId, senderDisplayName, senderIsYou) val avatarChangedToo = sp.getString(R.string.state_event_avatar_changed_too) "$message\n$avatarChangedToo" } @@ -41,19 +43,19 @@ class ProfileChangeContentFormatter @Inject constructor( if (senderIsYou) { sp.getString(R.string.state_event_display_name_changed_from_by_you, prevDisplayName, displayName) } else { - sp.getString(R.string.state_event_display_name_changed_from, senderDisplayName, prevDisplayName, displayName) + sp.getString(R.string.state_event_display_name_changed_from, senderId.value, prevDisplayName, displayName) } } else if (displayName != null) { if (senderIsYou) { sp.getString(R.string.state_event_display_name_set_by_you, displayName) } else { - sp.getString(R.string.state_event_display_name_set, senderDisplayName, displayName) + sp.getString(R.string.state_event_display_name_set, senderId.value, displayName) } } else { if (senderIsYou) { sp.getString(R.string.state_event_display_name_removed_by_you, prevDisplayName) } else { - sp.getString(R.string.state_event_display_name_removed, senderDisplayName, prevDisplayName) + sp.getString(R.string.state_event_display_name_removed, senderId.value, prevDisplayName) } } } diff --git a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt index b127911cc0..71860937b4 100644 --- a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt +++ b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt @@ -733,7 +733,7 @@ class DefaultRoomLastMessageFormatterTest { val someoneChangedDisplayNameEvent = createRoomEvent(sentByYou = false, senderDisplayName = otherName, content = changedContent) val someoneChangedDisplayName = formatter.format(someoneChangedDisplayNameEvent, false) - assertThat(someoneChangedDisplayName).isEqualTo("$otherName changed their display name from $oldDisplayName to $newDisplayName") + assertThat(someoneChangedDisplayName).isEqualTo("$someoneElseId changed their display name from $oldDisplayName to $newDisplayName") val youSetDisplayNameEvent = createRoomEvent(sentByYou = true, senderDisplayName = null, content = setContent) val youSetDisplayName = formatter.format(youSetDisplayNameEvent, false) @@ -741,7 +741,7 @@ class DefaultRoomLastMessageFormatterTest { val someoneSetDisplayNameEvent = createRoomEvent(sentByYou = false, senderDisplayName = otherName, content = setContent) val someoneSetDisplayName = formatter.format(someoneSetDisplayNameEvent, false) - assertThat(someoneSetDisplayName).isEqualTo("$otherName set their display name to $newDisplayName") + assertThat(someoneSetDisplayName).isEqualTo("$someoneElseId set their display name to $newDisplayName") val youRemovedDisplayNameEvent = createRoomEvent(sentByYou = true, senderDisplayName = null, content = removedContent) val youRemovedDisplayName = formatter.format(youRemovedDisplayNameEvent, false) @@ -749,7 +749,7 @@ class DefaultRoomLastMessageFormatterTest { val someoneRemovedDisplayNameEvent = createRoomEvent(sentByYou = false, senderDisplayName = otherName, content = removedContent) val someoneRemovedDisplayName = formatter.format(someoneRemovedDisplayNameEvent, false) - assertThat(someoneRemovedDisplayName).isEqualTo("$otherName removed their display name (it was $oldDisplayName)") + assertThat(someoneRemovedDisplayName).isEqualTo("$someoneElseId removed their display name (it was $oldDisplayName)") val unchangedEvent = createRoomEvent(sentByYou = true, senderDisplayName = otherName, content = sameContent) val unchangedResult = formatter.format(unchangedEvent, false) @@ -828,7 +828,7 @@ class DefaultRoomLastMessageFormatterTest { // endregion private fun createRoomEvent(sentByYou: Boolean, senderDisplayName: String?, content: EventContent): EventTimelineItem { - val sender = if (sentByYou) A_USER_ID else UserId("@someone_else:domain") + val sender = if (sentByYou) A_USER_ID else someoneElseId val profile = ProfileTimelineDetails.Ready(senderDisplayName, false, null) return anEventTimelineItem( content = content, @@ -837,4 +837,6 @@ class DefaultRoomLastMessageFormatterTest { isOwn = sentByYou, ) } + + private val someoneElseId = UserId("@someone_else:domain") }