1 /*
<lambda>null2 * Copyright (C) 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package com.android.providers.media.tools.photopickerv2.navigation
17 
18 import androidx.compose.foundation.layout.padding
19 import androidx.compose.runtime.Composable
20 import androidx.compose.ui.Modifier
21 import androidx.compose.ui.graphics.vector.ImageVector
22 import androidx.navigation.compose.NavHost
23 import androidx.navigation.compose.composable
24 import androidx.navigation.compose.rememberNavController
25 import com.android.providers.media.tools.photopickerv2.R
26 import com.android.providers.media.tools.photopickerv2.photopicker.PhotoPickerScreen
27 import com.android.providers.media.tools.photopickerv2.docsui.DocsUIScreen
28 import com.android.providers.media.tools.photopickerv2.pickerchoice.PickerChoiceScreen
29 import androidx.compose.material.icons.outlined.Folder
30 import androidx.compose.material.icons.outlined.PhoneAndroid
31 import androidx.compose.material.icons.outlined.PhotoLibrary
32 import androidx.annotation.StringRes
33 import androidx.compose.material.icons.Icons
34 import androidx.compose.material3.Scaffold
35 import androidx.compose.runtime.getValue
36 import androidx.navigation.NavHostController
37 import androidx.navigation.compose.currentBackStackEntryAsState
38 import com.android.providers.media.tools.photopickerv2.utils.NavigationComponent
39 
40 /**
41  * MainScreen sets up the Scaffold with a bottom navigation bar
42  * and hosts the NavGraph for navigation between the tabs.
43  */
44 @Composable
45 fun MainScreen() {
46     val navController = rememberNavController()
47     val pickerRoutes = listOf(
48         NavigationItem.PhotoPicker,
49         NavigationItem.DocsUI,
50         NavigationItem.PickerChoice
51     )
52     val navBackStackEntry by navController.currentBackStackEntryAsState()
53     val currentRoute = navBackStackEntry?.destination?.route ?: NavigationItem.PhotoPicker.route
54 
55     Scaffold(
56         /**
57          * This navigation bar is to navigate between the three tabs of the app :
58          * PhotoPicker
59          * DocsUI
60          * PickerChoice
61          **/
62         bottomBar = {
63             NavigationComponent(
64                 navController = navController,
65                 items = pickerRoutes,
66                 currentRoute = currentRoute
67             )
68         }
69     ) { innerPadding ->
70         NavGraph(navController = navController, modifier = Modifier.padding(innerPadding))
71     }
72 }
73 
74 /**
75  * NavGraph is the main navigation graph of the app.
76  * It contains the three tabs of the app :
77  * PhotoPicker
78  * DocsUI
79  * PickerChoice
80  */
81 @Composable
NavGraphnull82 fun NavGraph(navController: NavHostController, modifier: Modifier = Modifier) {
83     NavHost(
84         navController = navController,
85         startDestination = NavigationItem.PhotoPicker.route,
86         modifier = modifier
87     ) {
88         composable(NavigationItem.PhotoPicker.route) { PhotoPickerScreen() }
89         composable(NavigationItem.DocsUI.route) { DocsUIScreen() }
90         composable(NavigationItem.PickerChoice.route) { PickerChoiceScreen() }
91     }
92 }
93 
94 enum class NavigationItem(val route: String, val icon: ImageVector, @StringRes val label: Int) {
95     PhotoPicker("photopicker", Icons.Outlined.PhotoLibrary, R.string.tab_photopicker),
96     DocsUI("docsui", Icons.Outlined.Folder, R.string.tab_docsui),
97     PickerChoice("pickerchoice", Icons.Outlined.PhoneAndroid, R.string.tab_pickerchoice)
98 }
99