Equify es una app Android nativa para repartir gastos en grupo: viajes, pisos compartidos, cenas o cualquier plan con amigos. Apuntas quién paga qué y Equify calcula al instante quién debe a quién, minimizando el número de transferencias. Sin registro: abres la app y empiezas, tus datos se quedan en tu dispositivo.
| Resumen del grupo | Echar cuentas | Sobre Equify |
|---|---|---|
![]() |
![]() |
![]() |
| Capa | Tecnología |
|---|---|
| Lenguaje | Kotlin 100% (corrutinas + Flow) |
| UI | Jetpack Compose + Material 3, single-activity, Navigation Compose |
| Inyección de dependencias | Hilt |
| Persistencia | Room (offline-first, esquemas versionados en app/schemas) + DataStore Preferences |
| Monetización | Google AdMob + Play Billing (compra remove_ads) |
| Firebase | Crashlytics, Remote Config (force update) |
| Calidad | Tests unitarios (JUnit), R8/ProGuard en release |
Clean Architecture organizada por features, con separación estricta data / domain / presentation en cada una:
app/src/main/java/com/jarica/compartirgastos/
├── app/ # Application, configuración global
├── core/ # Código compartido entre features
│ ├── billing/ # Play Billing (quitar anuncios)
│ ├── data/ # Base de datos Room, DataStore, mappers
│ ├── di/ # Módulos de Hilt
│ ├── domain/ # Modelos de dominio comunes
│ ├── forceUpdate/ # Actualización forzada vía Remote Config
│ ├── navigation/ # Navegación Compose type-safe
│ └── presentation/ # Tema y composables reutilizables
└── features/
├── groups/ # data / domain / presentation
├── groupDetail/
├── costs/
├── payments/
├── balances/ # Algoritmo de liquidación ("echar cuentas")
├── people/
├── appInfo/
└── splash/
graph LR
UI["Presentation<br/>(Compose + ViewModel)"] --> UC["Domain<br/>(Use Cases + Modelos)"]
UC --> REPO["Data<br/>(Repositorios + Room)"]
REPO --> DB[("Room / DataStore")]
Cada pantalla sigue el flujo ViewModel → Use Cases → Repositorio, con el estado de UI expuesto como StateFlow y la lógica de negocio aislada en use cases puros y testeables.
Long): todos los importes se almacenan y operan en céntimos para eliminar errores de redondeo de coma flotante; solo se formatea a decimal en la capa de presentación.DoTheCountsUseCase calcula los saldos netos y aplica un algoritmo greedy que empareja al mayor deudor con el mayor acreedor, saldando el grupo con como máximo n−1 pagos (el mínimo exacto es NP-difícil). Está cubierto con tests unitarios.app/schemas para poder escribir y testear migraciones reales.google-services.json en app/ (proyecto propio de Firebase)../gradlew assembleDebug
Para compilar la release se necesita un keystore propio configurado en local.properties (RELEASE_STORE_FILE, RELEASE_STORE_PASSWORD, RELEASE_KEY_ALIAS, RELEASE_KEY_PASSWORD).
Los datos se almacenan localmente en el dispositivo. Política de privacidad: jaricagames.github.io/Equify
Este proyecto está bajo licencia MIT.
Desarrollado por Juan Antonio Rivero (@JaricaGames)