@@ -11,12 +11,10 @@ import androidx.compose.animation.AnimatedVisibility
11
11
import androidx.compose.animation.expandVertically
12
12
import androidx.compose.animation.shrinkVertically
13
13
import androidx.compose.foundation.background
14
- import androidx.compose.foundation.clickable
15
14
import androidx.compose.foundation.layout.Arrangement
16
15
import androidx.compose.foundation.layout.Box
17
16
import androidx.compose.foundation.layout.Column
18
17
import androidx.compose.foundation.layout.Row
19
- import androidx.compose.foundation.layout.Spacer
20
18
import androidx.compose.foundation.layout.WindowInsets
21
19
import androidx.compose.foundation.layout.consumeWindowInsets
22
20
import androidx.compose.foundation.layout.fillMaxSize
@@ -27,30 +25,23 @@ import androidx.compose.foundation.layout.navigationBarsPadding
27
25
import androidx.compose.foundation.layout.padding
28
26
import androidx.compose.foundation.layout.statusBars
29
27
import androidx.compose.foundation.layout.systemBarsPadding
30
- import androidx.compose.foundation.layout.width
31
- import androidx.compose.foundation.shape.RoundedCornerShape
32
- import androidx.compose.material3.ExperimentalMaterial3Api
33
28
import androidx.compose.material3.MaterialTheme
34
29
import androidx.compose.runtime.Composable
35
30
import androidx.compose.ui.Alignment
36
31
import androidx.compose.ui.Modifier
37
- import androidx.compose.ui.draw.clip
38
32
import androidx.compose.ui.draw.shadow
39
33
import androidx.compose.ui.graphics.RectangleShape
40
34
import androidx.compose.ui.platform.LocalView
41
35
import androidx.compose.ui.res.stringResource
42
36
import androidx.compose.ui.semantics.Role
43
- import androidx.compose.ui.semantics.heading
44
37
import androidx.compose.ui.semantics.onClick
45
38
import androidx.compose.ui.semantics.role
46
39
import androidx.compose.ui.semantics.semantics
47
40
import androidx.compose.ui.text.font.FontStyle
48
41
import androidx.compose.ui.text.style.TextAlign
49
- import androidx.compose.ui.text.style.TextOverflow
50
42
import androidx.compose.ui.tooling.preview.PreviewParameter
51
43
import androidx.compose.ui.unit.dp
52
44
import io.element.android.compound.theme.ElementTheme
53
- import io.element.android.compound.tokens.generated.CompoundIcons
54
45
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvents
55
46
import io.element.android.features.messages.impl.actionlist.ActionListEvents
56
47
import io.element.android.features.messages.impl.actionlist.ActionListView
@@ -69,38 +60,30 @@ import io.element.android.features.messages.impl.pinned.banner.PinnedMessagesBan
69
60
import io.element.android.features.messages.impl.timeline.FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS
70
61
import io.element.android.features.messages.impl.timeline.TimelineEvents
71
62
import io.element.android.features.messages.impl.timeline.TimelineView
72
- import io.element.android.features.messages.impl.timeline.components.CallMenuItem
73
63
import io.element.android.features.messages.impl.timeline.components.customreaction.CustomReactionBottomSheet
74
64
import io.element.android.features.messages.impl.timeline.components.customreaction.CustomReactionEvents
75
65
import io.element.android.features.messages.impl.timeline.components.reactionsummary.ReactionSummaryEvents
76
66
import io.element.android.features.messages.impl.timeline.components.reactionsummary.ReactionSummaryView
77
67
import io.element.android.features.messages.impl.timeline.components.receipt.bottomsheet.ReadReceiptBottomSheet
78
68
import io.element.android.features.messages.impl.timeline.components.receipt.bottomsheet.ReadReceiptBottomSheetEvents
79
69
import io.element.android.features.messages.impl.timeline.model.TimelineItem
70
+ import io.element.android.features.messages.impl.topbars.MessagesViewTopBar
71
+ import io.element.android.features.messages.impl.topbars.ThreadTopBar
80
72
import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessagePermissionRationaleDialog
81
73
import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageSendingFailedDialog
82
74
import io.element.android.features.networkmonitor.api.ui.ConnectivityIndicatorView
83
- import io.element.android.features.roomcall.api.RoomCallState
84
75
import io.element.android.libraries.androidutils.ui.hideKeyboard
85
76
import io.element.android.libraries.designsystem.atomic.molecules.ComposerAlertMolecule
86
77
import io.element.android.libraries.designsystem.components.ExpandableBottomSheetLayout
87
78
import io.element.android.libraries.designsystem.components.ExpandableBottomSheetLayoutState
88
- import io.element.android.libraries.designsystem.components.avatar.Avatar
89
- import io.element.android.libraries.designsystem.components.avatar.AvatarData
90
- import io.element.android.libraries.designsystem.components.avatar.AvatarSize
91
- import io.element.android.libraries.designsystem.components.avatar.AvatarType
92
- import io.element.android.libraries.designsystem.components.button.BackButton
93
79
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
94
80
import io.element.android.libraries.designsystem.components.rememberExpandableBottomSheetLayoutState
95
81
import io.element.android.libraries.designsystem.preview.ElementPreview
96
82
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
97
83
import io.element.android.libraries.designsystem.text.toAnnotatedString
98
84
import io.element.android.libraries.designsystem.theme.components.BottomSheetDragHandle
99
- import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
100
- import io.element.android.libraries.designsystem.theme.components.Icon
101
85
import io.element.android.libraries.designsystem.theme.components.Scaffold
102
86
import io.element.android.libraries.designsystem.theme.components.Text
103
- import io.element.android.libraries.designsystem.theme.components.TopAppBar
104
87
import io.element.android.libraries.designsystem.utils.HideKeyboardWhenDisposed
105
88
import io.element.android.libraries.designsystem.utils.KeepScreenOn
106
89
import io.element.android.libraries.designsystem.utils.OnLifecycleEvent
@@ -113,14 +96,9 @@ import io.element.android.libraries.matrix.api.encryption.identity.IdentityState
113
96
import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom
114
97
import io.element.android.libraries.matrix.api.timeline.Timeline
115
98
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
118
99
import io.element.android.libraries.textcomposer.model.TextEditorState
119
100
import io.element.android.libraries.ui.strings.CommonStrings
120
101
import io.element.android.wysiwyg.link.Link
121
- import kotlinx.collections.immutable.ImmutableList
122
- import kotlinx.collections.immutable.persistentListOf
123
- import kotlinx.collections.immutable.toImmutableList
124
102
import timber.log.Timber
125
103
import kotlin.time.Duration.Companion.milliseconds
126
104
@@ -517,154 +495,6 @@ private fun MessagesViewComposerBottomSheetContents(
517
495
}
518
496
}
519
497
520
- @OptIn(ExperimentalMaterial3Api ::class )
521
- @Composable
522
- private fun MessagesViewTopBar (
523
- roomName : String? ,
524
- roomAvatar : AvatarData ,
525
- isTombstoned : Boolean ,
526
- heroes : ImmutableList <AvatarData >,
527
- roomCallState : RoomCallState ,
528
- dmUserIdentityState : IdentityState ? ,
529
- onRoomDetailsClick : () -> Unit ,
530
- onJoinCallClick : () -> Unit ,
531
- onBackClick : () -> Unit ,
532
- ) {
533
- TopAppBar (
534
- navigationIcon = {
535
- BackButton (onClick = onBackClick)
536
- },
537
- title = {
538
- val roundedCornerShape = RoundedCornerShape (8 .dp)
539
- Row (
540
- modifier = Modifier
541
- .clip(roundedCornerShape)
542
- .clickable { onRoomDetailsClick() },
543
- horizontalArrangement = Arrangement .spacedBy(4 .dp),
544
- verticalAlignment = Alignment .CenterVertically ,
545
- ) {
546
- val titleModifier = Modifier .weight(1f , fill = false )
547
- RoomAvatarAndNameRow (
548
- roomName = roomName,
549
- roomAvatar = roomAvatar,
550
- isTombstoned = isTombstoned,
551
- heroes = heroes,
552
- modifier = titleModifier
553
- )
554
-
555
- when (dmUserIdentityState) {
556
- IdentityState .Verified -> {
557
- Icon (
558
- imageVector = CompoundIcons .Verified (),
559
- tint = ElementTheme .colors.iconSuccessPrimary,
560
- contentDescription = null ,
561
- )
562
- }
563
- IdentityState .VerificationViolation -> {
564
- Icon (
565
- imageVector = CompoundIcons .ErrorSolid (),
566
- tint = ElementTheme .colors.iconCriticalPrimary,
567
- contentDescription = null ,
568
- )
569
- }
570
- else -> Unit
571
- }
572
- }
573
- },
574
- actions = {
575
- CallMenuItem (
576
- roomCallState = roomCallState,
577
- onJoinCallClick = onJoinCallClick,
578
- )
579
- Spacer (Modifier .width(8 .dp))
580
- },
581
- windowInsets = WindowInsets (0 .dp)
582
- )
583
- }
584
-
585
- @OptIn(ExperimentalMaterial3Api ::class )
586
- @Composable
587
- private fun ThreadTopBar (
588
- roomName : String? ,
589
- roomAvatarData : AvatarData ,
590
- heroes : ImmutableList <AvatarData >,
591
- isTombstoned : Boolean ,
592
- onBackClick : () -> Unit ,
593
- modifier : Modifier = Modifier ,
594
- ) {
595
- TopAppBar (
596
- modifier = modifier,
597
- navigationIcon = {
598
- BackButton (onClick = onBackClick)
599
- },
600
- title = {
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
- }
630
- }
631
- )
632
- }
633
-
634
- @Composable
635
- private fun RoomAvatarAndNameRow (
636
- roomName : String? ,
637
- roomAvatar : AvatarData ,
638
- heroes : ImmutableList <AvatarData >,
639
- isTombstoned : Boolean ,
640
- modifier : Modifier = Modifier
641
- ) {
642
- Row (
643
- modifier = modifier,
644
- verticalAlignment = Alignment .CenterVertically
645
- ) {
646
- Avatar (
647
- avatarData = roomAvatar,
648
- avatarType = AvatarType .Room (
649
- heroes = heroes,
650
- isTombstoned = isTombstoned,
651
- ),
652
- )
653
- Text (
654
- modifier = Modifier
655
- .padding(horizontal = 8 .dp)
656
- .semantics {
657
- heading()
658
- },
659
- text = roomName ? : stringResource(CommonStrings .common_no_room_name),
660
- style = ElementTheme .typography.fontBodyLgMedium,
661
- fontStyle = FontStyle .Italic .takeIf { roomName == null },
662
- maxLines = 1 ,
663
- overflow = TextOverflow .Ellipsis
664
- )
665
- }
666
- }
667
-
668
498
@Composable
669
499
private fun CantSendMessageBanner () {
670
500
Row (
@@ -719,58 +549,3 @@ internal fun MessagesViewPreview(@PreviewParameter(MessagesStateProvider::class)
719
549
knockRequestsBannerView = {},
720
550
)
721
551
}
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
- }
0 commit comments