Aplicación móvil Android para pedidos de comida, con doble interfaz para Clientes y Administradores, arquitectura offline-first y autenticación con Google mediante Firebase.
ExpressFood es una app Android orientada a la gestión de pedidos de comida. Soporta dos roles de usuario:
- Clientes: navegan el menú, realizan pedidos y consultan reportes de gasto.
- Administradores: gestionan el cumplimiento de pedidos y el inventario.
La aplicación sigue una filosofía offline-first: el usuario puede ver el menú y su historial incluso sin conexión activa a internet, gracias a la persistencia local con Room y sincronización en segundo plano.
- 🔐 Autenticación con Google: inicio de sesión seguro usando Firebase Auth y Credential Manager.
- 📡 Arquitectura offline-first: persistencia local con Room y sincronización en background.
- ⚡ Actualizaciones en tiempo real: seguimiento de pedidos en vivo mediante snapshots de Firestore.
- 🧭 Acceso basado en roles: enrutamiento automático al dashboard de Cliente o Admin según el perfil del usuario.
- 📊 Analítica de gasto: reportes mensuales y diarios para que los clientes controlen sus gastos en comida.
| Capa | Tecnologías |
|---|---|
| Lenguaje | Kotlin (Coroutines, Flow) |
| Framework de UI | ViewBinding (Fragments/XML) y Jetpack Compose (Theming) |
| Base de datos local | Room (SQLite) |
| Base de datos remota | Firebase Firestore |
| Almacenamiento | Supabase Storage (imágenes de productos) |
| Autenticación | Firebase Auth + Google Sign-In (Credential Manager) |
| Inyección de dependencias | Manual, mediante AppContainer |
| Tareas en segundo plano | WorkManager (sincronización periódica) |
El proyecto sigue el patrón MVVM (Model-View-ViewModel) combinado con una capa de Repository que abstrae las fuentes de datos. La clase AppContainer actúa como el contenedor central de inyección de dependencias, proveyendo instancias singleton de repositorios y servicios a los ViewModels.
1. Inyección de dependencias manual
En lugar de usar frameworks como Hilt o Koin, el proyecto implementa un patrón de DI manual a través de AppContainer, inicializado en la clase ExpressFoodApp y que mantiene el ciclo de vida de la lógica principal de la app.
2. Sincronización en segundo plano
La app usa WorkManager para mantener la consistencia de los datos. Un SyncOrdersWorker se ejecuta periódicamente (cada hora) para enviar a Firestore los pedidos realizados sin conexión.
3. Estrategia de almacenamiento híbrida ExpressFood distribuye sus datos entre tres proveedores:
- Room: caché local para productos, pedidos y el carrito de compras activo.
- Firestore: fuente de verdad principal para perfiles de usuario y estado de los pedidos.
- Supabase: almacenamiento de imágenes de productos del menú, optimizado para alto rendimiento.
Para más detalle sobre cada módulo del proyecto, consulta la wiki generada (DeepWiki):
- Getting Started & Build Configuration
- Application Entry Point & Dependency Injection
- Architecture & Data Layer
- Authentication
- Client-Facing UI
- Admin UI
- UI Design System & Resources
- Firebase & Backend Configuration
- Testing
- Glossary
- Android Studio instalado
- JDK disponible en el sistema (incluye
keytool) - Proyecto creado en Firebase Console
- PowerShell (Windows)
Ejecuta el siguiente comando en PowerShell para crear el keystore de debug de Android:
keytool -genkey -v `
-keystore "$env:USERPROFILE\.android\debug.keystore" `
-storepass android `
-alias androiddebugkey `
-keypass android `
-keyalg RSA `
-keysize 2048 `
-validity 10000 `
-dname "CN=Android Debug, O=Android, C=US"Nota: Este comando genera un par de claves RSA de 2048 bits con una validez de 10 000 días. Si el archivo
debug.keystoreya existe, puedes omitir este paso.
Ejecuta este comando para extraer el SHA-1 de tu keystore:
keytool -list -v `
-alias androiddebugkey `
-keystore "$env:USERPROFILE\.android\debug.keystore"- Contraseña del keystore:
android - Copia el valor que aparece en la línea
SHA1:del output.
⚠️ Importante: El SHA-1 del keystore de debug es solo para desarrollo local. Para publicar en Google Play Store necesitarás el SHA-1 de tu keystore de release.
- Ve a Firebase Console y abre tu proyecto ExpressFood.
- Haz clic en el ícono de engranaje ⚙️ → Configuración del proyecto.
- En la sección Tus apps, selecciona tu app Android.
- Desplázate hasta Huellas digitales del certificado SHA.
- Haz clic en Agregar huella digital y pega el SHA-1 obtenido.
- Guarda los cambios.
Después de registrar la huella digital:
- En la misma pantalla de configuración, descarga el archivo
google-services.jsonactualizado. - Reemplaza el archivo existente en tu proyecto:
app/
└── google-services.json ← reemplazar aquí
- Sincroniza el proyecto en Android Studio: File → Sync Project with Gradle Files.
ExpressFood/
├── app/
│ ├── google-services.json ← configuración de Firebase
│ └── src/
│ └── main/
│ └── java/
│ └── com/project/expressfood/
│ ├── data/ ← repositorios, Room, Firestore, Supabase, WorkManager
│ ├── ui/ ← pantallas de Cliente y Admin, theming
│ └── ExpressFoodApp.kt ← punto de entrada y AppContainer (DI)
├── build.gradle.kts
└── settings.gradle.kts




