From 48e112cfb277c5412a058f79141f3ac276f73a30 Mon Sep 17 00:00:00 2001 From: Anshu-Bijarnia Date: Sat, 30 Mar 2024 03:55:27 +0530 Subject: [PATCH 1/3] Improved storage permission handling --- app/src/main/AndroidManifest.xml | 18 ++++--- .../com/google/jetpackcamera/ui/JcaApp.kt | 54 +++++++++++++++---- .../google/jetpackcamera/ui/PermissionsUi.kt | 34 +++++++++--- app/src/main/res/drawable/photo_storage.xml | 5 ++ app/src/main/res/values/strings.xml | 3 ++ 5 files changed, 92 insertions(+), 22 deletions(-) create mode 100644 app/src/main/res/drawable/photo_storage.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bf1b4ed49..829919c28 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - - + + + + + + - + = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + storagePermissionState = rememberMultiplePermissionsState( + permissions = listOf( + READ_MEDIA_VISUAL_USER_SELECTED, + READ_MEDIA_IMAGES, + READ_MEDIA_VIDEO + ) + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + storagePermissionState = + rememberMultiplePermissionsState( + permissions = listOf( + READ_MEDIA_IMAGES, + READ_MEDIA_VIDEO + ) + ) + } else { + storagePermissionState = + rememberMultiplePermissionsState(permissions = listOf(READ_EXTERNAL_STORAGE)) + } + if (cameraPermissionState.allPermissionsGranted && (storagePermissionState.allPermissionsGranted || storagePermissionState.permissions[0].status.isGranted)) { JetpackCameraNavHost( onPreviewViewModel = onPreviewViewModel, previewMode = previewMode ) } else { - CameraPermission( - modifier = Modifier.fillMaxSize(), - cameraPermissionState = permissionState - ) + if (!cameraPermissionState.allPermissionsGranted) { + CameraPermission( + modifier = Modifier.fillMaxSize(), + cameraPermissionState = cameraPermissionState + ) + } + if (!storagePermissionState.allPermissionsGranted && !storagePermissionState.permissions[0].status.isGranted) { + StoragePermission( + modifier = Modifier.fillMaxSize(), + storagePermissionState = storagePermissionState + ) + } } } + @Composable private fun JetpackCameraNavHost( onPreviewViewModel: (PreviewViewModel) -> Unit, @@ -82,4 +118,4 @@ private fun JetpackCameraNavHost( ) } } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/google/jetpackcamera/ui/PermissionsUi.kt b/app/src/main/java/com/google/jetpackcamera/ui/PermissionsUi.kt index 5100dff9e..1b81a98a9 100644 --- a/app/src/main/java/com/google/jetpackcamera/ui/PermissionsUi.kt +++ b/app/src/main/java/com/google/jetpackcamera/ui/PermissionsUi.kt @@ -44,12 +44,15 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.google.accompanist.permissions.ExperimentalPermissionsApi -import com.google.accompanist.permissions.PermissionState +import com.google.accompanist.permissions.MultiplePermissionsState import com.google.jetpackcamera.R @OptIn(ExperimentalPermissionsApi::class) @Composable -fun CameraPermission(modifier: Modifier = Modifier, cameraPermissionState: PermissionState) { +fun CameraPermission( + modifier: Modifier = Modifier, + cameraPermissionState: MultiplePermissionsState +) { PermissionTemplate( modifier = modifier, permissionState = cameraPermissionState, @@ -61,11 +64,28 @@ fun CameraPermission(modifier: Modifier = Modifier, cameraPermissionState: Permi ) } +@OptIn(ExperimentalPermissionsApi::class) +@Composable +fun StoragePermission( + modifier: Modifier = Modifier, + storagePermissionState: MultiplePermissionsState +) { + PermissionTemplate( + modifier = modifier, + permissionState = storagePermissionState, + painter = painterResource(id = R.drawable.photo_storage), + iconAccessibilityText = stringResource(id = R.string.storage_permission_accessibility_text), + title = stringResource(id = R.string.storage_permission_screen_title), + bodyText = stringResource(id = R.string.storage_permission_required_rationale), + requestButtonText = stringResource(id = R.string.request_permission) + ) +} + @OptIn(ExperimentalPermissionsApi::class) @Composable fun PermissionTemplate( modifier: Modifier = Modifier, - permissionState: PermissionState, + permissionState: MultiplePermissionsState, onSkipPermission: (() -> Unit)? = null, painter: Painter, iconAccessibilityText: String, @@ -127,7 +147,7 @@ fun PermissionImage(modifier: Modifier = Modifier, painter: Painter, accessibili @Composable fun PermissionButtonSection( modifier: Modifier = Modifier, - permissionState: PermissionState, + permissionState: MultiplePermissionsState, requestButtonText: String, onSkipPermission: (() -> Unit)? ) { @@ -160,7 +180,7 @@ fun PermissionButtonSection( @Composable fun PermissionButton( modifier: Modifier = Modifier, - permissionState: PermissionState, + permissionState: MultiplePermissionsState, requestButtonText: String ) { Button( @@ -169,7 +189,7 @@ fun PermissionButton( containerColor = MaterialTheme.colorScheme.primaryContainer, contentColor = MaterialTheme.colorScheme.onPrimaryContainer ), - onClick = { permissionState.launchPermissionRequest() } + onClick = { permissionState.launchMultiplePermissionRequest() } ) { Text( modifier = Modifier.padding(10.dp), @@ -232,4 +252,4 @@ fun PermissionBodyText(modifier: Modifier = Modifier, text: String, color: Color style = MaterialTheme.typography.bodyLarge, textAlign = TextAlign.Center ) -} +} \ No newline at end of file diff --git a/app/src/main/res/drawable/photo_storage.xml b/app/src/main/res/drawable/photo_storage.xml new file mode 100644 index 000000000..8da2e7255 --- /dev/null +++ b/app/src/main/res/drawable/photo_storage.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e435f3370..0be4ccbaa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,8 +17,11 @@ Jetpack Camera Enable Camera + Provide Storage Access Please provide permission to access to the camera. It is necessary for this app to function. + Please provide permission to access to the storage. It is necessary for this app to function. A symbol representing a camera + A symbol representing storage Allow Access Loading App… Camera not available From 82abadebc8c72b5bd758d61f857c991c4ef078df Mon Sep 17 00:00:00 2001 From: Anshu-Bijarnia Date: Fri, 19 Apr 2024 21:15:07 +0530 Subject: [PATCH 2/3] Updated permissions --- .../androidTest/java/com/google/jetpackcamera/AppTestUtil.kt | 3 +++ app/src/main/AndroidManifest.xml | 4 +++- app/src/main/java/com/google/jetpackcamera/ui/JcaApp.kt | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/com/google/jetpackcamera/AppTestUtil.kt b/app/src/androidTest/java/com/google/jetpackcamera/AppTestUtil.kt index 550b1c1ea..a4c6096ff 100644 --- a/app/src/androidTest/java/com/google/jetpackcamera/AppTestUtil.kt +++ b/app/src/androidTest/java/com/google/jetpackcamera/AppTestUtil.kt @@ -22,4 +22,7 @@ val APP_REQUIRED_PERMISSIONS: List = buildList { if (Build.VERSION.SDK_INT <= 28) { add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) } + if(Build.VERSION.SDK_INT < 32){ + add(android.Manifest.permission.READ_EXTERNAL_STORAGE) + } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 829919c28..dc95bc144 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,7 +24,9 @@ android:required="false" /> - + Date: Tue, 30 Apr 2024 12:22:47 +0530 Subject: [PATCH 3/3] Updated AppTestUtil --- .../java/com/google/jetpackcamera/AppTestUtil.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/androidTest/java/com/google/jetpackcamera/AppTestUtil.kt b/app/src/androidTest/java/com/google/jetpackcamera/AppTestUtil.kt index a4c6096ff..a646b7b5a 100644 --- a/app/src/androidTest/java/com/google/jetpackcamera/AppTestUtil.kt +++ b/app/src/androidTest/java/com/google/jetpackcamera/AppTestUtil.kt @@ -25,4 +25,11 @@ val APP_REQUIRED_PERMISSIONS: List = buildList { if(Build.VERSION.SDK_INT < 32){ add(android.Manifest.permission.READ_EXTERNAL_STORAGE) } + if (Build.VERSION.SDK_INT >= 33) { + add (android.Manifest.permission.READ_MEDIA_IMAGES) + add (android.Manifest.permission.READ_MEDIA_VIDEO) + } + if (Build.VERSION.SDK_INT >= 34) { + add(android.Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED) + } }