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.




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