1 /*
2 * Copyright (C) 2023 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.google.jetpackcamera.ui
17
18 import android.Manifest
19 import androidx.compose.runtime.Composable
20 import androidx.compose.runtime.LaunchedEffect
21 import androidx.compose.ui.Modifier
22 import androidx.navigation.NavHostController
23 import androidx.navigation.compose.NavHost
24 import androidx.navigation.compose.composable
25 import androidx.navigation.compose.rememberNavController
26 import com.google.accompanist.permissions.ExperimentalPermissionsApi
27 import com.google.accompanist.permissions.isGranted
28 import com.google.accompanist.permissions.rememberMultiplePermissionsState
29 import com.google.jetpackcamera.BuildConfig
30 import com.google.jetpackcamera.feature.preview.PreviewMode
31 import com.google.jetpackcamera.feature.preview.PreviewScreen
32 import com.google.jetpackcamera.permissions.PermissionsScreen
33 import com.google.jetpackcamera.settings.SettingsScreen
34 import com.google.jetpackcamera.settings.VersionInfoHolder
35 import com.google.jetpackcamera.ui.Routes.PERMISSIONS_ROUTE
36 import com.google.jetpackcamera.ui.Routes.PREVIEW_ROUTE
37 import com.google.jetpackcamera.ui.Routes.SETTINGS_ROUTE
38
39 @OptIn(ExperimentalPermissionsApi::class)
40 @Composable
JcaAppnull41 fun JcaApp(
42 openAppSettings: () -> Unit,
43 /*TODO(b/306236646): remove after still capture*/
44 previewMode: PreviewMode,
45 onRequestWindowColorMode: (Int) -> Unit,
46 modifier: Modifier = Modifier
47 ) {
48 JetpackCameraNavHost(
49 previewMode = previewMode,
50 onOpenAppSettings = openAppSettings,
51 onRequestWindowColorMode = onRequestWindowColorMode,
52 modifier = modifier
53 )
54 }
55
56 @OptIn(ExperimentalPermissionsApi::class)
57 @Composable
JetpackCameraNavHostnull58 private fun JetpackCameraNavHost(
59 modifier: Modifier = Modifier,
60 previewMode: PreviewMode,
61 onOpenAppSettings: () -> Unit,
62 onRequestWindowColorMode: (Int) -> Unit,
63 navController: NavHostController = rememberNavController()
64 ) {
65 NavHost(
66 navController = navController,
67 startDestination = PERMISSIONS_ROUTE,
68 modifier = modifier
69 ) {
70 composable(PERMISSIONS_ROUTE) {
71 PermissionsScreen(
72 onNavigateToPreview = {
73 navController.navigate(PREVIEW_ROUTE) {
74 // cannot navigate back to permissions after leaving
75 popUpTo(0)
76 }
77 },
78 openAppSettings = onOpenAppSettings
79 )
80 }
81
82 composable(PREVIEW_ROUTE) {
83 val permissionStates = rememberMultiplePermissionsState(
84 permissions = listOf(
85 Manifest.permission.CAMERA,
86 Manifest.permission.RECORD_AUDIO
87 )
88 )
89 // Automatically navigate to permissions screen when camera permission revoked
90 LaunchedEffect(key1 = permissionStates.permissions[0].status) {
91 if (!permissionStates.permissions[0].status.isGranted) {
92 navController.navigate(PERMISSIONS_ROUTE) {
93 // cannot navigate back to preview
94 popUpTo(0)
95 }
96 }
97 }
98 PreviewScreen(
99 onNavigateToSettings = { navController.navigate(SETTINGS_ROUTE) },
100 onRequestWindowColorMode = onRequestWindowColorMode,
101 previewMode = previewMode
102 )
103 }
104 composable(SETTINGS_ROUTE) {
105 SettingsScreen(
106 versionInfo = VersionInfoHolder(
107 versionName = BuildConfig.VERSION_NAME,
108 buildType = BuildConfig.BUILD_TYPE
109 ),
110 onNavigateBack = { navController.popBackStack() }
111 )
112 }
113 }
114 }
115
116