From f601bb5c1b75136dae5654c8bd4afab7b27bdcad Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 24 Apr 2023 10:57:05 +0200 Subject: [PATCH] Timeline: copy getInitial method from EA to avoid showing @ as avatar. --- .../designsystem/components/avatar/Avatar.kt | 2 +- .../components/avatar/AvatarData.kt | 34 +++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt index 06aa4435a0..05257ece7f 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt @@ -93,7 +93,7 @@ private fun InitialsAvatar( ) { Text( modifier = Modifier.align(Alignment.Center), - text = avatarData.getInitial(), + text = avatarData.initial, fontSize = (avatarData.size.dp / 2).value.sp, color = Color.White, ) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarData.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarData.kt index 3bf4f7d0b4..e46751f15f 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarData.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarData.kt @@ -30,8 +30,36 @@ data class AvatarData( @IgnoredOnParcel val size: AvatarSize = AvatarSize.MEDIUM ) : Parcelable { - fun getInitial(): String { - val firstChar = name?.firstOrNull() ?: id.getOrNull(1) ?: '?' - return firstChar.uppercase() + + val initial by lazy { + (name?.takeIf { it.isNotBlank() } ?: id) + .let { dn -> + var startIndex = 0 + val initial = dn[startIndex] + + if (initial in listOf('@', '#', '+') && dn.length > 1) { + startIndex++ + } + + var length = 1 + var first = dn[startIndex] + + // LEFT-TO-RIGHT MARK + if (dn.length >= 2 && 0x200e == first.code) { + startIndex++ + first = dn[startIndex] + } + + // check if it’s the start of a surrogate pair + if (first.code in 0xD800..0xDBFF && dn.length > startIndex + 1) { + val second = dn[startIndex + 1] + if (second.code in 0xDC00..0xDFFF) { + length++ + } + } + + dn.substring(startIndex, startIndex + length) + } + .uppercase() } }