← Proyectos

BlueDrop

App nativa de Android que guarda dónde has aparcado en cuanto el móvil se desconecta del Bluetooth del coche, sin pulsar nada ni abrir la app. Mapa con OpenStreetMap, aviso al volver con el tiempo aparcado, historial con notas y fotos, estadísticas mensuales y widget de inicio. Sin anuncios, sin cuentas y sin servidor propio.

El último aparcamiento en el mapa de OpenStreetMap, con la dirección y los botones Compartir y Navegar al coche
El historial de aparcamientos con fechas, duración y notas como la planta y la plaza del parkingLas estadísticas del mes, con el tiempo total aparcado, sesiones, media, récord y zonas más frecuentesEl widget de inicio con la dirección del coche y el botón Navegar al coche
toques para guardar
0
toques para guardar
módulos Gradle
10
módulos Gradle
idiomas
6
idiomas
tests unitarios
47
tests unitarios

Qué hace

  • Sin pulsar nada. Cuando el móvil se desconecta del Bluetooth del coche, guarda la ubicación y la dirección y te avisa con una notificación. No hace falta abrir la app.
  • Volver al coche. El último aparcamiento en el mapa, con un botón para que el navegador te lleve andando hasta él y otro para compartir la ubicación.
  • Cuánto tiempo estuviste. Al volver a conectarte al coche apunta la hora de llegada y te dice cuánto tiempo ha estado aparcado. Si no llega a reconectar, la sesión se cierra a mano.
  • Sin GPS también se guarda. Si no hay señal, el aparcamiento se guarda igual y luego puedes arrastrar el pin a su sitio.
  • Historial. Todos los aparcamientos con fecha, duración, una nota ("planta -2, plaza 47") y una foto.
  • Estadísticas y widget. Tiempo aparcado en el mes, media, récord y zonas más frecuentes. En la pantalla de inicio, un widget con la dirección y el botón de navegar.
  • Varios coches. Puedes vigilar más de un dispositivo Bluetooth, el del coche y el de la moto, por ejemplo.
  • Privada. Sin anuncios, sin cuentas y sin servidor propio: los aparcamientos, las notas y las fotos se guardan en el móvil. Tema claro u oscuro y seis idiomas.

Cómo está hecho

Del Bluetooth al guardado en un foreground service

El aviso de desconexión llega a un BroadcastReceiver, y Android le da muy poco tiempo antes de poder matar el proceso. Por eso el receptor solo comprueba si el dispositivo es uno de los vigilados y arranca un foreground service. El servicio pide la ubicación con Fused Location, saca la dirección con el Geocoder, guarda el registro en Room y lanza la notificación.

Clean Architecture en 10 módulos

Un módulo de dominio en Kotlin puro, sin dependencias de Android, con los modelos, las interfaces de repositorio y nueve casos de uso. Alrededor, módulos de infraestructura (datos, Bluetooth, ubicación, tema) y uno por pantalla (mapa, historial, estadísticas, ajustes), todos dependiendo hacia el dominio. La interfaz es Jetpack Compose con MVVM, y Hilt lo conecta todo.

OpenStreetMap en lugar de Google Maps

El mapa empezó con Google Maps Compose. Lo cambié por osmdroid, que pinta OpenStreetMap dentro de Compose sin API key ni cuenta de facturación.

Problemas que resolví

  • Desconexiones duplicadas. Algunos equipos de Bluetooth envían dos desconexiones seguidas, lo que creaba aparcamientos fantasma. Ahora se ignora cualquier desconexión del mismo dispositivo en los 30 segundos siguientes.
  • Un aparcamiento en el océano. Sin GPS, el registro se guarda con coordenadas (0, 0), y al editarlo el pin aparecía frente a la costa de África. Ahora el modo edición coloca el pin en la última posición buena conocida.
  • Una dirección que no se actualizaba. Al mover el pin a mano se guardaba la dirección antigua. Si no la has tocado, ahora se vuelve a calcular a partir de las nuevas coordenadas.

Stack

Kotlin 2.0Jetpack ComposeMaterial 3HiltCoroutinesFlowRoomDataStoreFused LocationCameraXGlanceosmdroidJUnitMockK