From 119d09c4948db91af2e2b8ae1cf8ad3559a06968 Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 8 Apr 2025 20:27:47 +0200 Subject: [PATCH 1/9] change (preferences) : move from dev settings to advanced settings and add new safety values --- .../protection/TimelineProtectionPresenter.kt | 11 ++-- .../impl/advanced/AdvancedSettingsEvents.kt | 3 + .../advanced/AdvancedSettingsPresenter.kt | 17 ++++++ .../impl/advanced/AdvancedSettingsState.kt | 3 + .../advanced/AdvancedSettingsStateProvider.kt | 7 +++ .../impl/advanced/AdvancedSettingsView.kt | 60 +++++++++++++++++++ .../impl/developer/DeveloperSettingsEvents.kt | 1 - .../developer/DeveloperSettingsPresenter.kt | 7 --- .../impl/developer/DeveloperSettingsState.kt | 1 - .../DeveloperSettingsStateProvider.kt | 2 - .../impl/developer/DeveloperSettingsView.kt | 17 ------ .../impl/src/main/res/values/localazy.xml | 5 ++ .../DeveloperSettingsPresenterTest.kt | 22 ------- .../developer/DeveloperSettingsViewTest.kt | 12 ---- .../matrix/api/media/MediaPreviewValue.kt | 20 +++++++ .../api/store/AppPreferencesStore.kt | 8 ++- .../impl/store/DefaultAppPreferencesStore.kt | 24 ++++++-- .../test/InMemoryAppPreferencesStore.kt | 23 +++++-- .../DefaultNotifiableEventResolver.kt | 5 +- 19 files changed, 166 insertions(+), 82 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt index ce2ef75321..ad486bd2c5 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt @@ -16,6 +16,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.media.MediaPreviewValue import io.element.android.libraries.preferences.api.store.AppPreferencesStore import kotlinx.collections.immutable.toImmutableSet import javax.inject.Inject @@ -25,14 +26,14 @@ class TimelineProtectionPresenter @Inject constructor( ) : Presenter { @Composable override fun present(): TimelineProtectionState { - val hideMediaContent by appPreferencesStore.doesHideImagesAndVideosFlow().collectAsState(initial = false) + val mediaPreviewValue = appPreferencesStore.getTimelineMediaPreviewValueFlow().collectAsState(initial = MediaPreviewValue.Off) var allowedEvents by remember { mutableStateOf>(setOf()) } - val protectionState by remember(hideMediaContent) { + val protectionState by remember { derivedStateOf { - if (hideMediaContent) { - ProtectionState.RenderOnly(eventIds = allowedEvents.toImmutableSet()) - } else { + if (mediaPreviewValue.value == MediaPreviewValue.On) { ProtectionState.RenderAll + } else { + ProtectionState.RenderOnly(eventIds = allowedEvents.toImmutableSet()) } } } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt index 45d7ae615b..fabaf7afc5 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt @@ -8,6 +8,7 @@ package io.element.android.features.preferences.impl.advanced import io.element.android.compound.theme.Theme +import io.element.android.libraries.matrix.api.media.MediaPreviewValue sealed interface AdvancedSettingsEvents { data class SetDeveloperModeEnabled(val enabled: Boolean) : AdvancedSettingsEvents @@ -16,4 +17,6 @@ sealed interface AdvancedSettingsEvents { data object ChangeTheme : AdvancedSettingsEvents data object CancelChangeTheme : AdvancedSettingsEvents data class SetTheme(val theme: Theme) : AdvancedSettingsEvents + data class SetTimelineMediaPreviewValue(val value: MediaPreviewValue) : AdvancedSettingsEvents + data class SetHideInviteAvatars(val value: Boolean) : AdvancedSettingsEvents } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt index b256997d1c..5cefc1ba72 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt @@ -17,6 +17,7 @@ import androidx.compose.runtime.setValue import io.element.android.compound.theme.Theme import io.element.android.compound.theme.mapToTheme import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.matrix.api.media.MediaPreviewValue import io.element.android.libraries.preferences.api.store.AppPreferencesStore import io.element.android.libraries.preferences.api.store.SessionPreferencesStore import kotlinx.coroutines.launch @@ -44,6 +45,14 @@ class AdvancedSettingsPresenter @Inject constructor( .collectAsState(initial = Theme.System) var showChangeThemeDialog by remember { mutableStateOf(false) } + val hideInviteAvatars by remember { + appPreferencesStore.getHideInviteAvatarsFlow() + }.collectAsState(false) + + val timelineMediaPreviewValue by remember { + appPreferencesStore.getTimelineMediaPreviewValueFlow() + }.collectAsState(initial = MediaPreviewValue.On) + fun handleEvents(event: AdvancedSettingsEvents) { when (event) { is AdvancedSettingsEvents.SetDeveloperModeEnabled -> localCoroutineScope.launch { @@ -61,6 +70,12 @@ class AdvancedSettingsPresenter @Inject constructor( appPreferencesStore.setTheme(event.theme.name) showChangeThemeDialog = false } + is AdvancedSettingsEvents.SetHideInviteAvatars -> localCoroutineScope.launch { + appPreferencesStore.setHideInviteAvatars(event.value) + } + is AdvancedSettingsEvents.SetTimelineMediaPreviewValue -> localCoroutineScope.launch { + appPreferencesStore.setTimelineMediaPreviewValue(event.value) + } } } @@ -70,6 +85,8 @@ class AdvancedSettingsPresenter @Inject constructor( doesCompressMedia = doesCompressMedia, theme = theme, showChangeThemeDialog = showChangeThemeDialog, + hideInviteAvatars = hideInviteAvatars, + timelineMediaPreviewValue = timelineMediaPreviewValue, eventSink = { handleEvents(it) } ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt index a202ccc95f..9f55036154 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt @@ -8,6 +8,7 @@ package io.element.android.features.preferences.impl.advanced import io.element.android.compound.theme.Theme +import io.element.android.libraries.matrix.api.media.MediaPreviewValue data class AdvancedSettingsState( val isDeveloperModeEnabled: Boolean, @@ -15,5 +16,7 @@ data class AdvancedSettingsState( val doesCompressMedia: Boolean, val theme: Theme, val showChangeThemeDialog: Boolean, + val hideInviteAvatars: Boolean, + val timelineMediaPreviewValue: MediaPreviewValue, val eventSink: (AdvancedSettingsEvents) -> Unit ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt index d8e0730bf0..19e4b8b26a 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt @@ -9,6 +9,7 @@ package io.element.android.features.preferences.impl.advanced import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.compound.theme.Theme +import io.element.android.libraries.matrix.api.media.MediaPreviewValue open class AdvancedSettingsStateProvider : PreviewParameterProvider { override val values: Sequence @@ -18,6 +19,8 @@ open class AdvancedSettingsStateProvider : PreviewParameterProvider Unit = {}, ) = AdvancedSettingsState( isDeveloperModeEnabled = isDeveloperModeEnabled, @@ -33,5 +38,7 @@ fun aAdvancedSettingsState( doesCompressMedia = doesCompressMedia, theme = Theme.System, showChangeThemeDialog = showChangeThemeDialog, + hideInviteAvatars = hideInviteAvatars, + timelineMediaPreviewValue = timelineMediaPreviewValue, eventSink = eventSink ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt index 0332e98a95..d6c856b169 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt @@ -7,6 +7,7 @@ package io.element.android.features.preferences.impl.advanced +import android.preference.PreferenceCategory import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -18,11 +19,18 @@ import io.element.android.features.preferences.impl.R import io.element.android.libraries.designsystem.components.dialogs.ListOption import io.element.android.libraries.designsystem.components.dialogs.SingleSelectionDialog import io.element.android.libraries.designsystem.components.list.ListItemContent +import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory +import io.element.android.libraries.designsystem.components.preferences.PreferenceDivider import io.element.android.libraries.designsystem.components.preferences.PreferencePage +import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.ListItem +import io.element.android.libraries.designsystem.theme.components.ListSectionHeader +import io.element.android.libraries.designsystem.theme.components.ListSupportingText +import io.element.android.libraries.designsystem.theme.components.ListSupportingTextDefaults import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.matrix.api.media.MediaPreviewValue import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.services.analytics.compose.LocalAnalyticsService import io.element.android.services.analyticsproviders.api.trackers.captureInteraction @@ -98,6 +106,7 @@ fun AdvancedSettingsView( state.eventSink(AdvancedSettingsEvents.SetCompressMedia(newValue)) } ) + ModerationAndSafety(state) } if (state.showChangeThemeDialog) { @@ -116,6 +125,57 @@ fun AdvancedSettingsView( } } +@Composable +private fun ModerationAndSafety( + state: AdvancedSettingsState, + modifier: Modifier = Modifier, +) { + PreferenceCategory( + modifier = modifier, + title = stringResource(R.string.screen_advanced_settings_moderation_and_safety_section_title), + showTopDivider = true + ) { + PreferenceSwitch( + title = stringResource(R.string.screen_advanced_settings_hide_invite_avatars_toggle_title), + isChecked = state.hideInviteAvatars, + onCheckedChange = { + state.eventSink(AdvancedSettingsEvents.SetHideInviteAvatars(it)) + }, + ) + ListSectionHeader( + title = stringResource(R.string.screen_advanced_settings_show_media_timeline_title), + hasDivider = false, + description = { + ListSupportingText( + text = stringResource(R.string.screen_advanced_settings_show_media_timeline_subtitle), + contentPadding = ListSupportingTextDefaults.Padding.None, + ) + } + ) + ListItem( + headlineContent = { Text(text = stringResource(R.string.screen_advanced_settings_show_media_timeline_always_hide)) }, + leadingContent = ListItemContent.RadioButton(selected = state.timelineMediaPreviewValue == MediaPreviewValue.Off, compact = true), + onClick = { + state.eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Off)) + }, + ) + ListItem( + headlineContent = { Text(text = stringResource(R.string.screen_advanced_settings_show_media_timeline_private_rooms)) }, + leadingContent = ListItemContent.RadioButton(selected = state.timelineMediaPreviewValue == MediaPreviewValue.Private, compact = true), + onClick = { + state.eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Private)) + }, + ) + ListItem( + headlineContent = { Text(text = stringResource(R.string.screen_advanced_settings_show_media_timeline_always_show)) }, + leadingContent = ListItemContent.RadioButton(selected = state.timelineMediaPreviewValue == MediaPreviewValue.On, compact = true), + onClick = { + state.eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.On)) + }, + ) + } +} + @Composable private fun getOptions(): ImmutableList { return themes.map { diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsEvents.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsEvents.kt index 74c673bc8a..ced7b8d2b4 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsEvents.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsEvents.kt @@ -14,7 +14,6 @@ import io.element.android.libraries.matrix.api.tracing.TraceLogPack sealed interface DeveloperSettingsEvents { data class UpdateEnabledFeature(val feature: FeatureUiModel, val isEnabled: Boolean) : DeveloperSettingsEvents data class SetCustomElementCallBaseUrl(val baseUrl: String?) : DeveloperSettingsEvents - data class SetHideImagesAndVideos(val value: Boolean) : DeveloperSettingsEvents data class SetTracingLogLevel(val logLevel: LogLevelItem) : DeveloperSettingsEvents data class ToggleTracingLogPack(val logPack: TraceLogPack, val enabled: Boolean) : DeveloperSettingsEvents data object ClearCache : DeveloperSettingsEvents diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt index aa2c5a1c50..d938f064c1 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt @@ -74,9 +74,6 @@ class DeveloperSettingsPresenter @Inject constructor( val customElementCallBaseUrl by appPreferencesStore .getCustomElementCallBaseUrlFlow() .collectAsState(initial = null) - val hideImagesAndVideos by appPreferencesStore - .doesHideImagesAndVideosFlow() - .collectAsState(initial = false) val tracingLogLevelFlow = remember { appPreferencesStore.getTracingLogLevelFlow().map { AsyncData.Success(it.toLogLevelItem()) } @@ -126,9 +123,6 @@ class DeveloperSettingsPresenter @Inject constructor( appPreferencesStore.setCustomElementCallBaseUrl(urlToSave) } DeveloperSettingsEvents.ClearCache -> coroutineScope.clearCache(clearCacheAction) - is DeveloperSettingsEvents.SetHideImagesAndVideos -> coroutineScope.launch { - appPreferencesStore.setHideImagesAndVideos(event.value) - } is DeveloperSettingsEvents.SetTracingLogLevel -> coroutineScope.launch { appPreferencesStore.setTracingLogLevel(event.logLevel.toLogLevel()) } @@ -153,7 +147,6 @@ class DeveloperSettingsPresenter @Inject constructor( baseUrl = customElementCallBaseUrl, validator = ::customElementCallUrlValidator, ), - hideImagesAndVideos = hideImagesAndVideos, tracingLogLevel = tracingLogLevel, tracingLogPacks = tracingLogPacks, eventSink = ::handleEvents diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt index efcfcd01d4..93e7b9ae7b 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt @@ -21,7 +21,6 @@ data class DeveloperSettingsState( val rageshakeState: RageshakePreferencesState, val clearCacheAction: AsyncAction, val customElementCallBaseUrlState: CustomElementCallBaseUrlState, - val hideImagesAndVideos: Boolean, val tracingLogLevel: AsyncData, val tracingLogPacks: ImmutableList, val eventSink: (DeveloperSettingsEvents) -> Unit diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt index 18151d32c7..1585a3b8dd 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt @@ -34,7 +34,6 @@ open class DeveloperSettingsStateProvider : PreviewParameterProvider = AsyncAction.Uninitialized, customElementCallBaseUrlState: CustomElementCallBaseUrlState = aCustomElementCallBaseUrlState(), - hideImagesAndVideos: Boolean = false, traceLogPacks: List = emptyList(), eventSink: (DeveloperSettingsEvents) -> Unit = {}, ) = DeveloperSettingsState( @@ -43,7 +42,6 @@ fun aDeveloperSettingsState( cacheSize = AsyncData.Success("1.2 MB"), clearCacheAction = clearCacheAction, customElementCallBaseUrlState = customElementCallBaseUrlState, - hideImagesAndVideos = hideImagesAndVideos, tracingLogLevel = AsyncData.Success(LogLevelItem.INFO), tracingLogPacks = traceLogPacks.toPersistentList(), eventSink = eventSink, diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt index e335c0a6cd..9a9cc61d68 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt @@ -51,7 +51,6 @@ fun DeveloperSettingsView( title = stringResource(id = CommonStrings.common_developer_options) ) { // Note: this is OK to hardcode strings in this debug screen. - SettingsCategory(state) PreferenceCategory( title = "Feature flags", showTopDivider = true, @@ -134,22 +133,6 @@ fun DeveloperSettingsView( } } -@Composable -private fun SettingsCategory( - state: DeveloperSettingsState, -) { - PreferenceCategory(title = "Preferences", showTopDivider = false) { - PreferenceSwitch( - title = "Hide image & video previews", - subtitle = "When toggled image & video will not render in the timeline by default.", - isChecked = state.hideImagesAndVideos, - onCheckedChange = { - state.eventSink(DeveloperSettingsEvents.SetHideImagesAndVideos(it)) - } - ) - } -} - @Composable private fun ElementCallCategory( state: DeveloperSettingsState, diff --git a/features/preferences/impl/src/main/res/values/localazy.xml b/features/preferences/impl/src/main/res/values/localazy.xml index 989910384c..e27ebd661a 100644 --- a/features/preferences/impl/src/main/res/values/localazy.xml +++ b/features/preferences/impl/src/main/res/values/localazy.xml @@ -19,6 +19,11 @@ "If turned off, your read receipts won\'t be sent to anyone. You will still receive read receipts from other users." "Share presence" "If turned off, you won’t be able to send or receive read receipts or typing notifications." + "Always hide" + "Always show" + "In private rooms" + "A hidden media can always be shown by tapping on it" + "Show media in timeline" "Enable option to view message source in the timeline." "You have no blocked users" "Unblock" diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt index c2b4672878..4960add4ac 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt @@ -147,28 +147,6 @@ class DeveloperSettingsPresenterTest { } } - @Test - fun `present - toggling hide image and video`() = runTest { - val preferences = InMemoryAppPreferencesStore() - val presenter = createDeveloperSettingsPresenter(preferencesStore = preferences) - presenter.test { - skipItems(2) - awaitItem().also { state -> - assertThat(state.hideImagesAndVideos).isFalse() - state.eventSink(DeveloperSettingsEvents.SetHideImagesAndVideos(true)) - } - awaitItem().also { state -> - assertThat(state.hideImagesAndVideos).isTrue() - assertThat(preferences.doesHideImagesAndVideosFlow().first()).isTrue() - state.eventSink(DeveloperSettingsEvents.SetHideImagesAndVideos(false)) - } - awaitItem().also { state -> - assertThat(state.hideImagesAndVideos).isFalse() - assertThat(preferences.doesHideImagesAndVideosFlow().first()).isFalse() - } - } - } - @Test fun `present - changing tracing log level`() = runTest { val preferences = InMemoryAppPreferencesStore() diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsViewTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsViewTest.kt index 255c6442d9..5d0030af8e 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsViewTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsViewTest.kt @@ -109,18 +109,6 @@ class DeveloperSettingsViewTest { rule.onNodeWithText("Clear cache").performClick() eventsRecorder.assertSingle(DeveloperSettingsEvents.ClearCache) } - - @Test - fun `clicking on the hide images and videos switch emits the expected event`() { - val eventsRecorder = EventsRecorder() - rule.setDeveloperSettingsView( - state = aDeveloperSettingsState( - eventSink = eventsRecorder - ), - ) - rule.onNodeWithText("Hide image & video previews").performClick() - eventsRecorder.assertSingle(DeveloperSettingsEvents.SetHideImagesAndVideos(true)) - } } private fun AndroidComposeTestRule.setDeveloperSettingsView( diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt new file mode 100644 index 0000000000..06ebc237e0 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.api.media + +/** + * Represents the values for media preview settings. + * - [On] means that media preview are enabled + * - [Off] means that media preview are disabled + * - [Private] means that media preview are enabled only for private chats. + */ +enum class MediaPreviewValue { + On, + Off, + Private +} diff --git a/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt b/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt index c072229626..dfc0e38b89 100644 --- a/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt +++ b/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt @@ -7,6 +7,7 @@ package io.element.android.libraries.preferences.api.store +import io.element.android.libraries.matrix.api.media.MediaPreviewValue import io.element.android.libraries.matrix.api.tracing.LogLevel import io.element.android.libraries.matrix.api.tracing.TraceLogPack import kotlinx.coroutines.flow.Flow @@ -21,8 +22,11 @@ interface AppPreferencesStore { suspend fun setTheme(theme: String) fun getThemeFlow(): Flow - suspend fun setHideImagesAndVideos(value: Boolean) - fun doesHideImagesAndVideosFlow(): Flow + suspend fun setHideInviteAvatars(value: Boolean) + fun getHideInviteAvatarsFlow(): Flow + + suspend fun setTimelineMediaPreviewValue(value: MediaPreviewValue) + fun getTimelineMediaPreviewValueFlow(): Flow suspend fun setTracingLogLevel(logLevel: LogLevel) fun getTracingLogLevelFlow(): Flow diff --git a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt index a05e9c48da..599c73fc9d 100644 --- a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt +++ b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt @@ -19,6 +19,7 @@ import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.matrix.api.media.MediaPreviewValue import io.element.android.libraries.matrix.api.tracing.LogLevel import io.element.android.libraries.matrix.api.tracing.TraceLogPack import io.element.android.libraries.preferences.api.store.AppPreferencesStore @@ -31,7 +32,8 @@ private val Context.dataStore: DataStore by preferencesDataStore(na private val developerModeKey = booleanPreferencesKey("developerMode") private val customElementCallBaseUrlKey = stringPreferencesKey("elementCallBaseUrl") private val themeKey = stringPreferencesKey("theme") -private val hideImagesAndVideosKey = booleanPreferencesKey("hideImagesAndVideos") +private val hideInviteAvatarsKey = booleanPreferencesKey("hideInviteAvatars") +private val timelineMediaPreviewValueKey = stringPreferencesKey("timelineMediaPreviewValue") private val logLevelKey = stringPreferencesKey("logLevel") private val traceLogPacksKey = stringPreferencesKey("traceLogPacks") @@ -83,15 +85,27 @@ class DefaultAppPreferencesStore @Inject constructor( } } - override suspend fun setHideImagesAndVideos(value: Boolean) { + override suspend fun setHideInviteAvatars(value: Boolean) { store.edit { prefs -> - prefs[hideImagesAndVideosKey] = value + prefs[hideInviteAvatarsKey] = value } } - override fun doesHideImagesAndVideosFlow(): Flow { + override fun getHideInviteAvatarsFlow(): Flow { return store.data.map { prefs -> - prefs[hideImagesAndVideosKey] ?: false + prefs[hideInviteAvatarsKey] == true + } + } + + override suspend fun setTimelineMediaPreviewValue(value: MediaPreviewValue) { + store.edit { prefs -> + prefs[timelineMediaPreviewValueKey] = value.name + } + } + + override fun getTimelineMediaPreviewValueFlow(): Flow { + return store.data.map { prefs -> + prefs[timelineMediaPreviewValueKey]?.let { MediaPreviewValue.valueOf(it) } ?: MediaPreviewValue.On } } diff --git a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt index ab3913cd08..c5440a6be9 100644 --- a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt +++ b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt @@ -7,6 +7,7 @@ package io.element.android.libraries.preferences.test +import io.element.android.libraries.matrix.api.media.MediaPreviewValue import io.element.android.libraries.matrix.api.tracing.LogLevel import io.element.android.libraries.matrix.api.tracing.TraceLogPack import io.element.android.libraries.preferences.api.store.AppPreferencesStore @@ -15,18 +16,20 @@ import kotlinx.coroutines.flow.MutableStateFlow class InMemoryAppPreferencesStore( isDeveloperModeEnabled: Boolean = false, - hideImagesAndVideos: Boolean = false, customElementCallBaseUrl: String? = null, + hideInviteAvatars: Boolean = false, + timelineMediaPreviewValue: MediaPreviewValue = MediaPreviewValue.On, theme: String? = null, logLevel: LogLevel = LogLevel.INFO, traceLockPacks: Set = emptySet(), ) : AppPreferencesStore { private val isDeveloperModeEnabled = MutableStateFlow(isDeveloperModeEnabled) - private val hideImagesAndVideos = MutableStateFlow(hideImagesAndVideos) private val customElementCallBaseUrl = MutableStateFlow(customElementCallBaseUrl) private val theme = MutableStateFlow(theme) private val logLevel = MutableStateFlow(logLevel) private val tracingLogPacks = MutableStateFlow(traceLockPacks) + private val hideInviteAvatars = MutableStateFlow(hideInviteAvatars) + private val timelineMediaPreviewValue = MutableStateFlow(timelineMediaPreviewValue) override suspend fun setDeveloperModeEnabled(enabled: Boolean) { isDeveloperModeEnabled.value = enabled @@ -52,12 +55,20 @@ class InMemoryAppPreferencesStore( return theme } - override suspend fun setHideImagesAndVideos(value: Boolean) { - hideImagesAndVideos.value = value + override suspend fun setHideInviteAvatars(value: Boolean) { + hideInviteAvatars.value = value } - override fun doesHideImagesAndVideosFlow(): Flow { - return hideImagesAndVideos + override fun getHideInviteAvatarsFlow(): Flow { + return hideInviteAvatars + } + + override suspend fun setTimelineMediaPreviewValue(value: MediaPreviewValue) { + timelineMediaPreviewValue.value = value + } + + override fun getTimelineMediaPreviewValueFlow(): Flow { + return timelineMediaPreviewValue } override suspend fun setTracingLogLevel(logLevel: LogLevel) { diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt index c8e8ba4431..5116e945c5 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt @@ -21,6 +21,7 @@ import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.media.MediaPreviewValue import io.element.android.libraries.matrix.api.notification.NotificationContent import io.element.android.libraries.matrix.api.notification.NotificationData import io.element.android.libraries.matrix.api.permalink.PermalinkParser @@ -292,7 +293,7 @@ class DefaultNotifiableEventResolver @Inject constructor( } private suspend fun NotificationContent.MessageLike.RoomMessage.fetchImageIfPresent(client: MatrixClient): Uri? { - if (appPreferencesStore.doesHideImagesAndVideosFlow().first()) { + if (appPreferencesStore.getTimelineMediaPreviewValueFlow().first() != MediaPreviewValue.On) { return null } val fileResult = when (val messageType = messageType) { @@ -319,7 +320,7 @@ class DefaultNotifiableEventResolver @Inject constructor( } private suspend fun NotificationContent.MessageLike.RoomMessage.getImageMimetype(): String? { - if (appPreferencesStore.doesHideImagesAndVideosFlow().first()) { + if (appPreferencesStore.getTimelineMediaPreviewValueFlow().first() != MediaPreviewValue.On) { return null } return when (val messageType = messageType) { From e231ef7a0e139d561abf6c6adb87425787cdf4c1 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 9 Apr 2025 21:06:36 +0200 Subject: [PATCH 2/9] 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(), From b9eb4c49b797a6bd8180fb016822742c73648463 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 9 Apr 2025 21:30:54 +0200 Subject: [PATCH 3/9] change (preferences) : bind timeline media preview settings --- .../protection/TimelineProtectionPresenter.kt | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt index ad486bd2c5..d9c68403f4 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt @@ -17,23 +17,38 @@ import androidx.compose.runtime.setValue import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.media.MediaPreviewValue +import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.preferences.api.store.AppPreferencesStore import kotlinx.collections.immutable.toImmutableSet import javax.inject.Inject class TimelineProtectionPresenter @Inject constructor( private val appPreferencesStore: AppPreferencesStore, + private val room: MatrixRoom, ) : Presenter { @Composable override fun present(): TimelineProtectionState { - val mediaPreviewValue = appPreferencesStore.getTimelineMediaPreviewValueFlow().collectAsState(initial = MediaPreviewValue.Off) + val mediaPreviewValue = remember { + appPreferencesStore.getTimelineMediaPreviewValueFlow() + }.collectAsState(initial = MediaPreviewValue.Off) var allowedEvents by remember { mutableStateOf>(setOf()) } + val roomInfo = room.roomInfoFlow.collectAsState() val protectionState by remember { derivedStateOf { - if (mediaPreviewValue.value == MediaPreviewValue.On) { - ProtectionState.RenderAll - } else { - ProtectionState.RenderOnly(eventIds = allowedEvents.toImmutableSet()) + when (mediaPreviewValue.value) { + MediaPreviewValue.On -> { + ProtectionState.RenderAll + } + MediaPreviewValue.Off -> { + ProtectionState.RenderOnly(eventIds = allowedEvents.toImmutableSet()) + } + MediaPreviewValue.Private -> { + if (roomInfo.value.isPublic) { + ProtectionState.RenderOnly(eventIds = allowedEvents.toImmutableSet()) + } else { + ProtectionState.RenderAll + } + } } } } From 64f139750c34b4467ebf1749b7390428cbe26046 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 10 Apr 2025 18:10:37 +0200 Subject: [PATCH 4/9] change (preferences) : bind timeline media preview with join rule --- .../protection/TimelineProtectionPresenter.kt | 27 +++++++------------ .../matrix/api/media/MediaPreviewValue.kt | 19 +++++++++++++ 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt index d9c68403f4..b04ee1f176 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt @@ -17,6 +17,7 @@ import androidx.compose.runtime.setValue import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.media.MediaPreviewValue +import io.element.android.libraries.matrix.api.media.isPreviewEnabled import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.preferences.api.store.AppPreferencesStore import kotlinx.collections.immutable.toImmutableSet @@ -26,29 +27,21 @@ class TimelineProtectionPresenter @Inject constructor( private val appPreferencesStore: AppPreferencesStore, private val room: MatrixRoom, ) : Presenter { + private val allowedEvents = mutableStateOf>(setOf()) + @Composable override fun present(): TimelineProtectionState { val mediaPreviewValue = remember { appPreferencesStore.getTimelineMediaPreviewValueFlow() - }.collectAsState(initial = MediaPreviewValue.Off) - var allowedEvents by remember { mutableStateOf>(setOf()) } + }.collectAsState(initial = MediaPreviewValue.On) val roomInfo = room.roomInfoFlow.collectAsState() val protectionState by remember { derivedStateOf { - when (mediaPreviewValue.value) { - MediaPreviewValue.On -> { - ProtectionState.RenderAll - } - MediaPreviewValue.Off -> { - ProtectionState.RenderOnly(eventIds = allowedEvents.toImmutableSet()) - } - MediaPreviewValue.Private -> { - if (roomInfo.value.isPublic) { - ProtectionState.RenderOnly(eventIds = allowedEvents.toImmutableSet()) - } else { - ProtectionState.RenderAll - } - } + val isPreviewEnabled = mediaPreviewValue.value.isPreviewEnabled(roomInfo.value.joinRule) + if (isPreviewEnabled) { + ProtectionState.RenderAll + } else { + ProtectionState.RenderOnly(eventIds = allowedEvents.value.toImmutableSet()) } } } @@ -56,7 +49,7 @@ class TimelineProtectionPresenter @Inject constructor( fun handleEvent(event: TimelineProtectionEvent) { when (event) { is TimelineProtectionEvent.ShowContent -> { - allowedEvents = allowedEvents + setOfNotNull(event.eventId) + allowedEvents.value = allowedEvents.value + setOfNotNull(event.eventId) } } } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt index 06ebc237e0..83d6d464d5 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt @@ -7,6 +7,11 @@ package io.element.android.libraries.matrix.api.media +import io.element.android.libraries.matrix.api.media.MediaPreviewValue.Off +import io.element.android.libraries.matrix.api.media.MediaPreviewValue.On +import io.element.android.libraries.matrix.api.media.MediaPreviewValue.Private +import io.element.android.libraries.matrix.api.room.join.JoinRule + /** * Represents the values for media preview settings. * - [On] means that media preview are enabled @@ -18,3 +23,17 @@ enum class MediaPreviewValue { Off, Private } + +fun MediaPreviewValue.isPreviewEnabled(joinRule: JoinRule?): Boolean { + return when (this) { + On -> true + Off -> false + Private -> when (joinRule) { + is JoinRule.Knock, + is JoinRule.Invite, + is JoinRule.Restricted, + is JoinRule.KnockRestricted -> true + else -> false + } + } +} From 5fd987a116585d08cb6fc143533b3c45dd32a1a8 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 10 Apr 2025 18:10:50 +0200 Subject: [PATCH 5/9] change (preferences) : clean and fix tests --- features/joinroom/impl/build.gradle.kts | 1 - .../TimelineProtectionPresenterTest.kt | 42 ++++++++++++++++++- .../impl/advanced/AdvancedSettingsView.kt | 1 - .../DeveloperSettingsPresenterTest.kt | 1 - .../impl/components/RoomSummaryRow.kt | 1 - 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/features/joinroom/impl/build.gradle.kts b/features/joinroom/impl/build.gradle.kts index 69b755d1a3..b8684a4c5a 100644 --- a/features/joinroom/impl/build.gradle.kts +++ b/features/joinroom/impl/build.gradle.kts @@ -48,5 +48,4 @@ dependencies { testImplementation(libs.androidx.compose.ui.test.junit) testImplementation(projects.libraries.preferences.test) testReleaseImplementation(libs.androidx.compose.ui.test.manifest) - } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenterTest.kt index b55d9313af..6da5b38185 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenterTest.kt @@ -8,7 +8,12 @@ package io.element.android.features.messages.impl.timeline.protection import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.api.media.MediaPreviewValue +import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.matrix.api.room.join.JoinRule import io.element.android.libraries.matrix.test.AN_EVENT_ID +import io.element.android.libraries.matrix.test.room.FakeMatrixRoom +import io.element.android.libraries.matrix.test.room.aRoomInfo import io.element.android.libraries.preferences.api.store.AppPreferencesStore import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore import io.element.android.tests.testutils.WarmUpRule @@ -32,8 +37,8 @@ class TimelineProtectionPresenterTest { } @Test - fun `present - protected`() = runTest { - val appPreferencesStore = InMemoryAppPreferencesStore(hideImagesAndVideos = true) + fun `present - media preview value off`() = runTest { + val appPreferencesStore = InMemoryAppPreferencesStore(timelineMediaPreviewValue = MediaPreviewValue.Off) val presenter = createPresenter(appPreferencesStore) presenter.test { skipItems(1) @@ -47,9 +52,42 @@ class TimelineProtectionPresenterTest { } } + @Test + fun `present - media preview value private in public room`() = runTest { + val appPreferencesStore = InMemoryAppPreferencesStore(timelineMediaPreviewValue = MediaPreviewValue.Private) + val room = FakeMatrixRoom(initialRoomInfo = aRoomInfo(joinRule = JoinRule.Public)) + val presenter = createPresenter(appPreferencesStore, room) + presenter.test { + skipItems(1) + val initialState = awaitItem() + assertThat(initialState.protectionState).isEqualTo(ProtectionState.RenderOnly(persistentSetOf())) + // ShowContent with null should have no effect. + initialState.eventSink(TimelineProtectionEvent.ShowContent(eventId = null)) + initialState.eventSink(TimelineProtectionEvent.ShowContent(eventId = AN_EVENT_ID)) + val finalState = awaitItem() + assertThat(finalState.protectionState).isEqualTo(ProtectionState.RenderOnly(persistentSetOf(AN_EVENT_ID))) + } + } + + @Test + fun `present - media preview value private in non public room`() = runTest { + val appPreferencesStore = InMemoryAppPreferencesStore(timelineMediaPreviewValue = MediaPreviewValue.Private) + val room = FakeMatrixRoom(initialRoomInfo = aRoomInfo(joinRule = JoinRule.Invite)) + val presenter = createPresenter(appPreferencesStore, room) + presenter.test { + val initialState = awaitItem() + assertThat(initialState.protectionState).isEqualTo(ProtectionState.RenderAll) + // ShowContent with null should have no effect. + initialState.eventSink(TimelineProtectionEvent.ShowContent(eventId = null)) + initialState.eventSink(TimelineProtectionEvent.ShowContent(eventId = AN_EVENT_ID)) + } + } + private fun createPresenter( appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore(), + room: MatrixRoom = FakeMatrixRoom(), ) = TimelineProtectionPresenter( appPreferencesStore = appPreferencesStore, + room = room, ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt index d6c856b169..2880812489 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt @@ -20,7 +20,6 @@ import io.element.android.libraries.designsystem.components.dialogs.ListOption import io.element.android.libraries.designsystem.components.dialogs.SingleSelectionDialog import io.element.android.libraries.designsystem.components.list.ListItemContent import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory -import io.element.android.libraries.designsystem.components.preferences.PreferenceDivider import io.element.android.libraries.designsystem.components.preferences.PreferencePage import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch import io.element.android.libraries.designsystem.preview.ElementPreview diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt index 4960add4ac..cf372fdd9d 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt @@ -44,7 +44,6 @@ class DeveloperSettingsPresenterTest { assertThat(state.cacheSize).isEqualTo(AsyncData.Uninitialized) assertThat(state.customElementCallBaseUrlState).isNotNull() assertThat(state.customElementCallBaseUrlState.baseUrl).isNull() - assertThat(state.hideImagesAndVideos).isFalse() assertThat(state.rageshakeState.isEnabled).isFalse() assertThat(state.rageshakeState.isSupported).isTrue() assertThat(state.rageshakeState.sensitivity).isEqualTo(0.3f) 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 93de6c2fb3..d19398811a 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 @@ -73,7 +73,6 @@ internal fun RoomSummaryRow( eventSink: (RoomListEvents) -> Unit, modifier: Modifier = Modifier, ) { - Box(modifier = modifier) { when (room.displayType) { RoomSummaryDisplayType.PLACEHOLDER -> { From 320943155527095d245944338abfc08e95b8c9ee Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 11 Apr 2025 11:00:20 +0200 Subject: [PATCH 6/9] change (preferences) : fix warning --- .../features/preferences/impl/advanced/AdvancedSettingsView.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt index 2880812489..6dfdf9d88c 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt @@ -7,7 +7,6 @@ package io.element.android.features.preferences.impl.advanced -import android.preference.PreferenceCategory import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource From 034b68c930826a97d3f696ddc26db03053e7008c Mon Sep 17 00:00:00 2001 From: ElementBot Date: Fri, 11 Apr 2025 09:13:28 +0000 Subject: [PATCH 7/9] Update screenshots --- .../images/features.logout.impl_LogoutView_Night_10_en.png | 4 ++-- .../images/features.logout.impl_LogoutView_Night_11_en.png | 4 ++-- ...references.impl.advanced_AdvancedSettingsView_Day_0_en.png | 4 ++-- ...references.impl.advanced_AdvancedSettingsView_Day_1_en.png | 4 ++-- ...references.impl.advanced_AdvancedSettingsView_Day_2_en.png | 4 ++-- ...references.impl.advanced_AdvancedSettingsView_Day_3_en.png | 4 ++-- ...references.impl.advanced_AdvancedSettingsView_Day_4_en.png | 4 ++-- ...references.impl.advanced_AdvancedSettingsView_Day_5_en.png | 3 +++ ...references.impl.advanced_AdvancedSettingsView_Day_6_en.png | 3 +++ ...ferences.impl.advanced_AdvancedSettingsView_Night_0_en.png | 4 ++-- ...ferences.impl.advanced_AdvancedSettingsView_Night_1_en.png | 4 ++-- ...ferences.impl.advanced_AdvancedSettingsView_Night_2_en.png | 4 ++-- ...ferences.impl.advanced_AdvancedSettingsView_Night_3_en.png | 4 ++-- ...ferences.impl.advanced_AdvancedSettingsView_Night_4_en.png | 4 ++-- ...ferences.impl.advanced_AdvancedSettingsView_Night_5_en.png | 3 +++ ...ferences.impl.advanced_AdvancedSettingsView_Night_6_en.png | 3 +++ ...ferences.impl.developer_DeveloperSettingsView_Day_0_en.png | 4 ++-- ...ferences.impl.developer_DeveloperSettingsView_Day_1_en.png | 4 ++-- ...ferences.impl.developer_DeveloperSettingsView_Day_2_en.png | 4 ++-- ...rences.impl.developer_DeveloperSettingsView_Night_0_en.png | 4 ++-- ...rences.impl.developer_DeveloperSettingsView_Night_1_en.png | 4 ++-- ...rences.impl.developer_DeveloperSettingsView_Night_2_en.png | 4 ++-- 22 files changed, 48 insertions(+), 36 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_6_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_10_en.png index 9e60f85a51..0344224a85 100644 --- a/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:27587909106650e33d7bc7854c0f2dd7ca6e2dad0aaf6487bf266753288ec6f6 -size 24898 +oid sha256:6408d329ea127961b08cb92fcfbbdd93fc2c700191e7c97ce4ebad147647c1c4 +size 24899 diff --git a/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_11_en.png index 960535f462..fcddb192f4 100644 --- a/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9e65635400bfda5d242d07ebe31113e3ef2d039f21208421023f099997d5e4f9 -size 29603 +oid sha256:c1764cc1d1fc5234ef88a1f1cf9317a234cd7ee7195a190a0e827442c0d75db2 +size 29601 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en.png index d1bd764c2a..cf68033e1f 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c8f664f4a07b88fef329728a9f1ce3151a3b36b0255bcb62d4bc653a6d62b5a4 -size 54746 +oid sha256:6aa576274958f21da6b008b3c3e7698f996fc5124b18be5d9897f4fdcbc72df1 +size 78002 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en.png index d46ecb62d4..e3983c15a1 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9471766f40c07f65aba37fb166f99c8821995e192d9fa2fe633a84dd8dc4f4ac -size 54511 +oid sha256:4c1bb3ea0adf2e0ab678b1f238355716c0ffec96538dc79c060ddb62768d9d04 +size 77781 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en.png index d263193b4d..e549915d6d 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d36aea49da81fc526b91bdd5b30fdaa974bf6ffc498fde32f68182954f3d6b44 -size 31893 +oid sha256:e533b7aabda646ac9e51a2302a9f29317b37c4102674d34986f3f22eb0cdfb7c +size 47767 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en.png index 1f21a81383..b21f4c00fc 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a76df447d4e5108fc8412eebfcab8037e356f7ed410ad247379399b3d547da11 -size 54570 +oid sha256:448631ff519b2f6f4ce63d3d9cc6df98ed6b028a474eb782d9184ef0f1e65fb0 +size 77824 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en.png index 91f497a0ed..378b712d74 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7560757da0a4a8c9ffe70c4a81b6dc4d4e379db4c664d16fe4d958a27d77026d -size 54541 +oid sha256:906498f38a79491323f7f7550f16d7c058d4e670d93c7c4e9bb843913a652367 +size 77811 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_5_en.png new file mode 100644 index 0000000000..afeaddc375 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_5_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed2983e7f89083e30ea7fe774edf7beec8f0b2fd172d158b7a3bad8b649a6a59 +size 77695 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_6_en.png new file mode 100644 index 0000000000..53123d368d --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_6_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0dabf522c0dee2616c5c90ebdcf4bc33cc1a7a91c1eac2a3a1f3f0a805db1194 +size 78078 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en.png index 8c9189d33a..43a46659a4 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8f73399ea5f3126559521931424428af6b6d6de578ba8799a577f59ec628aded -size 53554 +oid sha256:b3dd003ab1e975b6a24e8eb57ee335e1ea4051575dc2acbf2afe59d38edd1b5d +size 75747 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en.png index 5398e5646b..4fca754813 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ba80841973fa1447940382975d5b56eff806bcf819441bc8cf25fc9b60c50eb9 -size 53265 +oid sha256:f0042189ec518aa5f497c2f6628fce86741ac4e05bf8a42be33c53569524184c +size 75450 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en.png index 8b6f452cce..53150c9169 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a3907566d471c26da9d8c4f1f10fb2cc5d69db584a32f83b662e195f696df320 -size 29568 +oid sha256:b401b0afe3e47b808339eae9d4293b4422fde1227fdf5f92113ef49ac8adce2c +size 45064 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en.png index b1435afb3e..691914002c 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e7ae58bd327e19f6c7d10c5be512fbd6ec4eeaa716b995dcc0dc081f2ff3c9c3 -size 53306 +oid sha256:44c1e5e6764a980d1069898a425de0857b70b3b8be73b920a4a4d73e0d29a1dc +size 75494 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en.png index e64f9b5cfd..fcb5c0b1bb 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bb6e24a7ae84d488a7b9a1574ca86d08b134ff889c2f885c7b7e2b1b5044868e -size 53270 +oid sha256:94479a37780a4d6bf087a93467cdd262c1c5e08d09ebbef3f3393c7f33525498 +size 75450 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_5_en.png new file mode 100644 index 0000000000..2fb443381b --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_5_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6374ada77b4ae82e14c3f7d1118ef1a4d14438db6d212e189e8914f9112d3014 +size 75289 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_6_en.png new file mode 100644 index 0000000000..f7e20619c2 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_6_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e22fe8580f622b1999876a646892687b319661ef8e2278c9da15a262771a525 +size 75786 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_0_en.png index 5a6c498300..9381505a00 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e1cb2f64719f8abda45e50b9cca1a2985630736c35e9cdb32b207696ec067edf -size 57683 +oid sha256:7836dc63d1181d2b057df6baf5fe3b8a05298aaa4e23a75a79790cafff1fd451 +size 54048 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_1_en.png index 5a6c498300..9381505a00 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e1cb2f64719f8abda45e50b9cca1a2985630736c35e9cdb32b207696ec067edf -size 57683 +oid sha256:7836dc63d1181d2b057df6baf5fe3b8a05298aaa4e23a75a79790cafff1fd451 +size 54048 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_2_en.png index c9c81afac2..48046221dc 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:40cdf166be2b920b5e6282835fa80654a734ad19bbefdc2c37d287447cb3b49a -size 56274 +oid sha256:cad88329f2179428e72e96499d91ebbfba0647c74fb271bbfffaea0f695d28fb +size 52595 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_0_en.png index 50fb79702e..c49b1ace09 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8ff541c779c046143e109f80fe45c5742868b1b4b9d4d5a96371b336e2f1c56 -size 55837 +oid sha256:5861efb5c4453365fa215ec675e8c1289d86fa7756b42c57dcd9c7f138cd62bb +size 52067 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_1_en.png index 50fb79702e..c49b1ace09 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8ff541c779c046143e109f80fe45c5742868b1b4b9d4d5a96371b336e2f1c56 -size 55837 +oid sha256:5861efb5c4453365fa215ec675e8c1289d86fa7756b42c57dcd9c7f138cd62bb +size 52067 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_2_en.png index 9f66038e62..67d26e583e 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d18ec536792e9e3cea6a40e8a2901e131631be7795f92f64726b8b91e8c52e34 -size 54433 +oid sha256:af268c15499c557a3c6502f6daf732ede68f7fca1539a10a420809ca0fb212a3 +size 50664 From 4982d933d87df41df143cebac18c46e8e5347713 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 11 Apr 2025 13:00:44 +0200 Subject: [PATCH 8/9] change (preferences) : some more final tweaks after review. --- .../joinroom/impl/JoinRoomPresenter.kt | 6 ++-- .../features/joinroom/impl/JoinRoomState.kt | 4 ++- .../joinroom/impl/JoinRoomStateProvider.kt | 4 +-- .../features/joinroom/impl/JoinRoomView.kt | 12 ++++---- .../impl/advanced/AdvancedSettingsView.kt | 28 ++++++++++++++----- 5 files changed, 36 insertions(+), 18 deletions(-) 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 9b775c670e..53f33be16a 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 @@ -96,7 +96,9 @@ 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 hideInviteAvatars by remember { + appPreferencesStore.getHideInviteAvatarsFlow() + }.collectAsState(initial = false) val contentState by produceState( initialValue = ContentState.Loading, key1 = roomInfo, @@ -205,7 +207,7 @@ class JoinRoomPresenter @AssistedInject constructor( cancelKnockAction = cancelKnockAction.value, applicationName = buildMeta.applicationName, knockMessage = knockMessage, - shouldHideAvatars = shouldHideAvatars, + hideInviteAvatars = hideInviteAvatars, 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 d709797776..df2a5fcf8f 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,7 +31,7 @@ data class JoinRoomState( val cancelKnockAction: AsyncAction, private val applicationName: String, val knockMessage: String, - val shouldHideAvatars: Boolean, + val hideInviteAvatars: Boolean, val eventSink: (JoinRoomEvents) -> Unit ) { val isJoinActionUnauthorized = joinAction is AsyncAction.Failure && joinAction.error is JoinRoomFailures.UnauthorizedJoin @@ -58,6 +58,8 @@ data class JoinRoomState( } else -> JoinAuthorisationStatus.None } + + val hideAvatarsImages = hideInviteAvatars && joinAuthorisationStatus is JoinAuthorisationStatus.IsInvited } @Immutable 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 ba18c2b952..e21794b46d 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,7 +171,7 @@ fun aJoinRoomState( forgetAction: AsyncAction = AsyncAction.Uninitialized, cancelKnockAction: AsyncAction = AsyncAction.Uninitialized, knockMessage: String = "", - shouldHideAvatars: Boolean = false, + hideInviteAvatars: Boolean = false, eventSink: (JoinRoomEvents) -> Unit = {} ) = JoinRoomState( roomIdOrAlias = roomIdOrAlias, @@ -183,7 +183,7 @@ fun aJoinRoomState( forgetAction = forgetAction, applicationName = "AppName", knockMessage = knockMessage, - shouldHideAvatars = shouldHideAvatars, + hideInviteAvatars = hideInviteAvatars, 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 c70e0ad163..8aae4a029b 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,7 +97,7 @@ fun JoinRoomView( roomIdOrAlias = state.roomIdOrAlias, contentState = state.contentState, knockMessage = state.knockMessage, - shouldHideAvatars = state.shouldHideAvatars, + hideAvatarsImages = state.hideAvatarsImages, onKnockMessageUpdate = { state.eventSink(JoinRoomEvents.UpdateKnockMessage(it)) }, ) }, @@ -372,7 +372,7 @@ private fun JoinRoomContent( roomIdOrAlias: RoomIdOrAlias, contentState: ContentState, knockMessage: String, - shouldHideAvatars: Boolean, + hideAvatarsImages: Boolean, onKnockMessageUpdate: (String) -> Unit, modifier: Modifier = Modifier, ) { @@ -387,14 +387,14 @@ private fun JoinRoomContent( Column(horizontalAlignment = Alignment.CenterHorizontally) { val inviteSender = (contentState.joinAuthorisationStatus as? JoinAuthorisationStatus.IsInvited)?.inviteSender if (inviteSender != null) { - InviteSenderView(inviteSender = inviteSender, hideAvatarImage = shouldHideAvatars) + InviteSenderView(inviteSender = inviteSender, hideAvatarImage = hideAvatarsImages) Spacer(modifier = Modifier.height(32.dp)) } DefaultLoadedContent( modifier = Modifier.verticalScroll(rememberScrollState()), contentState = contentState, knockMessage = knockMessage, - shouldHideAvatars = shouldHideAvatars, + hideAvatarImage = hideAvatarsImages, onKnockMessageUpdate = onKnockMessageUpdate ) } @@ -477,14 +477,14 @@ private fun IsKnockedLoadedContent(modifier: Modifier = Modifier) { private fun DefaultLoadedContent( contentState: ContentState.Loaded, knockMessage: String, - shouldHideAvatars: Boolean, + hideAvatarImage: Boolean, onKnockMessageUpdate: (String) -> Unit, modifier: Modifier = Modifier, ) { RoomPreviewOrganism( modifier = modifier, avatar = { - Avatar(contentState.avatarData(AvatarSize.RoomHeader), hideImage = shouldHideAvatars) + Avatar(contentState.avatarData(AvatarSize.RoomHeader), hideImage = hideAvatarImage) }, title = { if (contentState.name != null) { diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt index 6dfdf9d88c..dc26487f91 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt @@ -15,14 +15,16 @@ import im.vector.app.features.analytics.plan.Interaction import io.element.android.compound.theme.Theme import io.element.android.compound.theme.themes import io.element.android.features.preferences.impl.R +import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage import io.element.android.libraries.designsystem.components.dialogs.ListOption import io.element.android.libraries.designsystem.components.dialogs.SingleSelectionDialog import io.element.android.libraries.designsystem.components.list.ListItemContent import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory import io.element.android.libraries.designsystem.components.preferences.PreferencePage import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch -import io.element.android.libraries.designsystem.preview.ElementPreview -import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.preview.ElementPreviewDark +import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.preview.PreviewWithLargeHeight import io.element.android.libraries.designsystem.theme.components.ListItem import io.element.android.libraries.designsystem.theme.components.ListSectionHeader import io.element.android.libraries.designsystem.theme.components.ListSupportingText @@ -192,9 +194,21 @@ private fun Theme.toHumanReadable(): String { ) } -@PreviewsDayNight +@PreviewWithLargeHeight @Composable -internal fun AdvancedSettingsViewPreview(@PreviewParameter(AdvancedSettingsStateProvider::class) state: AdvancedSettingsState) = - ElementPreview { - AdvancedSettingsView(state = state, onBackClick = { }) - } +internal fun AdvancedSettingsViewLightPreview(@PreviewParameter(AdvancedSettingsStateProvider::class) state: AdvancedSettingsState) = + ElementPreviewLight { ContentToPreview(state) } + +@PreviewWithLargeHeight +@Composable +internal fun AdvancedSettingsViewDarkPreview(@PreviewParameter(AdvancedSettingsStateProvider::class) state: AdvancedSettingsState) = + ElementPreviewDark { ContentToPreview(state) } + +@ExcludeFromCoverage +@Composable +private fun ContentToPreview(state: AdvancedSettingsState) { + AdvancedSettingsView( + state = state, + onBackClick = { } + ) +} From 883103d71d2243d31c14c301e0422a7bf4cb92a5 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Fri, 11 Apr 2025 11:13:42 +0000 Subject: [PATCH 9/9] Update screenshots --- ...preferences.impl.advanced_AdvancedSettingsViewDark_0_en.png | 3 +++ ...preferences.impl.advanced_AdvancedSettingsViewDark_1_en.png | 3 +++ ...preferences.impl.advanced_AdvancedSettingsViewDark_2_en.png | 3 +++ ...preferences.impl.advanced_AdvancedSettingsViewDark_3_en.png | 3 +++ ...preferences.impl.advanced_AdvancedSettingsViewDark_4_en.png | 3 +++ ...preferences.impl.advanced_AdvancedSettingsViewDark_5_en.png | 3 +++ ...preferences.impl.advanced_AdvancedSettingsViewDark_6_en.png | 3 +++ ...references.impl.advanced_AdvancedSettingsViewLight_0_en.png | 3 +++ ...references.impl.advanced_AdvancedSettingsViewLight_1_en.png | 3 +++ ...references.impl.advanced_AdvancedSettingsViewLight_2_en.png | 3 +++ ...references.impl.advanced_AdvancedSettingsViewLight_3_en.png | 3 +++ ...references.impl.advanced_AdvancedSettingsViewLight_4_en.png | 3 +++ ...references.impl.advanced_AdvancedSettingsViewLight_5_en.png | 3 +++ ...references.impl.advanced_AdvancedSettingsViewLight_6_en.png | 3 +++ ...preferences.impl.advanced_AdvancedSettingsView_Day_0_en.png | 3 --- ...preferences.impl.advanced_AdvancedSettingsView_Day_1_en.png | 3 --- ...preferences.impl.advanced_AdvancedSettingsView_Day_2_en.png | 3 --- ...preferences.impl.advanced_AdvancedSettingsView_Day_3_en.png | 3 --- ...preferences.impl.advanced_AdvancedSettingsView_Day_4_en.png | 3 --- ...preferences.impl.advanced_AdvancedSettingsView_Day_5_en.png | 3 --- ...preferences.impl.advanced_AdvancedSettingsView_Day_6_en.png | 3 --- ...eferences.impl.advanced_AdvancedSettingsView_Night_0_en.png | 3 --- ...eferences.impl.advanced_AdvancedSettingsView_Night_1_en.png | 3 --- ...eferences.impl.advanced_AdvancedSettingsView_Night_2_en.png | 3 --- ...eferences.impl.advanced_AdvancedSettingsView_Night_3_en.png | 3 --- ...eferences.impl.advanced_AdvancedSettingsView_Night_4_en.png | 3 --- ...eferences.impl.advanced_AdvancedSettingsView_Night_5_en.png | 3 --- ...eferences.impl.advanced_AdvancedSettingsView_Night_6_en.png | 3 --- 28 files changed, 42 insertions(+), 42 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_5_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_6_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_5_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_6_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en.png new file mode 100644 index 0000000000..c6ea7ea86b --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:926ce46cacac7beaac403e1c4e8034398d91dc48ab5f651bc7f0639ac65fe33a +size 46759 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en.png new file mode 100644 index 0000000000..edccccc989 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84c2474bc4d10e1aa3184c41b12b1bcf51d7e2b7ec801944608613aa46f50eba +size 46636 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en.png new file mode 100644 index 0000000000..01cf719299 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:611d435a2b3e6e0f8c7721905f635c1c93aa217df3fe4f4b6bb38bf5700e3629 +size 34586 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en.png new file mode 100644 index 0000000000..f844203887 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d9b0a865db8f87d6c1c95b8fb6d916f261d44cecec52fdebd56288f2df35f0f +size 46627 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en.png new file mode 100644 index 0000000000..69f5a502d5 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0505bdd3cfccf156249ab27ed0f087bd4d01d11121cb1f5e0c8450c6b7b58059 +size 46615 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en.png new file mode 100644 index 0000000000..ef2041611a --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a004afcec0cb40f82172c7abdc4404d1a0d879d0e23c63d0dcd1d7325cddff43 +size 46471 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en.png new file mode 100644 index 0000000000..a3a7ee69cf --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb09af4f9c96afb60b917d9484e28bacb73c494f9dfc2f42abb482896027b7b7 +size 46767 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en.png new file mode 100644 index 0000000000..a61c1185f1 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dfb5f83a129332a84f0184ba6a37ba9a95ded6fd9692a6e5710aaeb6b424c7c +size 48610 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en.png new file mode 100644 index 0000000000..6c498e613b --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:903d0aa3faa5b4feae990139c467a5a6662808ffb768c7a2a5cd314f9ea09ba2 +size 48482 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en.png new file mode 100644 index 0000000000..992a95c8f1 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a2538700b5dc993568575e7017fc26c3cba7af7b7567fac069af5aa0c6f6b5f +size 36484 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en.png new file mode 100644 index 0000000000..babb6a6546 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9177ba1065f5cfe3137a16c024445332b2fe326969f5f6d65ccf6b1707deabe9 +size 48502 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en.png new file mode 100644 index 0000000000..909a027708 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f07064f41aafea6a91e3314d7d3bb099918e348ef9f9154a057d90758b9fb71 +size 48480 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en.png new file mode 100644 index 0000000000..e2d2f592e0 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92c1c93890214c88ed0e4d1d9faee27cc671db94fe928633ccc82471c137b64a +size 48422 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en.png new file mode 100644 index 0000000000..feba53f652 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f21d860514e97b48c3fab7fef4fbf6d710854d21ea2eecc3b44a5ba340c92eb +size 48608 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en.png deleted file mode 100644 index cf68033e1f..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6aa576274958f21da6b008b3c3e7698f996fc5124b18be5d9897f4fdcbc72df1 -size 78002 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en.png deleted file mode 100644 index e3983c15a1..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c1bb3ea0adf2e0ab678b1f238355716c0ffec96538dc79c060ddb62768d9d04 -size 77781 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en.png deleted file mode 100644 index e549915d6d..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e533b7aabda646ac9e51a2302a9f29317b37c4102674d34986f3f22eb0cdfb7c -size 47767 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en.png deleted file mode 100644 index b21f4c00fc..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:448631ff519b2f6f4ce63d3d9cc6df98ed6b028a474eb782d9184ef0f1e65fb0 -size 77824 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en.png deleted file mode 100644 index 378b712d74..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:906498f38a79491323f7f7550f16d7c058d4e670d93c7c4e9bb843913a652367 -size 77811 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_5_en.png deleted file mode 100644 index afeaddc375..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_5_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed2983e7f89083e30ea7fe774edf7beec8f0b2fd172d158b7a3bad8b649a6a59 -size 77695 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_6_en.png deleted file mode 100644 index 53123d368d..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Day_6_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0dabf522c0dee2616c5c90ebdcf4bc33cc1a7a91c1eac2a3a1f3f0a805db1194 -size 78078 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en.png deleted file mode 100644 index 43a46659a4..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3dd003ab1e975b6a24e8eb57ee335e1ea4051575dc2acbf2afe59d38edd1b5d -size 75747 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en.png deleted file mode 100644 index 4fca754813..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0042189ec518aa5f497c2f6628fce86741ac4e05bf8a42be33c53569524184c -size 75450 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en.png deleted file mode 100644 index 53150c9169..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b401b0afe3e47b808339eae9d4293b4422fde1227fdf5f92113ef49ac8adce2c -size 45064 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en.png deleted file mode 100644 index 691914002c..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44c1e5e6764a980d1069898a425de0857b70b3b8be73b920a4a4d73e0d29a1dc -size 75494 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en.png deleted file mode 100644 index fcb5c0b1bb..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94479a37780a4d6bf087a93467cdd262c1c5e08d09ebbef3f3393c7f33525498 -size 75450 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_5_en.png deleted file mode 100644 index 2fb443381b..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_5_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6374ada77b4ae82e14c3f7d1118ef1a4d14438db6d212e189e8914f9112d3014 -size 75289 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_6_en.png deleted file mode 100644 index f7e20619c2..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsView_Night_6_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e22fe8580f622b1999876a646892687b319661ef8e2278c9da15a262771a525 -size 75786