# Se vienen cositas en Android tras la Google I/O
###### tags: `google-io`, `blog`
Hace unas semanas se celebró una nueva edición de la **Google I/O**, evento en el que el gigante tecnológico presenta anualmente las novedades de sus productos, plataformas y herramientas de desarrollo.
En lo que concierne a Android, han sido muchas las novedades que se presentaron cómo la nueva versión del sistema operativo, **Android 12**, enfocado en mejorar la privacidad y con una vuelta de tuerca al aspecto visual con **Material You**.
Siguen firmes en su clara apuesta por modernizar el desarrollo en la plataforma con **Android Jetpack**, con numerosas nuevas librerías o funcionalidades en las ya existente, dedicando especial atención al nuevo framework para implementar de manera declarativa las interfaces de usuario, **Compose**.
Además, **Kotlin** sigue cogiendo peso como lenguaje para el desarrollo en la plataforma y por ello apuesta por mejorar el rendimiento en la construcción y compilación de las aplicaciones con **Kotlin Symbol Processing** y **Gradle Android Plugin 7.0**, incluídas en la futura versión de **Android Studio** que tendrá por nombre **Artic Fox**, con más herramientas para facilitar el trabajo diario de los desarrolladores.
## Y ya vamos por Android 12

La nueva versión del sistema operativo, viene con el mayor cambio de diseño realizado hasta la fecha por parte de Google. Continua apostando por la seguridad y privacidad de los usuario mediante más control y monitorización de lo que hacen las aplicaciones que usamos, por fin incluyen el aclamado permiso de Bluetooth independiente al de Localización (¡Aleluya!).
### Material You

El nuevo paso para **Material Design**, un cambio radical a la manera de pensar los diseños en Android, enfocado en las emociones y expresividad, además de personalizar el estilo del sistema operativo y las aplicaciones a los gustos personales de cada usuario, todo ello sin olvidar la accesibilidad y siendo adaptativo a cada tipo de pantalla en la que se visualicen nuestras aplicaciones.
## Desarrollo moderno en Android
Hace varios I/Os que se presentó en sociedad **Jetpack**, un conjunto de bibliotecas para facilitar a los desarrolladores a seguir buenas prácticas reduciendo el código a implementar haciéndolo más robusto y coherente para los diferentes dispositivos y versiones de Android.

### Camera X
Por fin tenemos disponible CameraX en versión estable. Con ella podremos integrar de manera sencilla el uso de la cámara de los dispositivos ofreciéndonos una API coherente, simple, afín al ciclo de vida de las aplicaciones y mejorando el rendimiento en la inicialización de la cámara y en la captura de las fotografías. También provee de funciones para aprovechar las últimas mejoras y efectos tales como los modo Retrato, HDR, nocturno y modo belleza.
```kotlin
// Set up the CameraController
val cameraController = LifecycleCameraController(context)
cameraController.bindToLifecycle(lifecycleOwner)
// Attach the CameraController to PreviewView
val previewView = findViewById(R.id.preview_view)
previewView.setController(cameraController)
// Use the CameraController
cameraController.takePicture(...)
```
### Hilt
Ya hemos hablado por [aquí](https://www.sdos.es/blog/como-integrar-hilt-en-proyecto-android-modular) de la nueva librería para la inyección de dependencias en Android que pasa también a versión estable. Simplifica esta tarea a veces compleja con una capa de abstracción sobre Dagger2.
```kotlin
@HiltViewModel
class MyViewModel @Inject constructor(
val handle: SavedStateHandle,
val repository: Repository,
) : ViewModel {
//...
}
@AndroidEntryPoint
class MyFragment : Fragment() {
val viewModel: MyViewModel by viewModels()
val navigationGraphScoped: MyViewMode by hiltNavGraphViewModels(R.id.nav_graph)
}
@HiltWorker
class MyWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted params: WorkerParameters,
repo: Repository,
) : Worker {
//...
}
```
### Paging 3.0
Tenemos también la versión estable de esta librería para cargar y mostrar datos por trozos conuuntamente con `RecyclerView` optimizando el rendimiento y uso del recursos del sistema.

### Security Crypto
La última librería estable que viene a ayudarnos a cifrar los archivos y preferencias de nuestras apps.
```kotlin
val prefs: SharedPreferences = EncryptedSharedPreferences.create(
context,
"prefs_file_name",
mainKey,
prefKeyEncryptionScheme = AES256_SIV,
prefValueEncryptionScheme = AES256_GCM,
)
prefs.edit()
.putBoolean("show_completed", true)
.apply()
```
### Nuevas incoporaciones a Jetpack
- **DataStore**: van a proveernos de una solución simple, robusta y alternativa a las `SharedPreferences`, totalmente asíncrona e integrada con las Corutinas y Flow de Kotlin. Dependiendo de las necesidades, tendremos varias opciones de implementación:
- **Proto**: Fuertemente tipada mediande esquemas de datos.
- **Preference**: Guardado mediante claves-valor
- **Custom**: Provee la posibilidad de implementar una solución ad-hoc.
- **Macrobenchmark**: con esta biblioteca vamos a poder medir con precisión el rendimiento tanto en la inicialización como durante el uso de la misma, tanto localmente cómo con nuestros procesos de integración continua, verificando los resultados y posibles regresiones antes de publicar nuevas versiones.
- **AppSearch**: biblioteca para la optimización de búsquedas de texto completo dentro de la app cómo en el dispositivo:
- Totalmente funcional con respecto a SQL
- Búsqueda avanzada de texto completo
- Incluye esquemas comunes para tipos de objeto, basados en [schemas.org](https://schema.org/)
- **Google Shortcuts**: biblioteca para integración de shortcuts de Google Assistant y otros productos de la compañia.
- **Emoji2**: Emojis para todos.
### Mejoras en las librerías existentes
- **WorkManager**: a partir de la versión 2.5 da soporte a múltiples procesos y en la futura versión 2.7 podremos manegar las restricciones de primer plano incluidas en Android S
- **Room**: Soporte a enumeraciones, `QueryCallback` para simplificar tareas como registrar trazas tras las ejecuciones, anotación `ProvidedTypeConverter` y soporte experimental con `Kotlin Symbol Processing` que promete compilaciones 2x más rápidas que con `kapt`
```kotlin
@ProvidedTypeConverter
class TimeStampConverter(timeformat: String) {
@TypeConverter
fun fromTimestamp(value: Long) {
//...
}
}
Room.inMemoryDatabaseBuilder(context, CacheDatabase::class)
.addTypeConverter(TimeStampConverter(getPreferredTimeFormat()))
.build()
```
- **ConstraintLayout**: Mejoras de rendimiento y corrección de incidencias.
- **Fragment**: Mejoras de rendimiento, integración con `ActivityResult` y nueva interfaz `FragmentOnAttachListener`
```kotlin
// Obtain the fragment manager. May be a childFragmentManager,
// if in a fragment, to observe child attachment
val fragmentManager = supportFragmentManager
val listener = FragmentOnAttachListener { fragmentManager, fragment ->
// Respond to the fragment being attached.
}
fragmentManager.addFragmentOnAttachListener(listener)
```
- Navigation: Este framework de navegación va a incluir soporte para navegar con múltiples backstacks
- Integraciones con Compose: la mayoría de bibliotecas ya incluyen integración con Compose (Hilt, Paging, Navigation, Activity, ViewModel, ConstraintLayout...)
## Compone la UI con Compose
Ya venía avisando la gran G mediante su comunidad de **Android Developer Experts** que el futuro de la implementación de UIs estaba a la vuelta de la esquina y ya ha anunciado que **Jetpack Compose** será estable este mismo Julio.
Compose es el kit de herramientas modernos para compilar UI navitas en Android. Viene a simplificar y acelerar el desarrollo de la UI permitiéndonos que nuestras apps cobre vida con menos código, herramientas más potentes y APIs intuitivas, de la mano de Kotlin.
```kotlin
@Composable
fun JetpackCompose(){
Card{
var expanded by remember { mutableStateOf(false) }
Column(Modifier.clickable {expanded = !expanded}) {
Image(painterResource(R.drawable.jetpack_compose))
AnimatedVisivility(expanded){
Text(
text = "Jetpack Compose",
style = MaterialTheme.typography.h2,
)
}
}
}
}
```

Próximamente iremos publicando una serie de post relacionados con Compose al igual que hemos venido haciendo con [SwiftUI](https://www.sdos.es/blog/descubre-swiftui-indice-de-contenidos) (su homólogo en iOS).
## Kotlin es nuestro amigo
Desde 2017 Google declaró claramente su apuesta por Kotlin como lenguaje de desarrollo para aplicaciones Android. Actualmente el 80% del top 1000 están implementadas en este lenguaje y el 60% de los desarrolladores profesionales trabajan con él, en SDOS el 100%. :sunglasses: :blue_heart:
Ya hemos contado [aquí](https://www.sdos.es/blog/android-loves-kotlin-todo-sobre-el-nuevo-lenguaje-de-programacion-oficial) que muchos los beneficios de implementar nuestras apps con Kotlin (expresividad, seguro, interoperabilidad, concurrencia estructurada). Como dato, se ha reducido un 10% los errores producidos por nulos.
Nos van a seguir haciendo la vida más sencilla gracias a **Kotlin Symbol Processing**, herramienta que viene a sustituir a su homólogo `kapt` prometiendo compilaciones 2x más rápidas. Además, con la versión 1.5 de Kotlin han trabajado en la reimplementación del compilador, todo para mejorar los tiempos de construcción y compilación.
En cuando a bibliotecas, además de Compose, tenemos más versiones de extensiones como `PlayCore`, `Map & Places` y `Android KTX`
Quizás el elemento más importante en cuando a las novedades sea `Flow` y sus hijos `StateFlow` y `SharedFlow` que vienen con el objetivo de heredar el legado de LiveData pero propios al lenguaje y ofrecer además soluciones a problemas más complejos de concurrencia y gestión de hilos.
## ¿Desarrollar ayudado un Zorro Ártico?
A partir de la próxima versión, Google ha decidido cambiar el versionado de Android Studio dándole más significado. Esta versión será la 2020.3.1 (dónde 2020 es el año de la versión de Intellij, 3 versión major del IDE de Jetbrains y 1 la versión mayor de Android Studio). También parece que van a recibir nombres y esta primera versión será Artic Fox.

Esta nueva versión incluíra muchísimas herramientas para ayudarnos a implementar nuestras aplicaciones, ya sea a nivel de diseño, para realizar pruebas en dispositivos virtuales o para aumentar la productividad. Vendrá con soporte para `Kotlin Symbol Processing` y `Android Gradle Plugin 7.0.0`
### Herramientas de diseño
- Muchas relacionedas con **Compose**:
- *Preview View*: Previsualización de los diseños realizados con este framework
- *Live Literals*: Posibilidad de ver en tiempo real los cambios de texto en funciones composables
- *Constraint preview*: Previsualización de las restricciones en una vista implementada con Compose y ConstraintLayout
- *Interactive preview*: Opciones para interactuar en el propio IDE con nuestros diseños si tener que ejecutar en dispositivos virtuales o reales
- **Animated drawables**: Ventana en la que podremos visualizar animaciones implementadas mediante vectores.
- **Motion Editor**: Actualización de esta ventana para facilitar aún más las animaciones con `MotionLayout`.
- **Layout Validation y Layout Inspector**: Herramientas para la validación e inspección de los diseños realizados mediante archivos .xml
- **Accessible Scanner**: Herramienta que permitirá optimizar la accesibilidad de nuestros diseños
### Herramientas de dispositivos
- Más posibilidades para visualizar nuestras apps para diferentes resoluciones de pantalla o tipos de dispositivo.
- Device Manager integrará los dispositivo conectados reales conjuntamente con los virtuales que tengamos configurados
- Wireless ADB, con el que no tendrémos que conectar físicamente los dispositivos reales para probar o depurar nuestras aplicaciones
### Herramientas de productividad
- Test retention: Snapshots de emuladores con los que capturaremos estados de pruebas fallidas en test de intrumentación
- Profiling: Mejoras en la herramienta
- WorkManager Inspetor: Nos permitirá tener una visión más clara en la gestión de trabajos
## Google se ha puesto las pilas
Nuestra voluntad es seguir en la vanguardia tecnológica para poder implementar aplicaciones modernas, robustas y escalables, atractivas y enfocadas en tener buenas experiencias de usuario, para cumplir con las necesidades de nuestros clientes para con su negocio. Google se ha puesto las pilas y parece enfocado en ayudarnos a cumplir con este objetivo.
Así pues, estad atentos al blog dónde seguiremos contando como aplicamos continuamente estas mejoras provistas por parte de Google en el ecosistema Android para dar soluciones tecnológicas a nuestras aplicaciones.