Skip to content

Commit 30e91e7

Browse files
Add room info to the thread's top app bar (#5374)
* Add room info to the thread's top app bar * Update screenshots * Fix lint issues --------- Co-authored-by: ElementBot <[email protected]>
1 parent c195cf2 commit 30e91e7

File tree

5 files changed

+113
-6
lines changed

5 files changed

+113
-6
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt

Lines changed: 103 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ import io.element.android.libraries.designsystem.components.ExpandableBottomShee
8787
import io.element.android.libraries.designsystem.components.ExpandableBottomSheetLayoutState
8888
import io.element.android.libraries.designsystem.components.avatar.Avatar
8989
import io.element.android.libraries.designsystem.components.avatar.AvatarData
90+
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
9091
import io.element.android.libraries.designsystem.components.avatar.AvatarType
9192
import io.element.android.libraries.designsystem.components.button.BackButton
9293
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
@@ -95,6 +96,7 @@ import io.element.android.libraries.designsystem.preview.ElementPreview
9596
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
9697
import io.element.android.libraries.designsystem.text.toAnnotatedString
9798
import io.element.android.libraries.designsystem.theme.components.BottomSheetDragHandle
99+
import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
98100
import io.element.android.libraries.designsystem.theme.components.Icon
99101
import io.element.android.libraries.designsystem.theme.components.Scaffold
100102
import io.element.android.libraries.designsystem.theme.components.Text
@@ -111,10 +113,14 @@ import io.element.android.libraries.matrix.api.encryption.identity.IdentityState
111113
import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom
112114
import io.element.android.libraries.matrix.api.timeline.Timeline
113115
import io.element.android.libraries.matrix.api.user.MatrixUser
116+
import io.element.android.libraries.matrix.ui.components.aMatrixUserList
117+
import io.element.android.libraries.matrix.ui.model.getAvatarData
114118
import io.element.android.libraries.textcomposer.model.TextEditorState
115119
import io.element.android.libraries.ui.strings.CommonStrings
116120
import io.element.android.wysiwyg.link.Link
117121
import kotlinx.collections.immutable.ImmutableList
122+
import kotlinx.collections.immutable.persistentListOf
123+
import kotlinx.collections.immutable.toImmutableList
118124
import timber.log.Timber
119125
import kotlin.time.Duration.Companion.milliseconds
120126

@@ -202,7 +208,13 @@ fun MessagesView(
202208
Column {
203209
ConnectivityIndicatorView(isOnline = state.hasNetworkConnection)
204210
if (state.timelineState.timelineMode is Timeline.Mode.Thread) {
205-
ThreadTopBar(onBackClick = onBackClick)
211+
ThreadTopBar(
212+
roomName = state.roomName,
213+
roomAvatarData = state.roomAvatar,
214+
heroes = state.heroes,
215+
isTombstoned = state.isTombstoned,
216+
onBackClick = onBackClick,
217+
)
206218
} else {
207219
MessagesViewTopBar(
208220
roomName = state.roomName,
@@ -573,14 +585,48 @@ private fun MessagesViewTopBar(
573585
@OptIn(ExperimentalMaterial3Api::class)
574586
@Composable
575587
private fun ThreadTopBar(
588+
roomName: String?,
589+
roomAvatarData: AvatarData,
590+
heroes: ImmutableList<AvatarData>,
591+
isTombstoned: Boolean,
576592
onBackClick: () -> Unit,
593+
modifier: Modifier = Modifier,
577594
) {
578595
TopAppBar(
596+
modifier = modifier,
579597
navigationIcon = {
580598
BackButton(onClick = onBackClick)
581599
},
582600
title = {
583-
Text(stringResource(CommonStrings.common_thread))
601+
Row(verticalAlignment = Alignment.CenterVertically) {
602+
Avatar(
603+
avatarData = roomAvatarData,
604+
avatarType = AvatarType.Room(
605+
heroes = heroes,
606+
isTombstoned = isTombstoned,
607+
),
608+
)
609+
Column(
610+
modifier = Modifier.fillMaxWidth()
611+
.padding(horizontal = 8.dp)
612+
.semantics {
613+
heading()
614+
},
615+
) {
616+
Text(
617+
text = stringResource(CommonStrings.common_thread),
618+
style = ElementTheme.typography.fontBodyLgMedium,
619+
)
620+
Text(
621+
text = roomName ?: stringResource(CommonStrings.common_no_room_name),
622+
style = ElementTheme.typography.fontBodySmRegular,
623+
fontStyle = FontStyle.Italic.takeIf { roomName == null },
624+
color = ElementTheme.colors.textSecondary,
625+
maxLines = 1,
626+
overflow = TextOverflow.Ellipsis
627+
)
628+
}
629+
}
584630
}
585631
)
586632
}
@@ -673,3 +719,58 @@ internal fun MessagesViewPreview(@PreviewParameter(MessagesStateProvider::class)
673719
knockRequestsBannerView = {},
674720
)
675721
}
722+
723+
@PreviewsDayNight
724+
@Composable
725+
internal fun ThreadTopBarPreview() {
726+
ElementPreview {
727+
val name = "Room name"
728+
val initialsAvatarData = AvatarData(
729+
id = "id",
730+
name = name,
731+
url = null,
732+
size = AvatarSize.TimelineRoom,
733+
)
734+
Column {
735+
ThreadTopBar(
736+
roomName = name,
737+
roomAvatarData = initialsAvatarData,
738+
heroes = persistentListOf(),
739+
isTombstoned = false,
740+
onBackClick = {},
741+
)
742+
HorizontalDivider()
743+
ThreadTopBar(
744+
roomName = name,
745+
roomAvatarData = initialsAvatarData,
746+
heroes = aMatrixUserList().map { it.getAvatarData(AvatarSize.TimelineRoom) }.toImmutableList(),
747+
isTombstoned = false,
748+
onBackClick = {},
749+
)
750+
HorizontalDivider()
751+
ThreadTopBar(
752+
roomName = null,
753+
roomAvatarData = initialsAvatarData,
754+
heroes = persistentListOf(),
755+
isTombstoned = false,
756+
onBackClick = {},
757+
)
758+
HorizontalDivider()
759+
ThreadTopBar(
760+
roomName = name,
761+
roomAvatarData = initialsAvatarData.copy(url = "https://some-avatar.jpg"),
762+
heroes = persistentListOf(),
763+
isTombstoned = false,
764+
onBackClick = {},
765+
)
766+
HorizontalDivider()
767+
ThreadTopBar(
768+
roomName = name,
769+
roomAvatarData = initialsAvatarData,
770+
heroes = persistentListOf(),
771+
isTombstoned = true,
772+
onBackClick = {},
773+
)
774+
}
775+
}
776+
}
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 3 additions & 0 deletions
Loading
Lines changed: 3 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)