From cb122306c63eeafb9d094703e67a228a99370407 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 30 Aug 2024 11:21:10 +0200 Subject: [PATCH] make onBackPress action adhere to the ui flow --- .../newpipe/newplayer/model/UIModeState.kt | 10 +++++++ .../newplayer/model/VideoPlayerViewModel.kt | 2 ++ .../model/VideoPlayerViewModelImpl.kt | 27 +++++++++++++++---- .../model/ViewoPlayerViewModelDummy.kt | 6 +++++ .../newplayer/ui/VideoPlayerControllerUI.kt | 13 --------- .../net/newpipe/newplayer/ui/VideoPlayerUI.kt | 7 +++++ 6 files changed, 47 insertions(+), 18 deletions(-) diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/UIModeState.kt b/new-player/src/main/java/net/newpipe/newplayer/model/UIModeState.kt index 7959f1a..d2c9607 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/model/UIModeState.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/model/UIModeState.kt @@ -153,6 +153,16 @@ enum class UIModeState { FULLSCREEN_VIDEO_STREAM_SELECT -> PlayMode.FULLSCREEN_VIDEO } + fun getNextModeWhenBackPressed() = when(this) { + EMBEDDED_VIDEO_CHAPTER_SELECT -> EMBEDDED_VIDEO + EMBEDDED_VIDEO_STREAM_SELECT -> EMBEDDED_VIDEO + FULLSCREEN_VIDEO -> EMBEDDED_VIDEO + FULLSCREEN_VIDEO_STREAM_SELECT -> FULLSCREEN_VIDEO + FULLSCREEN_VIDEO_CHAPTER_SELECT -> FULLSCREEN_VIDEO + FULLSCREEN_VIDEO_CONTROLLER_UI -> EMBEDDED_VIDEO + else -> null + } + companion object { fun fromPlayMode(playMode: PlayMode?) = if (playMode != null) diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt index 6fe62ec..16a2398 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt @@ -37,6 +37,7 @@ interface VideoPlayerViewModel { var maxContentRatio: Float var contentFitMode: ContentScale val embeddedPlayerDraggedDownBy: SharedFlow + val onBackPressed: SharedFlow fun initUIState(instanceState: Bundle) fun play() @@ -45,6 +46,7 @@ interface VideoPlayerViewModel { fun nextStream() fun switchToFullscreen(embeddedUiConfig: EmbeddedUiConfig) fun switchToEmbeddedView() + fun onBackPressed() fun showUi() fun hideUi() fun seekPositionChanged(newValue: Float) diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt index 5d24c8b..7508ac1 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt @@ -37,6 +37,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.asSharedFlow import javax.inject.Inject import kotlinx.coroutines.flow.asStateFlow @@ -127,6 +128,9 @@ class VideoPlayerViewModelImpl @Inject constructor( private var mutableEmbeddedPlayerDraggedDownBy = MutableSharedFlow() override val embeddedPlayerDraggedDownBy = mutableEmbeddedPlayerDraggedDownBy.asSharedFlow() + private var mutableOnBackPressed = MutableSharedFlow() + override val onBackPressed: SharedFlow = mutableOnBackPressed.asSharedFlow() + private fun installNewPlayer() { internalPlayer?.let { player -> Log.d(TAG, "Install player: ${player.videoSize.width}") @@ -298,9 +302,7 @@ class VideoPlayerViewModelImpl @Inject constructor( } override fun embeddedDraggedDown(offset: Float) { - viewModelScope.launch { - mutableEmbeddedPlayerDraggedDownBy.emit(offset) - } + saveTryEmit(mutableEmbeddedPlayerDraggedDownBy, offset) } override fun fastSeek(count: Int) { @@ -328,7 +330,6 @@ class VideoPlayerViewModelImpl @Inject constructor( } override fun brightnessChange(changeRate: Float, systemBrightness: Float) { - if (mutableUiState.value.uiMode.fullscreen) { val currentBrightness = mutableUiState.value.brightness ?: if (systemBrightness < 0f) 0.5f else systemBrightness @@ -381,8 +382,16 @@ class VideoPlayerViewModelImpl @Inject constructor( updateUiMode(UIModeState.EMBEDDED_VIDEO) } + override fun onBackPressed() { + val nextMode = uiState.value.uiMode.getNextModeWhenBackPressed() + if (nextMode != null) { + updateUiMode(nextMode) + } else { + saveTryEmit(mutableOnBackPressed, Unit) + } + } + override fun switchToFullscreen(embeddedUiConfig: EmbeddedUiConfig) { - println("gurken fullscreen: ${embeddedUiConfig}") uiVisibilityJob?.cancel() finishFastSeek() @@ -422,4 +431,12 @@ class VideoPlayerViewModelImpl @Inject constructor( } } } + + private fun saveTryEmit(sharedFlow: MutableSharedFlow, value: T) { + if(sharedFlow.tryEmit(value)) { + viewModelScope.launch { + sharedFlow.emit(value) + } + } + } } \ No newline at end of file diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/ViewoPlayerViewModelDummy.kt b/new-player/src/main/java/net/newpipe/newplayer/model/ViewoPlayerViewModelDummy.kt index 9981286..92959a1 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/model/ViewoPlayerViewModelDummy.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/model/ViewoPlayerViewModelDummy.kt @@ -4,6 +4,7 @@ import android.os.Bundle import androidx.media3.common.Player import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.asSharedFlow import net.newpipe.newplayer.NewPlayer import net.newpipe.newplayer.ui.ContentScale @@ -16,6 +17,7 @@ open class VideoPlayerViewModelDummy : VideoPlayerViewModel { override var maxContentRatio = 16F / 9F override var contentFitMode = ContentScale.FIT_INSIDE override val embeddedPlayerDraggedDownBy = MutableSharedFlow().asSharedFlow() + override val onBackPressed: SharedFlow = MutableSharedFlow().asSharedFlow() override fun initUIState(instanceState: Bundle) { println("dummy impl") @@ -29,6 +31,10 @@ open class VideoPlayerViewModelDummy : VideoPlayerViewModel { println("dummy impl") } + override fun onBackPressed() { + println("dummy impl") + } + override fun switchToFullscreen(embeddedUiConfig: EmbeddedUiConfig) { println("dummy impl") } diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerControllerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerControllerUI.kt index 51054ac..17a8707 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerControllerUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerControllerUI.kt @@ -64,19 +64,6 @@ fun VideoPlayerControllerUI( viewModel: VideoPlayerViewModel, uiState: VideoPlayerUIState ) { - val context = LocalContext.current - - if (uiState.uiMode.fullscreen) { - BackHandler { - viewModel.switchToEmbeddedView() - } - } - - val internalBrightnessChange = { rateChange: Float -> - val systemBrightness = getDefaultBrightness(context as Activity) - viewModel.brightnessChange(rateChange, systemBrightness) - } - val insets = getInsets() AnimatedVisibility(uiState.uiMode.controllerUiVisible) { diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt index d7bfcbc..2ca1123 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt @@ -24,6 +24,7 @@ import android.app.Activity import android.content.pm.ActivityInfo import android.util.Log import android.view.SurfaceView +import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.aspectRatio @@ -105,6 +106,12 @@ fun VideoPlayerUI( } } + if (uiState.uiMode.fullscreen) { + BackHandler { + viewModel.onBackPressed() + } + } + // setup immersive mode LaunchedEffect( key1 = uiState.uiMode.systemInsetsVisible,