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.  ...

Implementación de DecimalFormatSymbol en KMP



Cuando desarrollamos para Multiplataforma, pueden ser necesarias algunas utilidades que damos por sentadas en desarrollo nativo (en el que disponemos de prácticamente toda la JVM). Una de estas utilidades, que vamos a necesitar para acceder a ciertos elementos de configuración del sistema numérico, es la clase DecimalFormatSymbol que, si bien tenemos disponible tanto para android como para la JVM, no disponemos de ella en la parte iOS, por tanto, y mientras no se incluya de serie en el framework para KMP, necesitaremos agregarla por nuestra cuenta. En este pequeño artículo, agregaremos esta funcionalidad, implementando en cada plataforma soportada (Android, iOS, JVM) lo necesario para disponer de esta clase de forma global.


Implementación en commonMain


```kotlin
expect class MPDecimalFormatSymbols {
    companion object {
        fun getInstance(): MPDecimalFormatSymbols
    }
    val decimalSeparator: Char
    val groupingSeparator: Char
    val zeroDigit: Char
    val perMill: String
    val percent: Char
    val digit: Char
    val patternSeparator: Char
    val infinity: String
    val naN: String
    val minusSign: Char
    val currencySymbol: String
    val internationalCurrencySymbol: String
    val monetaryDecimalSeparator: Char
    val monetaryGroupingSeparator: Char
    val exponentialSeparator: String
}
```
Implementación en androidMain

```kotlin
import java.text.DecimalFormatSymbols
import java.util.*

actual class MPDecimalFormatSymbols {
    private val decimalSymbols = DecimalFormatSymbols(Locale.getDefault())

    actual val decimalSeparator: Char
        get() = decimalSymbols.decimalSeparator
    actual val groupingSeparator: Char
        get() = decimalSymbols.groupingSeparator
    actual val zeroDigit: Char
        get() = decimalSymbols.zeroDigit
    actual val perMill: String
        get() = decimalSymbols.perMill.toString()
    actual val percent: Char
        get() = decimalSymbols.percent
    actual val digit: Char
        get() = decimalSymbols.digit
    actual val patternSeparator: Char
        get() = decimalSymbols.patternSeparator
    actual val infinity: String
        get() = decimalSymbols.infinity
    actual val naN: String
        get() = decimalSymbols.naN
    actual val minusSign: Char
        get() = decimalSymbols.minusSign
    actual val currencySymbol: String
        get() = decimalSymbols.currencySymbol
    actual val internationalCurrencySymbol: String
        get() = decimalSymbols.internationalCurrencySymbol
    actual val monetaryDecimalSeparator: Char
        get() = decimalSymbols.monetaryDecimalSeparator
    actual val monetaryGroupingSeparator: Char
        get() = decimalSymbols.monetaryGroupingSeparator
    actual val exponentialSeparator: String
        get() = decimalSymbols.exponentSeparator

    actual companion object {
        actual fun getInstance(): MPDecimalFormatSymbols = MPDecimalFormatSymbols()
    }
}
```

Implementación en iosMain

```kotlin
import platform.Foundation.NSLocale
import platform.Foundation.NSNumberFormatter

actual class MPDecimalFormatSymbols {
    private val decimalSymbols = NSNumberFormatter().apply { locale = NSLocale.new()!! }

    actual val decimalSeparator: Char
        get() = decimalSymbols.decimalSeparator.first()
    actual val groupingSeparator: Char
        get() = decimalSymbols.groupingSeparator.first()
    actual val zeroDigit: Char
        get() = decimalSymbols.zeroSymbol?.first() ?: '0'
    actual val perMill: String
        get() = decimalSymbols.perMillSymbol
    actual val percent: Char
        get() = '%'
    actual val digit: Char
        get() = '0'
    actual val patternSeparator: Char
        get() = ';'
    actual val infinity: String
        get() = "∞"
    actual val naN: String
        get() = "NaN"
    actual val minusSign: Char
        get() = decimalSymbols.minusSign.first()
    actual val currencySymbol: String
        get() = decimalSymbols.currencySymbol
    actual val internationalCurrencySymbol: String
        get() = decimalSymbols.internationalCurrencySymbol
    actual val monetaryDecimalSeparator: Char
        get() = decimalSymbols.currencyDecimalSeparator.first()
    actual val monetaryGroupingSeparator: Char
        get() = decimalSymbols.currencyGroupingSeparator.first()
    actual val exponentialSeparator: String
        get() = decimalSymbols.exponentSymbol

    actual companion object {
        actual fun getInstance(): MPDecimalFormatSymbols = MPDecimalFormatSymbols()
    }
}
```
Implementación en jvmMain
```kotlin
import java.text.DecimalFormatSymbols
import java.util.*

actual class MPDecimalFormatSymbols {
    private val decimalSymbols = DecimalFormatSymbols(Locale.getDefault())

    actual val decimalSeparator: Char
        get() = decimalSymbols.decimalSeparator
    actual val groupingSeparator: Char
        get() = decimalSymbols.groupingSeparator
    actual val zeroDigit: Char
        get() = decimalSymbols.zeroDigit
    actual val perMill: String
        get() = decimalSymbols.perMill.toString()
    actual val percent: Char
        get() = decimalSymbols.percent
    actual val digit: Char
        get() = decimalSymbols.digit
    actual val patternSeparator: Char
        get() = decimalSymbols.patternSeparator
    actual val infinity: String
        get() = decimalSymbols.infinity
    actual val naN: String
        get() = decimalSymbols.naN
    actual val minusSign: Char
        get() = decimalSymbols.minusSign
    actual val currencySymbol: String
        get() = decimalSymbols.currencySymbol
    actual val internationalCurrencySymbol: String
        get() = decimalSymbols.internationalCurrencySymbol
    actual val monetaryDecimalSeparator: Char
        get() = decimalSymbols.monetaryDecimalSeparator
    actual val monetaryGroupingSeparator: Char
        get() = decimalSymbols.monetaryGroupingSeparator
    actual val exponentialSeparator: String
        get() = decimalSymbols.exponentSeparator

    actual companion object {
        actual fun getInstance(): MPDecimalFormatSymbols = MPDecimalFormatSymbols()
    }
}
```

Comentarios

Entradas populares de este blog

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

Gestión de Permisos en Jetpack Compose