Saltar al contenido
Almar Ramos Curto

§ Caso de estudio · Experimentos

Fexra

Convertidor de divisas sin conexión para Android, centrado en guaraní paraguayo y euro, que conserva los últimos tipos de cambio descargados para usarlos sin conexión. Versión 1.0 hecha para uso personal; los tipos son orientativos.

Rol
Desarrollo en solitario
Periodo
oct. 2026
Estado
Completado
Código
Repositorio privado

Stack

  • Kotlin
  • Jetpack Compose
  • Material 3

Un problema de viaje

Construí Fexra para mis propios viajes, cuando quería consultar una conversión aunque no tuviera datos móviles. El par inicial es guaraní paraguayo (PYG) a euro (EUR), y la aplicación conserva en el dispositivo los últimos tipos de cambio descargados correctamente.

El flujo de conversión

El conversor permite cambiar las monedas de origen y destino, intercambiar el par e introducir importes con reglas acordes a la precisión de cada moneda. PYG y JPY se tratan como monedas sin decimales; el resto de las admitidas permite hasta dos. La vista de cotizaciones coloca primero las monedas favoritas y muestra su valor frente a un euro.

Uso de una copia local de las cotizaciones

Fexra carga los datos guardados al abrirse, sin esperar a la red. Cuando hay conexión, descarga tipos con base EUR desde fawazahmed0/exchange-api: jsDelivr es el endpoint principal y el proyecto usa una vez el endpoint de respaldo documentado en pages.dev. La actualización automática se produce si todavía no hay una descarga correcta, han pasado 24 horas o el reloj del dispositivo está antes de la última descarga. También se puede solicitar manualmente desde el control de actualización.

Una respuesta solo reemplaza la copia guardada si la fecha y los tipos requeridos para EUR y PYG pasan la validación. Si falla la petición o los datos no son válidos, se conserva la copia anterior. La interfaz diferencia la fecha publicada por la fuente de la hora en que el móvil descargó los datos. Si las cotizaciones tienen tres días o más, se avisa de que son antiguas, pero siguen disponibles para convertir. En el primer inicio sin datos guardados, la aplicación pide conexión antes de cargar cotizaciones.

Decisiones de ingeniería

Las reglas de cálculo y entrada están en una capa Kotlin separada de la interfaz Android y del repositorio de red. El repositorio se ocupa de las peticiones HTTP y guarda cada copia validada en un único valor de SharedPreferences; un ViewModel expone el estado de pantalla mediante StateFlow a la interfaz Jetpack Compose.

Las conversiones usan BigDecimal y DECIMAL128 en lugar de aritmética binaria de punto flotante; el redondeo se aplica según la precisión que se muestra para cada moneda. El analizador JSON rechaza fechas malformadas y tipos requeridos ausentes o no positivos, y descarta monedas opcionales inválidas. Las pruebas JVM cubren conversión, análisis, ida y vuelta de almacenamiento, entrada, formato y reglas de antigüedad de cotizaciones.

Versión y disponibilidad

La versión 1.0.0 tiene una release con un APK firmado en modo debug, pensado para uso personal. La release está en el repositorio privado cambio-offline, así que el portfolio no ofrece una descarga pública ni un enlace al código fuente.

Posibles siguientes pasos

Son mejoras futuras, no funcionalidades implementadas: añadir pruebas del repositorio con respuestas de red controladas para comprobar los endpoints principal y de respaldo y la conservación de la copia local; y valorar una distribución firmada para producción si la aplicación se prepara para un lanzamiento más amplio.