Skip to content

Commit 7bde9bc

Browse files
authored
Merge pull request #4891 from element-hq/feature/fga/tombstoned-room-decoration
Change : add tombstoned room decoration
2 parents df33cf2 + b8cef93 commit 7bde9bc

File tree

48 files changed

+449
-274
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+449
-274
lines changed

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,8 @@ class MessagesPresenter @AssistedInject constructor(
152152

153153
val userEventPermissions by userEventPermissions(syncUpdateFlow.value)
154154

155-
val roomName: AsyncData<String> by remember {
156-
derivedStateOf { roomInfo.name?.let { AsyncData.Success(it) } ?: AsyncData.Uninitialized }
157-
}
158-
val roomAvatar: AsyncData<AvatarData> by remember {
159-
derivedStateOf { AsyncData.Success(roomInfo.avatarData()) }
155+
val roomAvatar by remember {
156+
derivedStateOf { roomInfo.avatarData() }
160157
}
161158
val heroes by remember {
162159
derivedStateOf { roomInfo.heroes().toPersistentList() }
@@ -245,7 +242,7 @@ class MessagesPresenter @AssistedInject constructor(
245242

246243
return MessagesState(
247244
roomId = room.roomId,
248-
roomName = roomName,
245+
roomName = roomInfo.name,
249246
roomAvatar = roomAvatar,
250247
heroes = heroes,
251248
composerState = composerState,
@@ -292,7 +289,7 @@ class MessagesPresenter @AssistedInject constructor(
292289
return AvatarData(
293290
id = id.value,
294291
name = name,
295-
url = avatarUrl ?: room.info().avatarUrl,
292+
url = avatarUrl,
296293
size = AvatarSize.TimelineRoom
297294
)
298295
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ import kotlinx.collections.immutable.ImmutableList
3232
@Immutable
3333
data class MessagesState(
3434
val roomId: RoomId,
35-
val roomName: AsyncData<String>,
36-
val roomAvatar: AsyncData<AvatarData>,
35+
val roomName: String?,
36+
val roomAvatar: AvatarData,
3737
val heroes: ImmutableList<AvatarData>,
3838
val userEventPermissions: UserEventPermissions,
3939
val composerState: MessageComposerState,
@@ -59,4 +59,6 @@ data class MessagesState(
5959
val roomMemberModerationState: RoomMemberModerationState,
6060
val successorRoom: SuccessorRoom?,
6161
val eventSink: (MessagesEvents) -> Unit
62-
)
62+
) {
63+
val isTombstoned = successorRoom != null
64+
}

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,7 @@ open class MessagesStateProvider : PreviewParameterProvider<MessagesState> {
5858
aMessagesState(composerState = aMessageComposerState(showAttachmentSourcePicker = true)),
5959
aMessagesState(userEventPermissions = aUserEventPermissions(canSendMessage = false)),
6060
aMessagesState(showReinvitePrompt = true),
61-
aMessagesState(
62-
roomName = AsyncData.Uninitialized,
63-
roomAvatar = AsyncData.Uninitialized,
64-
),
61+
aMessagesState(roomName = null),
6562
aMessagesState(composerState = aMessageComposerState(showTextFormatting = true)),
6663
aMessagesState(
6764
enableVoiceMessages = true,
@@ -86,15 +83,15 @@ open class MessagesStateProvider : PreviewParameterProvider<MessagesState> {
8683
currentPinnedMessageIndex = 0,
8784
),
8885
),
89-
aMessagesState(roomName = AsyncData.Success("A DM with a very looong name"), dmUserVerificationState = IdentityState.Verified),
90-
aMessagesState(roomName = AsyncData.Success("A DM with a very looong name"), dmUserVerificationState = IdentityState.VerificationViolation),
86+
aMessagesState(roomName = "A DM with a very looong name", dmUserVerificationState = IdentityState.Verified),
87+
aMessagesState(roomName = "A DM with a very looong name", dmUserVerificationState = IdentityState.VerificationViolation),
9188
aMessagesState(successorRoom = SuccessorRoom(RoomId("!id:domain"), null)),
9289
)
9390
}
9491

9592
fun aMessagesState(
96-
roomName: AsyncData<String> = AsyncData.Success("Room name"),
97-
roomAvatar: AsyncData<AvatarData> = AsyncData.Success(AvatarData("!id:domain", "Room name", size = AvatarSize.TimelineRoom)),
93+
roomName: String? = "Room name",
94+
roomAvatar: AvatarData = AvatarData("!id:domain", "Room name", size = AvatarSize.TimelineRoom),
9895
userEventPermissions: UserEventPermissions = aUserEventPermissions(),
9996
composerState: MessageComposerState = aMessageComposerState(
10097
textEditorState = aTextEditorStateRich(initialText = "Hello", initialFocus = true),

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

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,8 @@ import io.element.android.features.networkmonitor.api.ui.ConnectivityIndicatorVi
8383
import io.element.android.features.roomcall.api.RoomCallState
8484
import io.element.android.libraries.androidutils.ui.hideKeyboard
8585
import io.element.android.libraries.designsystem.atomic.molecules.ComposerAlertMolecule
86-
import io.element.android.libraries.designsystem.atomic.molecules.IconTitlePlaceholdersRowMolecule
8786
import io.element.android.libraries.designsystem.components.avatar.AvatarData
88-
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
89-
import io.element.android.libraries.designsystem.components.avatar.CompositeAvatar
87+
import io.element.android.libraries.designsystem.components.avatar.RoomAvatar
9088
import io.element.android.libraries.designsystem.components.button.BackButton
9189
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
9290
import io.element.android.libraries.designsystem.preview.ElementPreview
@@ -194,8 +192,9 @@ fun MessagesView(
194192
Column {
195193
ConnectivityIndicatorView(isOnline = state.hasNetworkConnection)
196194
MessagesViewTopBar(
197-
roomName = state.roomName.dataOrNull(),
198-
roomAvatar = state.roomAvatar.dataOrNull(),
195+
roomName = state.roomName,
196+
roomAvatar = state.roomAvatar,
197+
isTombstoned = state.isTombstoned,
199198
heroes = state.heroes,
200199
roomCallState = state.roomCallState,
201200
dmUserIdentityState = state.dmUserVerificationState,
@@ -450,8 +449,8 @@ private fun MessagesViewComposerBottomSheetContents(
450449
}
451450
}),
452451
roomId = state.roomId,
453-
roomName = state.roomName.dataOrNull(),
454-
roomAvatarData = state.roomAvatar.dataOrNull(),
452+
roomName = state.roomName,
453+
roomAvatarData = state.roomAvatar,
455454
suggestions = state.composerState.suggestions,
456455
onSelectSuggestion = {
457456
state.composerState.eventSink(MessageComposerEvents.InsertSuggestion(it))
@@ -491,7 +490,8 @@ private fun MessagesViewComposerBottomSheetContents(
491490
@Composable
492491
private fun MessagesViewTopBar(
493492
roomName: String?,
494-
roomAvatar: AvatarData?,
493+
roomAvatar: AvatarData,
494+
isTombstoned: Boolean,
495495
heroes: ImmutableList<AvatarData>,
496496
roomCallState: RoomCallState,
497497
dmUserIdentityState: IdentityState?,
@@ -513,19 +513,13 @@ private fun MessagesViewTopBar(
513513
verticalAlignment = Alignment.CenterVertically,
514514
) {
515515
val titleModifier = Modifier.weight(1f, fill = false)
516-
if (roomName != null && roomAvatar != null) {
517-
RoomAvatarAndNameRow(
518-
roomName = roomName,
519-
roomAvatar = roomAvatar,
520-
heroes = heroes,
521-
modifier = titleModifier
522-
)
523-
} else {
524-
IconTitlePlaceholdersRowMolecule(
525-
iconSize = AvatarSize.TimelineRoom.dp,
526-
modifier = titleModifier
527-
)
528-
}
516+
RoomAvatarAndNameRow(
517+
roomName = roomName,
518+
roomAvatar = roomAvatar,
519+
isTombstoned = isTombstoned,
520+
heroes = heroes,
521+
modifier = titleModifier
522+
)
529523

530524
when (dmUserIdentityState) {
531525
IdentityState.Verified -> {
@@ -559,23 +553,26 @@ private fun MessagesViewTopBar(
559553

560554
@Composable
561555
private fun RoomAvatarAndNameRow(
562-
roomName: String,
556+
roomName: String?,
563557
roomAvatar: AvatarData,
564558
heroes: ImmutableList<AvatarData>,
559+
isTombstoned: Boolean,
565560
modifier: Modifier = Modifier
566561
) {
567562
Row(
568563
modifier = modifier,
569564
verticalAlignment = Alignment.CenterVertically
570565
) {
571-
CompositeAvatar(
566+
RoomAvatar(
572567
avatarData = roomAvatar,
573568
heroes = heroes,
569+
isTombstoned = isTombstoned,
574570
)
575571
Text(
576572
modifier = Modifier.padding(horizontal = 8.dp),
577-
text = roomName,
573+
text = roomName ?: stringResource(CommonStrings.common_no_room_name),
578574
style = ElementTheme.typography.fontBodyLgMedium,
575+
fontStyle = FontStyle.Italic.takeIf { roomName == null },
579576
maxLines = 1,
580577
overflow = TextOverflow.Ellipsis
581578
)
@@ -586,9 +583,9 @@ private fun RoomAvatarAndNameRow(
586583
private fun CantSendMessageBanner() {
587584
Row(
588585
modifier = Modifier
589-
.fillMaxWidth()
590-
.background(ElementTheme.colors.bgSubtleSecondary)
591-
.padding(16.dp),
586+
.fillMaxWidth()
587+
.background(ElementTheme.colors.bgSubtleSecondary)
588+
.padding(16.dp),
592589
verticalAlignment = Alignment.CenterVertically,
593590
horizontalArrangement = Arrangement.Center
594591
) {

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import io.element.android.features.messages.impl.R
2727
import io.element.android.libraries.designsystem.components.avatar.Avatar
2828
import io.element.android.libraries.designsystem.components.avatar.AvatarData
2929
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
30+
import io.element.android.libraries.designsystem.components.avatar.anAvatarData
3031
import io.element.android.libraries.designsystem.preview.ElementPreview
3132
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
3233
import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
@@ -45,7 +46,7 @@ import kotlinx.collections.immutable.persistentListOf
4546
fun SuggestionsPickerView(
4647
roomId: RoomId,
4748
roomName: String?,
48-
roomAvatarData: AvatarData?,
49+
roomAvatarData: AvatarData,
4950
suggestions: ImmutableList<ResolvedSuggestion>,
5051
onSelectSuggestion: (ResolvedSuggestion) -> Unit,
5152
modifier: Modifier = Modifier,
@@ -155,7 +156,7 @@ internal fun SuggestionsPickerViewPreview() {
155156
SuggestionsPickerView(
156157
roomId = RoomId("!room:matrix.org"),
157158
roomName = "Room",
158-
roomAvatarData = null,
159+
roomAvatarData = anAvatarData(),
159160
suggestions = persistentListOf(
160161
ResolvedSuggestion.AtRoom,
161162
ResolvedSuggestion.Member(roomMember),

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ class MessagesPresenterTest {
119119
presenter.testWithLifecycleOwner {
120120
val initialState = consumeItemsUntilTimeout().last()
121121
assertThat(initialState.roomId).isEqualTo(A_ROOM_ID)
122-
assertThat(initialState.roomName).isEqualTo(AsyncData.Success(""))
122+
assertThat(initialState.roomName).isEqualTo("")
123123
assertThat(initialState.roomAvatar)
124-
.isEqualTo(AsyncData.Success(AvatarData(id = A_ROOM_ID.value, name = "", url = AN_AVATAR_URL, size = AvatarSize.TimelineRoom)))
124+
.isEqualTo(AvatarData(id = A_ROOM_ID.value, name = "", url = AN_AVATAR_URL, size = AvatarSize.TimelineRoom))
125125
assertThat(initialState.userEventPermissions.canSendMessage).isTrue()
126126
assertThat(initialState.userEventPermissions.canRedactOwn).isTrue()
127127
assertThat(initialState.hasNetworkConnection).isTrue()

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class MessagesViewTest {
110110
state = state,
111111
onRoomDetailsClick = callback,
112112
)
113-
rule.onNodeWithText(state.roomName.dataOrNull().orEmpty(), useUnmergedTree = true).performClick()
113+
rule.onNodeWithText(state.roomName.orEmpty(), useUnmergedTree = true).performClick()
114114
}
115115
}
116116

features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingView.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import androidx.compose.ui.text.font.FontStyle
1616
import androidx.compose.ui.tooling.preview.PreviewParameter
1717
import io.element.android.features.preferences.impl.R
1818
import io.element.android.libraries.designsystem.components.async.AsyncActionView
19-
import io.element.android.libraries.designsystem.components.avatar.CompositeAvatar
19+
import io.element.android.libraries.designsystem.components.avatar.RoomAvatar
2020
import io.element.android.libraries.designsystem.components.list.ListItemContent
2121
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
2222
import io.element.android.libraries.designsystem.components.preferences.PreferencePage
@@ -97,7 +97,7 @@ fun EditDefaultNotificationSettingView(
9797
Text(text = subtitle)
9898
},
9999
leadingContent = ListItemContent.Custom {
100-
CompositeAvatar(
100+
RoomAvatar(
101101
avatarData = summary.avatarData,
102102
heroes = summary.heroesAvatar,
103103
)

features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ class RoomDetailsPresenter @Inject constructor(
210210
canShowSecurityAndPrivacy = canShowSecurityAndPrivacy,
211211
hasMemberVerificationViolations = hasMemberVerificationViolations,
212212
canReportRoom = canReportRoom,
213+
isTombstoned = roomInfo.successorRoom != null,
213214
eventSink = ::handleEvents,
214215
)
215216
}

features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ data class RoomDetailsState(
4949
val canShowSecurityAndPrivacy: Boolean,
5050
val hasMemberVerificationViolations: Boolean,
5151
val canReportRoom: Boolean,
52+
val isTombstoned: Boolean,
5253
val eventSink: (RoomDetailsEvent) -> Unit
5354
) {
5455
val roomBadges = buildList {

0 commit comments

Comments
 (0)