diff --git a/README.md b/README.md index 6df3436..48edc83 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,15 @@ Un visor híbrido especializado y offline-first desarrollado para la visualizaci - Usa IDs de notificación estables para evitar duplicados al sincronizar múltiples veces. - Funciona completamente **offline** — no requiere servidor externo. +### 📅 Agenda de Hitos y Exámenes *(Nuevo en v1.1.8)* +- Añade exámenes (Parciales, Finales) y Trabajos Prácticos directamente desde el menú de una materia. +- Los hitos muestran insignias de tiempo (rojo cuando falta poco, secundario el resto del tiempo) en la tarjeta de la materia en Cartelera. +- La selección de fecha se hace mediante un popover ligero e intuitivo. + +### 📍 Integración Nativa con Mapas *(Mejora v1.1.9)* +- El pie de página renovado con un rediseño UI tipo "botón flotante". +- Utiliza esquemas nativos (`geo:0,0?q=` en Android y `maps://` en iOS) que dejan al usuario **elegir la app de navegación preferida** (Waze, Google Maps, Apple Maps) al tocar la sede. + ### 🪪 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. diff --git a/android/.kotlin/sessions/kotlin-compiler-3996273560393522172.salive b/android/.kotlin/sessions/kotlin-compiler-3996273560393522172.salive new file mode 100644 index 0000000..e69de29 diff --git a/android/app/build.gradle b/android/app/build.gradle index 28b53af..5bd19e9 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "ar.edu.unicaba.cartelera" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 12 - versionName "1.1.9" + versionCode 14 + versionName "1.2.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle index a68a260..46875a5 100644 --- a/android/app/capacitor.build.gradle +++ b/android/app/capacitor.build.gradle @@ -21,6 +21,7 @@ dependencies { implementation project(':capacitor-share') implementation project(':capacitor-status-bar') implementation project(':capawesome-capacitor-file-picker') + implementation project(':ebarooni-capacitor-calendar') implementation project(':transistorsoft-capacitor-background-fetch') } diff --git a/android/app/src/main/res/drawable-land-hdpi/splash.png b/android/app/src/main/res/drawable-land-hdpi/splash.png index 5aca680..ed9c8e3 100644 Binary files a/android/app/src/main/res/drawable-land-hdpi/splash.png and b/android/app/src/main/res/drawable-land-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-ldpi/splash.png b/android/app/src/main/res/drawable-land-ldpi/splash.png index b3cca55..6401331 100644 Binary files a/android/app/src/main/res/drawable-land-ldpi/splash.png and b/android/app/src/main/res/drawable-land-ldpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-mdpi/splash.png b/android/app/src/main/res/drawable-land-mdpi/splash.png index 253982a..7e1a2e7 100644 Binary files a/android/app/src/main/res/drawable-land-mdpi/splash.png and b/android/app/src/main/res/drawable-land-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-night-hdpi/splash.png b/android/app/src/main/res/drawable-land-night-hdpi/splash.png index 235c479..e62450e 100644 Binary files a/android/app/src/main/res/drawable-land-night-hdpi/splash.png and b/android/app/src/main/res/drawable-land-night-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-night-ldpi/splash.png b/android/app/src/main/res/drawable-land-night-ldpi/splash.png index 6fc055d..e0c05f9 100644 Binary files a/android/app/src/main/res/drawable-land-night-ldpi/splash.png and b/android/app/src/main/res/drawable-land-night-ldpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-night-mdpi/splash.png b/android/app/src/main/res/drawable-land-night-mdpi/splash.png index 4eb9642..110b82d 100644 Binary files a/android/app/src/main/res/drawable-land-night-mdpi/splash.png and b/android/app/src/main/res/drawable-land-night-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-night-xhdpi/splash.png b/android/app/src/main/res/drawable-land-night-xhdpi/splash.png index 5bcec0c..9f55efc 100644 Binary files a/android/app/src/main/res/drawable-land-night-xhdpi/splash.png and b/android/app/src/main/res/drawable-land-night-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png b/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png index 9e385e1..2e2f043 100644 Binary files a/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png and b/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png b/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png index 4a05220..bb87fc0 100644 Binary files a/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png and b/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xhdpi/splash.png b/android/app/src/main/res/drawable-land-xhdpi/splash.png index 4c897a0..aadc27a 100644 Binary files a/android/app/src/main/res/drawable-land-xhdpi/splash.png and b/android/app/src/main/res/drawable-land-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxhdpi/splash.png index af30037..5bb8aa3 100644 Binary files a/android/app/src/main/res/drawable-land-xxhdpi/splash.png and b/android/app/src/main/res/drawable-land-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png index 2f934df..ddc8124 100644 Binary files a/android/app/src/main/res/drawable-land-xxxhdpi/splash.png and b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-night/splash.png b/android/app/src/main/res/drawable-night/splash.png index 6fc055d..e0c05f9 100644 Binary files a/android/app/src/main/res/drawable-night/splash.png and b/android/app/src/main/res/drawable-night/splash.png differ diff --git a/android/app/src/main/res/drawable-port-hdpi/splash.png b/android/app/src/main/res/drawable-port-hdpi/splash.png index 81e4dcd..f5d15b1 100644 Binary files a/android/app/src/main/res/drawable-port-hdpi/splash.png and b/android/app/src/main/res/drawable-port-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-ldpi/splash.png b/android/app/src/main/res/drawable-port-ldpi/splash.png index ce3b9d1..6e666fb 100644 Binary files a/android/app/src/main/res/drawable-port-ldpi/splash.png and b/android/app/src/main/res/drawable-port-ldpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-mdpi/splash.png b/android/app/src/main/res/drawable-port-mdpi/splash.png index 6f28f7e..c8fa78c 100644 Binary files a/android/app/src/main/res/drawable-port-mdpi/splash.png and b/android/app/src/main/res/drawable-port-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-night-hdpi/splash.png b/android/app/src/main/res/drawable-port-night-hdpi/splash.png index 524155b..96af01a 100644 Binary files a/android/app/src/main/res/drawable-port-night-hdpi/splash.png and b/android/app/src/main/res/drawable-port-night-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-night-ldpi/splash.png b/android/app/src/main/res/drawable-port-night-ldpi/splash.png index 6dc2dae..7f961c5 100644 Binary files a/android/app/src/main/res/drawable-port-night-ldpi/splash.png and b/android/app/src/main/res/drawable-port-night-ldpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-night-mdpi/splash.png b/android/app/src/main/res/drawable-port-night-mdpi/splash.png index 33d8814..96d033f 100644 Binary files a/android/app/src/main/res/drawable-port-night-mdpi/splash.png and b/android/app/src/main/res/drawable-port-night-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-night-xhdpi/splash.png b/android/app/src/main/res/drawable-port-night-xhdpi/splash.png index 6920e57..4033653 100644 Binary files a/android/app/src/main/res/drawable-port-night-xhdpi/splash.png and b/android/app/src/main/res/drawable-port-night-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png b/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png index ee7ab99..f6c9a13 100644 Binary files a/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png and b/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png b/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png index 98494a1..039f2cd 100644 Binary files a/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png and b/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xhdpi/splash.png b/android/app/src/main/res/drawable-port-xhdpi/splash.png index 641659e..4174052 100644 Binary files a/android/app/src/main/res/drawable-port-xhdpi/splash.png and b/android/app/src/main/res/drawable-port-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxhdpi/splash.png index dd79a2f..889c3d6 100644 Binary files a/android/app/src/main/res/drawable-port-xxhdpi/splash.png and b/android/app/src/main/res/drawable-port-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png index d139769..2e0287d 100644 Binary files a/android/app/src/main/res/drawable-port-xxxhdpi/splash.png and b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable/splash.png b/android/app/src/main/res/drawable/splash.png index 6f28f7e..c8fa78c 100644 Binary files a/android/app/src/main/res/drawable/splash.png and b/android/app/src/main/res/drawable/splash.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 9510512..01b8dca 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png index 48a8996..7505d2e 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index fe6d962..bff280e 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-ldpi/ic_launcher.png b/android/app/src/main/res/mipmap-ldpi/ic_launcher.png index 2cc3697..6f1207a 100644 Binary files a/android/app/src/main/res/mipmap-ldpi/ic_launcher.png and b/android/app/src/main/res/mipmap-ldpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png index aadba46..334ed50 100644 Binary files a/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png index 069491c..49d3865 100644 Binary files a/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 25e1793..201666c 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png index 1e3804b..f893c0b 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index 3f0d8b3..f216ffe 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 1eeff5a..02c0753 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index 378874c..5c8dfc8 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 0edec74..36c9340 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 9363f44..d85bab1 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index ad508df..fea66a7 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 14f36e9..448d782 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 15afbc0..5ea4c05 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png index 7d35421..cb05f2b 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index c28ca6d..d80f5d1 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle index 36ebbbb..26f0d84 100644 --- a/android/capacitor.settings.gradle +++ b/android/capacitor.settings.gradle @@ -38,5 +38,8 @@ project(':capacitor-status-bar').projectDir = new File('../node_modules/@capacit include ':capawesome-capacitor-file-picker' project(':capawesome-capacitor-file-picker').projectDir = new File('../node_modules/@capawesome/capacitor-file-picker/android') +include ':ebarooni-capacitor-calendar' +project(':ebarooni-capacitor-calendar').projectDir = new File('../node_modules/@ebarooni/capacitor-calendar/android') + include ':transistorsoft-capacitor-background-fetch' project(':transistorsoft-capacitor-background-fetch').projectDir = new File('../node_modules/@transistorsoft/capacitor-background-fetch/android') diff --git a/angular.json b/angular.json index c27b8ea..c056f2e 100644 --- a/angular.json +++ b/angular.json @@ -49,8 +49,8 @@ }, { "type": "anyComponentStyle", - "maximumWarning": "6kb", - "maximumError": "8kb" + "maximumWarning": "10kb", + "maximumError": "12kb" } ], "fileReplacements": [ diff --git a/assets/Aulas-UNICABA_Cartelera.png b/assets/Aulas-UNICABA_Cartelera.png deleted file mode 100644 index 582f172..0000000 Binary files a/assets/Aulas-UNICABA_Cartelera.png and /dev/null differ diff --git a/assets/Aulas-UNICABA_Favoritos.png b/assets/Aulas-UNICABA_Favoritos.png deleted file mode 100644 index 1f00ac6..0000000 Binary files a/assets/Aulas-UNICABA_Favoritos.png and /dev/null differ diff --git a/assets/Aulas-UNICABA_Funcion_Favoritos.png b/assets/Aulas-UNICABA_Funcion_Favoritos.png deleted file mode 100644 index 054008a..0000000 Binary files a/assets/Aulas-UNICABA_Funcion_Favoritos.png and /dev/null differ diff --git a/assets/Aulas-UNICABA_Funciones_Cartelera.png b/assets/Aulas-UNICABA_Funciones_Cartelera.png deleted file mode 100644 index 14a7286..0000000 Binary files a/assets/Aulas-UNICABA_Funciones_Cartelera.png and /dev/null differ diff --git a/assets/Aulas_UNICABA_One-UI-Home.png b/assets/Aulas_UNICABA_One-UI-Home.png deleted file mode 100644 index 0709b8f..0000000 Binary files a/assets/Aulas_UNICABA_One-UI-Home.png and /dev/null differ diff --git a/assets/icon.png b/assets/icon.png index 4b33ee2..56c39f0 100644 Binary files a/assets/icon.png and b/assets/icon.png differ diff --git a/assets/icon.psd b/assets/icon.psd index 46fea34..a5fc0c0 100644 Binary files a/assets/icon.psd and b/assets/icon.psd differ diff --git a/package-lock.json b/package-lock.json index da45533..b6839df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "aulas-unicaba", - "version": "1.1.5", + "version": "1.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "aulas-unicaba", - "version": "1.1.5", + "version": "1.2.1", "dependencies": { "@angular/animations": "~20.3.18", "@angular/common": "~20.3.18", @@ -30,6 +30,7 @@ "@capacitor/share": "^8.0.1", "@capacitor/status-bar": "8.0.1", "@capawesome/capacitor-file-picker": "^8.0.2", + "@ebarooni/capacitor-calendar": "^8.0.1", "@ionic/angular": "^8.0.0", "@transistorsoft/capacitor-background-fetch": "^8.0.0", "ionicons": "^7.0.0", @@ -600,7 +601,6 @@ "integrity": "sha512-CVskZnF38IIxVVlKWi1VCz7YH/gHMJu2IY9bD1AVoBBGIe0xA4FRXJkW2Y+EDs9vQqZTkZZljhK5gL65Ro1PeQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@angular-eslint/bundled-angular-compiler": "20.7.0", "eslint-scope": "^9.0.0" @@ -630,7 +630,6 @@ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.3.18.tgz", "integrity": "sha512-XFxgSyjfs0SRD2vQVFJljmM4z9nTvUoI8TRqSre/+l8D2FgzD5pG67Aj2BgDgpSFAUkIcI37G48ijK7a3ZZ3WA==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -780,7 +779,6 @@ "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.18.tgz", "integrity": "sha512-M62oQbSTRmnGavIVCwimoadg/PDWadgNhactMm9fgH0eM9rx+iWBAYJk4VufO0bwOhysFpRZpJgXlFjOifz/Jw==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -797,7 +795,6 @@ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.18.tgz", "integrity": "sha512-AaP/LCiDNcYmF135EEozjyR04NRBT38ZfBHQwjhgwiBBTejmvcpHwJaHSkraLpZqZzE4BQqqmgiQ1EJqxEwLVA==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -811,7 +808,6 @@ "integrity": "sha512-zsoEgLgnblmRbi47YwMghKirJ8IBKJ3+I8TxLBRIBrhx+KHFp+6oeDeLyu9H+djdyk88zexVd09wzR/YK73F0g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "7.28.3", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -844,7 +840,6 @@ "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.18.tgz", "integrity": "sha512-B+NQQngd/aDbcfW0zGLis3wTLDeHTeTYMl/mGKQH+HwdPaRCKI1wEtaXaOYVJXkP2FeThocPevB8gLwNlPQUUw==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -870,7 +865,6 @@ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.18.tgz", "integrity": "sha512-x6/99LfxolyZIFUL3Wr0OrtuXHEDwEz/rwx+WzE7NL+n35yO40t3kp0Sn5uMFwI94i91QZJmXHltMpZhrVLuYg==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -899,7 +893,6 @@ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.18.tgz", "integrity": "sha512-q6s5rEN1yYazpHYp+k4pboXRzMsRB9auzTRBEhyXSGYxqzrnn3qHN0DqgsLC9WAdyhCgnIEMFA8kRT+W277DqQ==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -940,7 +933,6 @@ "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.18.tgz", "integrity": "sha512-3CWejsEYr+ze+ktvWN/qHdyq5WLrj96QZpGYJyxh1pchIcpMPE9MmLpdjf0CUrWYB7g/85u0Geq/xsz72JrGng==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -985,7 +977,6 @@ "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -2835,7 +2826,6 @@ "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.2.0.tgz", "integrity": "sha512-oKaoNeNtH2iIZMDFVrb1atoyRECDGHcfLMunJ5KWN8DtvpVBeeA4c41e20NTuhMxw1cSYbpq2PV2hb+/9CJxlQ==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -2960,6 +2950,15 @@ "node": ">=14.17.0" } }, + "node_modules/@ebarooni/capacitor-calendar": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@ebarooni/capacitor-calendar/-/capacitor-calendar-8.0.1.tgz", + "integrity": "sha512-kwtvdYrcogioAkoft5Pcj/dkgsCaBUc4WVf3WoRBYQ92frfr4aNUSe+2Sd8ioA9ghrYAAdIPzTWzU4+tLU62iQ==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=8.0.0" + } + }, "node_modules/@es-joy/jsdoccomment": { "version": "0.46.0", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.46.0.tgz", @@ -3958,7 +3957,6 @@ "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@inquirer/checkbox": "^4.2.1", "@inquirer/confirm": "^5.1.14", @@ -7081,7 +7079,6 @@ "integrity": "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -7222,7 +7219,6 @@ "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.56.1", "@typescript-eslint/types": "8.56.1", @@ -7330,7 +7326,6 @@ "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7403,7 +7398,6 @@ "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.56.1", @@ -7688,7 +7682,6 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7764,7 +7757,6 @@ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -8463,7 +8455,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -10123,7 +10114,6 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -10616,7 +10606,6 @@ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -11405,7 +11394,6 @@ "integrity": "sha512-jq9l1DM0zVIvsm3lv9Nw9nlJnMNPOcAtsbsgiUhWcFzPE99Gvo6yRTlszSLLYacMeQ6quHD6hMfId8crVHvexw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -12488,8 +12476,7 @@ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.1.2.tgz", "integrity": "sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jasmine-spec-reporter": { "version": "5.0.2", @@ -12538,7 +12525,6 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -12679,7 +12665,6 @@ "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.5.0", "body-parser": "^1.19.0", @@ -13257,7 +13242,6 @@ "integrity": "sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -13402,7 +13386,6 @@ "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", @@ -15300,7 +15283,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -16133,7 +16115,6 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -16227,7 +16208,6 @@ "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -17370,7 +17350,6 @@ "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.14.0", @@ -17572,8 +17551,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tuf-js": { "version": "4.1.0", @@ -17709,7 +17687,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17975,7 +17952,6 @@ "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -18110,7 +18086,6 @@ "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -18213,7 +18188,6 @@ "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -19196,7 +19170,6 @@ "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -19215,8 +19188,7 @@ "version": "0.15.1", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", - "license": "MIT", - "peer": true + "license": "MIT" } } } diff --git a/package.json b/package.json index c6922ff..f5b71fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aulas-unicaba", - "version": "1.1.9", + "version": "1.2.1", "author": "Ionic Framework", "homepage": "https://ionicframework.com/", "scripts": { @@ -35,6 +35,7 @@ "@capacitor/share": "^8.0.1", "@capacitor/status-bar": "8.0.1", "@capawesome/capacitor-file-picker": "^8.0.2", + "@ebarooni/capacitor-calendar": "^8.0.1", "@ionic/angular": "^8.0.0", "@transistorsoft/capacitor-background-fetch": "^8.0.0", "ionicons": "^7.0.0", diff --git a/privacidad-aulas-unicaba.md b/privacidad-aulas-unicaba.md index 1d88d12..66d4598 100644 --- a/privacidad-aulas-unicaba.md +++ b/privacidad-aulas-unicaba.md @@ -6,7 +6,8 @@ Esta sección detalla el funcionamiento, alcance y compromiso de privacidad de l **Aulas UNICABA** es un visor especializado y autónomo para la cartelera de horarios, aulas y credencial de la Universidad de la Ciudad. - Permite consultar las materias, sus respectivos días, horarios y aulas asignadas. - Facilita el seguimiento de materias específicas mediante un sistema de **Favoritos**. -- Avisa mediante **Notificaciones locales** si se detecta un cambio de aula en las materias marcadas como favoritas. +- Avisa mediante **Notificaciones locales** si se detecta un cambio de aula en las materias marcadas como favoritas, y emite **Recordatorios Automáticos** programados 30 minutos antes de cada clase. +- Gestiona una **Agenda de Exámenes e Hitos** integrada por materia (Parciales, Finales, TP), cuyos datos nunca abandonan tu celular. - **Opcionalmente**, permite acceder a tu **Credencial Digital** universitaria de los registros oficiales de forma segura e integrada. ## 2. ¿Cómo funciona? (Alcance Técnico) @@ -19,11 +20,11 @@ La aplicación ha sido diseñada bajo una arquitectura de "cliente liviano" con ## 3. Privacidad Absoluta y Persistencia Avanzada - **Sin Intermediarios ni Datos Personales:** No retenemos u observamos nombres, correos ni datos sensibles vinculados a las cuentas y accesos del usuario. Ni Aulas UNICABA ni empresas externas rastrearán o vincularán tu cuenta. - **Sin Rastreadores (Zero Trackers):** Nuestra filosofía es estricta. Cero herramientas analíticas (No Google Analytics, no SDKs invasivos de Facebook o reportes crudos), sin métricas engorrosas y libre de publicidad en el código fuente. -- **Persistencia Local Segura (CSV Offline):** Valoramos tus elecciones. Tus decisiones (Materias Favoritas) se guardan directamente como respaldo silencioso bajo un formato `.csv` estandarizado en la carpeta nativa interna "Documentos" del dispositivo (Respaldado por permisos explícitos de Almacenamiento y `Filesystem API`). **Esto permite que tus favoritos (y futuras agendas de exámenes) asombrosamente sobrevivan a desinstalaciones agresivas de la app o borrado de datos** sin depender y jamás tocar entornos remotos en la Nube. +- **Persistencia Local Segura (CSV Offline):** Valoramos tus elecciones. Tus decisiones (Materias Favoritas y Agenda de Exámenes) se guardan directamente como respaldo silencioso bajo un formato `.csv` estandarizado en la carpeta nativa interna "Documentos" del dispositivo (Respaldado por permisos explícitos de Almacenamiento y `Filesystem API`). **Esto permite que tus favoritos y tu agenda asombrosamente sobrevivan a desinstalaciones agresivas de la app o borrado de datos** sin depender y jamás tocar entornos remotos en la Nube. - **Caché Inteligente (Modo Offline):** Entendemos que la conectividad en facultades y subtes es delicada. Toda la cartelera central y tu Credencial QR se empaquetan en `Base64` utilizando memorias volátiles locales (`Preferences API`). Es decir, puedes mostrar qué materia debes rendir o exhibir tu credencial QR instantáneamente sin red (Modo Avión o Sin Señal). ## 4. Compromiso de Transparencia Esta innovación tecnológica es de carácter informativo. La precisión estricta de asignación de las aulas depende originariamente de la pre-carga impuesta por el cuerpo no-docente en el documento de Spreadsheets. En escenarios contradictorios, la palabra oficial del ala administrativa universitaria primará sobre la respuesta sincronizada en Aulas UNICABA. --- -*Última actualización: 25 de Marzo, 2026 - v1.1.5* +*Última actualización: 27 de Marzo, 2026 - v1.1.9* diff --git a/src/app/components/evento-modal/evento-modal.component.html b/src/app/components/evento-modal/evento-modal.component.html index 9560e00..a33be41 100644 --- a/src/app/components/evento-modal/evento-modal.component.html +++ b/src/app/components/evento-modal/evento-modal.component.html @@ -32,16 +32,32 @@ - - Fecha y Hora - - - - - - - + + + + + Día del Hito + + + + + + + + + + + Hora aprox. + + + + + + + + + + @@ -72,6 +88,11 @@ {{ isEdit ? 'Actualizar Agenda' : 'Agendar Hito' }} + + + Añadir a Google Calendar + + Eliminar Evento diff --git a/src/app/components/evento-modal/evento-modal.component.ts b/src/app/components/evento-modal/evento-modal.component.ts index d072491..1fe1231 100644 --- a/src/app/components/evento-modal/evento-modal.component.ts +++ b/src/app/components/evento-modal/evento-modal.component.ts @@ -1,9 +1,10 @@ import { Component, Input, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; -import { IonicModule, ModalController } from '@ionic/angular'; +import { IonicModule, ModalController, AlertController, ToastController } from '@ionic/angular'; import { EventoAcademico } from '../../services/data'; import { EventosService } from '../../services/eventos.service'; +import { CapacitorCalendar } from '@ebarooni/capacitor-calendar'; @Component({ @@ -28,7 +29,9 @@ export class EventoModalComponent implements OnInit { constructor( private modalCtrl: ModalController, - private eventosService: EventosService + private eventosService: EventosService, + private alertCtrl: AlertController, + private toastCtrl: ToastController ) { } ngOnInit() { @@ -63,8 +66,52 @@ export class EventoModalComponent implements OnInit { async eliminar() { if (this.eventoExistente) { - await this.eventosService.deleteEvento(this.eventoExistente.id); - this.modalCtrl.dismiss(null, 'deleted'); + const alert = await this.alertCtrl.create({ + header: 'Eliminar Evento', + message: '¿Estás seguro que querés eliminar este hito de tu agenda?', + buttons: [ + { + text: 'Cancelar', + role: 'cancel' + }, + { + text: 'Eliminar', + role: 'destructive', + handler: async () => { + await this.eventosService.deleteEvento(this.eventoExistente!.id); + this.modalCtrl.dismiss(null, 'deleted'); + } + } + ] + }); + await alert.present(); + } + } + + async exportarCalendario() { + try { + const startDate = new Date(this.fecha); + const endDate = new Date(startDate.getTime() + 2 * 60 * 60 * 1000); // +2 horas por defecto + + let descString = this.notas || ''; + if (this.link) descString += `\n\nLink de cursada: ${this.link}`; + + await CapacitorCalendar.createEventWithPrompt({ + title: `${this.tipo} de ${this.materiaNombre}`, + description: descString, + location: this.aula ? `Aula ${this.aula}, Universidad de la Ciudad` : 'Universidad de la Ciudad', + startDate: startDate.getTime(), + endDate: endDate.getTime(), + isAllDay: false + }); + + } catch (e) { + console.error('Error abriendo enlace de Calendario:', e); + const toast = await this.toastCtrl.create({ + message: 'No pudimos abrir tu Calendario. Verificá si tenés una app instalada.', + duration: 2500, color: 'warning' + }); + toast.present(); } } } diff --git a/src/app/home/home.page.html b/src/app/home/home.page.html index 10e3a87..0dc53dd 100644 --- a/src/app/home/home.page.html +++ b/src/app/home/home.page.html @@ -7,6 +7,9 @@ Cartelera de Aulas + + + @@ -19,6 +22,7 @@ Favoritos Cartelera + Mi Carrera @@ -43,40 +47,58 @@

¿Qué hace esta aplicación?

-

Aulas UNICABA es un visor especializado e independiente para la cartelera de horarios, aulas y - uso de credencial de la Universidad de la Ciudad.

+

Aulas UNICABA es el visor especializado, independiente y offline-first para + la cartelera de horarios, campus virtual y seguimiento de tu progreso académico de la Universidad de la Ciudad. + Desarrollado pensando en + el uso en movimiento, el ahorro de batería y la mala conectividad.

+ +

Nuevas Características y Funciones

    -
  • Consulta materias, horarios y aulas rápidamente.
  • -
  • Sigue tus Favoritos y recibe alertas locales si cambian de aula.
  • -
  • ¡NUEVO! Visualiza tu Credencial Digital de estudiante tocando el logo de - la UNICABA en la cabecera.
  • +
  • Cartelera Rápida y Offline: Consulta de materias organizada por días y cacheada al + instante. Muestra datos rápido aunque estés bajo tierra sin red.
  • +
  • Mi Carrera y Trackeo: Ingresá a tu Plan de Estudios interactivo. Usá los Action Sheets + nativos para marcar materias como 'Aprobadas' (Fucsia) o 'En Curso' + (Violeta), y gestioná tus Materias Optativas desde el catálogo + directamente con un clic.
  • +
  • Próxima Clase Inteligente: Un banner destacado superior en Favoritos te avisa cuándo es y + cuánto falta + para tu próxima clase, con un reloj regresivo dinámico en vivo.
  • +
  • Alertas Automáticas: Si la universidad cambia repentinamente el número de aula o el link de + Meet/Zoom de tus materias, serás notificado. También recibís pre-alertas de 30 minutos antes de cursar.
-

Credencial Digital (Opcional)

-

El inicio de sesión para obtener la credencial es 100% opcional y completamente independiente - de la cartelera de aulas (que puedes seguir usando sin loguearte).

-

Tus credenciales (DNI y Clave) se comunican directamente con el Campus Virtual (Moodle) para - descargar el PDF de tu código QR, sin pasar por ningún servidor intermediario. Luego, la imagen queda guardada - localmente en tu celular para que puedas mostrarla incluso sin conexión a internet.

+

Agenda de Hitos Académicos

+
    +
  • Accedé rápidamente para agendar Parciales / Trabajos Prácticos / Finales desde cualquier + materia para llevar un control estricto.
  • +
  • El robusto sistema de calendario nativo "Wheels" evitará borrados accidentales de tus fechas importantes. +
  • +
-

Almacenamiento Seguro y Persistente

-

Tus datos son tuyos. Aseguramos que tus materias favoritas se guarden automáticamente en un archivo - .csv seguro dentro de la carpeta "Documentos" de tu dispositivo. +

Credencial Inmediata y Exportación

+
    +
  • Credencial Digital: Tocando el logo superior izquierdo obtenés tu QR offline y se sube el + brillo de tu pantalla al máximo de forma automática para facilitar la lectura.
  • +
  • Respaldo Portable Seguro: Apretando la "Nubecita" o "Disquete" podés emitir un archivo de + backup (JSON seguro) hacia la memoria o nube de tu teléfono, para que restaures de inmediato toda la + configuración si mudás a otro equipo.
  • +
+ +

Privacidad Zero-Trust

+

Sin Servidores Intermediarios: No dependemos de bases de datos centralizadas, ni recopilamos + credenciales. Cada sincronización viaja directo desde Aulas UNICABA hasta el servidor del SIU/Google localmente.

-

Gracias a esto, toda tu configuración y datos están a salvo y sobrevivirán a desinstalaciones - o actualizaciones de la aplicación sin tener que subirlos a la nube.

-

Privacidad Absoluta

-

Sin Intermediarios: No recopilamos nombres, contraseñas, ni correos. Todo el procesamiento se - realiza en la memoria de tu teléfono.

-

Sin Rastreadores: No incluimos publicidad, telemetría ni analíticas de terceros.

+

Tu ecosistema digital universitario, diseñado por y + para estudiantes.

+ +

Versión 1.2.1

-

Versión 1.1.9 - 26/03/2026

- + @@ -123,7 +145,7 @@

{{ errorMsg }}

- + @@ -174,21 +196,82 @@ -
+

No se encontraron horarios para la selección actual.

+ +
+ + +
+ Plan de Estudios / Recorrido + + + +
+

Selecciona tu carrera para guardar tu avance y ver el recorrido sugerido, toca materias + para marcarlas como aprobadas o en curso.

+ + + + Lic. en Tecnologías Digitales + Lic. en Ciencia de Datos + Lic. en Des. de Videojuegos + + +
+
+ +
+ + + + + + + + + + + + + + + +
1° Cuat.2° Cuat.3° Cuat.
+
+ {{ row.c1.name }} +
+
+
+ {{ row.c2.name }} +
+
+
+ {{ row.c3.name }} +
+
+
+
+ - - -