Gestión de Permisos en Jetpack Compose

 


    Una de las características más interesantes de cualquier dispositivo moderno es la gestión de permisos, que va a permitir a nuestros usuarios decidir si concede o no un permiso concreto a nuestra aplicación, viéndose modificado por tanto el comportamiento de nuestra app en base a esa decisión.

    Para el caso concreto de android, se nos proporcionan multitud de posibilidades, pero google nos proporciona un repositorio de componentes / utilidades que, si bien aún están en fase de desarrollo, nos permite un control bastante bueno de ciertas características, estos componentes forman parte de los componentes Accompanist, de los cuales, muchos acaban formando parte del core de desarrollo, si bien otros, acaban siendo eliminados, ya que no se consideran excesivamente útiles.

    En este artículo, vamos a ver un componente específico, y su correspondiente aplicación, que nos va a permitir la gestión sencilla de los permisos de nuestra app.

   Además vamos a encapsular este sistema de permisos en nuestro propio composable, el cual va a permitirnos generalizar este proceso de una forma que, como veremos, simplifica (y mucho) el diseño de UI.

     La documentación completa para estas librerías se encuentra en el repositorio que Google ha habilitado al efecto, en el que, además se muestra información para su despliegue. Aún así, veamos cómo desplegar y utilizar (a nuestro modo) estos componentes:


Integración en nuestro proyecto

Integrar las librerías de accompanist en nuestro proyecto no difiere en absoluto a lo que haríamos con cualquier otra dependencia, nos basta con agregar la siguiente línea a nuestro build.gradle.kts:

implementation "com.google.accompanist:accompanist-permissions:0.35.0-alpha"

Creación de nuestro composable personalizado

Para la creación de nuestro composable, vamos a encapsular las distintas características que nos proporciona la librería de accompanist, veamos el código de nuestro flamante composable:

@OptIn(ExperimentalPermissionsApi::class)@Composablefun PermissionManager(    vararg permission: String,    modifier: Modifier = Modifier,    showDeniedIfNeeded: Boolean = true,    onDenied: @Composable BoxScope.(Array<String>) -> Unit,    onGranted: @Composable BoxScope.(Array<String>) -> Unit,){    val deniedPermissions = remember { mutableStateListOf<String>() }    val grantedPermissions = remember { mutableStateListOf<String>() }    var launchedPermissionRequest by remember {        mutableStateOf(false)    }    val permissions = rememberMultiplePermissionsState(permissions = permission.toList()){ permissionResults ->        launchedPermissionRequest = true        deniedPermissions.addAll(permissionResults.filterValues { isGranted -> !isGranted }.keys)        grantedPermissions.addAll(permissionResults.filterValues { isGranted -> isGranted }.keys)    }    Box(        modifier = modifier    ){        if (launchedPermissionRequest) {            if (grantedPermissions.isNotEmpty()) {                this.onGranted(grantedPermissions.toTypedArray())            }            if (!permissions.allPermissionsGranted && showDeniedIfNeeded) {                this.onDenied(deniedPermissions.toTypedArray())            }        }else{            LaunchedEffect(permissions){                permissions.launchMultiplePermissionRequest()            }        }    }}

    Como vemos, a nuestro composable tan solo le pasamos la lista de permisos que necesita, un modifier, a fin de que indique el tamaño máximo del contenedor, y un par de composables, uno para lo que debe pintar en el caso de que se deniegue algún permiso, y otro, en el caso de que los permisos solicitados sean aceptados.

    Si nos fijamos en como se gestionan los permisos con acompanist, el proceso es tan simple como configurar la petición de permisos con un estado que se creará con rememberMultiplePermissionsState, y a continuación en función del estado de los permisos, lanzar si procede la petición (que, en caso de ser necesario, mostrará los diálogos de petición de permisos del sistema) y por último, en función de si los permisos han sido aceptados o no, mostrará un composable u otro.

Como conclusión, queda decir que gracias a esta librería de accompanist, la gestión de permisos se simplifica enormemente, además de que con este ejemplo (incluido en mi librería de componentes) podemos gestionar de forma extremadamente simple, sin necesidad de repetir el mismo código una y otra vez, el proceso de decisión en base a los permisos aceptados.

Comentarios

Entradas populares de este blog

Implementación de DecimalFormatSymbol en KMP

Creación y publicación de librerías Android utilizando MavenCentral (OSSRH)