From 77aaa8712620f4df4347a43e48068a377334c5a4 Mon Sep 17 00:00:00 2001 From: damontecres <154766448+damontecres@users.noreply.github.com> Date: Sun, 19 Oct 2025 22:35:47 -0400 Subject: [PATCH] More bug fixes (#45) Fixes: * Issue from #39 where pressing back from playback went back two screens instead of one * Sometimes having to click on a server twice to switch to it * Update UI when marking a single season as watched * Fix needing to press back twice to hide skip segment buttons * Fix skip intro/outro behaviors being swapped * Always attempt to save playback progress when stopping playback --- .../damontecres/wholphin/MainActivity.kt | 9 ++++ .../wholphin/ui/detail/SeriesDetails.kt | 6 +-- .../wholphin/ui/detail/SeriesViewModel.kt | 12 ++++- .../wholphin/ui/playback/PlaybackPage.kt | 50 +++++++++---------- .../wholphin/ui/playback/PlaybackViewModel.kt | 6 +-- .../util/TrackActivityPlaybackListener.kt | 3 +- 6 files changed, 51 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/github/damontecres/wholphin/MainActivity.kt b/app/src/main/java/com/github/damontecres/wholphin/MainActivity.kt index 67277279..eac3878e 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/MainActivity.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/MainActivity.kt @@ -135,6 +135,8 @@ class MainActivity : AppCompatActivity() { val initialDestination = if (server != null && user != null) { Destination.Home() + } else if (server != null) { + Destination.UserList } else { Destination.ServerList } @@ -164,4 +166,11 @@ class MainActivity : AppCompatActivity() { } } } + + override fun onPause() { + if (navigationManager.backStack.lastOrNull() is Destination.Playback) { + navigationManager.goBack() + } + super.onPause() + } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/SeriesDetails.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/SeriesDetails.kt index ee341352..9b4c92b9 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/SeriesDetails.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/SeriesDetails.kt @@ -127,11 +127,7 @@ fun SeriesDetails( season, onClickItem = { viewModel.navigateTo(it.destination()) }, markPlayed = { played -> - viewModel.setWatched( - season.id, - played, - null, - ) + viewModel.setSeasonWatched(season.id, played) }, ) }, diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/SeriesViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/SeriesViewModel.kt index 3a3d6e58..dd30fd21 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/SeriesViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/SeriesViewModel.kt @@ -220,7 +220,7 @@ class SeriesViewModel itemId: UUID, played: Boolean, listIndex: Int?, - ) = viewModelScope.launch(ExceptionHandler()) { + ) = viewModelScope.launch(Dispatchers.IO + ExceptionHandler()) { if (played) { api.playStateApi.markPlayedItem(itemId) } else { @@ -231,6 +231,16 @@ class SeriesViewModel } } + fun setSeasonWatched( + seasonId: UUID, + played: Boolean, + ) = viewModelScope.launch(Dispatchers.IO + ExceptionHandler()) { + setWatched(seasonId, played, null) + val series = fetchItem(seriesId, null) + val seasons = getSeasons(series) + this@SeriesViewModel.seasons.setValueOnMain(seasons) + } + fun setWatchedSeries(played: Boolean) = viewModelScope.launch(ExceptionHandler() + Dispatchers.IO) { if (played) { 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 2f321f4b..a429da61 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 @@ -373,32 +373,32 @@ fun PlaybackPage( currentSegment = currentSegment, ) } + } - // Ask to skip intros, etc button - AnimatedVisibility( - showSegment, - modifier = - Modifier - .padding(40.dp) - .align(Alignment.BottomEnd), - ) { - currentSegment?.let { segment -> - val focusRequester = remember { FocusRequester() } - LaunchedEffect(Unit) { - focusRequester.tryRequestFocus() - delay(10.seconds) - segmentCancelled = false - } - Button( - onClick = { - player.seekTo(segment.endTicks.ticks.inWholeMilliseconds) - }, - modifier = Modifier.focusRequester(focusRequester), - ) { - Text( - text = "Skip ${segment.type.serialName}", - ) - } + // Ask to skip intros, etc button + AnimatedVisibility( + showSegment, + modifier = + Modifier + .padding(40.dp) + .align(Alignment.BottomEnd), + ) { + currentSegment?.let { segment -> + val focusRequester = remember { FocusRequester() } + LaunchedEffect(Unit) { + focusRequester.tryRequestFocus() + delay(10.seconds) + segmentCancelled = false + } + Button( + onClick = { + player.seekTo(segment.endTicks.ticks.inWholeMilliseconds) + }, + modifier = Modifier.focusRequester(focusRequester), + ) { + Text( + text = "Skip ${segment.type.serialName}", + ) } } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt index 729360e8..a741911a 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt @@ -619,8 +619,8 @@ class PlaybackViewModel MediaSegmentType.COMMERCIAL -> prefs.skipCommercials MediaSegmentType.PREVIEW -> prefs.skipPreviews MediaSegmentType.RECAP -> prefs.skipRecaps - MediaSegmentType.OUTRO -> prefs.skipIntros - MediaSegmentType.INTRO -> prefs.skipOutros + MediaSegmentType.OUTRO -> prefs.skipOutros + MediaSegmentType.INTRO -> prefs.skipIntros MediaSegmentType.UNKNOWN -> SkipSegmentBehavior.IGNORE } withContext(Dispatchers.Main) { @@ -731,8 +731,8 @@ class PlaybackViewModel } fun release() { + activityListener?.release() player.release() - navigationManager.goBack() } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/util/TrackActivityPlaybackListener.kt b/app/src/main/java/com/github/damontecres/wholphin/util/TrackActivityPlaybackListener.kt index 90d870c3..41c23ea5 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/util/TrackActivityPlaybackListener.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/util/TrackActivityPlaybackListener.kt @@ -92,11 +92,12 @@ class TrackActivityPlaybackListener( fun release() { task.cancel() TIMER.purge() + val position = player.currentPosition.milliseconds.inWholeTicks coroutineScope.launch(Dispatchers.IO + ExceptionHandler()) { api.playStateApi.reportPlaybackStopped( PlaybackStopInfo( itemId = itemPlayback.itemId, - positionTicks = withContext(Dispatchers.Main) { player.currentPosition.milliseconds.inWholeTicks }, + positionTicks = position, failed = false, playSessionId = playback.playSessionId, ),