From ed65b77e903d8349221b09551bfaf7fc55d206c0 Mon Sep 17 00:00:00 2001 From: Jeena Date: Mon, 12 Oct 2026 03:23:34 +0000 Subject: [PATCH] player: Pause and mute out when the app goes to the background Pressing HOME kept the audio running, so a video started in another app played on top of it and returning landed on the home view with an invisible player. The player now pauses itself on ON_PAUSE, reports the position to the server and resumes automatically when the app comes back. The playing screen is also kept across activity recreation now, so returning shows the video, not the home view. Ref #6 --- .../jeena/jtubetv/ui/screens/HomeScreen.kt | 2 +- .../jeena/jtubetv/ui/screens/PlayerScreen.kt | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) 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)