diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index 3837e8366..b409c1702 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -43,6 +43,15 @@ import com.vitorpamplona.amethyst.service.nip19.Nip19 import com.vitorpamplona.amethyst.ui.note.NoteCompose import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.uriToRoute +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.ImmutableMap +import kotlinx.collections.immutable.ImmutableSet +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.persistentMapOf +import kotlinx.collections.immutable.persistentSetOf +import kotlinx.collections.immutable.toImmutableList +import kotlinx.collections.immutable.toImmutableMap +import kotlinx.collections.immutable.toImmutableSet import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.net.MalformedURLException @@ -108,10 +117,10 @@ fun RichTextViewer( @Stable class RichTextViewerState( val content: String, - val urlSet: Set, - val imagesForPager: Map, - val imageList: List, - val customEmoji: Map + val urlSet: ImmutableSet, + val imagesForPager: ImmutableMap, + val imageList: ImmutableList, + val customEmoji: ImmutableMap ) @Composable @@ -124,7 +133,15 @@ private fun RenderRegular( nav: (String) -> Unit ) { var state by remember(content) { - mutableStateOf(RichTextViewerState(content, emptySet(), emptyMap(), emptyList(), emptyMap())) + mutableStateOf( + RichTextViewerState( + content, + persistentSetOf(), + persistentMapOf(), + persistentListOf(), + persistentMapOf() + ) + ) } LaunchedEffect(key1 = content) { @@ -146,7 +163,13 @@ private fun RenderRegular( val emojiMap = tags?.filter { it.size > 2 && it[0] == "emoji" }?.associate { ":${it[1]}:" to it[2] } ?: emptyMap() if (urlSet.isNotEmpty() || emojiMap.isNotEmpty()) { - state = RichTextViewerState(content, urlSet, imagesForPager, imageList, emojiMap) + state = RichTextViewerState( + content, + urlSet.toImmutableSet(), + imagesForPager.toImmutableMap(), + imageList.toImmutableList(), + emojiMap.toImmutableMap() + ) } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt index 39636999e..d56f65998 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt @@ -54,7 +54,6 @@ import coil.request.ImageRequest import com.google.android.exoplayer2.C import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem -import com.google.android.exoplayer2.MediaMetadata import com.google.android.exoplayer2.Player import com.google.android.exoplayer2.source.ProgressiveMediaSource import com.google.android.exoplayer2.ui.AspectRatioFrameLayout @@ -126,17 +125,17 @@ fun VideoView(videoUri: Uri, description: String? = null, thumb: Drawable? = nul var exoPlayer by remember { mutableStateOf(null) } LaunchedEffect(key1 = videoUri) { - val mediaBuilder = MediaItem.Builder().setUri(videoUri) - - description?.let { - mediaBuilder.setMediaMetadata( - MediaMetadata.Builder().setDisplayTitle(it).build() - ) + if (exoPlayer == null) { + launch(Dispatchers.Default) { + exoPlayer = ExoPlayer.Builder(context).build() + } } + } - val media = mediaBuilder.build() + exoPlayer?.let { + val media = remember { MediaItem.Builder().setUri(videoUri).build() } - exoPlayer = ExoPlayer.Builder(context).build().apply { + it.apply { repeatMode = Player.REPEAT_MODE_ALL videoScalingMode = C.VIDEO_SCALING_MODE_SCALE_TO_FIT volume = if (mutedInstance.value) 0f else 1f @@ -151,9 +150,7 @@ fun VideoView(videoUri: Uri, description: String? = null, thumb: Drawable? = nul } prepare() } - } - exoPlayer?.let { RenderVideoPlayer(it, context, thumb, onDialog, mutedInstance) } @@ -232,14 +229,11 @@ fun Modifier.onVisibilityChanges(onVisibilityChanges: (Boolean) -> Unit): Modifi val view = LocalView.current var isVisible: Boolean? by remember { mutableStateOf(null) } - LaunchedEffect(isVisible) { - onVisibilityChanges(isVisible == true) - } - onGloballyPositioned { coordinates -> val newIsVisible = coordinates.isCompletelyVisible(view) if (isVisible != newIsVisible) { isVisible = newIsVisible + onVisibilityChanges(isVisible == true) } } }