change (preferences) : bind timeline media preview with join rule
This commit is contained in:
parent
b9eb4c49b7
commit
64f139750c
2 changed files with 29 additions and 17 deletions
|
|
@ -17,6 +17,7 @@ import androidx.compose.runtime.setValue
|
||||||
import io.element.android.libraries.architecture.Presenter
|
import io.element.android.libraries.architecture.Presenter
|
||||||
import io.element.android.libraries.matrix.api.core.EventId
|
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.MediaPreviewValue
|
||||||
|
import io.element.android.libraries.matrix.api.media.isPreviewEnabled
|
||||||
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
||||||
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
|
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
|
||||||
import kotlinx.collections.immutable.toImmutableSet
|
import kotlinx.collections.immutable.toImmutableSet
|
||||||
|
|
@ -26,29 +27,21 @@ class TimelineProtectionPresenter @Inject constructor(
|
||||||
private val appPreferencesStore: AppPreferencesStore,
|
private val appPreferencesStore: AppPreferencesStore,
|
||||||
private val room: MatrixRoom,
|
private val room: MatrixRoom,
|
||||||
) : Presenter<TimelineProtectionState> {
|
) : Presenter<TimelineProtectionState> {
|
||||||
|
private val allowedEvents = mutableStateOf<Set<EventId>>(setOf())
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
override fun present(): TimelineProtectionState {
|
override fun present(): TimelineProtectionState {
|
||||||
val mediaPreviewValue = remember {
|
val mediaPreviewValue = remember {
|
||||||
appPreferencesStore.getTimelineMediaPreviewValueFlow()
|
appPreferencesStore.getTimelineMediaPreviewValueFlow()
|
||||||
}.collectAsState(initial = MediaPreviewValue.Off)
|
}.collectAsState(initial = MediaPreviewValue.On)
|
||||||
var allowedEvents by remember { mutableStateOf<Set<EventId>>(setOf()) }
|
|
||||||
val roomInfo = room.roomInfoFlow.collectAsState()
|
val roomInfo = room.roomInfoFlow.collectAsState()
|
||||||
val protectionState by remember {
|
val protectionState by remember {
|
||||||
derivedStateOf {
|
derivedStateOf {
|
||||||
when (mediaPreviewValue.value) {
|
val isPreviewEnabled = mediaPreviewValue.value.isPreviewEnabled(roomInfo.value.joinRule)
|
||||||
MediaPreviewValue.On -> {
|
if (isPreviewEnabled) {
|
||||||
ProtectionState.RenderAll
|
ProtectionState.RenderAll
|
||||||
}
|
} else {
|
||||||
MediaPreviewValue.Off -> {
|
ProtectionState.RenderOnly(eventIds = allowedEvents.value.toImmutableSet())
|
||||||
ProtectionState.RenderOnly(eventIds = allowedEvents.toImmutableSet())
|
|
||||||
}
|
|
||||||
MediaPreviewValue.Private -> {
|
|
||||||
if (roomInfo.value.isPublic) {
|
|
||||||
ProtectionState.RenderOnly(eventIds = allowedEvents.toImmutableSet())
|
|
||||||
} else {
|
|
||||||
ProtectionState.RenderAll
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -56,7 +49,7 @@ class TimelineProtectionPresenter @Inject constructor(
|
||||||
fun handleEvent(event: TimelineProtectionEvent) {
|
fun handleEvent(event: TimelineProtectionEvent) {
|
||||||
when (event) {
|
when (event) {
|
||||||
is TimelineProtectionEvent.ShowContent -> {
|
is TimelineProtectionEvent.ShowContent -> {
|
||||||
allowedEvents = allowedEvents + setOfNotNull(event.eventId)
|
allowedEvents.value = allowedEvents.value + setOfNotNull(event.eventId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,11 @@
|
||||||
|
|
||||||
package io.element.android.libraries.matrix.api.media
|
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.
|
* Represents the values for media preview settings.
|
||||||
* - [On] means that media preview are enabled
|
* - [On] means that media preview are enabled
|
||||||
|
|
@ -18,3 +23,17 @@ enum class MediaPreviewValue {
|
||||||
Off,
|
Off,
|
||||||
Private
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue