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
This commit is contained in:
Ray 2026-01-19 19:32:43 -05:00 committed by GitHub
parent 2572a38450
commit 7a20fedef4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 17 additions and 17 deletions

View file

@ -121,6 +121,7 @@ class SeriesViewModel
) + Dispatchers.IO,
) {
Timber.v("Start")
addCloseable { themeSongPlayer.stop() }
val item = fetchItem(seriesId)
backdropService.submit(item)

View file

@ -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(),
)
}

View file

@ -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()
}
}

View file

@ -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(),
)
},

View file

@ -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,
)
}

View file

@ -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(