diff --git a/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeScreen.kt b/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeScreen.kt index b031715..baa5f2a 100644 --- a/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeScreen.kt +++ b/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeScreen.kt @@ -78,7 +78,7 @@ fun HomeScreen(viewModel: AppViewModel = androidx.lifecycle.viewmodel.compose.vi var destination by rememberSaveable { mutableStateOf(Destination.Home) } var channelDetails by rememberSaveable { mutableStateOf(null) } // handle // NOT saveable: launching the app should never resume a half-watched player session. - var playingVideo by remember { mutableStateOf(null) } // shortUUID + var playingVideo by rememberSaveable { mutableStateOf(null) } // shortUUID var restoreToken by rememberSaveable { mutableStateOf(0) } // increments when playback ends var drawerOpen by rememberSaveable { mutableStateOf(false) } val context = androidx.compose.ui.platform.LocalContext.current diff --git a/app/src/main/java/net/jeena/jtubetv/ui/screens/PlayerScreen.kt b/app/src/main/java/net/jeena/jtubetv/ui/screens/PlayerScreen.kt index 64e1d61..60709e1 100644 --- a/app/src/main/java/net/jeena/jtubetv/ui/screens/PlayerScreen.kt +++ b/app/src/main/java/net/jeena/jtubetv/ui/screens/PlayerScreen.kt @@ -270,6 +270,33 @@ private fun PlayerSurface( LaunchedEffect(Unit) { runCatching { keyFocus.requestFocus() } } + // Leaving the app (HOME key, task switch) must not keep the sound going: + // pause on ON_PAUSE, report the position, and resume on return (issue #6). + var autoPaused by remember { mutableStateOf(false) } + val lifecycleOwner = androidx.lifecycle.compose.LocalLifecycleOwner.current + DisposableEffect(lifecycleOwner) { + val observer = androidx.lifecycle.LifecycleEventObserver { _, event -> + when (event) { + androidx.lifecycle.Lifecycle.Event.ON_PAUSE -> { + if (player.isPlaying) { + autoPaused = true + player.pause() + } + viewModel.persistExit(shortUuid, (player.currentPosition / 1000).toInt()) + } + androidx.lifecycle.Lifecycle.Event.ON_RESUME -> { + if (autoPaused) { + autoPaused = false + player.play() + } + } + else -> {} + } + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { lifecycleOwner.lifecycle.removeObserver(observer) } + } + DisposableEffect(s.playUrl) { val item = MediaItem.Builder() .setUri(s.playUrl)