From 3635a4ed74ad8fbcfdd4a99171beb30b96d5fc61 Mon Sep 17 00:00:00 2001 From: Jeena Date: Mon, 12 Oct 2026 09:42:09 +0000 Subject: [PATCH] home: Restore row focus when returning from the player BACK from a video dropped the user on a random spot (often the search screen, #2): the restore token was only bumped when it was already >= 1, so the very first back never re-focused anything, and HomeRowsViewModel refresh() cleared the continue-watching rows synchronously, disposing the rows before their focus-restore effect could run. Bump the token on every playing -> not-playing transition and keep the rows alive during a refresh instead. Refs #2 --- .../main/java/net/jeena/jtubetv/ui/screens/HomeRows.kt | 5 +++-- .../main/java/net/jeena/jtubetv/ui/screens/HomeScreen.kt | 8 +++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeRows.kt b/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeRows.kt index 97aa411..dbd71d4 100644 --- a/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeRows.kt +++ b/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeRows.kt @@ -78,9 +78,10 @@ class HomeRowsViewModel(private val repository: PeerTubeRepository) : ViewModel( fetchContinue() } - /** Re-fetch after playback changed server-side positions (UX report BUG-7). */ + /** Re-fetch after playback changed server-side positions (UX report BUG-7). + * Keeps the current rows in place while re-fetching (clearing them disposed + * the rows and killed the focus-restore effect before it could run, #2). */ fun refresh() { - continueItems = emptyList() loaded = true fetchContinue() fetchSubs() 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 baa5f2a..4efb9a0 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 @@ -87,8 +87,14 @@ fun HomeScreen(viewModel: AppViewModel = androidx.lifecycle.viewmodel.compose.vi // After BACK from the player: bump the restore token so lists re-focus the opened // card and re-fetch positions (UX report BUG-3 + BUG-7). + var hadPlaying by rememberSaveable { mutableStateOf(false) } LaunchedEffect(playingVideo) { - if (playingVideo == null && restoreToken >= 1) restoreToken++ + if (playingVideo != null) { + hadPlaying = true + } else if (hadPlaying) { + restoreToken++ + hadPlaying = false + } } // BACK order (TV standard): player (own handler) → drawer close → channel