Despliegue de VPS Linux con servicios gestionados

  Desde que comencé a trastear con ordenadores (allá por el año 87 /88) siempre me ha fascinado cómo funcionan, como se configuran y sobre todo desplegar nuevos servicios o procesos de forma lo más "artesanal" posible, sin recurrir en la medida de lo posible, a paquetes autocontenidos (aunque a veces, por la característica del servicio no queda otra). En esta entrada de blog, y en sucesivas entradas, voy a mostrar cómo he configurado mi servidor VPS para que albergue una serie de servicios configurados por mi (a mano) para, aparte de tener control sobre qué instalo, aprender y/o refrescar conocimientos sobre servicios que hacía ya bastante que no tocaba. Básicamente en esta entrada, por ser la primera, voy a enumerar los distintos servicios que corren en mi VPS, así como indicar la hoja de ruta de los sucesivos posts, y como no, comenzaré por describir los servicios típicos que todo VPS (creo) debe proporcionar. Así pues, mi VPS corre los siguientes servicios (alguno públicos...

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

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

Implementación de DecimalFormatSymbol en KMP