Merge pull request #6019 from element-hq/feature/bma/fixCrashOnLongStrings

Ensure that room with long names are rendered correctly in the room list.
This commit is contained in:
Benoit Marty 2026-01-15 18:13:58 +01:00 committed by GitHub
commit 85be09639d
3 changed files with 8 additions and 9 deletions

View file

@ -46,6 +46,7 @@ import io.element.android.features.home.impl.model.RoomListRoomSummaryProvider
import io.element.android.features.home.impl.model.RoomSummaryDisplayType import io.element.android.features.home.impl.model.RoomSummaryDisplayType
import io.element.android.features.home.impl.roomlist.RoomListEvents import io.element.android.features.home.impl.roomlist.RoomListEvents
import io.element.android.libraries.core.extensions.orEmpty import io.element.android.libraries.core.extensions.orEmpty
import io.element.android.libraries.core.extensions.toSafeLength
import io.element.android.libraries.designsystem.atomic.atoms.UnreadIndicatorAtom import io.element.android.libraries.designsystem.atomic.atoms.UnreadIndicatorAtom
import io.element.android.libraries.designsystem.atomic.molecules.InviteButtonsRowMolecule import io.element.android.libraries.designsystem.atomic.molecules.InviteButtonsRowMolecule
import io.element.android.libraries.designsystem.components.avatar.Avatar import io.element.android.libraries.designsystem.components.avatar.Avatar
@ -227,7 +228,7 @@ private fun NameAndTimestampRow(
// Name // Name
Text( Text(
style = ElementTheme.typography.fontBodyLgMedium, style = ElementTheme.typography.fontBodyLgMedium,
text = name ?: stringResource(id = CommonStrings.common_no_room_name), text = name?.toSafeLength(ellipsize = true) ?: stringResource(id = CommonStrings.common_no_room_name),
fontStyle = FontStyle.Italic.takeIf { name == null }, fontStyle = FontStyle.Italic.takeIf { name == null },
color = ElementTheme.colors.roomListRoomName, color = ElementTheme.colors.roomListRoomName,
maxLines = 1, maxLines = 1,
@ -380,7 +381,7 @@ private fun InviteNameAndIndicatorRow(
Text( Text(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
style = ElementTheme.typography.fontBodyLgMedium, style = ElementTheme.typography.fontBodyLgMedium,
text = name ?: stringResource(id = CommonStrings.common_no_room_name), text = name?.toSafeLength(ellipsize = true) ?: stringResource(id = CommonStrings.common_no_room_name),
fontStyle = FontStyle.Italic.takeIf { name == null }, fontStyle = FontStyle.Italic.takeIf { name == null },
color = ElementTheme.colors.roomListRoomName, color = ElementTheme.colors.roomListRoomName,
maxLines = 1, maxLines = 1,

View file

@ -100,6 +100,8 @@ fun String.containsRtLOverride() = contains(RTL_OVERRIDE_CHAR)
fun String.filterDirectionOverrides() = filterNot { it == RTL_OVERRIDE_CHAR || it == LTR_OVERRIDE_CHAR } fun String.filterDirectionOverrides() = filterNot { it == RTL_OVERRIDE_CHAR || it == LTR_OVERRIDE_CHAR }
const val DEFAULT_SAFE_LENGTH = 500
/** /**
* This works around https://github.com/element-hq/element-x-android/issues/2105. * This works around https://github.com/element-hq/element-x-android/issues/2105.
* @param maxLength Max characters to retrieve. Defaults to `500`. * @param maxLength Max characters to retrieve. Defaults to `500`.
@ -107,7 +109,7 @@ fun String.filterDirectionOverrides() = filterNot { it == RTL_OVERRIDE_CHAR || i
* @return The string truncated to [maxLength] characters, with an optional ellipsis if larger. * @return The string truncated to [maxLength] characters, with an optional ellipsis if larger.
*/ */
fun String.toSafeLength( fun String.toSafeLength(
maxLength: Int = 500, maxLength: Int = DEFAULT_SAFE_LENGTH,
ellipsize: Boolean = false, ellipsize: Boolean = false,
): String { ): String {
return if (ellipsize) { return if (ellipsize) {

View file

@ -9,6 +9,7 @@
package io.element.android.libraries.eventformatter.impl package io.element.android.libraries.eventformatter.impl
import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.ContributesBinding
import io.element.android.libraries.core.extensions.DEFAULT_SAFE_LENGTH
import io.element.android.libraries.di.SessionScope import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.eventformatter.api.RoomLatestEventFormatter import io.element.android.libraries.eventformatter.api.RoomLatestEventFormatter
import io.element.android.libraries.eventformatter.impl.mode.RenderingMode import io.element.android.libraries.eventformatter.impl.mode.RenderingMode
@ -54,11 +55,6 @@ class DefaultRoomLatestEventFormatter(
private val stateContentFormatter: StateContentFormatter, private val stateContentFormatter: StateContentFormatter,
private val permalinkParser: PermalinkParser, private val permalinkParser: PermalinkParser,
) : RoomLatestEventFormatter { ) : RoomLatestEventFormatter {
companion object {
// Max characters to display in the last message. This works around https://github.com/element-hq/element-x-android/issues/2105
private const val MAX_SAFE_LENGTH = 500
}
override fun format( override fun format(
latestEvent: LatestEventValue.Local, latestEvent: LatestEventValue.Local,
isDmRoom: Boolean, isDmRoom: Boolean,
@ -121,7 +117,7 @@ class DefaultRoomLatestEventFormatter(
} }
is LegacyCallInviteContent -> sp.getString(CommonStrings.common_unsupported_call) is LegacyCallInviteContent -> sp.getString(CommonStrings.common_unsupported_call)
is CallNotifyContent -> sp.getString(CommonStrings.common_call_started) is CallNotifyContent -> sp.getString(CommonStrings.common_call_started)
}?.take(MAX_SAFE_LENGTH) }?.take(DEFAULT_SAFE_LENGTH)
} }
private fun MessageContent.process( private fun MessageContent.process(