Use navigation

This commit is contained in:
Damontecres 2026-01-29 14:57:50 -05:00
parent 01bdf2cefa
commit 75183802e7
No known key found for this signature in database
5 changed files with 182 additions and 111 deletions

View file

@ -33,6 +33,7 @@ import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
import org.jellyfin.sdk.api.client.ApiClient
import org.jellyfin.sdk.api.client.extensions.displayPreferencesApi
import org.jellyfin.sdk.api.client.extensions.liveTvApi
import org.jellyfin.sdk.api.client.extensions.userApi
import org.jellyfin.sdk.api.client.extensions.userLibraryApi
import org.jellyfin.sdk.api.client.extensions.userViewsApi
@ -46,6 +47,7 @@ import org.jellyfin.sdk.model.api.request.GetGenresRequest
import org.jellyfin.sdk.model.api.request.GetItemsRequest
import org.jellyfin.sdk.model.api.request.GetLatestMediaRequest
import org.jellyfin.sdk.model.api.request.GetPersonsRequest
import org.jellyfin.sdk.model.api.request.GetRecommendedProgramsRequest
import org.jellyfin.sdk.model.api.request.GetRecordingsRequest
import timber.log.Timber
import java.io.File
@ -315,8 +317,11 @@ class HomeSettingsService
val config =
when (sectionType) {
HomeSectionType.ACTIVE_RECORDINGS -> {
// GetRecordingsRequest
TODO()
HomeRowConfigDisplay(
id = id++,
title = context.getString(R.string.active_recordings),
config = HomeRowConfig.Recordings(),
)
}
HomeSectionType.RESUME -> {
@ -337,8 +342,11 @@ class HomeSettingsService
HomeSectionType.LIVE_TV -> {
if (userDto.policy?.enableLiveTvAccess == true) {
// GetRecommendedProgramsRequest
TODO()
HomeRowConfigDisplay(
id = id++,
title = context.getString(R.string.live_tv),
config = HomeRowConfig.TvPrograms(),
)
} else {
null
}
@ -478,11 +486,19 @@ class HomeSettingsService
}
is HomeRowConfig.Recordings -> {
TODO()
HomeRowConfigDisplay(
id = id,
title = context.getString(R.string.active_recordings),
config,
)
}
is HomeRowConfig.TvPrograms -> {
TODO()
HomeRowConfigDisplay(
id = id,
title = context.getString(R.string.live_tv),
config,
)
}
}
@ -753,12 +769,48 @@ class HomeSettingsService
}
is HomeRowConfig.Recordings -> {
GetRecordingsRequest()
TODO()
val request =
GetRecordingsRequest(
userId = userDto.id,
isInProgress = true,
fields = DefaultItemFields,
limit = limit,
enableImages = true,
enableUserData = true,
)
api.liveTvApi
.getRecordings(request)
.content.items
.map { BaseItem(it, true) }
.let {
Success(
context.getString(R.string.active_recordings),
it,
row.viewOptions,
)
}
}
is HomeRowConfig.TvPrograms -> {
TODO()
val request =
GetRecommendedProgramsRequest(
userId = userDto.id,
fields = DefaultItemFields,
limit = limit,
enableImages = true,
enableUserData = true,
)
api.liveTvApi
.getRecommendedPrograms(request)
.content.items
.map { BaseItem(it, true) }
.let {
Success(
context.getString(R.string.live_tv),
it,
row.viewOptions,
)
}
}
}

View file

@ -28,7 +28,7 @@ import com.github.damontecres.wholphin.ui.ifElse
import com.github.damontecres.wholphin.ui.tryRequestFocus
@Composable
fun HomeSettingsLibraryList(
fun HomeSettingsAddRow(
libraries: List<Library>,
showDiscover: Boolean,
onClick: (Library) -> Unit,

View file

@ -1,24 +1,32 @@
package com.github.damontecres.wholphin.ui.main.settings
import androidx.navigation3.runtime.NavKey
import kotlinx.serialization.Serializable
/**
* Tracking the pages for selecting and configuring rows
*/
@Serializable
sealed interface HomeSettingsDestination : NavKey {
@Serializable
data object RowList : HomeSettingsDestination
data object ChooseLibrary : HomeSettingsDestination
@Serializable
data object AddRow : HomeSettingsDestination
@Serializable
data class ChooseRowType(
val library: Library,
) : HomeSettingsDestination
@Serializable
data class RowSettings(
val rowId: Int,
) : HomeSettingsDestination
@Serializable
data object ChooseFavorite : HomeSettingsDestination
@Serializable
data object ChooseDiscover : HomeSettingsDestination
}

View file

@ -1,6 +1,5 @@
package com.github.damontecres.wholphin.ui.main.settings
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@ -13,14 +12,17 @@ import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.navigation3.runtime.NavEntry
import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
import androidx.navigation3.ui.NavDisplay
import androidx.tv.material3.MaterialTheme
import androidx.tv.material3.surfaceColorAtElevation
import com.github.damontecres.wholphin.ui.main.HomePageContent
import com.github.damontecres.wholphin.ui.main.settings.HomeSettingsDestination.ChooseRowType
import com.github.damontecres.wholphin.ui.main.settings.HomeSettingsDestination.RowSettings
@ -37,20 +39,11 @@ fun HomeSettingsPage(
) {
val scope = rememberCoroutineScope()
val listState = rememberLazyListState()
var destination by remember { mutableStateOf<HomeSettingsDestination>(HomeSettingsDestination.RowList) }
val backStack = rememberNavBackStack(HomeSettingsDestination.RowList)
val state by viewModel.state.collectAsState()
val discoverEnabled by viewModel.discoverEnabled.collectAsState(false)
BackHandler(destination is ChooseRowType) {
destination = HomeSettingsDestination.ChooseLibrary
}
BackHandler(destination is HomeSettingsDestination.ChooseLibrary) {
destination = HomeSettingsDestination.RowList
}
BackHandler(destination is RowSettings) {
destination = HomeSettingsDestination.RowList
}
Row(
horizontalArrangement = Arrangement.spacedBy(8.dp),
modifier = modifier,
@ -62,20 +55,32 @@ fun HomeSettingsPage(
.fillMaxHeight()
.background(color = MaterialTheme.colorScheme.surface),
) {
NavDisplay(
backStack = backStack,
// onBack = { navigationManager.goBack() },
entryDecorators =
listOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator(),
),
modifier = Modifier.background(MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp)),
entryProvider = { key ->
key as HomeSettingsDestination
NavEntry(key, contentKey = key.toString()) {
val destModifier =
Modifier
.fillMaxSize()
.padding(4.dp)
when (val dest = destination) {
when (val dest = key) {
HomeSettingsDestination.RowList -> {
HomeSettingsRowList(
state = state,
onClickAdd = { destination = HomeSettingsDestination.ChooseLibrary },
onClickAdd = { backStack.add(HomeSettingsDestination.AddRow) },
onClickSaveLocal = { viewModel.saveToLocal() },
onClickMove = viewModel::moveRow,
onClickDelete = viewModel::deleteRow,
onClick = { index, row ->
destination = RowSettings(row.id)
backStack.add(RowSettings(row.id))
scope.launch(ExceptionHandler()) {
Timber.v("Scroll to $index")
listState.scrollToItem(index)
@ -88,11 +93,11 @@ fun HomeSettingsPage(
)
}
is HomeSettingsDestination.ChooseLibrary -> {
HomeSettingsLibraryList(
is HomeSettingsDestination.AddRow -> {
HomeSettingsAddRow(
libraries = state.libraries,
showDiscover = discoverEnabled,
onClick = { destination = ChooseRowType(it) },
onClick = { backStack.add(ChooseRowType(it)) },
onClickMeta = {
when (it) {
MetaRowType.CONTINUE_WATCHING,
@ -100,15 +105,15 @@ fun HomeSettingsPage(
MetaRowType.COMBINED_CONTINUE_WATCHING,
-> {
viewModel.addRow(it)
destination = HomeSettingsDestination.RowList
backStack.add(HomeSettingsDestination.RowList)
}
MetaRowType.FAVORITES -> {
destination = HomeSettingsDestination.ChooseFavorite
backStack.add(HomeSettingsDestination.ChooseFavorite)
}
MetaRowType.DISCOVER -> {
destination = HomeSettingsDestination.ChooseDiscover
backStack.add(HomeSettingsDestination.ChooseDiscover)
}
}
},
@ -121,7 +126,7 @@ fun HomeSettingsPage(
library = dest.library,
onClick = {
viewModel.addRow(dest.library, it)
destination = HomeSettingsDestination.RowList
backStack.add(HomeSettingsDestination.RowList)
},
modifier = destModifier,
)
@ -157,6 +162,9 @@ fun HomeSettingsPage(
}
}
}
},
)
}
HomePageContent(
loadingState = state.loading,
homeRows = state.rowData,

View file

@ -34,8 +34,10 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.update
import kotlinx.serialization.Serializable
import org.jellyfin.sdk.model.api.BaseItemKind
import org.jellyfin.sdk.model.api.CollectionType
import org.jellyfin.sdk.model.serializer.UUIDSerializer
import timber.log.Timber
import java.util.UUID
import javax.inject.Inject
@ -400,8 +402,9 @@ data class HomePageSettingsState(
}
@Immutable
@Serializable
data class Library(
val itemId: UUID,
@Serializable(UUIDSerializer::class) val itemId: UUID,
val name: String,
val collectionType: CollectionType,
)