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 454b89824..44b0cb0b0 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 @@ -32,6 +32,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -281,70 +282,74 @@ fun GetVideoController( UUID.randomUUID().toString() } + val scope = rememberCoroutineScope() + // Prepares a VideoPlayer from the foreground service. DisposableEffect(key1 = videoUri) { // If it is not null, the user might have come back from a playing video, like clicking on // the notification of the video player. - if (controller.value == null) { - PlaybackClientController.prepareController( - uid, - videoUri, - nostrUriCallback, - context - ) { - // checks again because of race conditions. - if (controller.value == null) { // still prone to race conditions. - controller.value = it + scope.launch(Dispatchers.IO) { + if (controller.value == null) { + PlaybackClientController.prepareController( + uid, + videoUri, + nostrUriCallback, + context + ) { + // checks again because of race conditions. + if (controller.value == null) { // still prone to race conditions. + controller.value = it - if (!it.isPlaying) { - if (keepPlayingMutex?.isPlaying == true) { - // There is a video playing, start this one on mute. - controller.value?.volume = 0f - } else { - // There is no other video playing. Use the default mute state to - // decide if sound is on or not. - controller.value?.volume = if (defaultToStart) 0f else 1f - } - } - - controller.value?.setMediaItem(mediaItem) - controller.value?.prepare() - } else if (controller.value != it) { - // discards the new controller because there is an existing one - it.stop() - it.release() - - controller.value?.let { - if (it.playbackState == Player.STATE_IDLE || it.playbackState == Player.STATE_ENDED) { - if (it.isPlaying) { + if (!it.isPlaying) { + if (keepPlayingMutex?.isPlaying == true) { // There is a video playing, start this one on mute. - it.volume = 0f + controller.value?.volume = 0f } else { // There is no other video playing. Use the default mute state to // decide if sound is on or not. - it.volume = if (defaultToStart) 0f else 1f + controller.value?.volume = if (defaultToStart) 0f else 1f } + } - it.setMediaItem(mediaItem) - it.prepare() + controller.value?.setMediaItem(mediaItem) + controller.value?.prepare() + } else if (controller.value != it) { + // discards the new controller because there is an existing one + it.stop() + it.release() + + controller.value?.let { + if (it.playbackState == Player.STATE_IDLE || it.playbackState == Player.STATE_ENDED) { + if (it.isPlaying) { + // There is a video playing, start this one on mute. + it.volume = 0f + } else { + // There is no other video playing. Use the default mute state to + // decide if sound is on or not. + it.volume = if (defaultToStart) 0f else 1f + } + + it.setMediaItem(mediaItem) + it.prepare() + } } } } - } - } else { - controller.value?.let { - if (it.playbackState == Player.STATE_IDLE || it.playbackState == Player.STATE_ENDED) { - if (it.isPlaying) { - // There is a video playing, start this one on mute. - it.volume = 0f - } else { - // There is no other video playing. Use the default mute state to - // decide if sound is on or not. - it.volume = if (defaultToStart) 0f else 1f - } + } else { + controller.value?.let { + if (it.playbackState == Player.STATE_IDLE || it.playbackState == Player.STATE_ENDED) { + if (it.isPlaying) { + // There is a video playing, start this one on mute. + it.volume = 0f + } else { + // There is no other video playing. Use the default mute state to + // decide if sound is on or not. + it.volume = if (defaultToStart) 0f else 1f + } - it.setMediaItem(mediaItem) - it.prepare() + it.setMediaItem(mediaItem) + it.prepare() + } } } } @@ -366,34 +371,36 @@ fun GetVideoController( if (event == Lifecycle.Event.ON_RESUME) { // if the controller is null, restarts the controller with a new one // if the controller is not null, just continue playing what the controller was playing - if (controller.value == null) { - PlaybackClientController.prepareController( - uid, - videoUri, - nostrUriCallback, - context - ) { - // checks again to make sure no other thread has created a controller. - if (controller.value == null) { - controller.value = it + scope.launch(Dispatchers.IO) { + if (controller.value == null) { + PlaybackClientController.prepareController( + uid, + videoUri, + nostrUriCallback, + context + ) { + // checks again to make sure no other thread has created a controller. + if (controller.value == null) { + controller.value = it - if (!it.isPlaying) { - if (keepPlayingMutex?.isPlaying == true) { - // There is a video playing, start this one on mute. - controller.value?.volume = 0f - } else { - // There is no other video playing. Use the default mute state to - // decide if sound is on or not. - controller.value?.volume = if (defaultToStart) 0f else 1f + if (!it.isPlaying) { + if (keepPlayingMutex?.isPlaying == true) { + // There is a video playing, start this one on mute. + controller.value?.volume = 0f + } else { + // There is no other video playing. Use the default mute state to + // decide if sound is on or not. + controller.value?.volume = if (defaultToStart) 0f else 1f + } } - } - controller.value?.setMediaItem(mediaItem) - controller.value?.prepare() - } else if (controller.value != it) { - // discards the new controller because there is an existing one - it.stop() - it.release() + controller.value?.setMediaItem(mediaItem) + controller.value?.prepare() + } else if (controller.value != it) { + // discards the new controller because there is an existing one + it.stop() + it.release() + } } } } @@ -519,7 +526,8 @@ private fun RenderVideoPlayer( .defaultMinSize(minHeight = 100.dp) .align(Alignment.Center) } else { - Modifier.fillMaxWidth() + Modifier + .fillMaxWidth() .defaultMinSize(minHeight = 100.dp) .align(Alignment.Center) },