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 f10a721ce..3443aed7e 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 @@ -141,6 +141,9 @@ fun RichTextViewer( if (imageExtension.matcher(removedParamsFromUrl).matches()) { imagesForPager.add(word) } + if (videoExtension.matcher(removedParamsFromUrl).matches()) { + imagesForPager.add(word) + } } } } @@ -160,7 +163,7 @@ fun RichTextViewer( if (imageExtension.matcher(removedParamsFromUrl).matches()) { ZoomableImageView(word, imagesForPager) } else if (videoExtension.matcher(removedParamsFromUrl).matches()) { - VideoView(word) + ZoomableImageView(word, imagesForPager) } 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 index 081bd720c..304a00ea1 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 @@ -19,7 +19,7 @@ import com.google.android.exoplayer2.ui.StyledPlayerView import com.vitorpamplona.amethyst.VideoCache @Composable -fun VideoView(videoUri: String) { +fun VideoView(videoUri: String, onDialog: ((Boolean) -> Unit)? = null) { val context = LocalContext.current val exoPlayer = remember { @@ -49,6 +49,11 @@ fun VideoView(videoUri: String) { ViewGroup.LayoutParams.WRAP_CONTENT ) resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH + onDialog?.let { innerOnDialog -> + setFullscreenButtonClickListener { + innerOnDialog(it) + } + } } } ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt index 9e968f27e..84486200d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt @@ -46,24 +46,28 @@ fun ZoomableImageView(word: String, images: List = listOf(word)) { mutableStateOf(false) } - AsyncImage( - model = word, - contentDescription = word, - contentScale = ContentScale.FillWidth, - modifier = Modifier - .padding(top = 4.dp) - .fillMaxWidth() - .clip(shape = RoundedCornerShape(15.dp)) - .border( - 1.dp, - MaterialTheme.colors.onSurface.copy(alpha = 0.12f), - RoundedCornerShape(15.dp) - ) - .combinedClickable( - onClick = { dialogOpen = true }, - onLongClick = { clipboardManager.setText(AnnotatedString(word)) } - ) - ) + if (imageExtension.matcher(word).matches()) { + AsyncImage( + model = word, + contentDescription = word, + contentScale = ContentScale.FillWidth, + modifier = Modifier + .padding(top = 4.dp) + .fillMaxWidth() + .clip(shape = RoundedCornerShape(15.dp)) + .border( + 1.dp, + MaterialTheme.colors.onSurface.copy(alpha = 0.12f), + RoundedCornerShape(15.dp) + ) + .combinedClickable( + onClick = { dialogOpen = true }, + onLongClick = { clipboardManager.setText(AnnotatedString(word)) } + ) + ) + } else { + VideoView(word) { dialogOpen = true } + } if (dialogOpen) { ZoomableImageDialog(word, images, onDismiss = { dialogOpen = false }) @@ -78,14 +82,11 @@ fun ZoomableImageDialog(imageUrl: String, allImages: List = listOf(image properties = DialogProperties(usePlatformDefaultWidth = false) ) { Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background) { - Column( - modifier = Modifier.padding(10.dp) - ) { + Column() { var pagerState: PagerState = remember { PagerState() } Row( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.padding(10.dp).fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -99,27 +100,31 @@ fun ZoomableImageDialog(imageUrl: String, allImages: List = listOf(image pagerState = pagerState, itemsCount = allImages.size, itemContent = { index -> - AsyncImage( - model = allImages[index], - contentDescription = stringResource(id = R.string.profile_image), - contentScale = ContentScale.FillWidth, - modifier = Modifier - .fillMaxSize() - .zoomable(rememberZoomState()) - ) + RenderImageOrVideo(allImages[index]) } ) } else { - AsyncImage( - model = imageUrl, - contentDescription = stringResource(id = R.string.profile_image), - contentScale = ContentScale.FillWidth, - modifier = Modifier - .fillMaxSize() - .zoomable(rememberZoomState()) - ) + RenderImageOrVideo(imageUrl) } } } } } + +@Composable +private fun RenderImageOrVideo(imageUrl: String) { + if (imageExtension.matcher(imageUrl).matches()) { + AsyncImage( + model = imageUrl, + contentDescription = stringResource(id = R.string.profile_image), + contentScale = ContentScale.FillWidth, + modifier = Modifier + .fillMaxSize() + .zoomable(rememberZoomState()) + ) + } else { + Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxSize(1f)) { + VideoView(imageUrl) + } + } +}