diff --git a/permissions/src/androidTest/java/com/google/accompanist/permissions/MultiplePermissionsStateTest.kt b/permissions/src/androidTest/java/com/google/accompanist/permissions/MultiplePermissionsStateTest.kt index fa0d00359..c920b9049 100644 --- a/permissions/src/androidTest/java/com/google/accompanist/permissions/MultiplePermissionsStateTest.kt +++ b/permissions/src/androidTest/java/com/google/accompanist/permissions/MultiplePermissionsStateTest.kt @@ -16,6 +16,8 @@ package com.google.accompanist.permissions +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.test.filters.SdkSuppress import androidx.test.rule.GrantPermissionRule @@ -78,4 +80,33 @@ class MultiplePermissionsStateTest { .isEqualTo("android.permission.WRITE_EXTERNAL_STORAGE") } } + + @Test + fun previewMultiplePermissionsState_reflectsPreviewPermissionStatuses() { + composeTestRule.setContent { + CompositionLocalProvider(LocalInspectionMode provides true) { + val state = rememberMultiplePermissionsState( + listOf( + android.Manifest.permission.ACCESS_FINE_LOCATION, + android.Manifest.permission.CAMERA, + ), + previewPermissionStatuses = mapOf( + android.Manifest.permission.ACCESS_FINE_LOCATION to + PermissionStatus.Granted, + android.Manifest.permission.CAMERA to + PermissionStatus.Denied(shouldShowRationale = true), + ), + ) + + assertThat(state.allPermissionsGranted).isFalse() + assertThat(state.shouldShowRationale).isTrue() + assertThat(state.revokedPermissions).hasSize(1) + assertThat(state.revokedPermissions[0].permission) + .isEqualTo(android.Manifest.permission.CAMERA) + assertThat( + state.permissions.size == state.revokedPermissions.size + ).isFalse() + } + } + } } diff --git a/permissions/src/main/java/com/google/accompanist/permissions/MultiplePermissionsState.kt b/permissions/src/main/java/com/google/accompanist/permissions/MultiplePermissionsState.kt index 8d6cb501f..1d8c96b81 100644 --- a/permissions/src/main/java/com/google/accompanist/permissions/MultiplePermissionsState.kt +++ b/permissions/src/main/java/com/google/accompanist/permissions/MultiplePermissionsState.kt @@ -116,19 +116,25 @@ public interface MultiplePermissionsState { @OptIn(ExperimentalPermissionsApi::class) @Immutable private class PreviewMultiplePermissionsState( - permissions: List, - permissionStatuses: Map + permissionNames: List, + permissionStatuses: Map, ) : MultiplePermissionsState { - override val permissions: List = permissions.fastMap { permission -> + override val permissions: List = permissionNames.fastMap { permission -> PreviewPermissionState( permission = permission, status = permissionStatuses[permission] ?: PermissionStatus.Granted, ) } - override val revokedPermissions: List = emptyList() - override val allPermissionsGranted: Boolean = false - override val shouldShowRationale: Boolean = false + override val revokedPermissions: List = + permissions.filter { it.status != PermissionStatus.Granted } + + override val allPermissionsGranted: Boolean = + permissions.all { it.status.isGranted } || revokedPermissions.isEmpty() + + override val shouldShowRationale: Boolean = + permissions.any { it.status.shouldShowRationale } && + permissions.none { !it.status.isGranted && !it.status.shouldShowRationale } override fun launchMultiplePermissionRequest() {} }