From 69fdc4fcd46b4ca27fe6f3d8a8333da290c1c3a7 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 12 Jan 2023 22:40:39 -0500 Subject: [PATCH] Adding video playback to the timeline --- app/build.gradle | 3 + .../vitorpamplona/amethyst/ui/MainActivity.kt | 1 + .../amethyst/ui/components/RichTextViewer.kt | 3 + .../amethyst/ui/components/VideoView.kt | 57 +++++++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt diff --git a/app/build.gradle b/app/build.gradle index 758c29789..dcc78f347 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -95,6 +95,9 @@ dependencies { // upload pictures: implementation "com.google.accompanist:accompanist-permissions:0.28.0" + // view videos + implementation 'com.google.android.exoplayer:exoplayer:2.18.2' + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt index cd2f697c2..8c8385bae 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt @@ -8,6 +8,7 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface import androidx.compose.ui.Modifier import androidx.lifecycle.viewmodel.compose.viewModel +import com.google.android.exoplayer2.util.Util import com.vitorpamplona.amethyst.KeyStorage import com.vitorpamplona.amethyst.service.NostrAccountDataSource import com.vitorpamplona.amethyst.service.NostrGlobalDataSource 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 512581449..81dc3678b 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 @@ -23,6 +23,7 @@ import java.net.URL import java.util.regex.Pattern val imageExtension = Pattern.compile("(.*/)*.+\\.(png|jpg|gif|bmp|jpeg|webp)$") +val videoExtension = Pattern.compile("(.*/)*.+\\.(mp4|avi|wmv|mpg|amv|webm)$") val noProtocolUrlValidator = Pattern.compile("^[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$") val tagIndex = Pattern.compile("\\#\\[([0-9]*)\\]") @@ -59,6 +60,8 @@ fun RichTextViewer(content: String, tags: List>?) { .clip(shape = RoundedCornerShape(15.dp)) .border(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.12f), RoundedCornerShape(15.dp)) ) + } else if (videoExtension.matcher(removedParamsFromUrl).matches()) { + VideoView(word) } else { UrlPreview(word, word) } 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 new file mode 100644 index 000000000..2a0e86301 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt @@ -0,0 +1,57 @@ +package com.vitorpamplona.amethyst.ui.components + +import android.media.browse.MediaBrowser +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import com.google.android.exoplayer2.C +import com.google.android.exoplayer2.ExoPlayer +import com.google.android.exoplayer2.MediaItem +import com.google.android.exoplayer2.Player +import com.google.android.exoplayer2.ui.AspectRatioFrameLayout +import com.google.android.exoplayer2.ui.StyledPlayerView + +@Composable +fun VideoView(videoUri: String) { + val context = LocalContext.current + + val exoPlayer = ExoPlayer.Builder(LocalContext.current).build().apply { + playWhenReady = true + repeatMode = Player.REPEAT_MODE_ALL + videoScalingMode = C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING + setMediaItem(MediaItem.fromUri(videoUri)) + prepare() + } + + DisposableEffect(exoPlayer) { + onDispose { + exoPlayer.release() + } + } + + println("CCC"+exoPlayer.videoFormat?.width) + AndroidView( + modifier = Modifier + .fillMaxWidth(), + factory = { + StyledPlayerView(context).apply { + player = exoPlayer + layoutParams = FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH + } + }) +} \ No newline at end of file