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 + } + } +}