diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStatePresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStatePresenter.kt index a4a13986e8..16bc39fac8 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStatePresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStatePresenter.kt @@ -105,13 +105,13 @@ class IdentityChangeStatePresenter @Inject constructor( private fun RoomMember.toIdentityRoomMember() = IdentityRoomMember( userId = userId, - disambiguatedDisplayName = disambiguatedDisplayName, + displayNameOrDefault = displayNameOrDefault, avatarData = getAvatarData(AvatarSize.ComposerAlert), ) private fun createDefaultRoomMemberForIdentityChange(userId: UserId) = IdentityRoomMember( userId = userId, - disambiguatedDisplayName = userId.value, + displayNameOrDefault = userId.extractedDisplayName, avatarData = AvatarData( id = userId.value, name = null, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateProvider.kt index fa70bebe6a..2a36c5e23f 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateProvider.kt @@ -20,8 +20,16 @@ class IdentityChangeStateProvider : PreviewParameterProvider = emptyList(), ) = IdentityChangeState( @@ -38,7 +54,7 @@ internal fun anIdentityChangeState( internal fun anIdentityRoomMember( userId: UserId = UserId("@alice:example.com"), - disambiguatedDisplayName: String = userId.value, + displayNameOrDefault: String = userId.extractedDisplayName, avatarData: AvatarData = AvatarData( id = userId.value, name = null, @@ -47,6 +63,6 @@ internal fun anIdentityRoomMember( ), ) = IdentityRoomMember( userId = userId, - disambiguatedDisplayName = disambiguatedDisplayName, + displayNameOrDefault = displayNameOrDefault, avatarData = avatarData, ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateView.kt index 6ff167a8a7..aac05f8684 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateView.kt @@ -40,13 +40,27 @@ fun IdentityChangeStateView( avatar = pinViolationIdentityChange.identityRoomMember.avatarData, content = buildAnnotatedString { val learnMoreStr = stringResource(CommonStrings.action_learn_more) + val displayName = pinViolationIdentityChange.identityRoomMember.displayNameOrDefault + val userIdStr = stringResource( + CommonStrings.crypto_identity_change_pin_violation_new_user_id, + pinViolationIdentityChange.identityRoomMember.userId, + ) val fullText = stringResource( - id = CommonStrings.crypto_identity_change_pin_violation, - pinViolationIdentityChange.identityRoomMember.disambiguatedDisplayName, + id = CommonStrings.crypto_identity_change_pin_violation_new, + displayName, + userIdStr, learnMoreStr, ) - val learnMoreStartIndex = fullText.indexOf(learnMoreStr) append(fullText) + val userIdStartIndex = fullText.indexOf(userIdStr) + addStyle( + style = SpanStyle( + fontWeight = FontWeight.Bold, + ), + start = userIdStartIndex, + end = userIdStartIndex + userIdStr.length, + ) + val learnMoreStartIndex = fullText.lastIndexOf(learnMoreStr) addStyle( style = SpanStyle( textDecoration = TextDecoration.Underline, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityRoomMember.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityRoomMember.kt index f5ad9295b3..4acfbd5181 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityRoomMember.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityRoomMember.kt @@ -12,6 +12,6 @@ import io.element.android.libraries.matrix.api.core.UserId data class IdentityRoomMember( val userId: UserId, - val disambiguatedDisplayName: String, + val displayNameOrDefault: String, val avatarData: AvatarData, ) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/UserId.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/UserId.kt index e03069a243..ae6c3de5bd 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/UserId.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/UserId.kt @@ -24,4 +24,9 @@ value class UserId(val value: String) : Serializable { } override fun toString(): String = value + + val extractedDisplayName: String + get() = value + .removePrefix("@") + .substringBefore(":") } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMember.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMember.kt index 52d45bfc11..cabd222b72 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMember.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMember.kt @@ -51,6 +51,12 @@ data class RoomMember( isNameAmbiguous -> "$displayName ($userId)" else -> displayName } + + val displayNameOrDefault: String + get() = when { + displayName == null -> userId.extractedDisplayName + else -> displayName + } } enum class RoomMembershipState { diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index f3adc853f2..24e35e6e58 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -252,6 +252,8 @@ Reason: %1$s." "Waiting for this message" "You" "%1$s\'s identity appears to have changed. %2$s" + "%1$s’s %2$s identity appears to have changed. %3$s" + "(%1$s)" "Confirmation" "Error" "Success"