Add method to request multiple permissions at once (#633)

This commit is contained in:
David Perez 2024-01-16 09:54:35 -06:00 committed by Álison Fernandes
parent 880bdc8826
commit 87ea0da23f
3 changed files with 48 additions and 1 deletions

View file

@ -16,11 +16,26 @@ interface PermissionsManager {
@Composable
fun getLauncher(onResult: (Boolean) -> Unit): ManagedActivityResultLauncher<String, Boolean>
/**
* Method for creating and returning a permissions launcher that can request multiple
* permissions at once.
*/
@Composable
fun getPermissionsLauncher(
onResult: (Map<String, Boolean>) -> Unit,
): ManagedActivityResultLauncher<Array<String>, Map<String, Boolean>>
/**
* 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<String>): Boolean
/**
* Method for checking if an informative UI should be shown the user.
*/

View file

@ -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<String, Boolean> =
rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestPermission(),
onResult,
onResult = onResult,
)
@Composable
override fun getPermissionsLauncher(
onResult: (Map<String, Boolean>) -> Unit,
): ManagedActivityResultLauncher<Array<String>, Map<String, Boolean>> =
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<String>): Boolean =
permissions.map { checkPermission(it) }.all { isGranted -> isGranted }
override fun shouldShouldRequestPermissionRationale(
permission: String,
): Boolean =

View file

@ -20,6 +20,11 @@ class FakePermissionManager : PermissionsManager {
*/
var getPermissionsResult: Boolean = false
/**
* The value returned when the user is asked for permission.
*/
var getMultiplePermissionsResult: Map<String, Boolean> = 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<String, Boolean>) -> Unit,
): ManagedActivityResultLauncher<Array<String>, Map<String, Boolean>> {
return mockk {
every { launch(any()) } answers { onResult.invoke(getMultiplePermissionsResult) }
}
}
override fun checkPermission(permission: String): Boolean {
return checkPermissionResult
}
override fun checkPermissions(permissions: Array<String>): Boolean {
return checkPermissionResult
}
override fun shouldShouldRequestPermissionRationale(
permission: String,
): Boolean {