diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5e935349..26ebd428 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -103,7 +103,7 @@ android { buildTypes { release { isMinifyEnabled = false - signingConfig = signingConfigs.getByName("debug") + proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro", diff --git a/app/src/main/java/com/github/damontecres/dolphin/MainActivity.kt b/app/src/main/java/com/github/damontecres/dolphin/MainActivity.kt index eb3a415d..59e608e9 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/MainActivity.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/MainActivity.kt @@ -53,6 +53,9 @@ class MainActivity : AppCompatActivity() { @Inject lateinit var okHttpClient: OkHttpClient + @Inject + lateinit var navigationManager: NavigationManager + @OptIn(ExperimentalTvMaterial3Api::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -95,7 +98,7 @@ class MainActivity : AppCompatActivity() { createDeviceProfile(this@MainActivity, preferences, false) } val backStack = rememberNavBackStack(Destination.Main()) - val navigationManager = NavigationManager(backStack) + navigationManager.backStack = backStack if (server != null && user != null) { ApplicationContent( @@ -119,12 +122,10 @@ class MainActivity : AppCompatActivity() { } else if (server != null) { // Have server but no user, go to user selection SwitchUserContent( - navigationManager = navigationManager, modifier = Modifier.fillMaxSize(), ) } else { SwitchServerContent( - navigationManager = navigationManager, modifier = Modifier.fillMaxSize(), ) } diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/components/RecommendedMovie.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/components/RecommendedMovie.kt index 9e2c0369..1862fcf2 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/components/RecommendedMovie.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/components/RecommendedMovie.kt @@ -8,13 +8,13 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.github.damontecres.dolphin.data.model.BaseItem import com.github.damontecres.dolphin.preferences.UserPreferences import com.github.damontecres.dolphin.ui.DefaultItemFields import com.github.damontecres.dolphin.ui.OneTimeLaunchedEffect import com.github.damontecres.dolphin.ui.main.HomePageContent import com.github.damontecres.dolphin.ui.main.HomeRow import com.github.damontecres.dolphin.ui.main.HomeSection -import com.github.damontecres.dolphin.ui.nav.NavigationManager import com.github.damontecres.dolphin.util.ApiRequestPager import com.github.damontecres.dolphin.util.ExceptionHandler import com.github.damontecres.dolphin.util.GetItemsRequestHandler @@ -126,9 +126,9 @@ class RecommendedMovieViewModel @Composable fun RecommendedMovie( preferences: UserPreferences, - navigationManager: NavigationManager, parentId: UUID, - modifier: Modifier, + onClickItem: (BaseItem) -> Unit, + modifier: Modifier = Modifier, viewModel: RecommendedMovieViewModel = hiltViewModel(), ) { OneTimeLaunchedEffect { @@ -144,8 +144,8 @@ fun RecommendedMovie( LoadingState.Success -> HomePageContent( - navigationManager = navigationManager, homeRows = rows, + onClickItem = onClickItem, modifier = modifier, ) } diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/components/RecommendedTvShow.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/components/RecommendedTvShow.kt index e837e6db..d7b625e0 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/components/RecommendedTvShow.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/components/RecommendedTvShow.kt @@ -8,13 +8,13 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.github.damontecres.dolphin.data.model.BaseItem import com.github.damontecres.dolphin.preferences.UserPreferences import com.github.damontecres.dolphin.ui.DefaultItemFields import com.github.damontecres.dolphin.ui.OneTimeLaunchedEffect import com.github.damontecres.dolphin.ui.main.HomePageContent import com.github.damontecres.dolphin.ui.main.HomeRow import com.github.damontecres.dolphin.ui.main.HomeSection -import com.github.damontecres.dolphin.ui.nav.NavigationManager import com.github.damontecres.dolphin.util.ApiRequestPager import com.github.damontecres.dolphin.util.ExceptionHandler import com.github.damontecres.dolphin.util.GetItemsRequestHandler @@ -138,9 +138,9 @@ class RecommendedTvShowViewModel @Composable fun RecommendedTvShow( preferences: UserPreferences, - navigationManager: NavigationManager, parentId: UUID, - modifier: Modifier, + onClickItem: (BaseItem) -> Unit, + modifier: Modifier = Modifier, viewModel: RecommendedTvShowViewModel = hiltViewModel(), ) { OneTimeLaunchedEffect { @@ -156,8 +156,8 @@ fun RecommendedTvShow( LoadingState.Success -> HomePageContent( - navigationManager = navigationManager, homeRows = rows, + onClickItem = onClickItem, modifier = modifier, ) } diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CardGrid.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CardGrid.kt index 6727706b..449679d6 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CardGrid.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CardGrid.kt @@ -58,7 +58,7 @@ private const val DEBUG = false @Composable fun CardGrid( pager: List, - itemOnClick: (BaseItem) -> Unit, + onClickItem: (BaseItem) -> Unit, longClicker: (BaseItem) -> Unit, letterPosition: suspend (Char) -> Int, gridFocusRequester: FocusRequester, @@ -240,7 +240,7 @@ fun CardGrid( onClick = { if (item != null) { focusedIndex = index - itemOnClick.invoke(item) + onClickItem.invoke(item) } }, onLongClick = { if (item != null) longClicker.invoke(item) }, diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderDetails.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderDetails.kt index 65209991..ab272173 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderDetails.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderDetails.kt @@ -39,7 +39,6 @@ import com.github.damontecres.dolphin.ui.data.SeriesSortOptions import com.github.damontecres.dolphin.ui.data.SortAndDirection import com.github.damontecres.dolphin.ui.data.VideoSortOptions import com.github.damontecres.dolphin.ui.nav.Destination -import com.github.damontecres.dolphin.ui.nav.NavigationManager import com.github.damontecres.dolphin.ui.tryRequestFocus import com.github.damontecres.dolphin.util.ApiRequestPager import com.github.damontecres.dolphin.util.GetItemsRequestHandler @@ -134,8 +133,8 @@ class CollectionFolderViewModel @Composable fun CollectionFolderDetails( preferences: UserPreferences, - navigationManager: NavigationManager, destination: Destination.MediaItem, + onClickItem: (BaseItem) -> Unit, modifier: Modifier = Modifier, viewModel: CollectionFolderViewModel = hiltViewModel(), initialSortAndDirection: SortAndDirection = @@ -162,12 +161,12 @@ fun CollectionFolderDetails( pager?.let { pager -> CollectionDetails( preferences, - navigationManager, library!!, item!!, pager, sortAndDirection = sortAndDirection, modifier = modifier, + onClickItem = onClickItem, onSortChange = { viewModel.loadResults(it) }, @@ -182,11 +181,11 @@ fun CollectionFolderDetails( @Composable fun CollectionDetails( preferences: UserPreferences, - navigationManager: NavigationManager, library: Library, item: BaseItem, pager: List, sortAndDirection: SortAndDirection, + onClickItem: (BaseItem) -> Unit, onSortChange: (SortAndDirection) -> Unit, modifier: Modifier = Modifier, showTitle: Boolean = true, @@ -232,15 +231,7 @@ fun CollectionDetails( } CardGrid( pager = pager, - itemOnClick = { - navigationManager.navigateTo( - Destination.MediaItem( - it.id, - it.type, - it, - ), - ) - }, + onClickItem = onClickItem, longClicker = {}, letterPosition = { 0 }, gridFocusRequester = gridFocusRequester, diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderGeneric.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderGeneric.kt new file mode 100644 index 00000000..4da1e054 --- /dev/null +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderGeneric.kt @@ -0,0 +1,36 @@ +package com.github.damontecres.dolphin.ui.detail + +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +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 com.github.damontecres.dolphin.preferences.UserPreferences +import com.github.damontecres.dolphin.ui.nav.Destination +import com.github.damontecres.dolphin.ui.preferences.PreferencesViewModel + +@Composable +fun CollectionFolderGeneric( + preferences: UserPreferences, + destination: Destination.MediaItem, + modifier: Modifier = Modifier, + preferencesViewModel: PreferencesViewModel = hiltViewModel(), +) { + var showHeader by remember { mutableStateOf(true) } + CollectionFolderDetails( + preferences = preferences, + onClickItem = { preferencesViewModel.navigationManager.navigateTo(it.destination()) }, + destination = destination, + showTitle = showHeader, + modifier = + modifier + .padding(start = 16.dp), + positionCallback = { columns, position -> + showHeader = position < columns + }, + ) +} diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderMovie.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderMovie.kt index 101d304b..0042a1db 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderMovie.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderMovie.kt @@ -29,20 +29,19 @@ import androidx.tv.material3.TabDefaults import androidx.tv.material3.TabRow import androidx.tv.material3.TabRowDefaults import androidx.tv.material3.Text +import com.github.damontecres.dolphin.data.model.BaseItem import com.github.damontecres.dolphin.preferences.UserPreferences import com.github.damontecres.dolphin.preferences.rememberTab import com.github.damontecres.dolphin.ui.components.ErrorMessage import com.github.damontecres.dolphin.ui.components.RecommendedMovie import com.github.damontecres.dolphin.ui.ifElse import com.github.damontecres.dolphin.ui.nav.Destination -import com.github.damontecres.dolphin.ui.nav.NavigationManager import com.github.damontecres.dolphin.ui.preferences.PreferencesViewModel import com.github.damontecres.dolphin.ui.tryRequestFocus @Composable fun CollectionFolderMovie( preferences: UserPreferences, - navigationManager: NavigationManager, destination: Destination.MediaItem, modifier: Modifier = Modifier, preferencesViewModel: PreferencesViewModel = hiltViewModel(), @@ -72,6 +71,10 @@ fun CollectionFolderMovie( } var showHeader by rememberSaveable { mutableStateOf(true) } + val onClickItem = { item: BaseItem -> + preferencesViewModel.navigationManager.navigateTo(item.destination()) + } + LaunchedEffect(Unit) { focusRequester.tryRequestFocus() } Column( modifier = modifier, @@ -137,7 +140,7 @@ fun CollectionFolderMovie( 0 -> { RecommendedMovie( preferences = preferences, - navigationManager = navigationManager, + onClickItem = onClickItem, parentId = destination.itemId, modifier = Modifier @@ -149,7 +152,7 @@ fun CollectionFolderMovie( 1 -> { CollectionFolderDetails( preferences = preferences, - navigationManager = navigationManager, + onClickItem = onClickItem, destination = destination, showTitle = false, modifier = diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderTv.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderTv.kt index be7c6631..62732935 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderTv.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/CollectionFolderTv.kt @@ -29,20 +29,19 @@ import androidx.tv.material3.TabDefaults import androidx.tv.material3.TabRow import androidx.tv.material3.TabRowDefaults import androidx.tv.material3.Text +import com.github.damontecres.dolphin.data.model.BaseItem import com.github.damontecres.dolphin.preferences.UserPreferences import com.github.damontecres.dolphin.preferences.rememberTab import com.github.damontecres.dolphin.ui.components.ErrorMessage import com.github.damontecres.dolphin.ui.components.RecommendedTvShow import com.github.damontecres.dolphin.ui.ifElse import com.github.damontecres.dolphin.ui.nav.Destination -import com.github.damontecres.dolphin.ui.nav.NavigationManager import com.github.damontecres.dolphin.ui.preferences.PreferencesViewModel import com.github.damontecres.dolphin.ui.tryRequestFocus @Composable fun CollectionFolderTv( preferences: UserPreferences, - navigationManager: NavigationManager, destination: Destination.MediaItem, modifier: Modifier = Modifier, preferencesViewModel: PreferencesViewModel = hiltViewModel(), @@ -70,6 +69,9 @@ fun CollectionFolderTv( } } } + val onClickItem = { item: BaseItem -> + preferencesViewModel.navigationManager.navigateTo(item.destination()) + } var showHeader by rememberSaveable { mutableStateOf(true) } @@ -138,8 +140,8 @@ fun CollectionFolderTv( 0 -> { RecommendedTvShow( preferences = preferences, - navigationManager = navigationManager, parentId = destination.itemId, + onClickItem = onClickItem, modifier = Modifier .padding(start = 16.dp) @@ -150,7 +152,6 @@ fun CollectionFolderTv( 1 -> { CollectionFolderDetails( preferences = preferences, - navigationManager = navigationManager, destination = destination, showTitle = false, modifier = @@ -161,6 +162,7 @@ fun CollectionFolderTv( positionCallback = { columns, position -> showHeader = position < columns }, + onClickItem = onClickItem, ) } else -> ErrorMessage("Invalid tab index $selectedTabIndex", null) diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/EpisodeDetails.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/EpisodeDetails.kt index b4bbf9f8..a8a3d96f 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/EpisodeDetails.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/EpisodeDetails.kt @@ -33,7 +33,6 @@ import com.github.damontecres.dolphin.ui.components.LoadingPage import com.github.damontecres.dolphin.ui.components.details.VideoDetailsHeader import com.github.damontecres.dolphin.ui.isNotNullOrBlank import com.github.damontecres.dolphin.ui.nav.Destination -import com.github.damontecres.dolphin.ui.nav.NavigationManager import com.github.damontecres.dolphin.util.LoadingState import com.github.damontecres.dolphin.util.seasonEpisode import dagger.hilt.android.lifecycle.HiltViewModel @@ -54,7 +53,6 @@ class EpisodeViewModel @Composable fun EpisodeDetails( preferences: UserPreferences, - navigationManager: NavigationManager, destination: Destination.MediaItem, modifier: Modifier = Modifier, viewModel: EpisodeViewModel = hiltViewModel(), diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/SeasonDetails.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/SeasonDetails.kt index d50b5911..c8c4ee57 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/detail/SeasonDetails.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/detail/SeasonDetails.kt @@ -41,6 +41,7 @@ class SeasonViewModel @Inject constructor( api: ApiClient, + val navigationManager: NavigationManager, ) : ItemViewModel