Merge pull request #1999 from vitorpamplona/claude/pip-wake-lock-investigation-XhK3D

Fix PiP video playback: keep screen on and improve lifecycle
This commit is contained in:
Vitor Pamplona
2026-03-28 19:12:05 -04:00
committed by GitHub
2 changed files with 43 additions and 6 deletions
@@ -60,14 +60,22 @@ class PipVideoActivity : ComponentActivity() {
}
}
override fun onStop() {
super.onStop()
finishAndRemoveTask()
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode)
if (!isInPictureInPictureMode) {
// User dismissed PiP (swiped away or expanded).
finishAndRemoveTask()
}
}
override fun finish() {
finishAndRemoveTask()
super.finish()
override fun onStop() {
super.onStop()
if (!isInPictureInPictureMode) {
// Only finish if we're not in PiP mode.
// When the screen locks while in PiP, we stay alive
// so the PlaybackService can continue audio playback.
finishAndRemoveTask()
}
}
companion object {
@@ -32,7 +32,9 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.core.content.ContextCompat
import androidx.media3.common.Player
import androidx.media3.common.util.UnstableApi
import androidx.media3.ui.compose.ContentFrame
import androidx.media3.ui.compose.state.rememberMuteButtonState
@@ -51,6 +53,8 @@ fun RenderPipVideo(
controller: MediaControllerState,
waveformData: WaveformData?,
) {
KeepScreenOnWhilePlaying(controller)
val modifier =
remember {
val ratio =
@@ -78,6 +82,31 @@ fun RenderPipVideo(
}
}
@Composable
fun KeepScreenOnWhilePlaying(controller: MediaControllerState) {
val view = LocalView.current
DisposableEffect(controller.controller, view) {
val listener =
object : Player.Listener {
override fun onIsPlayingChanged(isPlaying: Boolean) {
if (view.keepScreenOn != isPlaying) {
view.keepScreenOn = isPlaying
}
}
}
// Set initial state
view.keepScreenOn = controller.controller.isPlaying
controller.controller.addListener(listener)
onDispose {
controller.controller.removeListener(listener)
view.keepScreenOn = false
}
}
}
@Composable
fun RegisterControllerReceiver(controllerState: MediaControllerState) {
val context = LocalContext.current