OrarViewer este o aplicație modernă de Android, construită nativ în Kotlin și Jetpack Compose (Material 3), dedicată studenților care urmează două facultăți concomitent (ex: Facultatea de Automatică și Calculatoare - ACS + Facultatea de Științe Aplicate - FSA).
Aplicația rezolvă problema suprapunerii orelor universitare, calculului parității săptămânilor (Par / Impar) și oferă widget-uri de ecran principal optimizate pentru clustere/stive Smart Widget 4x2.
- Top Bar Compact (~15-20% din ecran): Selector de zi rapid (Luni – Vineri), indicator de săptămână și paritate (ex:
Săpt. 2 • PAR), fără elemente voluminoase care să irosească ecranul. - Ecran Dedicat de Setări & Gestionare (BottomSheet): Căutare rapidă de săli/materii, filtrare pe facultate (ACS / FSA / Opționale), configurare semestru și sincronizare cloud.
- 80-85% Canvas pentru Orar: Listă fluidă cu toate activitățile academice ale zilei.
- Dimineți Libere (
🌅 Dimineață Liberă): Dacă într-o zi nu ai cursuri de la 08:00, aplicația afișează automat un card distinct de dimineață liberă, fără să fie nevoie să verifici ceasul. - Ferestre între cursuri (
🟢 Fereastră Liberă): Pauzele de 2 ore dintre laboratoare/cursuri sunt semnalizate vizual în fluxul orarului.
Ambele widget-uri sunt configurate nativ la dimensiunea 4x2 pentru compatibilitate completă cu funcția Smart Widget / Stack (Samsung One UI & Android Launcher):
- Widget Săptămânal (
OrarWeekWidgetProvider):- Afișează orarul întregii săptămâni (Luni – Vineri) pe sloturi universitare standard.
- Ferestrele libere sunt marcate pozițional cu
—. - Logică automată de Duminică: Duminica comută automat pe săptămâna viitoare (crește numărul săptămânii și inversează paritatea) pentru a ști ce ai de pregătit pentru Luni.
- Widget Destinație / Următoarea Oră (
OrarNextClassWidgetProvider&OrarAppWidgetProvider):- În timpul orelor curente, afișează materia și sala.
- Comutare Proactivă cu 30 de minute înainte: În ultimele 30 de minute ale unui curs (sau în pauză), widget-ul comută automat pe următoarea destinație, evidențiind sala mare (
📍 SALA PR 106), disciplina și un countdown până la începere. - Programator de Alarme de Precizie (
WidgetAlarmScheduler): Widget-urile se actualizează exact la minutul tranzițiilor (laend - 30m, la începutul și finalul orelor) fără să depindă de trezirile lente ale sistemului.
- Sincronizare 1-click cu serverul PythonAnywhere (
https://<user>.pythonanywhere.com/api/orar). - File Picker nativ pentru importul direct al fișierelor
orar.jsonsalvate local pe telefon. - Mod complet offline cu cache securizat în
filesDir.
Acest proiect a fost conceput, structurat și dezvoltat în regim de pair-programming asistat de Inteligență Artificială (Google DeepMind Antigravity / Gemini).
Rolul AI-ului în proiect:
- Arhitecturarea componentelor reactive Jetpack Compose și a sistemului de rezolvare a conflictelor de orar.
- Scrierea logicii complexe de calcul al parității semestriale și a providerilor
RemoteViewspentru widget-urile Android.- Implementarea mecanismului de trezire punctuală prin
AlarmManagerpentru actualizarea widget-urilor cu 30 de minute în avans.- Rafinarea layout-urilor conform principiilor de UI/UX modern (Material 3 Dark Theme).
Rolul uman:
- Definirea cerințelor specifice pentru studentul care urmează două facultăți în paralel.
- Validarea fluxului pe dispozitive fizice (Samsung Galaxy / One UI) și feedback iterativ pe proporțiile ecranului și comportamentul widget-urilor.
- Limbaj: Kotlin 2.0+
- Framework UI: Jetpack Compose, Material 3
- Arhitectură: Clean Architecture (Data, Domain, UI Components)
- Persistență & Modele: Gson, Android SharedPreferences, Local Storage Cache
- Widget-uri: Android AppWidget Framework, RemoteViews, AlarmManager RTC_WAKEUP
- Asincron: Kotlin Coroutines & Flow
- Clonează depozitul:
git clone https://github.com/tgnfrzt/OrarViewer-Android.git
- Deschide proiectul în Android Studio (Hedgehog sau mai nou).
- Conectează un dispozitiv Android (sau emulator) și rulează:
./gradlew assembleDebug
- APK-ul generat se va afla la:
app/build/outputs/apk/debug/app-debug.apk
Acest proiect este licențiat sub licența MIT.