Switch de características con AGC Remote Configuration
Tags: android, kotlin
Published: 2021-04-20 23:22:39

El lanzamiento de nuevas características dentro de una aplicación es siempre un proceso desafiante en la vida de un desarrollador. Aunque nos gustaría que la app con sus nuevas características funcione a la perfeción, sabemos que no siempre es así. Aquí es dónde el Switch de características entra en acción, usando esta técnica, usando esta técnica, serás capaz de mostrar u ocultar una característica de tu app, sin necesidad de publicar una actualización.

_Nota: Este artículo es una traducción del artículo [Feature Toggling with Remote Config](https://forums.developer.huawei.com/forumPortal/en/topic/0203418933444690037) publicado originalmente en el Huawei Developer Forum por el usuario k4t****@***il.com_

#El objetivo
En este artículo vamos a lanzar una nueva característica en una app que podrá ser habilitada o deshabilitada al cambiar un valor remotamente.

#Pasos
1. Configurar un proyecto para funcionar con las APIs de Huawei
2. Habilitar el servicio de Remote Configuration
3. Agregar el SDK al proyecto Android
4. Usar los valores remotos para cambiar la disponibilidad de la nueva característica

#Configurando el proyecto para funcionar con las APIs de Huawei
Este paso es obligatorio para usar la mayoría de los SDKs de Huawei, en caso de que nunca hayas realizado esta configuración, puedes seguir esta [guía](https://developer.huawei.com/consumer/en/codelab/HMSPreparation/index.html#0) que te ayudará a configurar tu proyecto paso a paso.

![](https://miro.medium.com/max/1400/1*kAWPav1ks3Uf4wIimoA9yQ.png)

#Habilitando el servicio de Remote Configuration
Antes de usar Remote Config, es necesario que habilites el servicio en AppGallery Connect. Para hacerlo, ve a la pestaña **“Manage APIs”** y activa el switch de **Remote Configuration**.

![](https://miro.medium.com/max/1400/0*uGVYLByLIsj6PKYf.png)

Ahora usa el panel izquierdo para navegar hacia la consola de Remote Configuration _(Growing>Remote Configuration)_ está ubicada un par de opciones debajo de **“Project Settings”**. La consola estará deshabilitada por defecta ya que recién habilitamos el servicio. Para habilitarla, solo haz clic en **“Enable now”**.

![](https://miro.medium.com/max/1400/0*7mNHZsVM1cPXFPIJ.png)

#Agregando las dependencias
Agrega el SDK de Remote Config al archivo build.gradle de tu proyecto.

```
dependencies {
// Configure the following address.
implementation 'com.huawei.agconnect:agconnect-remoteconfig:1.5.1.300'
}
```

Ahora sincroniza el proyecto con gradle para descargar el SDK. Puedes hacerlo presionando el botón “**Sync project with gradle files**”

![](https://miro.medium.com/max/184/0*hv4dPZbj6DqH4IUE.png)

#Cambiando la funcionalidad de la app basado en el valor remoto
##Fundamentos
En el fondo, el switch de características es una simple condición if/else que determinará si el disparador de una acción (como un botón, una imagen, un diálogo, etc) debe ser desplegado o no. Algo similar a esto:

```
if( veryCoolFeatureIsEnabled ){
showFeature()
}
else{
hideFeature()
}
```

Parece simple ¿no? Realmente lo es. Puedes implementar esta técnica de múltiples formas, almacenando el valor de esta bandera en una base de datos, programar la aparición de esa característica (si eres un temerario) o en este caso, usar una herramienta que permita administrar esta condición a distancia.

##Configurando parámetros remotos

El primer paso es crear los parámetros remotos en la consola de Remote configuration. Para hacerlo, presiona el botón “**Add parameter**”.

![](https://miro.medium.com/max/1400/0*99YmOTJI9m69f932.png)

Una vez ahí, crea un parámetro para administrar la disponibilidad de nuestra nueva característica. En este caso, crearemos el parámetro ENABLE_COOL_FEATURE y ajustaremos su valor en true.

![](https://miro.medium.com/max/1400/0*alPIMiPz94_jJHlB.png)

Una vez configurados todos los parámetros necesarios, debemos presionar el botón “**Release**” para aplicar la configuración.

![](https://miro.medium.com/max/1400/0*RtIAnaCJ2GyJEYFu.png)

so es todo lo que necesitamos hacer en la consola de Remote Configuration. Es momento de pasar al código.

##Estableciendo valores por defecto para los parámetros remotos
Antes de cargar los parámetros configurados en la consola, la aplicación debe cargar sus valores por defecto para garantizar una ejecición correcta. Para esto, crearemos un archivo llamado remote_config.xml dentro del directorio de recursos res/xml/. Si este directorio no existe en tu proyecto, deberás crearlo.

```
<?xml version="1.0" encoding="utf-8"?>
<remoteconfig>
<value key="ENABLE_COOL_FEATURE">false</value>
</remoteconfig>
```

#Leyendo los parámetros remotos en la app
Primero, debemos crear una constante que contenga exáctamene el mismo nombre que le asignamos a nuestro parámetro remoto en la consola.

```
const val ENABLE_COOL_FEATURE = "ENABLE_COOL_FEATURE";
```

Luego, debemos obtener una instancia de AGConnectConfig.

```
val config= AGConnectConfig.getInstance()
```

Carga los valores por defecto.

```
config.applyDefault(R.xml.remote_config);
```

Ahora sólo debemos actualizar los valores leyendo los parámetros remotos.

```
config.fetch(0)
    .addOnSuccessListener { configValues -> 
        config.apply(configValues)
    }.addOnFailureListener { e -> 
        Log.e("REMOTE CONFIGURATION", "fetch setting failed: " + e.message) 
    }
```

Y eso es todo, una vez que se dispara el onSuccessListener tendrás el valor más reciente de los parámetros remotos. Ahora podrás acceder a ellos de la siguiente forma.

```
config.getValueAsBoolean(ENABLE_COOL_FEATURE);
```

Ahora puedes usar estos valores para habilitar o deshabilitar características de forma remota sin necesidad de actualizar la app.

#Conclusión
¿Por qué esta simple característica es tan poderosa? Es porque te permite experimentar, ahora puedes liberar una nueva característica en tu aplicación a un porcentaje de sus usuarios, analizar lo que salió bien y lo que salió mal, arreglarla, intentarlo de nuevo y liberarla con una menor probabilidad de fallar y una mayor estabilidad a toda la base de usuarios. Permite gestionar su crecimiento y conocer el impacto de la característica gradualmente, si tu nueva característica permite al usuario subir fotos, será más fácil manejar los datos almacenados por 100 usuarios que por 100000. Puedes comprobar cosas como el tráfico de datos o el tiempo de servidor usado y adaptar todo para manejar el nuevo grupo de usuarios que viene. También aumenta la productividad y la seguridad, ya que muchos desarrolladores pueden trabajar en diferentes características y todavía mantienen la aplicación estable porque el código detrás de la función no se ejecutará hasta que se habilite.