diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9c1b7d22a..5f36ddadf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,6 +31,7 @@ android:theme="@style/Theme.Sunflower"> diff --git a/app/src/main/java/com/google/samples/apps/sunflower/GardenActivity.kt b/app/src/main/java/com/google/samples/apps/sunflower/GardenActivity.kt index ef3acc269..92a2ed328 100644 --- a/app/src/main/java/com/google/samples/apps/sunflower/GardenActivity.kt +++ b/app/src/main/java/com/google/samples/apps/sunflower/GardenActivity.kt @@ -19,7 +19,7 @@ package com.google.samples.apps.sunflower import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.core.view.WindowCompat +import androidx.activity.enableEdgeToEdge import com.google.samples.apps.sunflower.compose.SunflowerApp import com.google.samples.apps.sunflower.ui.SunflowerTheme import dagger.hilt.android.AndroidEntryPoint @@ -31,7 +31,7 @@ class GardenActivity : ComponentActivity() { super.onCreate(savedInstanceState) // Displaying edge-to-edge - WindowCompat.setDecorFitsSystemWindows(window, false) + enableEdgeToEdge() setContent { SunflowerTheme { SunflowerApp() @@ -39,4 +39,4 @@ class GardenActivity : ComponentActivity() { } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/google/samples/apps/sunflower/compose/Screen.kt b/app/src/main/java/com/google/samples/apps/sunflower/compose/Screen.kt new file mode 100644 index 000000000..4d34d4f1c --- /dev/null +++ b/app/src/main/java/com/google/samples/apps/sunflower/compose/Screen.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.sunflower.compose + +import androidx.navigation.NamedNavArgument +import androidx.navigation.NavType +import androidx.navigation.navArgument + +sealed class Screen( + val route: String, + val navArguments: List = emptyList() +) { + data object Home : Screen("home") + + data object PlantDetail : Screen( + route = "plantDetail/{plantId}", + navArguments = listOf(navArgument("plantId") { + type = NavType.StringType + }) + ) { + fun createRoute(plantId: String) = "plantDetail/${plantId}" + } + + data object Gallery : Screen( + route = "gallery/{plantName}", + navArguments = listOf(navArgument("plantName") { + type = NavType.StringType + }) + ) { + fun createRoute(plantName: String) = "gallery/${plantName}" + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/google/samples/apps/sunflower/compose/SunflowerApp.kt b/app/src/main/java/com/google/samples/apps/sunflower/compose/SunflowerApp.kt index f59541972..859907fdf 100644 --- a/app/src/main/java/com/google/samples/apps/sunflower/compose/SunflowerApp.kt +++ b/app/src/main/java/com/google/samples/apps/sunflower/compose/SunflowerApp.kt @@ -23,11 +23,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.core.app.ShareCompat import androidx.navigation.NavHostController -import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController -import androidx.navigation.navArgument import com.google.samples.apps.sunflower.R import com.google.samples.apps.sunflower.compose.gallery.GalleryScreen import com.google.samples.apps.sunflower.compose.home.HomeScreen @@ -46,19 +44,21 @@ fun SunFlowerNavHost( navController: NavHostController ) { val activity = (LocalContext.current as Activity) - NavHost(navController = navController, startDestination = "home") { - composable("home") { + NavHost(navController = navController, startDestination = Screen.Home.route) { + composable(route = Screen.Home.route) { HomeScreen( onPlantClick = { - navController.navigate("plantDetail/${it.plantId}") + navController.navigate( + Screen.PlantDetail.createRoute( + plantId = it.plantId + ) + ) } ) } composable( - "plantDetail/{plantId}", - arguments = listOf(navArgument("plantId") { - type = NavType.StringType - }) + route = Screen.PlantDetail.route, + arguments = Screen.PlantDetail.navArguments ) { PlantDetailsScreen( onBackClick = { navController.navigateUp() }, @@ -66,15 +66,17 @@ fun SunFlowerNavHost( createShareIntent(activity, it) }, onGalleryClick = { - navController.navigate("gallery/${it.name}") + navController.navigate( + Screen.Gallery.createRoute( + plantName = it.name + ) + ) } ) } composable( - "gallery/{plantName}", - arguments = listOf(navArgument("plantName") { - type = NavType.StringType - }) + route = Screen.Gallery.route, + arguments = Screen.Gallery.navArguments ) { GalleryScreen( onPhotoClick = { diff --git a/app/src/main/java/com/google/samples/apps/sunflower/compose/gallery/GalleryScreen.kt b/app/src/main/java/com/google/samples/apps/sunflower/compose/gallery/GalleryScreen.kt index e78bade63..eaf0c8c7c 100644 --- a/app/src/main/java/com/google/samples/apps/sunflower/compose/gallery/GalleryScreen.kt +++ b/app/src/main/java/com/google/samples/apps/sunflower/compose/gallery/GalleryScreen.kt @@ -62,7 +62,6 @@ fun GalleryScreen( ) } -@OptIn(ExperimentalMaterial3Api::class) @Composable private fun GalleryScreen( plantPictures: Flow>, @@ -150,4 +149,4 @@ private class GalleryScreenPreviewParamProvider : ) ), ) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/google/samples/apps/sunflower/compose/garden/GardenScreen.kt b/app/src/main/java/com/google/samples/apps/sunflower/compose/garden/GardenScreen.kt index 4821712c6..376081fe3 100644 --- a/app/src/main/java/com/google/samples/apps/sunflower/compose/garden/GardenScreen.kt +++ b/app/src/main/java/com/google/samples/apps/sunflower/compose/garden/GardenScreen.kt @@ -23,6 +23,8 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid @@ -98,7 +100,7 @@ private fun GardenList( ReportDrawnWhen { gridState.layoutInfo.totalItemsCount > 0 } LazyVerticalGrid( columns = GridCells.Fixed(2), - modifier, + modifier.imePadding(), state = gridState, contentPadding = PaddingValues( horizontal = dimensionResource(id = R.dimen.card_side_margin), @@ -257,4 +259,4 @@ private class GardenScreenPreviewParamProvider : ) ) ) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/google/samples/apps/sunflower/compose/home/HomeScreen.kt b/app/src/main/java/com/google/samples/apps/sunflower/compose/home/HomeScreen.kt index 5b274d74a..299c21467 100644 --- a/app/src/main/java/com/google/samples/apps/sunflower/compose/home/HomeScreen.kt +++ b/app/src/main/java/com/google/samples/apps/sunflower/compose/home/HomeScreen.kt @@ -16,6 +16,7 @@ package com.google.samples.apps.sunflower.compose.home +import android.util.Log import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.foundation.ExperimentalFoundationApi @@ -26,7 +27,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState @@ -85,11 +85,11 @@ fun HomeScreen( scrollBehavior = scrollBehavior ) } - ) { + ) { contentPadding -> HomePagerScreen( onPlantClick = onPlantClick, pagerState = pagerState, - modifier = Modifier.padding(it) + Modifier.padding(top = contentPadding.calculateTopPadding()) ) } } @@ -102,9 +102,6 @@ fun HomePagerScreen( modifier: Modifier = Modifier, pages: Array = SunflowerPage.values() ) { - // Use Modifier.nestedScroll + rememberNestedScrollInteropConnection() here so that this - // composable participates in the nested scroll hierarchy so that HomeScreen can be used in - // use cases like a collapsing toolbar Column(modifier) { val coroutineScope = rememberCoroutineScope() @@ -181,7 +178,7 @@ private fun HomeTopAppBar( ) } }, - modifier = modifier.statusBarsPadding(), + modifier = modifier, actions = { if (pagerState.currentPage == SunflowerPage.PLANT_LIST.ordinal) { IconButton(onClick = onFilterClick) { diff --git a/app/src/main/java/com/google/samples/apps/sunflower/compose/plantlist/PlantListScreen.kt b/app/src/main/java/com/google/samples/apps/sunflower/compose/plantlist/PlantListScreen.kt index 586f24033..a364d8f56 100644 --- a/app/src/main/java/com/google/samples/apps/sunflower/compose/plantlist/PlantListScreen.kt +++ b/app/src/main/java/com/google/samples/apps/sunflower/compose/plantlist/PlantListScreen.kt @@ -17,6 +17,9 @@ package com.google.samples.apps.sunflower.compose.plantlist import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items @@ -37,6 +40,7 @@ import com.google.samples.apps.sunflower.data.Plant @Composable fun PlantListScreen( onPlantClick: (Plant) -> Unit, + modifier: Modifier = Modifier, viewModel: PlantListViewModel = hiltViewModel(), ) { @@ -52,7 +56,8 @@ fun PlantListScreen( ) { LazyVerticalGrid( columns = GridCells.Fixed(2), - modifier = modifier.testTag("plant_list"), + modifier = modifier.testTag("plant_list") + .imePadding(), contentPadding = PaddingValues( horizontal = dimensionResource(id = R.dimen.card_side_margin), vertical = dimensionResource(id = R.dimen.header_margin) @@ -88,4 +93,4 @@ private class PlantListPreviewParamProvider : PreviewParameterProvider