# Aulas UNICABA Un visor híbrido especializado y offline-first desarrollado para la visualización de la cartelera oficial de aulas, seguimiento automatizado de materias cursadas y generación de la Credencial Digital Universitaria para estudiantes de la Universidad de la Ciudad (UNICABA). --- ## ✨ Características ### 📋 Cartelera de Horarios - Visualización completa de la cartelera oficial de aulas organizada por día de la semana (Lunes a Sábado). - **Modo offline-first**: la cartelera se cachea localmente al primer acceso y se muestra instantáneamente aunque no haya conexión. - **Sincronización automática** en background (Background Fetch) delegada al sistema operativo. - **Búsqueda fuzzy** tolerante a errores tipográficos: busca por nombre de materia, código, aula o carrera. - **Filtro por vista**: alternás entre "Favoritos" y "Cartelera completa" con un segmento. - Acceso directo a clases virtuales (Zoom / Meet) desde el botón de cada materia. - Función de compartir el horario de una materia por WhatsApp, Telegram, y cualquier app nativa. ### ⭐ Favoritos Inteligentes - Marcá hasta 5 materias como favoritas para tenerlas a mano en su propia pestaña. - Los favoritos se guardan automáticamente en un archivo `aulas_unicaba_datos.csv` en la carpeta "Documentos" del dispositivo, **sobreviviendo a desinstalaciones y actualizaciones** gracias a las políticas de almacenamiento de Android 11+. - **Alertas locales automáticas**: si una materia favorita cambia de aula o link de clase virtual, la app lo detecta en el próximo sincronismo y dispara una notificación push inmediata. - Restauración manual de favoritos desde un respaldo CSV (Google Drive, iCloud, Descargas). ### 🎓 Banner "Próxima Clase" *(Nuevo en v1.1.6)* - Al entrar a la pestaña **Favoritos**, aparece automáticamente un banner destacado con la materia favorita cuya clase es la más cercana en el tiempo (hoy o mañana). - **Chip de countdown** en tiempo real que se actualiza cada minuto: - 🔵 Azul → más de 2 horas - 🟡 Amarillo → entre 30 minutos y 2 horas - 🔴 Rojo + animación de pulso → menos de 30 minutos - Muestra nombre de la materia, número de aula y día + hora de inicio. ### 🔔 Recordatorio Pre-Clase *(Nuevo en v1.1.6)* - Cada vez que la app sincroniza la cartelera, programa automáticamente una notificación local **30 minutos antes** del inicio de cada materia favorita del día. - Usa IDs de notificación estables para evitar duplicados al sincronizar múltiples veces. - Funciona completamente **offline** — no requiere servidor externo. ### 🪪 Credencial Digital Universitaria - Inicio de sesión directo al Campus Virtual (Moodle) con DNI y clave. - **Sin intermediarios**: las credenciales nunca pasan por ningún servidor tercero. El flujo HTTP se delega al motor nativo del SO mediante `CapacitorHttp`, evitando bloqueos CORS. - Descarga y renderiza el PDF de la credencial (código QR) como imagen nativa usando `pdfjs-dist`. - La imagen queda **cacheada localmente** para usarla offline sin volver a loguearse. - El brillo de la pantalla aumenta automáticamente al mostrar el QR para facilitar su lectura. - Login completamente **opcional** — la cartelera funciona sin necesidad de cuenta. ### 🛡️ Privacidad y Seguridad - No se recopilan nombres, contraseñas ni correos. - No hay publicidad, telemetría ni analytics de terceros. - Todo el procesamiento ocurre en la memoria del teléfono. --- ## 🛠️ Información Técnica y Frameworks | Componente | Tecnología | |---|---| | Base Frontend | [Angular 20.3.x](https://angular.io/) | | UI Components | [Ionic Framework v8](https://ionicframework.com/) | | Puente Nativo | [Capacitor v8](https://capacitorjs.com/) | | Renderizado PDF | `pdfjs-dist` | ### Plugins de Capacitor utilizados | Plugin | Uso | |---|---| | `@capacitor/filesystem` | Escritura y lectura del CSV de respaldo en "Documentos" | | `@capawesome/capacitor-file-picker` | Importación manual de CSV desde el explorador de archivos | | `@capacitor/local-notifications` | Avisos de cambio de aula y recordatorios pre-clase | | `@capacitor/preferences` | Caché rápida de horarios y credencial | | `@transistorsoft/capacitor-background-fetch` | Sincronización silenciosa en background | | `@capacitor-community/screen-brightness` | Máximo brillo al mostrar la credencial QR | | `@capacitor/haptics` | Feedback háptico en acciones clave | | `@capacitor/share` | Compartir horarios por WhatsApp, Telegram, etc. | | `@capacitor/network` | Detección de estado de conexión | | `@capacitor/clipboard` | Acceso al portapapeles del sistema | --- ## 📱 Compatibilidad Multiplataforma Todo el código fuente (TypeScript, HTML y SCSS) y los plugins seleccionados son **100% compatibles con Android e iOS**. La arquitectura garantiza comportamiento idéntico en ambas plataformas. ### 🤖 Despliegue en Android **Requisito previo**: [Android Studio](https://developer.android.com/studio) instalado, Node.js y NPM. ```bash # 1. Instalar dependencias npm install # 2. Compilación del bundle web npm run build # 3. Sincronización con puentes nativos npx cap sync android # 4. Abrir en Android Studio para firmar APK o ejecutar por ADB npx cap open android ``` ### 🍏 Despliegue en iOS (iPhone / iPad) **Requisito previo**: macOS reciente, [Xcode](https://developer.apple.com/xcode/), Node.js y CocoaPods (`sudo gem install cocoapods`). ```bash # 1-2. Instalación y compilación web npm install npm run build # 3. Agregar plataforma iOS (solo la primera vez) npx cap add ios # 4. Sincronizar plugins y actualizar Pods npx cap sync ios # 5. Abrir en Xcode npx cap open ios ``` > **Nota para Xcode:** Habilitar permisos explícitos para **Local Notifications** y **Background Fetch** en la pestaña *Signing & Capabilities* de Xcode. --- ## 🔒 Privacidad y Flujo Cero Intermediarios (Zero-Trust) 1. **Credenciales en Moodle Bypass**: La app extrae el PDF de credencial logueándose directamente mediante `CapacitorHttp`, delegando el flujo HTTP al motor nativo del OS. Nunca triangula el DNI a través de un backend tercero. 2. **Resiliencia Anti-Wipes**: Las agresivas políticas *Storage Scoped* de Android 11+ pueden borrar bases de datos SQLite y Preferences al desinstalar. La app mitiga esto exportando automáticamente los favoritos a `aulas_unicaba_datos.csv` en el gestor público de archivos ("Documentos").