feat: actualización a v1.1.9 con Agenda interactiva y correcciones visuales
This commit is contained in:
@@ -2,67 +2,126 @@
|
||||
|
||||
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).
|
||||
|
||||
## Información Técnica y Frameworks
|
||||
---
|
||||
|
||||
* **Base Frontend**: [Angular 20.3.x](https://angular.io/)
|
||||
* **Librería de Componentes UI**: [Ionic Framework v8](https://ionicframework.com/)
|
||||
* **Puente Nativo Multiplataforma**: [Capacitor v8](https://capacitorjs.com/)
|
||||
* **Procesamiento de Archivos PDF Interno**: `pdfjs-dist` (Renderización nativa in-dom de la Credencial)
|
||||
## ✨ Características
|
||||
|
||||
## Plugins de Experiencia Nativa (Capacitor)
|
||||
### 📋 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.
|
||||
|
||||
La aplicación invoca funciones 100% nativas apoyándose en las siguientes librerías core:
|
||||
- `@capacitor/filesystem`: Escritura pesada persistente de respaldos en CSV en el FileSystem local ("Documents").
|
||||
- `@capawesome/capacitor-file-picker`: Interfaz de File Picker del OS (Cloud / Storage) para restauración manual.
|
||||
- `@capacitor/local-notifications`: Motor de avisos visuales locales ante un cambio repentino de aula mapeada en favoritos.
|
||||
- `@capacitor/preferences`: Almacenamiento rápido volátil (Key-Value) para estado de caché de credenciales offline y preferencias menores.
|
||||
- `@transistorsoft/capacitor-background-fetch`: Cronjobs transparentes delegados al Sistema Operativo para despertar a la app y sincronizar la cartelera.
|
||||
- `@capacitor-community/screen-brightness`: Anulación y control programático de brillo de panel al desplegar formatos estáticos de código QR/Credencial UI.
|
||||
- `@capacitor/haptics`: Respuestas hápticas (Vibración inteligente) en interacciones de hardware/software clave.
|
||||
- `@capacitor/share`: Puente social nativo para el envío de horarios por WhatsApp, Telegram, etc.
|
||||
### ⭐ 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.
|
||||
|
||||
---
|
||||
|
||||
## Compatibilidad Multiplataforma (iOS y Android)
|
||||
## 🛠️ Información Técnica y Frameworks
|
||||
|
||||
Todo el código fuente de Aulas UNICABA (TypeScript, HTML y SCSS) y la selección estricta de sus plugins de Capacitor son **100% compatibles tanto con equipos móviles Android como con el ecosistema iOS de Apple**. La arquitectura garantiza que la aplicación operará sintácticamente de forma idéntica en iPhone.
|
||||
| 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 e hibridación
|
||||
# 1. Instalar dependencias
|
||||
npm install
|
||||
|
||||
# 2. Compilación del binario web
|
||||
npm run build
|
||||
# 2. Compilación del bundle web
|
||||
npm run build
|
||||
|
||||
# 3. Transpilación y Sincronización de puentes nativos Android
|
||||
# 3. Sincronización con puentes nativos
|
||||
npx cap sync android
|
||||
|
||||
# 4. Apertura del EDI para firma de APK o ejecución en celular por ADB
|
||||
# 4. Abrir en Android Studio para firmar APK o ejecutar por ADB
|
||||
npx cap open android
|
||||
```
|
||||
|
||||
### 🍏 Despliegue en iOS (iPhone / iPad)
|
||||
**Requisito previo**: Una computadora macOS reciente, [Xcode](https://developer.apple.com/xcode/), Node.js y CocoaPods instalado globalmente (`sudo gem install cocoapods`).
|
||||
|
||||
**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 estándar de web
|
||||
# 1-2. Instalación y compilación web
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
# 3. Empaquetar el proyecto inicial para iOS (Solo se ejecuta una vez en la vida del proyecto)
|
||||
# 3. Agregar plataforma iOS (solo la primera vez)
|
||||
npx cap add ios
|
||||
|
||||
# 4. Sincronizar plugins y actualizar Pods
|
||||
npx cap sync ios
|
||||
|
||||
# 5. Apertura en Xcode para configurar equipo de Apple Dev y emular
|
||||
npx cap open ios
|
||||
# 5. Abrir en Xcode
|
||||
npx cap open ios
|
||||
```
|
||||
> **Nota para Xcode:** Para compilar exitosamente deberás habilitar permisos explícitos para Local Notifications y capacidades de "Background Fetch" en los *Background Modes* de la pestaña *Signing & Capabilities* dentro de Xcode.
|
||||
|
||||
> **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**: Por diseño de arquitectura, la app extrae el PDF de credencial estudiantil logueándose de manera asilvestrada mediante `CapacitorHttp`. Supera bloqueos tipo CORS al delegar el flujo de HTTP al motor OS, nunca triangulando el DNI a través de un backend tercero.
|
||||
2. **Resiliencia (Anti-Wipes)**: Dado las agresivas políticas *Storage Scoped* a partir de Android 11 que borran bases de datos SQLite y Preferences locales si se desinstala, la app empuja automáticamente la personalización del alumno a un archivo estandarizado `aulas_unicaba_datos.csv` a su gestor público de archivos general ("Documentos").
|
||||
## 🔒 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").
|
||||
|
||||
|
||||
Reference in New Issue
Block a user