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:
+14
-6
@@ -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 {
|
||||
|
||||
+29
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user