change (preferences) : bind timeline media preview with join rule

This commit is contained in:
ganfra 2025-04-10 18:10:37 +02:00
parent ca1c2ae4a4
commit 5725e328fe
2 changed files with 29 additions and 17 deletions

View file

@ -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<TimelineProtectionState> {
private val allowedEvents = mutableStateOf<Set<EventId>>(setOf())
@Composable
override fun present(): TimelineProtectionState {
val mediaPreviewValue = remember {
appPreferencesStore.getTimelineMediaPreviewValueFlow()
}.collectAsState(initial = MediaPreviewValue.Off)
var allowedEvents by remember { mutableStateOf<Set<EventId>>(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)
}
}
}

View file

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