From 513302a1ed378c4a6ebcf1c46390dfdf9d251ba4 Mon Sep 17 00:00:00 2001 From: Damontecres Date: Fri, 14 Nov 2025 16:32:53 -0500 Subject: [PATCH] Fix loading indicator when playback ends --- .../wholphin/ui/playback/PlaybackPage.kt | 5 ++- .../ui/playback/PlayerLoadingState.kt | 39 +++++++++++++++++++ .../wholphin/util/mpv/MpvPlayer.kt | 9 ++++- 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlayerLoadingState.kt diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt index 9d89bf93..2fc7961a 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt @@ -253,12 +253,15 @@ fun PlaybackPage( modifier = scaledModifier, ) if (presentationState.coverSurface) { + val isLoading by rememberPlayerLoadingState(player) Box( Modifier .matchParentSize() .background(Color.Black), ) { - LoadingPage(focusEnabled = false) + if (isLoading) { + LoadingPage(focusEnabled = false) + } } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlayerLoadingState.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlayerLoadingState.kt new file mode 100644 index 00000000..c966a9aa --- /dev/null +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlayerLoadingState.kt @@ -0,0 +1,39 @@ +package com.github.damontecres.wholphin.ui.playback + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.State +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.media3.common.Player +import androidx.media3.common.listen +import androidx.media3.common.util.UnstableApi + +@UnstableApi +@Composable +fun rememberPlayerLoadingState(player: Player): PlayerLoadingState { + val state = remember(player) { PlayerLoadingState(player) } + LaunchedEffect(player) { + state.observe() + } + return state +} + +@UnstableApi +class PlayerLoadingState( + private val player: Player, +) : State { + override var value by mutableStateOf(player.isLoading) + private set + + suspend fun observe() { + value = player.isLoading + player.listen { + if (it.contains(Player.EVENT_IS_LOADING_CHANGED)) { + value = player.isLoading + } + } + } +} diff --git a/app/src/main/java/com/github/damontecres/wholphin/util/mpv/MpvPlayer.kt b/app/src/main/java/com/github/damontecres/wholphin/util/mpv/MpvPlayer.kt index f19d2b2f..c675ddfc 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/util/mpv/MpvPlayer.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/util/mpv/MpvPlayer.kt @@ -89,6 +89,9 @@ class MpvPlayer( var isReleased = false private set + @Volatile + private var isLoadingFile = false + init { Timber.v("config-dir=${context.filesDir.path}") MPVLib.create(context) @@ -260,7 +263,7 @@ class MpvPlayer( override fun getShuffleModeEnabled(): Boolean = false - override fun isLoading(): Boolean = false + override fun isLoading(): Boolean = isLoadingFile override fun getSeekBackIncrement(): Long = 10_000 @@ -602,6 +605,8 @@ class MpvPlayer( // MPV_EVENT_START_FILE -> { // } MPV_EVENT_FILE_LOADED -> { + isLoadingFile = false + notifyListeners(EVENT_IS_LOADING_CHANGED) { onIsLoadingChanged(false) } Timber.d("event: MPV_EVENT_FILE_LOADED") mediaItem!!.localConfiguration?.subtitleConfigurations?.forEach { val url = it.uri.toString() @@ -685,6 +690,8 @@ class MpvPlayer( } private fun loadFile() { + isLoadingFile = true + notifyListeners(EVENT_IS_LOADING_CHANGED) { onIsLoadingChanged(true) } val url = mediaItem!!.localConfiguration?.uri.toString() if (startPositionMs > 0) { MPVLib.command(