From f3614ab67e27eefee88c257cff3c347bf10155bf Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 17 Jun 2025 20:37:41 +0200 Subject: [PATCH] change (room avatar) : clean code related to room name/avatar --- .../messages/impl/MessagesPresenter.kt | 11 ++--- .../features/messages/impl/MessagesState.kt | 6 +-- .../messages/impl/MessagesStateProvider.kt | 13 +++--- .../features/messages/impl/MessagesView.kt | 44 ++++++++----------- .../roomdetails/impl/RoomDetailsView.kt | 2 +- .../components/avatar/RoomAvatar.kt | 2 +- 6 files changed, 32 insertions(+), 46 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index aa0d55e29b..3390b55d5e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -152,11 +152,8 @@ class MessagesPresenter @AssistedInject constructor( val userEventPermissions by userEventPermissions(syncUpdateFlow.value) - val roomName: AsyncData by remember { - derivedStateOf { roomInfo.name?.let { AsyncData.Success(it) } ?: AsyncData.Uninitialized } - } - val roomAvatar: AsyncData by remember { - derivedStateOf { AsyncData.Success(roomInfo.avatarData()) } + val roomAvatar by remember { + derivedStateOf { roomInfo.avatarData() } } val heroes by remember { derivedStateOf { roomInfo.heroes().toPersistentList() } @@ -245,7 +242,7 @@ class MessagesPresenter @AssistedInject constructor( return MessagesState( roomId = room.roomId, - roomName = roomName, + roomName = roomInfo.name, roomAvatar = roomAvatar, heroes = heroes, composerState = composerState, @@ -292,7 +289,7 @@ class MessagesPresenter @AssistedInject constructor( return AvatarData( id = id.value, name = name, - url = avatarUrl ?: room.info().avatarUrl, + url = avatarUrl, size = AvatarSize.TimelineRoom ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt index e838757aee..bedce147dc 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt @@ -32,8 +32,8 @@ import kotlinx.collections.immutable.ImmutableList @Immutable data class MessagesState( val roomId: RoomId, - val roomName: AsyncData, - val roomAvatar: AsyncData, + val roomName: String?, + val roomAvatar: AvatarData, val heroes: ImmutableList, val userEventPermissions: UserEventPermissions, val composerState: MessageComposerState, @@ -59,6 +59,6 @@ data class MessagesState( val roomMemberModerationState: RoomMemberModerationState, val successorRoom: SuccessorRoom?, val eventSink: (MessagesEvents) -> Unit -){ +) { val isTombstoned = successorRoom != null } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt index 62dd6a15d7..8fa539dd94 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt @@ -58,10 +58,7 @@ open class MessagesStateProvider : PreviewParameterProvider { aMessagesState(composerState = aMessageComposerState(showAttachmentSourcePicker = true)), aMessagesState(userEventPermissions = aUserEventPermissions(canSendMessage = false)), aMessagesState(showReinvitePrompt = true), - aMessagesState( - roomName = AsyncData.Uninitialized, - roomAvatar = AsyncData.Uninitialized, - ), + aMessagesState(roomName = null), aMessagesState(composerState = aMessageComposerState(showTextFormatting = true)), aMessagesState( enableVoiceMessages = true, @@ -86,15 +83,15 @@ open class MessagesStateProvider : PreviewParameterProvider { currentPinnedMessageIndex = 0, ), ), - aMessagesState(roomName = AsyncData.Success("A DM with a very looong name"), dmUserVerificationState = IdentityState.Verified), - aMessagesState(roomName = AsyncData.Success("A DM with a very looong name"), dmUserVerificationState = IdentityState.VerificationViolation), + aMessagesState(roomName = "A DM with a very looong name", dmUserVerificationState = IdentityState.Verified), + aMessagesState(roomName = "A DM with a very looong name", dmUserVerificationState = IdentityState.VerificationViolation), aMessagesState(successorRoom = SuccessorRoom(RoomId("!id:domain"), null)), ) } fun aMessagesState( - roomName: AsyncData = AsyncData.Success("Room name"), - roomAvatar: AsyncData = AsyncData.Success(AvatarData("!id:domain", "Room name", size = AvatarSize.TimelineRoom)), + roomName: String? = "Room name", + roomAvatar: AvatarData = AvatarData("!id:domain", "Room name", size = AvatarSize.TimelineRoom), userEventPermissions: UserEventPermissions = aUserEventPermissions(), composerState: MessageComposerState = aMessageComposerState( textEditorState = aTextEditorStateRich(initialText = "Hello", initialFocus = true), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt index 51b03c4a3c..a772015787 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt @@ -83,9 +83,7 @@ import io.element.android.features.networkmonitor.api.ui.ConnectivityIndicatorVi import io.element.android.features.roomcall.api.RoomCallState import io.element.android.libraries.androidutils.ui.hideKeyboard import io.element.android.libraries.designsystem.atomic.molecules.ComposerAlertMolecule -import io.element.android.libraries.designsystem.atomic.molecules.IconTitlePlaceholdersRowMolecule import io.element.android.libraries.designsystem.components.avatar.AvatarData -import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.RoomAvatar import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog @@ -194,8 +192,8 @@ fun MessagesView( Column { ConnectivityIndicatorView(isOnline = state.hasNetworkConnection) MessagesViewTopBar( - roomName = state.roomName.dataOrNull(), - roomAvatar = state.roomAvatar.dataOrNull(), + roomName = state.roomName, + roomAvatar = state.roomAvatar, isTombstoned = state.isTombstoned, heroes = state.heroes, roomCallState = state.roomCallState, @@ -451,8 +449,8 @@ private fun MessagesViewComposerBottomSheetContents( } }), roomId = state.roomId, - roomName = state.roomName.dataOrNull(), - roomAvatarData = state.roomAvatar.dataOrNull(), + roomName = state.roomName, + roomAvatarData = state.roomAvatar, suggestions = state.composerState.suggestions, onSelectSuggestion = { state.composerState.eventSink(MessageComposerEvents.InsertSuggestion(it)) @@ -492,7 +490,7 @@ private fun MessagesViewComposerBottomSheetContents( @Composable private fun MessagesViewTopBar( roomName: String?, - roomAvatar: AvatarData?, + roomAvatar: AvatarData, isTombstoned: Boolean, heroes: ImmutableList, roomCallState: RoomCallState, @@ -515,20 +513,13 @@ private fun MessagesViewTopBar( verticalAlignment = Alignment.CenterVertically, ) { val titleModifier = Modifier.weight(1f, fill = false) - if (roomName != null && roomAvatar != null) { - RoomAvatarAndNameRow( - roomName = roomName, - roomAvatar = roomAvatar, - isTombstoned = isTombstoned, - heroes = heroes, - modifier = titleModifier - ) - } else { - IconTitlePlaceholdersRowMolecule( - iconSize = AvatarSize.TimelineRoom.dp, - modifier = titleModifier - ) - } + RoomAvatarAndNameRow( + roomName = roomName, + roomAvatar = roomAvatar, + isTombstoned = isTombstoned, + heroes = heroes, + modifier = titleModifier + ) when (dmUserIdentityState) { IdentityState.Verified -> { @@ -562,7 +553,7 @@ private fun MessagesViewTopBar( @Composable private fun RoomAvatarAndNameRow( - roomName: String, + roomName: String?, roomAvatar: AvatarData, heroes: ImmutableList, isTombstoned: Boolean, @@ -579,8 +570,9 @@ private fun RoomAvatarAndNameRow( ) Text( modifier = Modifier.padding(horizontal = 8.dp), - text = roomName, + text = roomName ?: stringResource(CommonStrings.common_no_room_name), style = ElementTheme.typography.fontBodyLgMedium, + fontStyle = FontStyle.Italic.takeIf { roomName == null }, maxLines = 1, overflow = TextOverflow.Ellipsis ) @@ -591,9 +583,9 @@ private fun RoomAvatarAndNameRow( private fun CantSendMessageBanner() { Row( modifier = Modifier - .fillMaxWidth() - .background(ElementTheme.colors.bgSubtleSecondary) - .padding(16.dp), + .fillMaxWidth() + .background(ElementTheme.colors.bgSubtleSecondary) + .padding(16.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center ) { diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt index e7fb070424..254c31023d 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt @@ -48,8 +48,8 @@ import io.element.android.libraries.designsystem.atomic.molecules.MatrixBadgeRow import io.element.android.libraries.designsystem.components.ClickableLinkText import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize -import io.element.android.libraries.designsystem.components.avatar.RoomAvatar import io.element.android.libraries.designsystem.components.avatar.DmAvatars +import io.element.android.libraries.designsystem.components.avatar.RoomAvatar import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.button.MainActionButton import io.element.android.libraries.designsystem.components.list.ListItemContent diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/RoomAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/RoomAvatar.kt index 1c618a54f0..44d1c9b491 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/RoomAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/RoomAvatar.kt @@ -20,7 +20,7 @@ fun RoomAvatar( hideAvatarImage: Boolean = false, contentDescription: String? = null, ) { - when { + when { isTombstoned -> { TombstonedRoomAvatar( size = avatarData.size,