From 7a20fedef4d27944e21128b9c9ababf2b3efb6e4 Mon Sep 17 00:00:00 2001 From: Ray <154766448+damontecres@users.noreply.github.com> Date: Mon, 19 Jan 2026 19:32:43 -0500 Subject: [PATCH] More minor bug fixes (#728) ## Description - Better focus handling on discover page - Follow up to #723 to dim the user image when the nav drawer is closed - Add a missed closeable to stop theme music when leaving a series page --- .../ui/detail/series/SeriesViewModel.kt | 1 + .../wholphin/ui/discover/DiscoverPage.kt | 19 +++++-------------- .../wholphin/ui/discover/SeerrDiscoverPage.kt | 4 +++- .../damontecres/wholphin/ui/nav/NavDrawer.kt | 3 +++ .../wholphin/ui/setup/ServerList.kt | 4 +++- .../damontecres/wholphin/ui/setup/UserList.kt | 3 ++- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/series/SeriesViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/series/SeriesViewModel.kt index 4e5f33c7..4c0fb81b 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/series/SeriesViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/series/SeriesViewModel.kt @@ -121,6 +121,7 @@ class SeriesViewModel ) + Dispatchers.IO, ) { Timber.v("Start") + addCloseable { themeSongPlayer.stop() } val item = fetchItem(seriesId) backdropService.submit(item) diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/discover/DiscoverPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/discover/DiscoverPage.kt index 4d3bdc42..53b04161 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/discover/DiscoverPage.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/discover/DiscoverPage.kt @@ -18,18 +18,17 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import com.github.damontecres.wholphin.R import com.github.damontecres.wholphin.preferences.UserPreferences +import com.github.damontecres.wholphin.ui.OneTimeLaunchedEffect import com.github.damontecres.wholphin.ui.components.ErrorMessage import com.github.damontecres.wholphin.ui.components.TabRow import com.github.damontecres.wholphin.ui.logTab import com.github.damontecres.wholphin.ui.nav.NavDrawerItem import com.github.damontecres.wholphin.ui.preferences.PreferencesViewModel -import com.github.damontecres.wholphin.ui.tryRequestFocus @Composable fun DiscoverPage( @@ -46,21 +45,16 @@ fun DiscoverPage( stringResource(R.string.request), ) var selectedTabIndex by rememberSaveable { mutableIntStateOf(rememberedTabIndex) } - val focusRequester = remember { FocusRequester() } val tabFocusRequesters = remember(tabs) { List(tabs.size) { FocusRequester() } } - val firstTabFocusRequester = remember { FocusRequester() } - LaunchedEffect(Unit) { firstTabFocusRequester.tryRequestFocus() } - LaunchedEffect(selectedTabIndex) { logTab("discover", selectedTabIndex) preferencesViewModel.saveRememberedTab(preferences, NavDrawerItem.Discover.id, selectedTabIndex) - preferencesViewModel.backdropService.clearBackdrop() } + OneTimeLaunchedEffect { preferencesViewModel.backdropService.clearBackdrop() } var showHeader by rememberSaveable { mutableStateOf(true) } - LaunchedEffect(Unit) { focusRequester.tryRequestFocus("page") } Column( modifier = modifier, ) { @@ -73,8 +67,7 @@ fun DiscoverPage( selectedTabIndex = selectedTabIndex, modifier = Modifier - .padding(start = 32.dp, top = 16.dp, bottom = 16.dp) - .focusRequester(firstTabFocusRequester), + .padding(start = 32.dp, top = 16.dp, bottom = 16.dp), tabs = tabs, onClick = { selectedTabIndex = it }, focusRequesters = tabFocusRequesters, @@ -87,8 +80,7 @@ fun DiscoverPage( preferences = preferences, modifier = Modifier - .fillMaxSize() - .focusRequester(focusRequester), + .fillMaxSize(), ) } @@ -98,8 +90,7 @@ fun DiscoverPage( focusRequesterOnEmpty = tabFocusRequesters.getOrNull(selectedTabIndex), modifier = Modifier - .fillMaxSize() - .focusRequester(focusRequester), + .fillMaxSize(), ) } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/discover/SeerrDiscoverPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/discover/SeerrDiscoverPage.kt index fc58bf2d..691b00cb 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/discover/SeerrDiscoverPage.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/discover/SeerrDiscoverPage.kt @@ -197,7 +197,7 @@ fun SeerrDiscoverPage( listOf(state.trending, state.movies, state.tv, state.upcomingMovies, state.upcomingTv) val ratingMap by viewModel.rating.collectAsState() - val focusRequesters = remember(2) { List(rows.size) { FocusRequester() } } + val focusRequesters = remember(rows) { List(rows.size) { FocusRequester() } } var position by rememberPosition(0, -1) val focusedItem = remember(position) { @@ -212,6 +212,8 @@ fun SeerrDiscoverPage( LaunchedEffect(state.trending) { if (!firstFocused && state.trending.items is DataLoadingState.Success<*>) { firstFocused = focusRequesters.getOrNull(0)?.tryRequestFocus("discover") == true + } else if (firstFocused) { + focusRequesters.getOrNull(position.row)?.tryRequestFocus() } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/nav/NavDrawer.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/nav/NavDrawer.kt index b9acb2d5..559445b4 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/nav/NavDrawer.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/nav/NavDrawer.kt @@ -396,6 +396,7 @@ fun NavDrawer( user = user, imageUrl = userImageUrl, serverName = server.name ?: server.url, + drawerOpen = drawerState.isOpen, interactionSource = interactionSource, onClick = { viewModel.setupNavigationManager.navigateTo( @@ -581,6 +582,7 @@ fun NavigationDrawerScope.ProfileIcon( user: JellyfinUser, imageUrl: String?, serverName: String, + drawerOpen: Boolean, onClick: () -> Unit, modifier: Modifier = Modifier, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, @@ -595,6 +597,7 @@ fun NavigationDrawerScope.ProfileIcon( id = user.id, name = user.name, imageUrl = imageUrl, + alpha = if (drawerOpen) 1f else .5f, modifier = Modifier.fillMaxSize(), ) }, diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/setup/ServerList.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/setup/ServerList.kt index 0d7d3c6e..b209ee59 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/setup/ServerList.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/setup/ServerList.kt @@ -181,9 +181,10 @@ fun ServerList( @Composable fun rememberIdColor( id: UUID?, + alpha: Float = 1f, nullColor: Color = MaterialTheme.colorScheme.surfaceVariant, ): Color = - remember(id) { + remember(id, alpha) { if (id == null) { return@remember nullColor } @@ -212,6 +213,7 @@ fun rememberIdColor( red = (r + m).coerceIn(0f, 1f), green = (g + m).coerceIn(0f, 1f), blue = (b + m).coerceIn(0f, 1f), + alpha = alpha, ) } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/setup/UserList.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/setup/UserList.kt index 2b6a2e29..1b35cce6 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/setup/UserList.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/setup/UserList.kt @@ -296,9 +296,10 @@ fun UserIconCardImage( name: String?, imageUrl: String?, modifier: Modifier = Modifier, + alpha: Float = 1f, ) { var imageError by remember { mutableStateOf(false) } - val userColor = rememberIdColor(id) + val userColor = rememberIdColor(id, alpha) Box( modifier = modifier.background(