From 87ea0da23fdc01e115377efc26bd4f3f65f97166 Mon Sep 17 00:00:00 2001 From: David Perez Date: Tue, 16 Jan 2024 09:54:35 -0600 Subject: [PATCH] Add method to request multiple permissions at once (#633) --- .../manager/permissions/PermissionsManager.kt | 15 +++++++++++++++ .../permissions/PermissionsManagerImpl.kt | 16 +++++++++++++++- .../permissions/FakePermissionManager.kt | 18 ++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/manager/permissions/PermissionsManager.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/manager/permissions/PermissionsManager.kt index e530013430..c8ffed65fb 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/manager/permissions/PermissionsManager.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/manager/permissions/PermissionsManager.kt @@ -16,11 +16,26 @@ interface PermissionsManager { @Composable fun getLauncher(onResult: (Boolean) -> Unit): ManagedActivityResultLauncher + /** + * Method for creating and returning a permissions launcher that can request multiple + * permissions at once. + */ + @Composable + fun getPermissionsLauncher( + onResult: (Map) -> Unit, + ): ManagedActivityResultLauncher, Map> + /** * Method for checking whether the permission is granted. */ fun checkPermission(permission: String): Boolean + /** + * Method for checking whether the permissions are granted. This returns `true` only if all + * permissions have been granted, `false` otherwise. + */ + fun checkPermissions(permissions: Array): Boolean + /** * Method for checking if an informative UI should be shown the user. */ diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/manager/permissions/PermissionsManagerImpl.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/manager/permissions/PermissionsManagerImpl.kt index 0be9f1a4c2..be13a8799c 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/manager/permissions/PermissionsManagerImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/manager/permissions/PermissionsManagerImpl.kt @@ -7,10 +7,12 @@ import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.Composable import androidx.core.content.ContextCompat +import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage /** * Primary implementation of [PermissionsManager]. */ +@OmitFromCoverage class PermissionsManagerImpl( private val activity: Activity, ) : PermissionsManager { @@ -21,7 +23,16 @@ class PermissionsManagerImpl( ): ManagedActivityResultLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.RequestPermission(), - onResult, + onResult = onResult, + ) + + @Composable + override fun getPermissionsLauncher( + onResult: (Map) -> Unit, + ): ManagedActivityResultLauncher, Map> = + rememberLauncherForActivityResult( + contract = ActivityResultContracts.RequestMultiplePermissions(), + onResult = onResult, ) override fun checkPermission(permission: String): Boolean = @@ -30,6 +41,9 @@ class PermissionsManagerImpl( permission, ) == PackageManager.PERMISSION_GRANTED + override fun checkPermissions(permissions: Array): Boolean = + permissions.map { checkPermission(it) }.all { isGranted -> isGranted } + override fun shouldShouldRequestPermissionRationale( permission: String, ): Boolean = diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/manager/permissions/FakePermissionManager.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/manager/permissions/FakePermissionManager.kt index e9bf92a85a..f8ef5e8077 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/manager/permissions/FakePermissionManager.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/manager/permissions/FakePermissionManager.kt @@ -20,6 +20,11 @@ class FakePermissionManager : PermissionsManager { */ var getPermissionsResult: Boolean = false + /** + * The value returned when the user is asked for permission. + */ + var getMultiplePermissionsResult: Map = emptyMap() + /** * * The value for whether a rationale should be shown to the user. */ @@ -34,10 +39,23 @@ class FakePermissionManager : PermissionsManager { } } + @Composable + override fun getPermissionsLauncher( + onResult: (Map) -> Unit, + ): ManagedActivityResultLauncher, Map> { + return mockk { + every { launch(any()) } answers { onResult.invoke(getMultiplePermissionsResult) } + } + } + override fun checkPermission(permission: String): Boolean { return checkPermissionResult } + override fun checkPermissions(permissions: Array): Boolean { + return checkPermissionResult + } + override fun shouldShouldRequestPermissionRationale( permission: String, ): Boolean {