From ce8efd7eeae5dcddd4053c7607cea12bbeac53cc Mon Sep 17 00:00:00 2001 From: Owen LeJeune Date: Thu, 10 Feb 2022 16:35:17 -0500 Subject: [PATCH] move main view out of main activity --- .../com/owenlejeune/tvtime/MainActivity.kt | 100 ----------------- .../tvtime/ui/components/Widgets.kt | 20 ++++ .../tvtime/ui/navigation/Routes.kt | 6 +- .../owenlejeune/tvtime/ui/screens/MainView.kt | 105 ++++++++++++++++++ .../ui/screens/{ => tabs}/FavouritesTab.kt | 0 .../tvtime/ui/screens/{ => tabs}/MoviesTab.kt | 0 .../ui/screens/{ => tabs}/SettingsTab.kt | 0 .../tvtime/ui/screens/{ => tabs}/TvTab.kt | 0 8 files changed, 126 insertions(+), 105 deletions(-) create mode 100644 app/src/main/java/com/owenlejeune/tvtime/ui/screens/MainView.kt rename app/src/main/java/com/owenlejeune/tvtime/ui/screens/{ => tabs}/FavouritesTab.kt (100%) rename app/src/main/java/com/owenlejeune/tvtime/ui/screens/{ => tabs}/MoviesTab.kt (100%) rename app/src/main/java/com/owenlejeune/tvtime/ui/screens/{ => tabs}/SettingsTab.kt (100%) rename app/src/main/java/com/owenlejeune/tvtime/ui/screens/{ => tabs}/TvTab.kt (100%) diff --git a/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt b/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt index 62d2509..28d319e 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/MainActivity.kt @@ -37,110 +37,10 @@ class MainActivity : ComponentActivity() { @Composable fun MyApp() { TVTimeTheme { - val appNavController = rememberNavController() Box { MainNavigationRoutes(navController = appNavController) } - - } -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun MainAppView(appNavController: NavController) { - val navController = rememberNavController() - val navBackStackEntry by navController.currentBackStackEntryAsState() - val currentRoute = navBackStackEntry?.destination?.route - - val appBarTitle = remember { mutableStateOf(BottomNavItem.Items[0].name) } - val decayAnimationSpec = rememberSplineBasedDecay() - val scrollBehavior = remember(decayAnimationSpec) { - TopAppBarDefaults.exitUntilCollapsedScrollBehavior(decayAnimationSpec) - } - - Scaffold( - modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), - backgroundColor = MaterialTheme.colorScheme.background, - bottomBar = { - BottomNavBar( - navController = navController, - appBarTitle = appBarTitle - ) - }, - topBar = { - TopBar( - title = appBarTitle, - scrollBehavior = scrollBehavior - ) - }, - floatingActionButton = { - if (currentRoute in listOf(BottomNavItem.Movies.route, BottomNavItem.TV.route)) { - SearchFab() - } - } - ) { innerPadding -> - Box(modifier = Modifier.padding(innerPadding)) { - BottomNavigationRoutes(navController = navController) - } - } -} - -@Composable -private fun TopBar(title: MutableState, scrollBehavior: TopAppBarScrollBehavior) { - LargeTopAppBar( - title = { Text(text = title.value) }, - scrollBehavior = scrollBehavior - ) -} - -@Composable -private fun BottomNavBar(navController: NavController, appBarTitle: MutableState) { - val navBackStackEntry by navController.currentBackStackEntryAsState() - val currentRoute = navBackStackEntry?.destination?.route - - NavigationBar { - BottomNavItem.Items.forEach { item -> - NavigationBarItem( - icon = { Icon(painter = painterResource(id = item.icon), contentDescription = null) }, - label = { Text(item.name) }, - selected = currentRoute == item.route, - onClick = { - onBottomAppBarItemClicked( - navController = navController, - appBarTitle = appBarTitle, - item = item - ) - } - ) - } - } -} - -private fun onBottomAppBarItemClicked( - navController: NavController, - appBarTitle: MutableState, - item: BottomNavItem -) { - appBarTitle.value = item.name - navController.navigate(item.route) { - navController.graph.startDestinationRoute?.let { screenRoute -> - popUpTo(screenRoute) { - saveState = true - } - } - launchSingleTop = true - restoreState = true - } -} - -@Composable -private fun SearchFab() { - val context = LocalContext.current - FloatingActionButton(onClick = { - Toast.makeText(context, "Search Clicked!", Toast.LENGTH_SHORT).show() - }) { - Icon(Icons.Filled.Search, "") } } 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 0a3b181..708465b 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 @@ -11,6 +11,10 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyVerticalGrid import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Card +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Search +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -144,4 +148,20 @@ fun TopLevelSwitchPreview() { TopLevelSwitch("This is a switch") { isChecked -> Toast.makeText(context, "Switch changed to $isChecked", Toast.LENGTH_SHORT).show() } +} + +@Composable +fun SearchFab() { + val context = LocalContext.current + FloatingActionButton(onClick = { + Toast.makeText(context, "Search Clicked!", Toast.LENGTH_SHORT).show() + }) { + Icon(Icons.Filled.Search, "") + } +} + +@Preview +@Composable +fun SearchFabPreview() { + SearchFab() } \ No newline at end of file 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 index 3489018..e795f36 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/Routes.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/Routes.kt @@ -4,11 +4,7 @@ import androidx.compose.runtime.Composable import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable -import com.owenlejeune.tvtime.MainAppView -import com.owenlejeune.tvtime.ui.screens.FavouritesTab -import com.owenlejeune.tvtime.ui.screens.MoviesTab -import com.owenlejeune.tvtime.ui.screens.SettingsTab -import com.owenlejeune.tvtime.ui.screens.TvTab +import com.owenlejeune.tvtime.ui.screens.* @Composable fun MainNavigationRoutes(navController: NavHostController) { diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MainView.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MainView.kt new file mode 100644 index 0000000..c557f0a --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MainView.kt @@ -0,0 +1,105 @@ +package com.owenlejeune.tvtime.ui.screens + +import androidx.compose.animation.rememberSplineBasedDecay +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Scaffold +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.res.painterResource +import androidx.navigation.NavController +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import com.owenlejeune.tvtime.ui.components.SearchFab +import com.owenlejeune.tvtime.ui.navigation.BottomNavItem +import com.owenlejeune.tvtime.ui.navigation.BottomNavigationRoutes + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MainAppView(appNavController: NavController) { + val navController = rememberNavController() + val navBackStackEntry by navController.currentBackStackEntryAsState() + val currentRoute = navBackStackEntry?.destination?.route + + val appBarTitle = remember { mutableStateOf(BottomNavItem.Items[0].name) } + val decayAnimationSpec = rememberSplineBasedDecay() + val scrollBehavior = remember(decayAnimationSpec) { + TopAppBarDefaults.exitUntilCollapsedScrollBehavior(decayAnimationSpec) + } + + Scaffold( + modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), + backgroundColor = MaterialTheme.colorScheme.background, + bottomBar = { + BottomNavBar( + navController = navController, + appBarTitle = appBarTitle + ) + }, + topBar = { + TopBar( + title = appBarTitle, + scrollBehavior = scrollBehavior + ) + }, + floatingActionButton = { + if (currentRoute in listOf(BottomNavItem.Movies.route, BottomNavItem.TV.route)) { + SearchFab() + } + } + ) { innerPadding -> + Box(modifier = Modifier.padding(innerPadding)) { + BottomNavigationRoutes(navController = navController) + } + } +} + +@Composable +private fun TopBar(title: MutableState, scrollBehavior: TopAppBarScrollBehavior) { + LargeTopAppBar( + title = { Text(text = title.value) }, + scrollBehavior = scrollBehavior + ) +} + +@Composable +private fun BottomNavBar(navController: NavController, appBarTitle: MutableState) { + val navBackStackEntry by navController.currentBackStackEntryAsState() + val currentRoute = navBackStackEntry?.destination?.route + + NavigationBar { + BottomNavItem.Items.forEach { item -> + NavigationBarItem( + icon = { Icon(painter = painterResource(id = item.icon), contentDescription = null) }, + label = { Text(item.name) }, + selected = currentRoute == item.route, + onClick = { + onBottomAppBarItemClicked( + navController = navController, + appBarTitle = appBarTitle, + item = item + ) + } + ) + } + } +} + +private fun onBottomAppBarItemClicked( + navController: NavController, + appBarTitle: MutableState, + item: BottomNavItem +) { + appBarTitle.value = item.name + navController.navigate(item.route) { + navController.graph.startDestinationRoute?.let { screenRoute -> + popUpTo(screenRoute) { + saveState = true + } + } + launchSingleTop = true + restoreState = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/FavouritesTab.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/FavouritesTab.kt similarity index 100% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/FavouritesTab.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/FavouritesTab.kt diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MoviesTab.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/MoviesTab.kt similarity index 100% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/MoviesTab.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/MoviesTab.kt diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsTab.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/SettingsTab.kt similarity index 100% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsTab.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/SettingsTab.kt diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/TvTab.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/TvTab.kt similarity index 100% rename from app/src/main/java/com/owenlejeune/tvtime/ui/screens/TvTab.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/TvTab.kt