Hide's the Video Full Screen dialog buttons together with video controls.

This commit is contained in:
Vitor Pamplona 2023-10-03 11:50:22 -04:00
parent 9f5a71020d
commit b8b41f840a
2 changed files with 112 additions and 55 deletions

View File

@ -154,24 +154,26 @@ fun VideoView(
authorName: String? = null, authorName: String? = null,
nostrUriCallback: String? = null, nostrUriCallback: String? = null,
onDialog: ((Boolean) -> Unit)? = null, onDialog: ((Boolean) -> Unit)? = null,
onControllerVisibilityChanged: ((Boolean) -> Unit)? = null,
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
alwaysShowVideo: Boolean = false alwaysShowVideo: Boolean = false
) { ) {
val defaultToStart by remember(videoUri) { mutableStateOf(DefaultMutedSetting.value) } val defaultToStart by remember(videoUri) { mutableStateOf(DefaultMutedSetting.value) }
VideoViewInner( VideoViewInner(
videoUri, videoUri = videoUri,
defaultToStart, defaultToStart = defaultToStart,
title, title = title,
thumb, thumb = thumb,
roundedCorner, roundedCorner = roundedCorner,
waveform, waveform = waveform,
artworkUri, artworkUri = artworkUri,
authorName, authorName = authorName,
nostrUriCallback, nostrUriCallback = nostrUriCallback,
alwaysShowVideo, alwaysShowVideo = alwaysShowVideo,
accountViewModel, accountViewModel = accountViewModel,
onDialog onControllerVisibilityChanged = onControllerVisibilityChanged,
onDialog = onDialog
) )
} }
@ -189,6 +191,7 @@ fun VideoViewInner(
nostrUriCallback: String? = null, nostrUriCallback: String? = null,
alwaysShowVideo: Boolean = false, alwaysShowVideo: Boolean = false,
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
onControllerVisibilityChanged: ((Boolean) -> Unit)? = null,
onDialog: ((Boolean) -> Unit)? = null onDialog: ((Boolean) -> Unit)? = null
) { ) {
val automaticallyStartPlayback = remember { val automaticallyStartPlayback = remember {
@ -247,6 +250,7 @@ fun VideoViewInner(
keepPlaying = keepPlaying, keepPlaying = keepPlaying,
automaticallyStartPlayback = automaticallyStartPlayback, automaticallyStartPlayback = automaticallyStartPlayback,
activeOnScreen = activeOnScreen, activeOnScreen = activeOnScreen,
onControllerVisibilityChanged = onControllerVisibilityChanged,
onDialog = onDialog onDialog = onDialog
) )
} }
@ -514,6 +518,7 @@ private fun RenderVideoPlayer(
keepPlaying: MutableState<Boolean>, keepPlaying: MutableState<Boolean>,
automaticallyStartPlayback: MutableState<Boolean>, automaticallyStartPlayback: MutableState<Boolean>,
activeOnScreen: MutableState<Boolean>, activeOnScreen: MutableState<Boolean>,
onControllerVisibilityChanged: ((Boolean) -> Unit)? = null,
onDialog: ((Boolean) -> Unit)? onDialog: ((Boolean) -> Unit)?
) { ) {
ControlWhenPlayerIsActive(controller, keepPlaying, automaticallyStartPlayback, activeOnScreen) ControlWhenPlayerIsActive(controller, keepPlaying, automaticallyStartPlayback, activeOnScreen)
@ -558,8 +563,11 @@ private fun RenderVideoPlayer(
} }
} }
setControllerVisibilityListener( setControllerVisibilityListener(
PlayerView.ControllerVisibilityListener { PlayerView.ControllerVisibilityListener { visible ->
controllerVisible.value = it == View.VISIBLE controllerVisible.value = visible == View.VISIBLE
onControllerVisibilityChanged?.let { callback ->
callback(visible == View.VISIBLE)
}
} }
) )
} }

View File

@ -6,6 +6,9 @@ import android.content.ContextWrapper
import android.os.Build import android.os.Build
import android.util.Log import android.util.Log
import android.view.Window import android.view.Window
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.combinedClickable
@ -636,25 +639,66 @@ fun ZoomableImageDialog(
) { ) {
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.TopCenter) { Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.TopCenter) {
DialogContent(allImages, imageUrl, onDismiss, accountViewModel)
}
}
}
}
@Composable
@OptIn(ExperimentalFoundationApi::class)
private fun DialogContent(
allImages: ImmutableList<ZoomableContent>,
imageUrl: ZoomableContent,
onDismiss: () -> Unit,
accountViewModel: AccountViewModel
) {
val pagerState: PagerState = rememberPagerState() { allImages.size } val pagerState: PagerState = rememberPagerState() { allImages.size }
val controllerVisible = remember { mutableStateOf(false) }
val holdOn = remember { mutableStateOf<Boolean>(true) }
LaunchedEffect(key1 = pagerState, key2 = imageUrl) { LaunchedEffect(key1 = pagerState, key2 = imageUrl) {
launch {
val page = allImages.indexOf(imageUrl) val page = allImages.indexOf(imageUrl)
if (page > -1) { if (page > -1) {
pagerState.scrollToPage(page) pagerState.scrollToPage(page)
} }
} }
launch(Dispatchers.Default) {
delay(2000)
holdOn.value = false
}
}
if (allImages.size > 1) { if (allImages.size > 1) {
SlidingCarousel( SlidingCarousel(
pagerState = pagerState pagerState = pagerState
) { index -> ) { index ->
RenderImageOrVideo(allImages[index], false, accountViewModel) RenderImageOrVideo(
content = allImages[index],
roundedCorner = false,
onControllerVisibilityChanged = {
controllerVisible.value = it
},
accountViewModel = accountViewModel
)
} }
} else { } else {
RenderImageOrVideo(imageUrl, false, accountViewModel) RenderImageOrVideo(
content = imageUrl,
roundedCorner = false,
onControllerVisibilityChanged = {
controllerVisible.value = it
},
accountViewModel = accountViewModel
)
} }
AnimatedVisibility(
visible = holdOn.value || controllerVisible.value,
enter = fadeIn(),
exit = fadeOut()
) {
Row( Row(
modifier = Modifier modifier = Modifier
.padding(10.dp) .padding(10.dp)
@ -679,8 +723,6 @@ fun ZoomableImageDialog(
} }
} }
} }
}
}
} }
@Composable @Composable
@ -751,7 +793,12 @@ private fun ShareImageAction(
} }
@Composable @Composable
private fun RenderImageOrVideo(content: ZoomableContent, roundedCorner: Boolean, accountViewModel: AccountViewModel) { private fun RenderImageOrVideo(
content: ZoomableContent,
roundedCorner: Boolean,
onControllerVisibilityChanged: ((Boolean) -> Unit)? = null,
accountViewModel: AccountViewModel
) {
val mainModifier = Modifier val mainModifier = Modifier
.fillMaxSize() .fillMaxSize()
.zoomable(rememberZoomState()) .zoomable(rememberZoomState())
@ -766,6 +813,7 @@ private fun RenderImageOrVideo(content: ZoomableContent, roundedCorner: Boolean,
artworkUri = content.artworkUri, artworkUri = content.artworkUri,
authorName = content.authorName, authorName = content.authorName,
roundedCorner = roundedCorner, roundedCorner = roundedCorner,
onControllerVisibilityChanged = onControllerVisibilityChanged,
accountViewModel = accountViewModel, accountViewModel = accountViewModel,
alwaysShowVideo = true alwaysShowVideo = true
) )
@ -781,6 +829,7 @@ private fun RenderImageOrVideo(content: ZoomableContent, roundedCorner: Boolean,
artworkUri = content.artworkUri, artworkUri = content.artworkUri,
authorName = content.authorName, authorName = content.authorName,
roundedCorner = roundedCorner, roundedCorner = roundedCorner,
onControllerVisibilityChanged = onControllerVisibilityChanged,
accountViewModel = accountViewModel, accountViewModel = accountViewModel,
alwaysShowVideo = true alwaysShowVideo = true
) )