From 58fc1f9a0e3c14063ec0a8044c11b92b19cd1df2 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 9 Apr 2025 21:06:36 +0200 Subject: [PATCH] change (preferences) : hide invite avatars (room and sender) --- features/joinroom/impl/build.gradle.kts | 3 +++ .../joinroom/impl/JoinRoomPresenter.kt | 4 ++++ .../features/joinroom/impl/JoinRoomState.kt | 1 + .../joinroom/impl/JoinRoomStateProvider.kt | 2 ++ .../features/joinroom/impl/JoinRoomView.kt | 8 ++++++-- .../joinroom/impl/di/JoinRoomModule.kt | 3 +++ .../joinroom/impl/JoinRoomPresenterTest.kt | 8 ++++++-- .../roomlist/impl/RoomListPresenter.kt | 4 ++++ .../features/roomlist/impl/RoomListState.kt | 1 + .../roomlist/impl/RoomListStateProvider.kt | 2 ++ .../features/roomlist/impl/RoomListView.kt | 2 ++ .../impl/components/RoomListContentView.kt | 7 +++++++ .../roomlist/impl/components/RoomSummaryRow.kt | 7 +++++++ .../roomlist/impl/search/RoomListSearchView.kt | 5 +++++ .../designsystem/components/avatar/Avatar.kt | 4 +++- .../components/avatar/CompositeAvatar.kt | 18 +++++++++++++++--- .../matrix/ui/components/InviteSenderView.kt | 5 +++-- 17 files changed, 74 insertions(+), 10 deletions(-) diff --git a/features/joinroom/impl/build.gradle.kts b/features/joinroom/impl/build.gradle.kts index 65635f1907..69b755d1a3 100644 --- a/features/joinroom/impl/build.gradle.kts +++ b/features/joinroom/impl/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { implementation(projects.features.invite.api) implementation(projects.features.roomdirectory.api) implementation(projects.services.analytics.api) + implementation(projects.libraries.preferences.api) testImplementation(libs.test.junit) testImplementation(libs.coroutines.test) @@ -45,5 +46,7 @@ dependencies { testImplementation(projects.libraries.matrix.test) testImplementation(projects.tests.testutils) testImplementation(libs.androidx.compose.ui.test.junit) + testImplementation(projects.libraries.preferences.test) testReleaseImplementation(libs.androidx.compose.ui.test.manifest) + } diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt index 09ec3c9a5f..722ab53488 100644 --- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt +++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt @@ -50,6 +50,7 @@ import io.element.android.libraries.matrix.api.room.join.JoinRoom import io.element.android.libraries.matrix.api.room.join.JoinRule import io.element.android.libraries.matrix.api.room.preview.RoomPreviewInfo import io.element.android.libraries.matrix.ui.model.toInviteSender +import io.element.android.libraries.preferences.api.store.AppPreferencesStore import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import java.util.Optional @@ -67,6 +68,7 @@ class JoinRoomPresenter @AssistedInject constructor( private val forgetRoom: ForgetRoom, private val acceptDeclineInvitePresenter: Presenter, private val buildMeta: BuildMeta, + private val appPreferencesStore: AppPreferencesStore, ) : Presenter { interface Factory { fun create( @@ -89,6 +91,7 @@ class JoinRoomPresenter @AssistedInject constructor( val forgetRoomAction: MutableState> = remember { mutableStateOf(AsyncAction.Uninitialized) } var knockMessage by rememberSaveable { mutableStateOf("") } var isDismissingContent by remember { mutableStateOf(false) } + val shouldHideAvatars by appPreferencesStore.getHideInviteAvatarsFlow().collectAsState(initial = false) val contentState by produceState( initialValue = ContentState.Loading, key1 = roomInfo, @@ -193,6 +196,7 @@ class JoinRoomPresenter @AssistedInject constructor( cancelKnockAction = cancelKnockAction.value, applicationName = buildMeta.applicationName, knockMessage = knockMessage, + shouldHideAvatars = shouldHideAvatars, eventSink = ::handleEvents ) } diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomState.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomState.kt index 7162aea414..d709797776 100644 --- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomState.kt +++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomState.kt @@ -31,6 +31,7 @@ data class JoinRoomState( val cancelKnockAction: AsyncAction, private val applicationName: String, val knockMessage: String, + val shouldHideAvatars: Boolean, val eventSink: (JoinRoomEvents) -> Unit ) { val isJoinActionUnauthorized = joinAction is AsyncAction.Failure && joinAction.error is JoinRoomFailures.UnauthorizedJoin diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomStateProvider.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomStateProvider.kt index 3ebf021cc1..ba18c2b952 100644 --- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomStateProvider.kt +++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomStateProvider.kt @@ -171,6 +171,7 @@ fun aJoinRoomState( forgetAction: AsyncAction = AsyncAction.Uninitialized, cancelKnockAction: AsyncAction = AsyncAction.Uninitialized, knockMessage: String = "", + shouldHideAvatars: Boolean = false, eventSink: (JoinRoomEvents) -> Unit = {} ) = JoinRoomState( roomIdOrAlias = roomIdOrAlias, @@ -182,6 +183,7 @@ fun aJoinRoomState( forgetAction = forgetAction, applicationName = "AppName", knockMessage = knockMessage, + shouldHideAvatars = shouldHideAvatars, eventSink = eventSink ) diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt index 0e8c3e3581..c70e0ad163 100644 --- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt +++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt @@ -97,6 +97,7 @@ fun JoinRoomView( roomIdOrAlias = state.roomIdOrAlias, contentState = state.contentState, knockMessage = state.knockMessage, + shouldHideAvatars = state.shouldHideAvatars, onKnockMessageUpdate = { state.eventSink(JoinRoomEvents.UpdateKnockMessage(it)) }, ) }, @@ -371,6 +372,7 @@ private fun JoinRoomContent( roomIdOrAlias: RoomIdOrAlias, contentState: ContentState, knockMessage: String, + shouldHideAvatars: Boolean, onKnockMessageUpdate: (String) -> Unit, modifier: Modifier = Modifier, ) { @@ -385,13 +387,14 @@ private fun JoinRoomContent( Column(horizontalAlignment = Alignment.CenterHorizontally) { val inviteSender = (contentState.joinAuthorisationStatus as? JoinAuthorisationStatus.IsInvited)?.inviteSender if (inviteSender != null) { - InviteSenderView(inviteSender = inviteSender) + InviteSenderView(inviteSender = inviteSender, hideAvatarImage = shouldHideAvatars) Spacer(modifier = Modifier.height(32.dp)) } DefaultLoadedContent( modifier = Modifier.verticalScroll(rememberScrollState()), contentState = contentState, knockMessage = knockMessage, + shouldHideAvatars = shouldHideAvatars, onKnockMessageUpdate = onKnockMessageUpdate ) } @@ -474,13 +477,14 @@ private fun IsKnockedLoadedContent(modifier: Modifier = Modifier) { private fun DefaultLoadedContent( contentState: ContentState.Loaded, knockMessage: String, + shouldHideAvatars: Boolean, onKnockMessageUpdate: (String) -> Unit, modifier: Modifier = Modifier, ) { RoomPreviewOrganism( modifier = modifier, avatar = { - Avatar(contentState.avatarData(AvatarSize.RoomHeader)) + Avatar(contentState.avatarData(AvatarSize.RoomHeader), hideImage = shouldHideAvatars) }, title = { if (contentState.name != null) { diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/JoinRoomModule.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/JoinRoomModule.kt index ff4cbbbc80..9a15987f8e 100644 --- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/JoinRoomModule.kt +++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/JoinRoomModule.kt @@ -21,6 +21,7 @@ import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomIdOrAlias import io.element.android.libraries.matrix.api.room.join.JoinRoom +import io.element.android.libraries.preferences.api.store.AppPreferencesStore import java.util.Optional @Module @@ -35,6 +36,7 @@ object JoinRoomModule { forgetRoom: ForgetRoom, acceptDeclineInvitePresenter: Presenter, buildMeta: BuildMeta, + appPreferencesStore: AppPreferencesStore, ): JoinRoomPresenter.Factory { return object : JoinRoomPresenter.Factory { override fun create( @@ -57,6 +59,7 @@ object JoinRoomModule { cancelKnockRoom = cancelKnockRoom, acceptDeclineInvitePresenter = acceptDeclineInvitePresenter, buildMeta = buildMeta, + appPreferencesStore = appPreferencesStore, ) } } diff --git a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt index 1c146285c2..5cc13f2e65 100644 --- a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt +++ b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt @@ -45,6 +45,8 @@ import io.element.android.libraries.matrix.test.room.aRoomPreviewInfo import io.element.android.libraries.matrix.test.room.aRoomSummary import io.element.android.libraries.matrix.test.room.join.FakeJoinRoom import io.element.android.libraries.matrix.ui.model.toInviteSender +import io.element.android.libraries.preferences.api.store.AppPreferencesStore +import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.lambda.any import io.element.android.tests.testutils.lambda.assert @@ -759,7 +761,8 @@ class JoinRoomPresenterTest { cancelKnockRoom: CancelKnockRoom = FakeCancelKnockRoom(), forgetRoom: ForgetRoom = FakeForgetRoom(), buildMeta: BuildMeta = aBuildMeta(applicationName = "AppName"), - acceptDeclineInvitePresenter: Presenter = Presenter { anAcceptDeclineInviteState() } + acceptDeclineInvitePresenter: Presenter = Presenter { anAcceptDeclineInviteState() }, + appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore() ): JoinRoomPresenter { return JoinRoomPresenter( roomId = roomId, @@ -773,7 +776,8 @@ class JoinRoomPresenterTest { cancelKnockRoom = cancelKnockRoom, forgetRoom = forgetRoom, buildMeta = buildMeta, - acceptDeclineInvitePresenter = acceptDeclineInvitePresenter + acceptDeclineInvitePresenter = acceptDeclineInvitePresenter, + appPreferencesStore = appPreferencesStore, ) } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt index 19e46607ef..b235553677 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt @@ -117,6 +117,9 @@ class RoomListPresenter @Inject constructor( // Avatar indicator val showAvatarIndicator by indicatorService.showRoomListTopBarIndicator() + val hideInvitesAvatar by remember { + appPreferencesStore.getHideInviteAvatarsFlow() + }.collectAsState(initial = false) val contextMenu = remember { mutableStateOf(RoomListState.ContextMenu.Hidden) } @@ -171,6 +174,7 @@ class RoomListPresenter @Inject constructor( contentState = contentState, acceptDeclineInviteState = acceptDeclineInviteState, directLogoutState = directLogoutState, + hideInvitesAvatars = hideInvitesAvatar, eventSink = ::handleEvents, ) } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt index 4ee15b7fab..f8463b2590 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt @@ -34,6 +34,7 @@ data class RoomListState( val contentState: RoomListContentState, val acceptDeclineInviteState: AcceptDeclineInviteState, val directLogoutState: DirectLogoutState, + val hideInvitesAvatars: Boolean, val eventSink: (RoomListEvents) -> Unit, ) { val displayFilters = contentState is RoomListContentState.Rooms diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt index 6b075db9df..1f93e81d67 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt @@ -61,6 +61,7 @@ internal fun aRoomListState( contentState: RoomListContentState = aRoomsContentState(), acceptDeclineInviteState: AcceptDeclineInviteState = anAcceptDeclineInviteState(), directLogoutState: DirectLogoutState = aDirectLogoutState(), + hideInvitesAvatars: Boolean = false, eventSink: (RoomListEvents) -> Unit = {} ) = RoomListState( matrixUser = matrixUser, @@ -75,6 +76,7 @@ internal fun aRoomListState( contentState = contentState, acceptDeclineInviteState = acceptDeclineInviteState, directLogoutState = directLogoutState, + hideInvitesAvatars = hideInvitesAvatars, eventSink = eventSink, ) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt index 64ec1f8406..090180a7b8 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt @@ -81,6 +81,7 @@ fun RoomListView( RoomListSearchView( state = state.searchState, eventSink = state.eventSink, + hideInvitesAvatars = state.hideInvitesAvatars, onRoomClick = onRoomClick, modifier = Modifier .statusBarsPadding() @@ -134,6 +135,7 @@ private fun RoomListScaffold( RoomListContentView( contentState = state.contentState, filtersState = state.filtersState, + hideInvitesAvatars = state.hideInvitesAvatars, eventSink = state.eventSink, onSetUpRecoveryClick = onSetUpRecoveryClick, onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt index ebd618185c..dd724f9ef8 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt @@ -59,6 +59,7 @@ import kotlinx.collections.immutable.ImmutableList fun RoomListContentView( contentState: RoomListContentState, filtersState: RoomListFiltersState, + hideInvitesAvatars: Boolean, eventSink: (RoomListEvents) -> Unit, onSetUpRecoveryClick: () -> Unit, onConfirmRecoveryKeyClick: () -> Unit, @@ -85,6 +86,7 @@ fun RoomListContentView( is RoomListContentState.Rooms -> { RoomsView( state = contentState, + hideInvitesAvatars = hideInvitesAvatars, filtersState = filtersState, eventSink = eventSink, onSetUpRecoveryClick = onSetUpRecoveryClick, @@ -155,6 +157,7 @@ private fun EmptyView( @Composable private fun RoomsView( state: RoomListContentState.Rooms, + hideInvitesAvatars: Boolean, filtersState: RoomListFiltersState, eventSink: (RoomListEvents) -> Unit, onSetUpRecoveryClick: () -> Unit, @@ -170,6 +173,7 @@ private fun RoomsView( } else { RoomsViewList( state = state, + hideInvitesAvatars = hideInvitesAvatars, eventSink = eventSink, onSetUpRecoveryClick = onSetUpRecoveryClick, onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, @@ -182,6 +186,7 @@ private fun RoomsView( @Composable private fun RoomsViewList( state: RoomListContentState.Rooms, + hideInvitesAvatars: Boolean, eventSink: (RoomListEvents) -> Unit, onSetUpRecoveryClick: () -> Unit, onConfirmRecoveryKeyClick: () -> Unit, @@ -239,6 +244,7 @@ private fun RoomsViewList( ) { index, room -> RoomSummaryRow( room = room, + hideInviteAvatars = hideInvitesAvatars, onClick = onRoomClick, eventSink = eventSink, ) @@ -300,6 +306,7 @@ internal fun RoomListContentViewPreview(@PreviewParameter(RoomListContentStatePr filtersState = aRoomListFiltersState( filterSelectionStates = RoomListFilter.entries.map { FilterSelectionState(it, isSelected = true) } ), + hideInvitesAvatars = false, eventSink = {}, onSetUpRecoveryClick = {}, onConfirmRecoveryKeyClick = {}, diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt index 9ce03ab4cc..93de6c2fb3 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt @@ -68,10 +68,12 @@ internal val minHeight = 84.dp @Composable internal fun RoomSummaryRow( room: RoomListRoomSummary, + hideInviteAvatars: Boolean, onClick: (RoomListRoomSummary) -> Unit, eventSink: (RoomListEvents) -> Unit, modifier: Modifier = Modifier, ) { + Box(modifier = modifier) { when (room.displayType) { RoomSummaryDisplayType.PLACEHOLDER -> { @@ -80,6 +82,7 @@ internal fun RoomSummaryRow( RoomSummaryDisplayType.INVITE -> { RoomSummaryScaffoldRow( room = room, + hideAvatarImage = hideInviteAvatars, onClick = onClick, onLongClick = { Timber.d("Long click on invite room") @@ -92,6 +95,7 @@ internal fun RoomSummaryRow( InviteSenderView( modifier = Modifier.fillMaxWidth(), inviteSender = room.inviteSender, + hideAvatarImage = hideInviteAvatars ) } Spacer(modifier = Modifier.height(12.dp)) @@ -164,6 +168,7 @@ private fun RoomSummaryScaffoldRow( onClick: (RoomListRoomSummary) -> Unit, onLongClick: (RoomListRoomSummary) -> Unit, modifier: Modifier = Modifier, + hideAvatarImage: Boolean = false, content: @Composable ColumnScope.() -> Unit ) { val clickModifier = Modifier.combinedClickable( @@ -184,6 +189,7 @@ private fun RoomSummaryScaffoldRow( CompositeAvatar( avatarData = room.avatarData, heroes = room.heroes, + hideAvatarImages = hideAvatarImage, ) Spacer(modifier = Modifier.width(16.dp)) Column( @@ -384,6 +390,7 @@ private fun MentionIndicatorAtom() { internal fun RoomSummaryRowPreview(@PreviewParameter(RoomListRoomSummaryProvider::class) data: RoomListRoomSummary) = ElementPreview { RoomSummaryRow( room = data, + hideInviteAvatars = false, onClick = {}, eventSink = {}, ) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt index 90b4fba44c..6be9f2be33 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt @@ -54,6 +54,7 @@ import io.element.android.libraries.ui.strings.CommonStrings @Composable internal fun RoomListSearchView( state: RoomListSearchState, + hideInvitesAvatars: Boolean, eventSink: (RoomListEvents) -> Unit, onRoomClick: (RoomId) -> Unit, modifier: Modifier = Modifier, @@ -80,6 +81,7 @@ internal fun RoomListSearchView( if (state.isSearchActive) { RoomListSearchContent( state = state, + hideInvitesAvatars = hideInvitesAvatars, onRoomClick = onRoomClick, eventSink = eventSink, ) @@ -92,6 +94,7 @@ internal fun RoomListSearchView( @Composable private fun RoomListSearchContent( state: RoomListSearchState, + hideInvitesAvatars: Boolean, eventSink: (RoomListEvents) -> Unit, onRoomClick: (RoomId) -> Unit, ) { @@ -173,6 +176,7 @@ private fun RoomListSearchContent( ) { room -> RoomSummaryRow( room = room, + hideInviteAvatars = hideInvitesAvatars, onClick = ::onRoomClick, eventSink = eventSink, ) @@ -187,6 +191,7 @@ private fun RoomListSearchContent( internal fun RoomListSearchContentPreview(@PreviewParameter(RoomListSearchStateProvider::class) state: RoomListSearchState) = ElementPreview { RoomListSearchContent( state = state, + hideInvitesAvatars = false, onRoomClick = {}, eventSink = {}, ) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt index 31dd89b87a..1086fec9d0 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt @@ -48,11 +48,13 @@ fun Avatar( contentDescription: String? = null, // If not null, will be used instead of the size from avatarData forcedAvatarSize: Dp? = null, + // If true, will show initials even if avatarData.url is not null + hideImage: Boolean = false, ) { val commonModifier = modifier .size(forcedAvatarSize ?: avatarData.size.dp) .clip(CircleShape) - if (avatarData.url.isNullOrBlank()) { + if (avatarData.url.isNullOrBlank() || hideImage) { InitialsAvatar( avatarData = avatarData, forcedAvatarSize = forcedAvatarSize, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/CompositeAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/CompositeAvatar.kt index 9e40e08e2a..c696050f23 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/CompositeAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/CompositeAvatar.kt @@ -33,10 +33,16 @@ fun CompositeAvatar( avatarData: AvatarData, heroes: ImmutableList, modifier: Modifier = Modifier, + hideAvatarImages: Boolean = false, contentDescription: String? = null, ) { if (avatarData.url != null || heroes.isEmpty()) { - Avatar(avatarData, modifier, contentDescription) + Avatar( + avatarData = avatarData, + modifier = modifier, + contentDescription = contentDescription, + hideImage = hideAvatarImages + ) } else { val limitedHeroes = heroes.take(4) val numberOfHeroes = limitedHeroes.size @@ -49,7 +55,12 @@ fun CompositeAvatar( error("Unsupported number of heroes: 0") } 1 -> { - Avatar(heroes[0], modifier, contentDescription) + Avatar( + avatarData = heroes[0], + modifier = modifier, + contentDescription = contentDescription, + hideImage = hideAvatarImages + ) } else -> { val angle = 2 * Math.PI / numberOfHeroes @@ -91,8 +102,9 @@ fun CompositeAvatar( ) ) { Avatar( - heroAvatar, + avatarData = heroAvatar, forcedAvatarSize = heroAvatarSize, + hideImage = hideAvatarImages, ) } } diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/InviteSenderView.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/InviteSenderView.kt index 452f6ed5a2..946c0d51e9 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/InviteSenderView.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/InviteSenderView.kt @@ -27,14 +27,15 @@ import io.element.android.libraries.matrix.ui.model.InviteSender @Composable fun InviteSenderView( inviteSender: InviteSender, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + hideAvatarImage: Boolean = false, ) { Row( horizontalArrangement = Arrangement.spacedBy(8.dp), modifier = modifier, ) { Box(modifier = Modifier.padding(vertical = 2.dp)) { - Avatar(avatarData = inviteSender.avatarData) + Avatar(avatarData = inviteSender.avatarData, hideImage = hideAvatarImage) } Text( text = inviteSender.annotatedString(),