diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageLibraryRowTypeList.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeLibraryRowTypeList.kt similarity index 98% rename from app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageLibraryRowTypeList.kt rename to app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeLibraryRowTypeList.kt index 0206d46a..421bc9bf 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageLibraryRowTypeList.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeLibraryRowTypeList.kt @@ -24,7 +24,7 @@ import com.github.damontecres.wholphin.ui.ifElse import com.github.damontecres.wholphin.ui.tryRequestFocus @Composable -fun HomePageLibraryRowTypeList( +fun HomeLibraryRowTypeList( library: Library, onClick: (LibraryRowType) -> Unit, modifier: Modifier, diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageSettingsDestination.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageSettingsDestination.kt deleted file mode 100644 index ddf1a2fc..00000000 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageSettingsDestination.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.github.damontecres.wholphin.ui.main.settings - -sealed interface HomePageSettingsDestination { - data object RowList : HomePageSettingsDestination - - data object ChooseLibrary : HomePageSettingsDestination - - data class ChooseRowType( - val library: Library, - ) : HomePageSettingsDestination - - data class RowSettings( - val rowId: Int, - ) : HomePageSettingsDestination -} diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageRowSettings.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeRowSettings.kt similarity index 98% rename from app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageRowSettings.kt rename to app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeRowSettings.kt index f8b2a1e6..bf8e6676 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageRowSettings.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeRowSettings.kt @@ -17,7 +17,7 @@ import com.github.damontecres.wholphin.preferences.AppPreference import com.github.damontecres.wholphin.ui.preferences.ComposablePreference @Composable -fun HomePageRowSettings( +fun HomeRowSettings( title: String, viewOptions: HomeRowViewOptions, onViewOptionsChange: (HomeRowViewOptions) -> Unit, diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsDestination.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsDestination.kt new file mode 100644 index 00000000..10398755 --- /dev/null +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsDestination.kt @@ -0,0 +1,18 @@ +package com.github.damontecres.wholphin.ui.main.settings + +/** + * Tracking the pages for selecting and configuring rows + */ +sealed interface HomeSettingsDestination { + data object RowList : HomeSettingsDestination + + data object ChooseLibrary : HomeSettingsDestination + + data class ChooseRowType( + val library: Library, + ) : HomeSettingsDestination + + data class RowSettings( + val rowId: Int, + ) : HomeSettingsDestination +} diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageLibraryList.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsLibraryList.kt similarity index 99% rename from app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageLibraryList.kt rename to app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsLibraryList.kt index 66d8fd28..998b634d 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageLibraryList.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsLibraryList.kt @@ -24,7 +24,7 @@ import com.github.damontecres.wholphin.ui.ifElse import com.github.damontecres.wholphin.ui.tryRequestFocus @Composable -fun HomePageLibraryList( +fun HomeSettingsLibraryList( libraries: List, onClick: (Library) -> Unit, onClickMeta: (MetaRowType) -> Unit, diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsPage.kt new file mode 100644 index 00000000..7c226ba1 --- /dev/null +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsPage.kt @@ -0,0 +1,130 @@ +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 +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +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.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.tv.material3.MaterialTheme +import com.github.damontecres.wholphin.ui.main.HomePageContent + +val settingsWidth = 300.dp + +@Composable +fun HomeSettingsPage( + modifier: Modifier, + viewModel: HomeSettingsViewModel = hiltViewModel(), +) { + val state by viewModel.state.collectAsState() + val listState = rememberLazyListState() + var destination by remember { mutableStateOf(HomeSettingsDestination.RowList) } + + BackHandler(destination is HomeSettingsDestination.ChooseRowType) { + destination = HomeSettingsDestination.ChooseLibrary + } + BackHandler(destination is HomeSettingsDestination.ChooseLibrary) { + destination = HomeSettingsDestination.RowList + } + BackHandler(destination is HomeSettingsDestination.RowSettings) { + destination = HomeSettingsDestination.RowList + } + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = modifier, + ) { + Box( + modifier = + Modifier + .width(settingsWidth) + .fillMaxHeight() + .background(color = MaterialTheme.colorScheme.surface), + ) { + val destModifier = + Modifier + .fillMaxSize() + .padding(4.dp) + when (val dest = destination) { + HomeSettingsDestination.RowList -> { + HomeSettingsRowList( + state = state, + onClickAdd = { destination = HomeSettingsDestination.ChooseLibrary }, + onClickMove = viewModel::moveRow, + onClickDelete = viewModel::deleteRow, + onClick = { index, row -> + destination = HomeSettingsDestination.RowSettings(row.config.id) + }, + modifier = destModifier, + ) + } + + is HomeSettingsDestination.ChooseLibrary -> { + HomeSettingsLibraryList( + libraries = state.libraries, + onClick = { destination = HomeSettingsDestination.ChooseRowType(it) }, + onClickMeta = { + viewModel.addRow(it) + destination = HomeSettingsDestination.RowList + }, + modifier = destModifier, + ) + } + + is HomeSettingsDestination.ChooseRowType -> { + HomeLibraryRowTypeList( + library = dest.library, + onClick = { + viewModel.addRow(dest.library, it) + destination = HomeSettingsDestination.RowList + }, + modifier = destModifier, + ) + } + + is HomeSettingsDestination.RowSettings -> { + val row = + state.rows + .first { it.config.id == dest.rowId } + HomeRowSettings( + title = row.title, + viewOptions = row.config.viewOptions, + onViewOptionsChange = { + viewModel.updateViewOptions(dest.rowId, it) + }, + onApplyApplyAll = { + viewModel.updateViewOptionsForAll(row.config.viewOptions) + }, + modifier = destModifier, + ) + } + } + } + HomePageContent( + loadingState = state.loading, + homeRows = state.rowData, + onClickItem = { _, _ -> }, + onLongClickItem = { _, _ -> }, + onClickPlay = { _, _ -> }, + showClock = false, + onUpdateBackdrop = viewModel::updateBackdrop, + listState = listState, + modifier = + Modifier + .fillMaxHeight() + .weight(1f), + ) + } +} diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageRowList.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsRowList.kt similarity index 99% rename from app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageRowList.kt rename to app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsRowList.kt index 6b42fbbe..49842fca 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageRowList.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsRowList.kt @@ -41,7 +41,7 @@ enum class MoveDirection { } @Composable -fun HomePageRowList( +fun HomeSettingsRowList( state: HomePageSettingsState, onClick: (Int, HomeRowConfigDisplay) -> Unit, onClickAdd: () -> Unit, diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageSettings.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsViewModel.kt similarity index 81% rename from app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageSettings.kt rename to app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsViewModel.kt index 4fae6901..275fe202 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomePageSettings.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsViewModel.kt @@ -1,29 +1,9 @@ package com.github.damontecres.wholphin.ui.main.settings import android.content.Context -import androidx.activity.compose.BackHandler -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -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 import androidx.lifecycle.viewModelScope -import androidx.tv.material3.MaterialTheme import com.github.damontecres.wholphin.R import com.github.damontecres.wholphin.data.NavDrawerItemRepository import com.github.damontecres.wholphin.data.ServerRepository @@ -40,12 +20,10 @@ import com.github.damontecres.wholphin.ui.DefaultItemFields import com.github.damontecres.wholphin.ui.SlimItemFields import com.github.damontecres.wholphin.ui.components.getGenreImageMap import com.github.damontecres.wholphin.ui.launchIO -import com.github.damontecres.wholphin.ui.main.HomePageContent import com.github.damontecres.wholphin.ui.nav.ServerNavDrawerItem import com.github.damontecres.wholphin.util.GetGenresRequestHandler import com.github.damontecres.wholphin.util.GetItemsRequestHandler import com.github.damontecres.wholphin.util.HomeRowLoadingState -import com.github.damontecres.wholphin.util.HomeRowLoadingState.Success import com.github.damontecres.wholphin.util.LoadingState import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext @@ -66,7 +44,7 @@ import java.util.UUID import javax.inject.Inject @HiltViewModel -class HomePageSettingsViewModel +class HomeSettingsViewModel @Inject constructor( @param:ApplicationContext private val context: Context, @@ -215,7 +193,7 @@ class HomePageSettingsViewModel is HomeRowConfig.ContinueWatching -> { val resume = latestNextUpService.getResume(userDto.id, limit, true) listOf( - Success( + HomeRowLoadingState.Success( title = context.getString(R.string.continue_watching), items = resume, viewOptions = row.viewOptions, @@ -232,7 +210,7 @@ class HomePageSettingsViewModel false, ) listOf( - Success( + HomeRowLoadingState.Success( title = context.getString(R.string.next_up), items = nextUp, viewOptions = row.viewOptions, @@ -252,7 +230,7 @@ class HomePageSettingsViewModel ) listOf( - Success( + HomeRowLoadingState.Success( title = context.getString(R.string.continue_watching), items = latestNextUpService.buildCombined( @@ -298,7 +276,7 @@ class HomePageSettingsViewModel name?.let { context.getString(R.string.genres_in, it) } ?: context.getString(R.string.genres) listOf( - Success( + HomeRowLoadingState.Success( title, genres, viewOptions = row.viewOptions, @@ -327,9 +305,9 @@ class HomePageSettingsViewModel api.userLibraryApi .getLatestMedia(request) .content - .map { BaseItem.from(it, api, true) } + .map { BaseItem.Companion.from(it, api, true) } .let { - Success( + HomeRowLoadingState.Success( title, it, row.viewOptions, @@ -359,10 +337,10 @@ class HomePageSettingsViewModel GetItemsRequestHandler .execute(api, request) .content.items - .map { BaseItem.from(it, api, true) } + .map { BaseItem.Companion.from(it, api, true) } .let { listOf( - Success( + HomeRowLoadingState.Success( title, it, row.viewOptions, @@ -392,7 +370,7 @@ class HomePageSettingsViewModel .map { BaseItem(it, true) } .let { listOf( - Success( + HomeRowLoadingState.Success( name ?: context.getString(R.string.collection), it, row.viewOptions, @@ -427,10 +405,10 @@ class HomePageSettingsViewModel GetItemsRequestHandler .execute(api, request) .content.items - .map { BaseItem.from(it, api, true) } + .map { BaseItem.Companion.from(it, api, true) } .let { listOf( - Success( + HomeRowLoadingState.Success( name ?: context.getString(R.string.collection), it, row.viewOptions, @@ -662,110 +640,3 @@ data class Library( val name: String, val collectionType: CollectionType, ) - -val settingsWidth = 300.dp - -@Composable -fun HomePageSettings( - modifier: Modifier, - viewModel: HomePageSettingsViewModel = hiltViewModel(), -) { - val state by viewModel.state.collectAsState() - val listState = rememberLazyListState() - var destination by remember { mutableStateOf(HomePageSettingsDestination.RowList) } - - BackHandler(destination is HomePageSettingsDestination.ChooseRowType) { - destination = HomePageSettingsDestination.ChooseLibrary - } - BackHandler(destination is HomePageSettingsDestination.ChooseLibrary) { - destination = HomePageSettingsDestination.RowList - } - BackHandler(destination is HomePageSettingsDestination.RowSettings) { - destination = HomePageSettingsDestination.RowList - } - Row( - horizontalArrangement = Arrangement.spacedBy(8.dp), - modifier = modifier, - ) { - Box( - modifier = - Modifier - .width(settingsWidth) - .fillMaxHeight() - .background(color = MaterialTheme.colorScheme.surface), - ) { - val destModifier = - Modifier - .fillMaxSize() - .padding(4.dp) - when (val dest = destination) { - HomePageSettingsDestination.RowList -> { - HomePageRowList( - state = state, - onClickAdd = { destination = HomePageSettingsDestination.ChooseLibrary }, - onClickMove = viewModel::moveRow, - onClickDelete = viewModel::deleteRow, - onClick = { index, row -> - destination = HomePageSettingsDestination.RowSettings(row.config.id) - }, - modifier = destModifier, - ) - } - - is HomePageSettingsDestination.ChooseLibrary -> { - HomePageLibraryList( - libraries = state.libraries, - onClick = { destination = HomePageSettingsDestination.ChooseRowType(it) }, - onClickMeta = { - viewModel.addRow(it) - destination = HomePageSettingsDestination.RowList - }, - modifier = destModifier, - ) - } - - is HomePageSettingsDestination.ChooseRowType -> { - HomePageLibraryRowTypeList( - library = dest.library, - onClick = { - viewModel.addRow(dest.library, it) - destination = HomePageSettingsDestination.RowList - }, - modifier = destModifier, - ) - } - - is HomePageSettingsDestination.RowSettings -> { - val row = - state.rows - .first { it.config.id == dest.rowId } - HomePageRowSettings( - title = row.title, - viewOptions = row.config.viewOptions, - onViewOptionsChange = { - viewModel.updateViewOptions(dest.rowId, it) - }, - onApplyApplyAll = { - viewModel.updateViewOptionsForAll(row.config.viewOptions) - }, - modifier = destModifier, - ) - } - } - } - HomePageContent( - loadingState = state.loading, - homeRows = state.rowData, - onClickItem = { _, _ -> }, - onLongClickItem = { _, _ -> }, - onClickPlay = { _, _ -> }, - showClock = false, - onUpdateBackdrop = viewModel::updateBackdrop, - listState = listState, - modifier = - Modifier - .fillMaxHeight() - .weight(1f), - ) - } -} diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/nav/DestinationContent.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/nav/DestinationContent.kt index b4ef4575..63010fde 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/nav/DestinationContent.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/nav/DestinationContent.kt @@ -32,7 +32,7 @@ import com.github.damontecres.wholphin.ui.detail.series.SeriesOverview import com.github.damontecres.wholphin.ui.discover.DiscoverPage import com.github.damontecres.wholphin.ui.main.HomePage import com.github.damontecres.wholphin.ui.main.SearchPage -import com.github.damontecres.wholphin.ui.main.settings.HomePageSettings +import com.github.damontecres.wholphin.ui.main.settings.HomeSettingsPage import com.github.damontecres.wholphin.ui.playback.PlaybackPage import com.github.damontecres.wholphin.ui.preferences.PreferencesPage import com.github.damontecres.wholphin.ui.setup.InstallUpdatePage @@ -62,7 +62,7 @@ fun DestinationContent( } is Destination.HomeSettings -> { - HomePageSettings(modifier) + HomeSettingsPage(modifier) } is Destination.PlaybackList,