diff --git a/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt b/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt index 45e84c9..650ae9c 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt @@ -1,59 +1,25 @@ package com.owenlejeune.tvtime import android.os.Bundle -import androidx.activity.compose.BackHandler import androidx.activity.compose.setContent -import androidx.compose.animation.rememberSplineBasedDecay -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.Scaffold -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.compositeOver -import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.foundation.layout.Box +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp import androidx.lifecycle.lifecycleScope -import androidx.navigation.NavController -import androidx.navigation.NavHostController -import androidx.navigation.NavType -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController -import androidx.navigation.navArgument -import androidx.navigation.navDeepLink -import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.kieronquinn.monetcompat.app.MonetCompatActivity -import com.owenlejeune.tvtime.extensions.WindowSizeClass -import com.owenlejeune.tvtime.extensions.navigateInBottomBar import com.owenlejeune.tvtime.extensions.rememberWindowSizeClass -import com.owenlejeune.tvtime.preferences.AppPreferences -import com.owenlejeune.tvtime.ui.components.AccountIcon -import com.owenlejeune.tvtime.ui.components.ProfileMenuContainer -import com.owenlejeune.tvtime.ui.components.ProfileMenuDefaults -import com.owenlejeune.tvtime.ui.components.ProfileMenuOverlay -import com.owenlejeune.tvtime.ui.navigation.BottomNavItem -import com.owenlejeune.tvtime.ui.navigation.MainNavGraph -import com.owenlejeune.tvtime.ui.navigation.MainNavItem -import com.owenlejeune.tvtime.ui.screens.SearchScreen -import com.owenlejeune.tvtime.ui.screens.main.* +import com.owenlejeune.tvtime.ui.navigation.AppNavigationHost +import com.owenlejeune.tvtime.ui.navigation.HomeScreenNavItem import com.owenlejeune.tvtime.ui.theme.TVTimeTheme import com.owenlejeune.tvtime.utils.KeyboardManager -import com.owenlejeune.tvtime.utils.NavConstants import com.owenlejeune.tvtime.utils.SessionManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.koin.java.KoinJavaComponent.get -@OptIn(ExperimentalMaterial3Api::class) class MainActivity : MonetCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -63,7 +29,7 @@ class MainActivity : MonetCompatActivity() { SessionManager.initialize() } - val mainNavStartRoute = BottomNavItem.SortedItems[0].route + val mainNavStartRoute = HomeScreenNavItem.SortedItems[0].route lifecycleScope.launchWhenCreated { monet.awaitMonetReady() @@ -73,7 +39,7 @@ class MainActivity : MonetCompatActivity() { val windowSize = rememberWindowSizeClass() val appNavController = rememberNavController() Box { - MainNavigationRoutes( + AppNavigationHost( appNavController = appNavController, mainNavStartRoute = mainNavStartRoute, windowSize = windowSize @@ -84,394 +50,6 @@ class MainActivity : MonetCompatActivity() { } } - @Composable - private fun AppScaffold( - appNavController: NavHostController, - mainNavStartRoute: String = BottomNavItem.SortedItems[0].route, - windowSize: WindowSizeClass, - preferences: AppPreferences = get(AppPreferences::class.java) - ) { - val navController = rememberNavController() - - val decayAnimationSpec = rememberSplineBasedDecay() - val topAppBarScrollState = rememberTopAppBarScrollState() - val scrollBehavior = remember(decayAnimationSpec) { - TopAppBarDefaults.exitUntilCollapsedScrollBehavior(decayAnimationSpec, topAppBarScrollState) - } - - val appBarTitle = remember { mutableStateOf<@Composable () -> Unit>({}) } - val appBarActions = remember { mutableStateOf<@Composable RowScope.() -> Unit>({}) } - val fab = remember { mutableStateOf<@Composable () -> Unit>({}) } - - val showProfileMenuOverlay = remember { mutableStateOf(false) } - val navigationIcon = @Composable { - AccountIcon( - modifier = Modifier.padding(horizontal = 12.dp), - size = 32.dp, - onClick = { showProfileMenuOverlay.value = true } - ) - } - - val defaultNavBarColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.08f).compositeOver(background = MaterialTheme.colorScheme.surface) - - ProfileMenuContainer( - appNavController = appNavController, - visible = showProfileMenuOverlay.value, - onDismissRequest = { showProfileMenuOverlay.value = false }, - colors = ProfileMenuDefaults.systemBarColors(navBarColor = defaultNavBarColor) - ) { - Scaffold( - modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), - topBar = { - if (windowSize != WindowSizeClass.Expanded) { - TopBar( - appNavController = appNavController, - title = appBarTitle.value, - scrollBehavior = scrollBehavior, - appBarActions = appBarActions, - navigationIcon = navigationIcon - ) - } - }, - floatingActionButton = { - fab.value() - }, - bottomBar = { - if (windowSize != WindowSizeClass.Expanded) { - BottomNavBar(navController = navController) - } - } - ) { innerPadding -> - Box(modifier = Modifier.padding(innerPadding)) { - MainContent( - windowSize = windowSize, - appNavController = appNavController, - navController = navController, - fab = fab, - appBarTitle = appBarTitle, - appBarActions = appBarActions, - topBarScrollBehaviour = scrollBehavior, - mainNavStartRoute = mainNavStartRoute, - navigationIcon = navigationIcon - ) - } - } - } - } - - @Composable - private fun TopBar( - appNavController: NavHostController, - title: @Composable () -> Unit, - scrollBehavior: TopAppBarScrollBehavior, - appBarActions: MutableState<@Composable (RowScope.() -> Unit)> = mutableStateOf({}), - navigationIcon: @Composable () -> Unit = {} - ) { - LargeTopAppBar( - title = title, - scrollBehavior = scrollBehavior, - colors = TopAppBarDefaults - .largeTopAppBarColors( - scrolledContainerColor = MaterialTheme.colorScheme.background - ), - actions = { - appBarActions.value(this) - }, - navigationIcon = navigationIcon - ) - } - - @Composable - private fun BottomNavBar( - navController: NavController, - preferences: AppPreferences = get(AppPreferences::class.java) - ) { - val navBackStackEntry by navController.currentBackStackEntryAsState() - val currentRoute = navBackStackEntry?.destination?.route - - NavigationBar { - BottomNavItem.SortedItems.forEach { item -> - val isSelected = currentRoute == item.route - NavigationBarItem( - modifier = Modifier - .padding(4.dp) - .clip(RoundedCornerShape(24.dp)), - icon = { Icon(painter = painterResource(id = item.icon), contentDescription = null) }, - label = { - val name = if (preferences.showBottomTabLabels) item.name else " " - Text(text = name) - }, - selected = isSelected, - onClick = { - if (!isSelected) { - navController.navigateInBottomBar(item.route) - } - } - ) - } - } - } - - @Composable - private fun MainContent( - windowSize: WindowSizeClass, - appNavController: NavHostController, - navController: NavHostController, - fab: MutableState<@Composable () -> Unit>, - topBarScrollBehaviour: TopAppBarScrollBehavior, - appBarTitle: MutableState<@Composable () -> Unit>, - appBarActions: MutableState<@Composable (RowScope.() -> Unit)> = mutableStateOf({}), - navigationIcon: @Composable () -> Unit = {}, - mainNavStartRoute: String = BottomNavItem.SortedItems[0].route - ) { - if (windowSize == WindowSizeClass.Expanded) { - DualColumnMainContent( - appNavController = appNavController, - navController = navController, - fab = fab, - appBarTitle = appBarTitle, - appBarActions = appBarActions, - topBarScrollBehaviour = topBarScrollBehaviour, - mainNavStartRoute = mainNavStartRoute, - navigationIcon = navigationIcon - ) - } else { - SingleColumnMainContent( - appNavController = appNavController, - navController = navController, - fab = fab, - appBarTitle = appBarTitle, - appBarActions = appBarActions, - mainNavStartRoute = mainNavStartRoute - ) - } - } - - @Composable - private fun SingleColumnMainContent( - appNavController: NavHostController, - navController: NavHostController, - fab: MutableState<@Composable () -> Unit>, - appBarTitle: MutableState<@Composable () -> Unit>, - appBarActions: MutableState<@Composable (RowScope.() -> Unit)> = mutableStateOf({}), - mainNavStartRoute: String = BottomNavItem.SortedItems[0].route - ) { - MainMediaView( - appNavController = appNavController, - navController = navController, - fab = fab, - appBarTitle = appBarTitle, - appBarActions = appBarActions, - mainNavStartRoute = mainNavStartRoute - ) - } - - @Composable - private fun DualColumnMainContent( - appNavController: NavHostController, - navController: NavHostController, - fab: MutableState<@Composable () -> Unit>, - topBarScrollBehaviour: TopAppBarScrollBehavior, - appBarTitle: MutableState<@Composable () -> Unit>, - appBarActions: MutableState<@Composable (RowScope.() -> Unit)> = mutableStateOf({}), - navigationIcon: @Composable () -> Unit = {}, - mainNavStartRoute: String = BottomNavItem.SortedItems[0].route, - preferences: AppPreferences = get(AppPreferences::class.java) - ) { - val navBackStackEntry by navController.currentBackStackEntryAsState() - val currentRoute = navBackStackEntry?.destination?.route - - Row(modifier = Modifier.fillMaxSize()) { - NavigationRail { - Spacer(modifier = Modifier.weight(1f)) - BottomNavItem.SortedItems.forEachIndexed { index, item -> - val isSelected = currentRoute == item.route - NavigationRailItem( - icon = { Icon(painter = painterResource(id = item.icon), contentDescription = null) }, - label = { if (preferences.showBottomTabLabels) Text(item.name) }, - selected = isSelected, - onClick = { - if (!isSelected) { - navController.navigateInBottomBar(item.route) - } - } - ) - if (index < BottomNavItem.SortedItems.size - 1) { - Spacer(modifier = Modifier.height(20.dp)) - } - } - Spacer(modifier = Modifier.weight(1f)) - } - Column { - TopBar( - appNavController = appNavController, - title = appBarTitle.value, - scrollBehavior = topBarScrollBehaviour, - appBarActions = appBarActions, - navigationIcon = navigationIcon - ) - MainMediaView( - appNavController = appNavController, - navController = navController, - fab = fab, - appBarTitle = appBarTitle, - appBarActions = appBarActions, - mainNavStartRoute = mainNavStartRoute - ) - } - } - } - - @Composable - private fun MainMediaView( - appNavController: NavHostController, - navController: NavHostController, - fab: MutableState<@Composable () -> Unit>, - appBarTitle: MutableState<@Composable () -> Unit>, - appBarActions: MutableState Unit> = mutableStateOf({}), - mainNavStartRoute: String = BottomNavItem.SortedItems[0].route - ) { - Column { - BackHandler(enabled = true) { - finish() - } - - MainNavGraph( - activity = this@MainActivity, - appNavController = appNavController, - navController = navController, - fab = fab, - appBarTitle = appBarTitle, - appBarActions = appBarActions, - startDestination = mainNavStartRoute - ) - } - } - - @Composable - private fun MainNavigationRoutes( - startDestination: String = MainNavItem.MainView.route, - mainNavStartRoute: String = MainNavItem.Items[0].route, - appNavController: NavHostController, - windowSize: WindowSizeClass, - preferences: AppPreferences = get(AppPreferences::class.java) - ) { - NavHost(navController = appNavController, startDestination = startDestination) { - composable(MainNavItem.MainView.route) { - AppScaffold( - appNavController = appNavController, - mainNavStartRoute = mainNavStartRoute, - windowSize = windowSize - ) - } - composable( - MainNavItem.DetailView.route.plus("/{${NavConstants.TYPE_KEY}}/{${NavConstants.ID_KEY}}"), - arguments = listOf( - navArgument(NavConstants.ID_KEY) { type = NavType.IntType }, - navArgument(NavConstants.TYPE_KEY) { type = NavType.EnumType(MediaViewType::class.java) } - ) - ) { navBackStackEntry -> - val args = navBackStackEntry.arguments - val mediaType = args?.getSerializable(NavConstants.TYPE_KEY) as MediaViewType - - when (mediaType) { - MediaViewType.PERSON -> { - PersonDetailView( - appNavController = appNavController, - personId = args.getInt(NavConstants.ID_KEY) - ) - } - MediaViewType.LIST -> { - ListDetailView( - appNavController = appNavController, - itemId = args.getInt(NavConstants.ID_KEY), - windowSize = windowSize - ) - } - else -> { - MediaDetailView( - appNavController = appNavController, - itemId = args.getInt(NavConstants.ID_KEY), - type = mediaType, - windowSize = windowSize - ) - } - } - } - composable( - MainNavItem.SettingsView.route.plus("/{${NavConstants.SETTINGS_KEY}}"), - arguments = listOf( - navArgument(NavConstants.SETTINGS_KEY) { type = NavType.StringType } - ) - ) { - val route = it.arguments?.getString(NavConstants.SETTINGS_KEY) - SettingsTab( - appNavController = appNavController, - activity = this@MainActivity, - route = route - ) - } - composable(MainNavItem.SettingsView.route) { - SettingsTab(appNavController = appNavController, activity = this@MainActivity) - } - composable( - route = MainNavItem.SearchView.route.plus("/{${NavConstants.SEARCH_ID_KEY}}/{${NavConstants.SEARCH_TITLE_KEY}}"), - arguments = listOf( - navArgument(NavConstants.SEARCH_ID_KEY) { type = NavType.IntType }, - navArgument(NavConstants.SEARCH_TITLE_KEY) { type = NavType.StringType } - ) - ) { - it.arguments?.let { arguments -> - val (type, title) = if (preferences.multiSearch) { - Pair( - MediaViewType.MIXED, - stringResource(id = R.string.search_all_title) - ) - } else { - Pair( - MediaViewType[arguments.getInt(NavConstants.SEARCH_ID_KEY)], - arguments.getString(NavConstants.SEARCH_TITLE_KEY) ?: "" - ) - } - - SearchScreen( - appNavController = appNavController, - title = title, - mediaViewType = type - ) - } - } - composable( - route = MainNavItem.WebLinkView.route.plus("/{${NavConstants.WEB_LINK_KEY}}"), - arguments = listOf( - navArgument(NavConstants.WEB_LINK_KEY) { type = NavType.StringType } - ) - ) { - val url = it.arguments?.getString(NavConstants.WEB_LINK_KEY) - url?.let { - WebLinkView(url = url, appNavController = appNavController) - } - } - composable( - route = MainNavItem.AccountView.route, - deepLinks = listOf( - navDeepLink { uriPattern = "app://tvtime.auth.{${NavConstants.ACCOUNT_KEY}}" } - ) - ) { - val deepLink = it.arguments?.getString(NavConstants.ACCOUNT_KEY) - AccountView( - appNavController = appNavController, - doSignInPartTwo = deepLink == NavConstants.AUTH_REDIRECT_PAGE - ) - } - composable( - route = MainNavItem.AboutView.route - ) { - AboutView(appNavController = appNavController) - } - } - } - @Composable private fun AppKeyboardFocusManager() { val context = LocalContext.current diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/deserializer/KnownForDeserializer.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/deserializer/KnownForDeserializer.kt index 1f35ea6..ec9da66 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/deserializer/KnownForDeserializer.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/deserializer/KnownForDeserializer.kt @@ -1,13 +1,12 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.deserializer -import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.JsonParseException import com.owenlejeune.tvtime.api.tmdb.api.BaseDeserializer import com.owenlejeune.tvtime.api.tmdb.api.v3.model.KnownFor import com.owenlejeune.tvtime.api.tmdb.api.v3.model.KnownForMovie import com.owenlejeune.tvtime.api.tmdb.api.v3.model.KnownForTv -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class KnownForDeserializer: BaseDeserializer() { diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/deserializer/SortableSearchResultDeserializer.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/deserializer/SortableSearchResultDeserializer.kt index dc820d3..e0684ec 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/deserializer/SortableSearchResultDeserializer.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/deserializer/SortableSearchResultDeserializer.kt @@ -1,6 +1,5 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.deserializer -import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.JsonParseException import com.owenlejeune.tvtime.api.tmdb.api.BaseDeserializer @@ -8,7 +7,7 @@ import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SearchResultMovie import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SearchResultPerson import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SearchResultTv import com.owenlejeune.tvtime.api.tmdb.api.v3.model.SortableSearchResult -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class SortableSearchResultDeserializer: BaseDeserializer() { diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/DetailCast.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/DetailCast.kt index 04f84ff..21a60a5 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/DetailCast.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/DetailCast.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class DetailCast( @SerializedName("id") val id: Int, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/DetailCrew.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/DetailCrew.kt index 93762d3..920a3fd 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/DetailCrew.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/DetailCrew.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class DetailCrew( @SerializedName("id") val id: Int, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownFor.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownFor.kt index f83f5e9..f12cfac 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownFor.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownFor.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType abstract class KnownFor( @SerializedName("backdrop_path") val backdropPath: String?, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownForMovie.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownForMovie.kt index cc77622..7bad1e1 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownForMovie.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownForMovie.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class KnownForMovie( backdropPath: String?, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownForTv.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownForTv.kt index 6f5677a..e21469d 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownForTv.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/KnownForTv.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class KnownForTv( backdropPath: String?, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/MarkAsFavoriteBody.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/MarkAsFavoriteBody.kt index 8a3be6c..783ecbe 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/MarkAsFavoriteBody.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/MarkAsFavoriteBody.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class MarkAsFavoriteBody( @SerializedName("media_type") val mediaType: MediaViewType, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/RecommendedMediaPagingSource.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/RecommendedMediaPagingSource.kt index 20f23d7..2ea2648 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/RecommendedMediaPagingSource.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/RecommendedMediaPagingSource.kt @@ -4,7 +4,7 @@ import androidx.paging.PagingSource import androidx.paging.PagingState import com.owenlejeune.tvtime.api.tmdb.api.v4.AccountV4Service import com.owenlejeune.tvtime.preferences.AppPreferences -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType import org.koin.core.component.KoinComponent import org.koin.core.component.inject diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultMedia.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultMedia.kt index 092d343..19e33ba 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultMedia.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultMedia.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType abstract class SearchResultMedia( @SerializedName("overview") val overview: String, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultMovie.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultMovie.kt index 508925a..59dd911 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultMovie.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultMovie.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class SearchResultMovie( id: Int, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultPerson.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultPerson.kt index 4821867..933cb8c 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultPerson.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultPerson.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class SearchResultPerson( @SerializedName("profile_path") val profilePath: String, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultTv.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultTv.kt index 1e4e868..438a965 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultTv.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SearchResultTv.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class SearchResultTv( id: Int, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SortableSearchResult.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SortableSearchResult.kt index 7dfb72c..acb063b 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SortableSearchResult.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/SortableSearchResult.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType abstract class SortableSearchResult( @SerializedName("media_type") val mediaType: MediaViewType, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/WatchlistBody.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/WatchlistBody.kt index e434fdd..36506ce 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/WatchlistBody.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/WatchlistBody.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class WatchlistBody( @SerializedName("media_type") val mediaType: MediaViewType, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/deserializer/ListItemDeserializer.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/deserializer/ListItemDeserializer.kt index 3c9887a..41e342e 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/deserializer/ListItemDeserializer.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/deserializer/ListItemDeserializer.kt @@ -5,7 +5,7 @@ import com.owenlejeune.tvtime.api.tmdb.api.BaseDeserializer import com.owenlejeune.tvtime.api.tmdb.api.v4.model.ListItem import com.owenlejeune.tvtime.api.tmdb.api.v4.model.ListMovie import com.owenlejeune.tvtime.api.tmdb.api.v4.model.ListTv -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class ListItemDeserializer: BaseDeserializer() { diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/AddToListBodyItem.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/AddToListBodyItem.kt index 253e2c2..9143828 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/AddToListBodyItem.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/AddToListBodyItem.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v4.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class AddToListBody( @SerializedName("items") val items: List diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/DeleteListItemsBody.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/DeleteListItemsBody.kt index 658b92c..106a9bb 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/DeleteListItemsBody.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/DeleteListItemsBody.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v4.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class DeleteListItemsBody( @SerializedName("items") val items: List diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListItem.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListItem.kt index 942ad2d..9a1efff 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListItem.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListItem.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v4.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType abstract class ListItem( @SerializedName("backdrop_path") val backdropPath: String?, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListItemStatusResponse.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListItemStatusResponse.kt index 8167bef..032ef0e 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListItemStatusResponse.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListItemStatusResponse.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v4.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class ListItemStatusResponse( statusMessage: String, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListMovie.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListMovie.kt index bdf91eb..6fac55f 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListMovie.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListMovie.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v4.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class ListMovie( backdropPath: String?, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListTv.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListTv.kt index 713203f..26fe05b 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListTv.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/ListTv.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v4.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class ListTv( backdropPath: String?, diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/UpdateListItemBody.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/UpdateListItemBody.kt index b2df822..7139859 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/UpdateListItemBody.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v4/model/UpdateListItemBody.kt @@ -1,7 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v4.model import com.google.gson.annotations.SerializedName -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType class UpdateListItemBody( @SerializedName("items") val items: List diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/RecommendedMediaViewModel.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/RecommendedMediaViewModel.kt index 445d575..5e11161 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/RecommendedMediaViewModel.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/RecommendedMediaViewModel.kt @@ -8,7 +8,7 @@ import androidx.paging.PagingData import androidx.paging.cachedIn import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RecommendedMediaPagingSource import com.owenlejeune.tvtime.api.tmdb.api.v3.model.TmdbItem -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType import kotlinx.coroutines.flow.Flow import org.koin.core.component.KoinComponent diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/DetailViewCommon.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/DetailViewCommon.kt similarity index 96% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/DetailViewCommon.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/components/DetailViewCommon.kt index 8a12bf0..3d445ac 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/DetailViewCommon.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/DetailViewCommon.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.ui.screens.main +package com.owenlejeune.tvtime.ui.components import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -25,13 +25,9 @@ import com.google.accompanist.pager.PagerState import com.google.accompanist.pager.rememberPagerState import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ImageCollection -import com.owenlejeune.tvtime.ui.components.PosterItem -import com.owenlejeune.tvtime.ui.components.RatingRing import com.owenlejeune.tvtime.utils.TmdbUtils -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext @OptIn(ExperimentalPagerApi::class) @Composable diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/MediaViews.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/MediaViews.kt similarity index 95% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/MediaViews.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/components/MediaViews.kt index e0fb049..ca0756c 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/MediaViews.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/MediaViews.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.ui.screens.main +package com.owenlejeune.tvtime.ui.components import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -12,7 +12,6 @@ import androidx.compose.ui.draw.blur import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp @@ -22,7 +21,8 @@ import androidx.constraintlayout.compose.Dimension import androidx.navigation.NavController import coil.compose.AsyncImage import com.owenlejeune.tvtime.R -import com.owenlejeune.tvtime.ui.navigation.MainNavItem +import com.owenlejeune.tvtime.ui.navigation.AppNavItem +import com.owenlejeune.tvtime.utils.types.MediaViewType @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -45,7 +45,7 @@ fun MediaResultCard( .clickable( onClick = { appNavController.navigate( - "${MainNavItem.DetailView.route}/${mediaViewType}/${id}" + "${AppNavItem.DetailView.route}/${mediaViewType}/${id}" ) } ) diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Menus.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Menus.kt index 39f9bd5..5612647 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Menus.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Menus.kt @@ -39,14 +39,13 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.owenlejeune.tvtime.BuildConfig import com.owenlejeune.tvtime.R -import com.owenlejeune.tvtime.ui.navigation.MainNavItem +import com.owenlejeune.tvtime.ui.navigation.AppNavItem import com.owenlejeune.tvtime.utils.SessionManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -130,7 +129,7 @@ fun ProfileMenuOverlay( ProfileMenuItem( onClick = { onDismissRequest() - appNavController.navigate(MainNavItem.AccountView.route) + appNavController.navigate(AppNavItem.AccountView.route) } ) { Icon( @@ -147,7 +146,7 @@ fun ProfileMenuOverlay( ProfileMenuItem( onClick = { onDismissRequest() - appNavController.navigate(MainNavItem.SettingsView.route) + appNavController.navigate(AppNavItem.SettingsView.route) } ) { Icon( @@ -163,7 +162,7 @@ fun ProfileMenuOverlay( ProfileMenuItem( onClick = { onDismissRequest() - appNavController.navigate(MainNavItem.AboutView.route) + appNavController.navigate(AppNavItem.AboutView.route) } ) { Icon( @@ -187,7 +186,7 @@ fun ProfileMenuOverlay( } else { SessionManager.signInPart1(context) { appNavController.navigate( - MainNavItem.WebLinkView.route.plus("/$it") + AppNavItem.WebLinkView.route.plus("/$it") ) } } diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/top/TabsCommon.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/TabsCommon.kt similarity index 94% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/top/TabsCommon.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/components/TabsCommon.kt index 3cbc880..eb053f6 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/top/TabsCommon.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/TabsCommon.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.ui.screens.main.tabs.top +package com.owenlejeune.tvtime.ui.components import androidx.compose.foundation.background import androidx.compose.foundation.layout.Spacer @@ -17,14 +17,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.PagerState import com.google.accompanist.pager.pagerTabIndicatorOffset -import com.google.accompanist.pager.rememberPagerState -import com.owenlejeune.tvtime.ui.navigation.MediaTabNavItem -import com.owenlejeune.tvtime.ui.navigation.TabNavItem +import com.owenlejeune.tvtime.utils.types.TabNavItem import kotlinx.coroutines.launch @OptIn(ExperimentalPagerApi::class) diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Widgets.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Widgets.kt index 9f9f934..22c9ebe 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Widgets.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Widgets.kt @@ -17,7 +17,6 @@ import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.AccountCircle import androidx.compose.material.icons.filled.ArrowDropDown import androidx.compose.material.icons.filled.ArrowDropUp import androidx.compose.material.icons.filled.Error @@ -69,8 +68,8 @@ import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.api.tmdb.api.v3.model.AuthorDetails import com.owenlejeune.tvtime.extensions.unlessEmpty import com.owenlejeune.tvtime.preferences.AppPreferences -import com.owenlejeune.tvtime.ui.navigation.MainNavItem -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.ui.navigation.AppNavItem +import com.owenlejeune.tvtime.utils.types.MediaViewType import com.owenlejeune.tvtime.utils.SessionManager import com.owenlejeune.tvtime.utils.TmdbUtils import kotlinx.coroutines.delay @@ -211,7 +210,7 @@ fun SearchView( fab: MutableState<@Composable () -> Unit>, preferences: AppPreferences = KoinJavaComponent.get(AppPreferences::class.java) ) { - val route = "${MainNavItem.SearchView.route}/${mediaType.ordinal}/$title" + val route = "${AppNavItem.SearchView.route}/${mediaType.ordinal}/$title" if (preferences.showSearchBar) { SearchBar( placeholder = title diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/AccountTabNavItem.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/AccountTabNavItem.kt index 7a55e44..04d165f 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/AccountTabNavItem.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/AccountTabNavItem.kt @@ -11,11 +11,12 @@ import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatedTv import com.owenlejeune.tvtime.api.tmdb.api.v3.model.WatchlistMovie import com.owenlejeune.tvtime.api.tmdb.api.v3.model.WatchlistTvSeries import com.owenlejeune.tvtime.api.tmdb.api.v4.model.AccountList -import com.owenlejeune.tvtime.ui.screens.main.AccountTabContent -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType -import com.owenlejeune.tvtime.ui.screens.main.RecommendedAccountTabContent +import com.owenlejeune.tvtime.ui.screens.AccountTabContent +import com.owenlejeune.tvtime.utils.types.MediaViewType +import com.owenlejeune.tvtime.ui.screens.RecommendedAccountTabContent import com.owenlejeune.tvtime.utils.ResourceUtils import com.owenlejeune.tvtime.utils.SessionManager +import com.owenlejeune.tvtime.utils.types.TabNavItem import org.koin.core.component.inject import kotlin.reflect.KClass diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/AppNavigation.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/AppNavigation.kt new file mode 100644 index 0000000..c078903 --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/AppNavigation.kt @@ -0,0 +1,162 @@ +package com.owenlejeune.tvtime.ui.navigation + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import androidx.navigation.NavHostController +import androidx.navigation.NavType +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.navArgument +import androidx.navigation.navDeepLink +import com.owenlejeune.tvtime.R +import com.owenlejeune.tvtime.extensions.WindowSizeClass +import com.owenlejeune.tvtime.preferences.AppPreferences +import com.owenlejeune.tvtime.ui.screens.SearchScreen +import com.owenlejeune.tvtime.ui.screens.AboutScreen +import com.owenlejeune.tvtime.ui.screens.AccountScreen +import com.owenlejeune.tvtime.ui.screens.ListDetailScreen +import com.owenlejeune.tvtime.ui.screens.MediaDetailScreen +import com.owenlejeune.tvtime.utils.types.MediaViewType +import com.owenlejeune.tvtime.ui.screens.PersonDetailScreen +import com.owenlejeune.tvtime.ui.screens.SettingsScreen +import com.owenlejeune.tvtime.ui.screens.WebLinkScreen +import com.owenlejeune.tvtime.ui.screens.HomeScreen +import com.owenlejeune.tvtime.utils.NavConstants +import org.koin.java.KoinJavaComponent + +@Composable +fun AppNavigationHost( + startDestination: String = AppNavItem.MainView.route, + mainNavStartRoute: String = AppNavItem.Items[0].route, + appNavController: NavHostController, + windowSize: WindowSizeClass, + preferences: AppPreferences = KoinJavaComponent.get(AppPreferences::class.java) +) { + NavHost(navController = appNavController, startDestination = startDestination) { + composable(AppNavItem.MainView.route) { + HomeScreen( + appNavController = appNavController, + mainNavStartRoute = mainNavStartRoute, + windowSize = windowSize + ) + } + composable( + AppNavItem.DetailView.route.plus("/{${NavConstants.TYPE_KEY}}/{${NavConstants.ID_KEY}}"), + arguments = listOf( + navArgument(NavConstants.ID_KEY) { type = NavType.IntType }, + navArgument(NavConstants.TYPE_KEY) { type = NavType.EnumType(MediaViewType::class.java) } + ) + ) { navBackStackEntry -> + val args = navBackStackEntry.arguments + val mediaType = args?.getSerializable(NavConstants.TYPE_KEY) as MediaViewType + + when (mediaType) { + MediaViewType.PERSON -> { + PersonDetailScreen( + appNavController = appNavController, + personId = args.getInt(NavConstants.ID_KEY) + ) + } + MediaViewType.LIST -> { + ListDetailScreen( + appNavController = appNavController, + itemId = args.getInt(NavConstants.ID_KEY), + windowSize = windowSize + ) + } + else -> { + MediaDetailScreen( + appNavController = appNavController, + itemId = args.getInt(NavConstants.ID_KEY), + type = mediaType, + windowSize = windowSize + ) + } + } + } + composable( + AppNavItem.SettingsView.route.plus("/{${NavConstants.SETTINGS_KEY}}"), + arguments = listOf( + navArgument(NavConstants.SETTINGS_KEY) { type = NavType.StringType } + ) + ) { + val route = it.arguments?.getString(NavConstants.SETTINGS_KEY) + SettingsScreen( + appNavController = appNavController, + route = route + ) + } + composable(AppNavItem.SettingsView.route) { + SettingsScreen(appNavController = appNavController) + } + composable( + route = AppNavItem.SearchView.route.plus("/{${NavConstants.SEARCH_ID_KEY}}/{${NavConstants.SEARCH_TITLE_KEY}}"), + arguments = listOf( + navArgument(NavConstants.SEARCH_ID_KEY) { type = NavType.IntType }, + navArgument(NavConstants.SEARCH_TITLE_KEY) { type = NavType.StringType } + ) + ) { + it.arguments?.let { arguments -> + val (type, title) = if (preferences.multiSearch) { + Pair( + MediaViewType.MIXED, + stringResource(id = R.string.search_all_title) + ) + } else { + Pair( + MediaViewType[arguments.getInt(NavConstants.SEARCH_ID_KEY)], + arguments.getString(NavConstants.SEARCH_TITLE_KEY) ?: "" + ) + } + + SearchScreen( + appNavController = appNavController, + title = title, + mediaViewType = type + ) + } + } + composable( + route = AppNavItem.WebLinkView.route.plus("/{${NavConstants.WEB_LINK_KEY}}"), + arguments = listOf( + navArgument(NavConstants.WEB_LINK_KEY) { type = NavType.StringType } + ) + ) { + val url = it.arguments?.getString(NavConstants.WEB_LINK_KEY) + url?.let { + WebLinkScreen(url = url, appNavController = appNavController) + } + } + composable( + route = AppNavItem.AccountView.route, + deepLinks = listOf( + navDeepLink { uriPattern = "app://tvtime.auth.{${NavConstants.ACCOUNT_KEY}}" } + ) + ) { + val deepLink = it.arguments?.getString(NavConstants.ACCOUNT_KEY) + AccountScreen( + appNavController = appNavController, + doSignInPartTwo = deepLink == NavConstants.AUTH_REDIRECT_PAGE + ) + } + composable(route = AppNavItem.AboutView.route) { + AboutScreen(appNavController = appNavController) + } + } +} + +sealed class AppNavItem(val route: String) { + + companion object { + val Items = listOf(MainView, DetailView, SettingsView) + } + + object MainView: AppNavItem("main_route") + object DetailView: AppNavItem("detail_route") + object SettingsView: AppNavItem("settings_route") + object SearchView: AppNavItem("search_route") + object WebLinkView: AppNavItem("web_link_route") + object AccountView: AppNavItem("account_route") + object AboutView: AppNavItem("about_route") + +} diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/BottomNavItem.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/BottomNavItem.kt deleted file mode 100644 index cd1b037..0000000 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/BottomNavItem.kt +++ /dev/null @@ -1,80 +0,0 @@ -package com.owenlejeune.tvtime.ui.navigation - -import com.owenlejeune.tvtime.R -import com.owenlejeune.tvtime.preferences.AppPreferences -import com.owenlejeune.tvtime.utils.ResourceUtils -import com.owenlejeune.tvtime.utils.SessionManager -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject - -sealed class BottomNavItem( - stringRes: Int, - val icon: Int, - val route: String, - private val orderGetter: (AppPreferences) -> Int, - private val orderSetter: (AppPreferences, Int) -> Unit -): KoinComponent { - - private val appPreferences: AppPreferences by inject() - private val resourceUtils: ResourceUtils by inject() - - val name = resourceUtils.getString(stringRes) - var order: Int - get() = orderGetter.invoke(appPreferences) - set(value) { orderSetter.invoke(appPreferences, value) } - - companion object { - - val SortedItems - get() = Items.filter { it.order > -1 }.sortedBy { it.order }.ifEmpty { Items } - - val Items by lazy { - listOf(Movies, TV, People, Account) - } - - fun getByRoute(route: String?): BottomNavItem? { - return when (route) { - Movies.route -> Movies - TV.route -> TV - Account.route -> Account - else -> null - } - } - } - - object Movies: BottomNavItem( - R.string.nav_movies_title, - R.drawable.ic_movie, - "movies_route", - { it.moviesTabPosition }, - { p, i -> p.moviesTabPosition = i } - ) - object TV: BottomNavItem( - R.string.nav_tv_title, - R.drawable.ic_tv, - "tv_route", - { it.tvTabPosition }, - { p, i -> p.tvTabPosition = i } - ) - object Account: BottomNavItem( - R.string.nav_account_title, - R.drawable.ic_person, - "account_route", - { -// if (SessionManager.currentSession.value?.isAuthorized == true) { -// it.accountTabPosition -// } else { - -2 -// } - }, - { p, i -> p.accountTabPosition = i } - ) - object People: BottomNavItem( - R.string.nav_people_title, - R.drawable.ic_face, - "people_route", - { it.peopleTabPosition }, - { p, i -> p.peopleTabPosition = i } - ) - -} diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/HomeScreenNavigation.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/HomeScreenNavigation.kt new file mode 100644 index 0000000..945a517 --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/HomeScreenNavigation.kt @@ -0,0 +1,133 @@ +package com.owenlejeune.tvtime.ui.navigation + +import androidx.compose.foundation.layout.RowScope +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import com.owenlejeune.tvtime.R +import com.owenlejeune.tvtime.preferences.AppPreferences +import com.owenlejeune.tvtime.ui.screens.AccountViewContent +import com.owenlejeune.tvtime.ui.screens.new.tabs.MediaTab +import com.owenlejeune.tvtime.utils.types.MediaViewType +import com.owenlejeune.tvtime.ui.screens.tabs.PeopleTab +import com.owenlejeune.tvtime.utils.ResourceUtils +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +@Composable +fun HomeScreenNavHost( + appNavController: NavHostController, + navController: NavHostController, + fab: MutableState<@Composable () -> Unit>, + appBarTitle: MutableState<@Composable () -> Unit>, + appBarActions: MutableState<@Composable (RowScope.() -> Unit)> = mutableStateOf({}), + startDestination: String = HomeScreenNavItem.SortedItems[0].route +) { + NavHost(navController = navController, startDestination = startDestination) { + composable(HomeScreenNavItem.Movies.route) { + appBarActions.value = {} + MediaTab( + appBarTitle = appBarTitle, + appNavController = appNavController, + mediaType = MediaViewType.MOVIE, + fab = fab + ) + } + composable(HomeScreenNavItem.TV.route) { + appBarActions.value = {} + MediaTab( + appBarTitle = appBarTitle, + appNavController = appNavController, + mediaType = MediaViewType.TV, + fab = fab + ) + } + composable(route = HomeScreenNavItem.Account.route) { + AccountViewContent(appNavController = appNavController) + fab.value = {} + } + composable(HomeScreenNavItem.People.route) { + appBarActions.value = {} + PeopleTab( + appBarTitle = appBarTitle, + appNavController = appNavController, + fab = fab + ) + } + } +} + +sealed class HomeScreenNavItem( + stringRes: Int, + val icon: Int, + val route: String, + private val orderGetter: (AppPreferences) -> Int, + private val orderSetter: (AppPreferences, Int) -> Unit +): KoinComponent { + + private val appPreferences: AppPreferences by inject() + private val resourceUtils: ResourceUtils by inject() + + val name = resourceUtils.getString(stringRes) + var order: Int + get() = orderGetter.invoke(appPreferences) + set(value) { orderSetter.invoke(appPreferences, value) } + + companion object { + + val SortedItems + get() = Items.filter { it.order > -1 }.sortedBy { it.order }.ifEmpty { Items } + + val Items by lazy { + listOf(Movies, TV, People, Account) + } + + fun getByRoute(route: String?): HomeScreenNavItem? { + return when (route) { + Movies.route -> Movies + TV.route -> TV + Account.route -> Account + else -> null + } + } + } + + object Movies: HomeScreenNavItem( + R.string.nav_movies_title, + R.drawable.ic_movie, + "movies_route", + { it.moviesTabPosition }, + { p, i -> p.moviesTabPosition = i } + ) + object TV: HomeScreenNavItem( + R.string.nav_tv_title, + R.drawable.ic_tv, + "tv_route", + { it.tvTabPosition }, + { p, i -> p.tvTabPosition = i } + ) + object Account: HomeScreenNavItem( + R.string.nav_account_title, + R.drawable.ic_person, + "account_route", + { +// if (SessionManager.currentSession.value?.isAuthorized == true) { +// it.accountTabPosition +// } else { + -2 +// } + }, + { p, i -> p.accountTabPosition = i } + ) + object People: HomeScreenNavItem( + R.string.nav_people_title, + R.drawable.ic_face, + "people_route", + { it.peopleTabPosition }, + { p, i -> p.peopleTabPosition = i } + ) + +} diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/MainNavItem.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/MainNavItem.kt deleted file mode 100644 index 68ffcc3..0000000 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/MainNavItem.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.owenlejeune.tvtime.ui.navigation - -sealed class MainNavItem(val route: String) { - - companion object { - val Items = listOf(MainView, DetailView, SettingsView) - } - - object MainView: MainNavItem("main_route") - object DetailView: MainNavItem("detail_route") - object SettingsView: MainNavItem("settings_route") - object SearchView: MainNavItem("search_route") - object WebLinkView: MainNavItem("web_link_route") - object AccountView: MainNavItem("account_route") - object AboutView: MainNavItem("about_route") - -} \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/MediaTabNavItem.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/MediaTabNavItem.kt index 65fe8cc..21b4d79 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/MediaTabNavItem.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/MediaTabNavItem.kt @@ -5,10 +5,11 @@ import androidx.navigation.NavHostController import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.api.tmdb.api.v3.HomePageService import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePageResponse -import com.owenlejeune.tvtime.ui.screens.main.MediaTabContent -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.utils.types.MediaViewType import com.owenlejeune.tvtime.api.tmdb.viewmodel.MediaTabViewModel +import com.owenlejeune.tvtime.ui.screens.tabs.MediaTabContent import com.owenlejeune.tvtime.utils.ResourceUtils +import com.owenlejeune.tvtime.utils.types.TabNavItem import org.koin.core.component.inject import retrofit2.Response diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/Routes.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/Routes.kt deleted file mode 100644 index f486f78..0000000 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/Routes.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.owenlejeune.tvtime.ui.navigation - -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.RowScope -import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.mutableStateOf -import androidx.navigation.NavHostController -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.navDeepLink -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType -import com.owenlejeune.tvtime.ui.screens.main.* -import com.owenlejeune.tvtime.utils.NavConstants - -@Composable -fun MainNavGraph( - activity: AppCompatActivity, - appNavController: NavHostController, - navController: NavHostController, - fab: MutableState<@Composable () -> Unit>, - appBarTitle: MutableState<@Composable () -> Unit>, - appBarActions: MutableState<@Composable (RowScope.() -> Unit)> = mutableStateOf({}), - startDestination: String = BottomNavItem.SortedItems[0].route -) { - NavHost(navController = navController, startDestination = startDestination) { - composable(BottomNavItem.Movies.route) { - appBarActions.value = {} - MediaTab( - appBarTitle = appBarTitle, - appNavController = appNavController, - mediaType = MediaViewType.MOVIE, - fab = fab - ) - } - composable(BottomNavItem.TV.route) { - appBarActions.value = {} - MediaTab( - appBarTitle = appBarTitle, - appNavController = appNavController, - mediaType = MediaViewType.TV, - fab = fab - ) - } - composable(route = BottomNavItem.Account.route) { - AccountViewContent(appNavController = appNavController) - fab.value = {} - } - composable(BottomNavItem.People.route) { - appBarActions.value = {} - PeopleTab( - appBarTitle = appBarTitle, - appNavController = appNavController, - fab = fab - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/AboutView.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/AboutScreen.kt similarity index 99% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/AboutView.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/AboutScreen.kt index 307a12a..084e7ca 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/AboutView.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/AboutScreen.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.ui.screens.main +package com.owenlejeune.tvtime.ui.screens import android.content.Intent import android.net.Uri @@ -58,7 +58,7 @@ import dev.jeziellago.compose.markdowntext.MarkdownText @OptIn(ExperimentalMaterial3Api::class) @Composable -fun AboutView( +fun AboutScreen( appNavController: NavController ) { val systemUiController = rememberSystemUiController() diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/AccountView.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/AccountScreen.kt similarity index 97% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/AccountView.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/AccountScreen.kt index 637224a..8370562 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/AccountView.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/AccountScreen.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.ui.screens.main +package com.owenlejeune.tvtime.ui.screens import androidx.compose.animation.rememberSplineBasedDecay import androidx.compose.foundation.layout.* @@ -36,8 +36,10 @@ import com.owenlejeune.tvtime.ui.components.AccountIcon import com.owenlejeune.tvtime.ui.components.PagingPosterGrid import com.owenlejeune.tvtime.ui.navigation.AccountTabNavItem import com.owenlejeune.tvtime.ui.navigation.ListFetchFun -import com.owenlejeune.tvtime.ui.navigation.MainNavItem -import com.owenlejeune.tvtime.ui.screens.main.tabs.top.ScrollableTabs +import com.owenlejeune.tvtime.ui.navigation.AppNavItem +import com.owenlejeune.tvtime.ui.components.MediaResultCard +import com.owenlejeune.tvtime.utils.types.MediaViewType +import com.owenlejeune.tvtime.ui.components.ScrollableTabs import com.owenlejeune.tvtime.utils.SessionManager import com.owenlejeune.tvtime.utils.TmdbUtils import kotlinx.coroutines.launch @@ -45,7 +47,7 @@ import kotlin.reflect.KClass @OptIn(ExperimentalMaterial3Api::class) @Composable -fun AccountView( +fun AccountScreen( appNavController: NavHostController, doSignInPartTwo: Boolean = false ) { @@ -303,7 +305,7 @@ fun RecommendedAccountTabContent( lazyPagingItems = mediaListItems, onClick = { id -> appNavController.navigate( - "${MainNavItem.DetailView.route}/${mediaViewType}/${id}" + "${AppNavItem.DetailView.route}/${mediaViewType}/${id}" ) } ) diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/HomeScreen.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/HomeScreen.kt new file mode 100644 index 0000000..17f0e87 --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/HomeScreen.kt @@ -0,0 +1,313 @@ +package com.owenlejeune.tvtime.ui.screens + +import android.app.Activity +import androidx.activity.compose.BackHandler +import androidx.compose.animation.rememberSplineBasedDecay +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Scaffold +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.LargeTopAppBar +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.NavigationRail +import androidx.compose.material3.NavigationRailItem +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.TopAppBarScrollBehavior +import androidx.compose.material3.rememberTopAppBarScrollState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.compositeOver +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.navigation.NavHostController +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import com.owenlejeune.tvtime.extensions.WindowSizeClass +import com.owenlejeune.tvtime.extensions.navigateInBottomBar +import com.owenlejeune.tvtime.preferences.AppPreferences +import com.owenlejeune.tvtime.ui.components.AccountIcon +import com.owenlejeune.tvtime.ui.components.ProfileMenuContainer +import com.owenlejeune.tvtime.ui.components.ProfileMenuDefaults +import com.owenlejeune.tvtime.ui.navigation.HomeScreenNavItem +import com.owenlejeune.tvtime.ui.navigation.HomeScreenNavHost +import org.koin.java.KoinJavaComponent + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun HomeScreen( + appNavController: NavHostController, + mainNavStartRoute: String = HomeScreenNavItem.SortedItems[0].route, + windowSize: WindowSizeClass +) { + val navController = rememberNavController() + + val decayAnimationSpec = rememberSplineBasedDecay() + val topAppBarScrollState = rememberTopAppBarScrollState() + val scrollBehavior = remember(decayAnimationSpec) { + TopAppBarDefaults.exitUntilCollapsedScrollBehavior(decayAnimationSpec, topAppBarScrollState) + } + + val appBarTitle = remember { mutableStateOf<@Composable () -> Unit>({}) } + val appBarActions = remember { mutableStateOf<@Composable RowScope.() -> Unit>({}) } + val fab = remember { mutableStateOf<@Composable () -> Unit>({}) } + + val showProfileMenuOverlay = remember { mutableStateOf(false) } + val navigationIcon = @Composable { + AccountIcon( + modifier = Modifier.padding(horizontal = 12.dp), + size = 32.dp, + onClick = { showProfileMenuOverlay.value = true } + ) + } + + val defaultNavBarColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.08f).compositeOver(background = MaterialTheme.colorScheme.surface) + + ProfileMenuContainer( + appNavController = appNavController, + visible = showProfileMenuOverlay.value, + onDismissRequest = { showProfileMenuOverlay.value = false }, + colors = ProfileMenuDefaults.systemBarColors(navBarColor = defaultNavBarColor) + ) { + Scaffold( + modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), + topBar = { + if (windowSize != WindowSizeClass.Expanded) { + TopBar( + title = appBarTitle.value, + scrollBehavior = scrollBehavior, + appBarActions = appBarActions, + navigationIcon = navigationIcon + ) + } + }, + floatingActionButton = { + fab.value() + }, + bottomBar = { + if (windowSize != WindowSizeClass.Expanded) { + BottomNavBar(navController = navController) + } + } + ) { innerPadding -> + Box(modifier = Modifier.padding(innerPadding)) { + MainContent( + windowSize = windowSize, + appNavController = appNavController, + navController = navController, + fab = fab, + appBarTitle = appBarTitle, + appBarActions = appBarActions, + topBarScrollBehaviour = scrollBehavior, + mainNavStartRoute = mainNavStartRoute, + navigationIcon = navigationIcon + ) + } + } + } +} + +@Composable +private fun TopBar( + title: @Composable () -> Unit, + scrollBehavior: TopAppBarScrollBehavior, + appBarActions: MutableState<@Composable (RowScope.() -> Unit)> = mutableStateOf({}), + navigationIcon: @Composable () -> Unit = {} +) { + LargeTopAppBar( + title = title, + scrollBehavior = scrollBehavior, + colors = TopAppBarDefaults + .largeTopAppBarColors( + scrolledContainerColor = MaterialTheme.colorScheme.background + ), + actions = { + appBarActions.value(this) + }, + navigationIcon = navigationIcon + ) +} + +@Composable +private fun BottomNavBar( + navController: NavController, + preferences: AppPreferences = KoinJavaComponent.get(AppPreferences::class.java) +) { + val navBackStackEntry by navController.currentBackStackEntryAsState() + val currentRoute = navBackStackEntry?.destination?.route + + NavigationBar { + HomeScreenNavItem.SortedItems.forEach { item -> + val isSelected = currentRoute == item.route + NavigationBarItem( + modifier = Modifier + .padding(4.dp) + .clip(RoundedCornerShape(24.dp)), + icon = { Icon(painter = painterResource(id = item.icon), contentDescription = null) }, + label = { + val name = if (preferences.showBottomTabLabels) item.name else " " + Text(text = name) + }, + selected = isSelected, + onClick = { + if (!isSelected) { + navController.navigateInBottomBar(item.route) + } + } + ) + } + } +} + +@Composable +private fun MainContent( + windowSize: WindowSizeClass, + appNavController: NavHostController, + navController: NavHostController, + fab: MutableState<@Composable () -> Unit>, + topBarScrollBehaviour: TopAppBarScrollBehavior, + appBarTitle: MutableState<@Composable () -> Unit>, + appBarActions: MutableState<@Composable (RowScope.() -> Unit)> = mutableStateOf({}), + navigationIcon: @Composable () -> Unit = {}, + mainNavStartRoute: String = HomeScreenNavItem.SortedItems[0].route +) { + if (windowSize == WindowSizeClass.Expanded) { + DualColumnMainContent( + appNavController = appNavController, + navController = navController, + fab = fab, + appBarTitle = appBarTitle, + appBarActions = appBarActions, + topBarScrollBehaviour = topBarScrollBehaviour, + mainNavStartRoute = mainNavStartRoute, + navigationIcon = navigationIcon + ) + } else { + SingleColumnMainContent( + appNavController = appNavController, + navController = navController, + fab = fab, + appBarTitle = appBarTitle, + appBarActions = appBarActions, + mainNavStartRoute = mainNavStartRoute + ) + } +} + +@Composable +private fun SingleColumnMainContent( + appNavController: NavHostController, + navController: NavHostController, + fab: MutableState<@Composable () -> Unit>, + appBarTitle: MutableState<@Composable () -> Unit>, + appBarActions: MutableState<@Composable (RowScope.() -> Unit)> = mutableStateOf({}), + mainNavStartRoute: String = HomeScreenNavItem.SortedItems[0].route +) { + MainMediaView( + appNavController = appNavController, + navController = navController, + fab = fab, + appBarTitle = appBarTitle, + appBarActions = appBarActions, + mainNavStartRoute = mainNavStartRoute + ) +} + +@Composable +private fun DualColumnMainContent( + appNavController: NavHostController, + navController: NavHostController, + fab: MutableState<@Composable () -> Unit>, + topBarScrollBehaviour: TopAppBarScrollBehavior, + appBarTitle: MutableState<@Composable () -> Unit>, + appBarActions: MutableState<@Composable (RowScope.() -> Unit)> = mutableStateOf({}), + navigationIcon: @Composable () -> Unit = {}, + mainNavStartRoute: String = HomeScreenNavItem.SortedItems[0].route, + preferences: AppPreferences = KoinJavaComponent.get(AppPreferences::class.java) +) { + val navBackStackEntry by navController.currentBackStackEntryAsState() + val currentRoute = navBackStackEntry?.destination?.route + + Row(modifier = Modifier.fillMaxSize()) { + NavigationRail { + Spacer(modifier = Modifier.weight(1f)) + HomeScreenNavItem.SortedItems.forEachIndexed { index, item -> + val isSelected = currentRoute == item.route + NavigationRailItem( + icon = { Icon(painter = painterResource(id = item.icon), contentDescription = null) }, + label = { if (preferences.showBottomTabLabels) Text(item.name) }, + selected = isSelected, + onClick = { + if (!isSelected) { + navController.navigateInBottomBar(item.route) + } + } + ) + if (index < HomeScreenNavItem.SortedItems.size - 1) { + Spacer(modifier = Modifier.height(20.dp)) + } + } + Spacer(modifier = Modifier.weight(1f)) + } + Column { + TopBar( + title = appBarTitle.value, + scrollBehavior = topBarScrollBehaviour, + appBarActions = appBarActions, + navigationIcon = navigationIcon + ) + MainMediaView( + appNavController = appNavController, + navController = navController, + fab = fab, + appBarTitle = appBarTitle, + appBarActions = appBarActions, + mainNavStartRoute = mainNavStartRoute + ) + } + } +} + +@Composable +private fun MainMediaView( + appNavController: NavHostController, + navController: NavHostController, + fab: MutableState<@Composable () -> Unit>, + appBarTitle: MutableState<@Composable () -> Unit>, + appBarActions: MutableState Unit> = mutableStateOf({}), + mainNavStartRoute: String = HomeScreenNavItem.SortedItems[0].route +) { + val activity = LocalContext.current as Activity + Column { + BackHandler(enabled = true) { + activity.finish() + } + + HomeScreenNavHost( + appNavController = appNavController, + navController = navController, + fab = fab, + appBarTitle = appBarTitle, + appBarActions = appBarActions, + startDestination = mainNavStartRoute + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/ListDetailView.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/ListDetailScreen.kt similarity index 98% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/ListDetailView.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/ListDetailScreen.kt index bcb6497..c303410 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/ListDetailView.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/ListDetailScreen.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.ui.screens.main +package com.owenlejeune.tvtime.ui.screens import android.content.Context import android.content.Intent import android.util.Log @@ -45,7 +45,9 @@ import com.owenlejeune.tvtime.extensions.unlessEmpty import com.owenlejeune.tvtime.preferences.AppPreferences import com.owenlejeune.tvtime.ui.components.Spinner import com.owenlejeune.tvtime.ui.components.SwitchPreference -import com.owenlejeune.tvtime.ui.navigation.MainNavItem +import com.owenlejeune.tvtime.ui.navigation.AppNavItem +import com.owenlejeune.tvtime.utils.types.MediaViewType +import com.owenlejeune.tvtime.ui.components.RatingView import com.owenlejeune.tvtime.ui.theme.* import com.owenlejeune.tvtime.utils.SessionManager import com.owenlejeune.tvtime.utils.TmdbUtils @@ -60,7 +62,7 @@ import kotlin.math.roundToInt @OptIn(ExperimentalMaterial3Api::class) @Composable -fun ListDetailView( +fun ListDetailScreen( appNavController: NavController, itemId: Int?, windowSize: WindowSizeClass, @@ -457,7 +459,7 @@ private fun ListItemView( .clickable( onClick = { appNavController.navigate( - "${MainNavItem.DetailView.route}/${listItem.mediaType}/${listItem.id}" + "${AppNavItem.DetailView.route}/${listItem.mediaType}/${listItem.id}" ) } ) @@ -575,7 +577,7 @@ private fun ActionButtonRow(listItem: ListItem) { contentDescription = stringResource(id = R.string.favourite_label), isSelected = isFavourited, filledIconColor = FavoriteSelected, - onClick = ::addToFavorite + onClick = ::listAddToFavorite ) ActionButton( @@ -585,7 +587,7 @@ private fun ActionButtonRow(listItem: ListItem) { contentDescription = "", isSelected = isWatchlisted, filledIconColor = WatchlistSelected, - onClick = ::addToWatchlist + onClick = ::listAddToWatchlist ) val context = LocalContext.current @@ -604,7 +606,7 @@ private fun ActionButtonRow(listItem: ListItem) { } } -private fun addToWatchlist( +private fun listAddToWatchlist( context: Context, itemId: Int, type: MediaViewType, @@ -629,7 +631,7 @@ private fun addToWatchlist( } } -private fun addToFavorite( +private fun listAddToFavorite( context: Context, itemId: Int, type: MediaViewType, diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/MediaDetailView.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MediaDetailScreen.kt similarity index 98% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/MediaDetailView.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/MediaDetailScreen.kt index 5941cc1..19696ae 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/MediaDetailView.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MediaDetailScreen.kt @@ -1,11 +1,9 @@ -package com.owenlejeune.tvtime.ui.screens.main +package com.owenlejeune.tvtime.ui.screens import android.content.Context import android.widget.Toast import androidx.compose.animation.* import androidx.compose.animation.core.LinearEasing -import androidx.compose.animation.core.RepeatMode -import androidx.compose.animation.core.infiniteRepeatable import androidx.compose.animation.core.tween import androidx.compose.foundation.* import androidx.compose.foundation.layout.* @@ -16,7 +14,6 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Movie import androidx.compose.material.icons.filled.Send -import androidx.compose.material.icons.outlined.ExpandLess import androidx.compose.material.icons.outlined.ExpandMore import androidx.compose.material3.* import androidx.compose.runtime.* @@ -31,7 +28,6 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -55,9 +51,11 @@ import com.owenlejeune.tvtime.extensions.WindowSizeClass import com.owenlejeune.tvtime.extensions.listItems import com.owenlejeune.tvtime.preferences.AppPreferences import com.owenlejeune.tvtime.ui.components.* -import com.owenlejeune.tvtime.ui.navigation.MainNavItem -import com.owenlejeune.tvtime.ui.navigation.TabNavItem -import com.owenlejeune.tvtime.ui.screens.main.tabs.top.Tabs +import com.owenlejeune.tvtime.ui.navigation.AppNavItem +import com.owenlejeune.tvtime.utils.types.TabNavItem +import com.owenlejeune.tvtime.ui.components.DetailHeader +import com.owenlejeune.tvtime.utils.types.MediaViewType +import com.owenlejeune.tvtime.ui.components.Tabs import com.owenlejeune.tvtime.ui.theme.FavoriteSelected import com.owenlejeune.tvtime.ui.theme.RatingSelected import com.owenlejeune.tvtime.ui.theme.WatchlistSelected @@ -71,7 +69,7 @@ import java.text.DecimalFormat @OptIn(ExperimentalMaterial3Api::class, ExperimentalPagerApi::class) @Composable -fun MediaDetailView( +fun MediaDetailScreen( appNavController: NavController, itemId: Int?, type: MediaViewType, @@ -780,7 +778,7 @@ fun FavoriteButton( contentDescription = "", isSelected = isFavourited, filledIconColor = FavoriteSelected, - onClick = ::addToFavorite + onClick = ::mediaAddToFavorite ) } @@ -1140,7 +1138,7 @@ private fun CastCrewCard(appNavController: NavController, person: Person) { subtitleTextColor = MaterialTheme.colorScheme.onSecondary, onItemClicked = { appNavController.navigate( - "${MainNavItem.DetailView.route}/${MediaViewType.PERSON}/${person.id}" + "${AppNavItem.DetailView.route}/${MediaViewType.PERSON}/${person.id}" ) } ) @@ -1186,7 +1184,7 @@ fun SimilarContentCard( imageUrl = TmdbUtils.getFullPosterPath(content), onItemClicked = { appNavController.navigate( - "${MainNavItem.DetailView.route}/${mediaType}/${content.id}" + "${AppNavItem.DetailView.route}/${mediaType}/${content.id}" ) }, placeholder = Icons.Filled.Movie @@ -1573,7 +1571,7 @@ private fun addToWatchlist( } } -private fun addToFavorite( +private fun mediaAddToFavorite( context: Context, itemId: Int, type: MediaViewType, diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/PeopleDetailView.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/PeopleDetailScreen.kt similarity index 95% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/PeopleDetailView.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/PeopleDetailScreen.kt index 6fbab81..7ee534c 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/PeopleDetailView.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/PeopleDetailScreen.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.ui.screens.main +package com.owenlejeune.tvtime.ui.screens import androidx.compose.animation.rememberSplineBasedDecay import androidx.compose.foundation.background @@ -28,7 +28,9 @@ import com.owenlejeune.tvtime.api.tmdb.api.v3.model.PersonCreditsResponse import com.owenlejeune.tvtime.ui.components.ContentCard import com.owenlejeune.tvtime.ui.components.ExpandableContentCard import com.owenlejeune.tvtime.ui.components.TwoLineImageTextCard -import com.owenlejeune.tvtime.ui.navigation.MainNavItem +import com.owenlejeune.tvtime.ui.navigation.AppNavItem +import com.owenlejeune.tvtime.ui.components.DetailHeader +import com.owenlejeune.tvtime.utils.types.MediaViewType import com.owenlejeune.tvtime.utils.TmdbUtils import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -37,7 +39,7 @@ import kotlinx.coroutines.withContext @OptIn(ExperimentalMaterial3Api::class, ExperimentalPagerApi::class) @Composable -fun PersonDetailView( +fun PersonDetailScreen( appNavController: NavController, personId: Int? ) { @@ -125,7 +127,7 @@ fun PersonDetailView( onItemClicked = { personId?.let { appNavController.navigate( - "${MainNavItem.DetailView.route}/${content.mediaType}/${content.id}" + "${AppNavItem.DetailView.route}/${content.mediaType}/${content.id}" ) } } @@ -171,7 +173,7 @@ fun PersonDetailView( onItemClicked = { personId?.let { appNavController.navigate( - "${MainNavItem.DetailView.route}/${content.mediaType}/${content.id}" + "${AppNavItem.DetailView.route}/${content.mediaType}/${content.id}" ) } } diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SearchScreen.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SearchScreen.kt index 37180c2..610f444 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SearchScreen.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SearchScreen.kt @@ -1,11 +1,8 @@ package com.owenlejeune.tvtime.ui.screens import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.Card import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Clear @@ -14,17 +11,13 @@ import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.blur import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavHostController -import coil.compose.AsyncImage import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.api.tmdb.api.v3.DetailService @@ -33,9 +26,8 @@ import com.owenlejeune.tvtime.api.tmdb.api.v3.SearchService import com.owenlejeune.tvtime.api.tmdb.api.v3.TvService import com.owenlejeune.tvtime.api.tmdb.api.v3.model.* import com.owenlejeune.tvtime.extensions.listItems -import com.owenlejeune.tvtime.ui.navigation.MainNavItem -import com.owenlejeune.tvtime.ui.screens.main.MediaResultCard -import com.owenlejeune.tvtime.ui.screens.main.MediaViewType +import com.owenlejeune.tvtime.ui.components.MediaResultCard +import com.owenlejeune.tvtime.utils.types.MediaViewType import com.owenlejeune.tvtime.utils.TmdbUtils import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/SettingsTab.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsScreen.kt similarity index 98% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/SettingsTab.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsScreen.kt index 5cc00e7..94fffa3 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/SettingsTab.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsScreen.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.ui.screens.main +package com.owenlejeune.tvtime.ui.screens import android.os.Build import android.widget.Toast @@ -37,7 +37,7 @@ import com.owenlejeune.tvtime.OnboardingActivity import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.preferences.AppPreferences import com.owenlejeune.tvtime.ui.components.* -import com.owenlejeune.tvtime.ui.navigation.MainNavItem +import com.owenlejeune.tvtime.ui.navigation.AppNavItem import com.owenlejeune.tvtime.ui.views.HomeTabRecyclerAdapter import com.owenlejeune.tvtime.ui.views.ItemMoveCallback import com.owenlejeune.tvtime.utils.ResourceUtils @@ -49,9 +49,8 @@ import org.koin.java.KoinJavaComponent.get @OptIn(ExperimentalMaterial3Api::class) @Composable -fun SettingsTab( +fun SettingsScreen( appNavController: NavController, - activity: AppCompatActivity, route: String? = null, preferences: AppPreferences = get(AppPreferences::class.java) ) { @@ -110,6 +109,7 @@ fun SettingsTab( .padding(all = 24.dp), verticalArrangement = Arrangement.spacedBy(18.dp) ) { + val activity = LocalContext.current as AppCompatActivity SettingsPage.getByRoute(route).apply { appBarTitle.value = name restoreAction.value = resetPreferencesHandler @@ -188,7 +188,7 @@ private fun TopLevelSettingsCard( .wrapContentHeight() .clickable( onClick = { - appNavController.navigate("${MainNavItem.SettingsView.route}/${settingsView.route}") + appNavController.navigate("${AppNavItem.SettingsView.route}/${settingsView.route}") } ) ) { diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/WebLinkView.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/WebLinkScreen.kt similarity index 98% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/WebLinkView.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/WebLinkScreen.kt index 5614c5b..bd40945 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/WebLinkView.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/WebLinkScreen.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.ui.screens.main +package com.owenlejeune.tvtime.ui.screens import android.content.Context import android.content.Intent @@ -30,7 +30,7 @@ import org.koin.core.component.inject @OptIn(ExperimentalMaterial3Api::class) @Composable -fun WebLinkView( +fun WebLinkScreen( url: String, appNavController: NavController ) { diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/MediaTab.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/MediaTab.kt similarity index 92% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/MediaTab.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/MediaTab.kt index ed74c03..c961914 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/MediaTab.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/MediaTab.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.ui.screens.main +package com.owenlejeune.tvtime.ui.screens.tabs import androidx.compose.foundation.layout.Column import androidx.compose.material3.Text @@ -15,10 +15,11 @@ import com.google.accompanist.pager.rememberPagerState import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.ui.components.PagingPosterGrid import com.owenlejeune.tvtime.ui.components.SearchView -import com.owenlejeune.tvtime.ui.navigation.MainNavItem +import com.owenlejeune.tvtime.ui.navigation.AppNavItem import com.owenlejeune.tvtime.ui.navigation.MediaTabNavItem -import com.owenlejeune.tvtime.ui.screens.main.tabs.top.Tabs +import com.owenlejeune.tvtime.ui.components.Tabs import com.owenlejeune.tvtime.api.tmdb.viewmodel.MediaTabViewModel +import com.owenlejeune.tvtime.utils.types.MediaViewType @OptIn(ExperimentalPagerApi::class) @Composable @@ -72,7 +73,7 @@ fun MediaTabContent(appNavController: NavHostController, mediaType: MediaViewTyp lazyPagingItems = mediaListItems, onClick = { id -> appNavController.navigate( - "${MainNavItem.DetailView.route}/${mediaType}/${id}" + "${AppNavItem.DetailView.route}/${mediaType}/${id}" ) } ) diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/PeopleTab.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/PeopleTab.kt similarity index 83% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/PeopleTab.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/PeopleTab.kt index 1b45b5a..e9684c1 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/main/PeopleTab.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/PeopleTab.kt @@ -1,20 +1,18 @@ -package com.owenlejeune.tvtime.ui.screens.main +package com.owenlejeune.tvtime.ui.screens.tabs import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState -import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import androidx.paging.compose.collectAsLazyPagingItems import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.ui.components.PagingPeoplePosterGrid import com.owenlejeune.tvtime.ui.components.SearchView -import com.owenlejeune.tvtime.ui.navigation.MainNavItem +import com.owenlejeune.tvtime.ui.navigation.AppNavItem import com.owenlejeune.tvtime.api.tmdb.viewmodel.PeopleTabViewModel +import com.owenlejeune.tvtime.utils.types.MediaViewType @Composable fun PeopleTab( @@ -45,7 +43,7 @@ fun PeopleTab( }, onClick = { id -> appNavController.navigate( - "${MainNavItem.DetailView.route}/${MediaViewType.PERSON}/${id}" + "${AppNavItem.DetailView.route}/${MediaViewType.PERSON}/${id}" ) } ) diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/views/HomeTabRecyclerAdapter.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/views/HomeTabRecyclerAdapter.kt index 77bdedb..c3d5279 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/views/HomeTabRecyclerAdapter.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/views/HomeTabRecyclerAdapter.kt @@ -17,7 +17,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.recyclerview.widget.RecyclerView -import com.owenlejeune.tvtime.ui.navigation.BottomNavItem +import com.owenlejeune.tvtime.ui.navigation.HomeScreenNavItem import org.koin.core.component.KoinComponent import org.koin.core.component.get @@ -27,14 +27,14 @@ class HomeTabRecyclerAdapter: RecyclerView.Adapter + private val pages: MutableList private val indexOfDivider get() = pages.indexOf(null) init { - val visiblePages = BottomNavItem.Items.filter { it.order > -1 }.sortedBy { it.order } - val hiddenPages = BottomNavItem.Items.filter { it.order == -1 } - pages = ArrayList().apply { + val visiblePages = HomeScreenNavItem.Items.filter { it.order > -1 }.sortedBy { it.order } + val hiddenPages = HomeScreenNavItem.Items.filter { it.order == -1 } + pages = ArrayList().apply { addAll(visiblePages) add(null) addAll(hiddenPages) @@ -67,7 +67,7 @@ class HomeTabRecyclerAdapter: RecyclerView.Adapter