Native Kotlin/Compose client for SEQTA Learn — multi-module architecture with auth, networking, session management, background sync, widgets, and notifications.
- Android Studio Ladybug or newer
- JDK 11+
- Android SDK 36
- Min SDK 24
./gradlew assembleDebugInstall on a device/emulator:
./gradlew installDebugRun unit tests:
./gradlew testapp/ → Hilt entry, MainActivity, MainShell navigation
core/common/ → AppResult, dispatchers
core/designsystem/ → BetterTheme, motion, UI components
core/network/ → OkHttp interceptors, Retrofit SeqtaStudentApi
core/session/ → Encrypted session, user prefs, launch gate
core/background/ → WorkManager, notification channels, schedulers
domain/ → Models, repository interfaces, use cases
data/ → DTOs, mappers, repository implementations
feature/auth/ → Login (QR, deeplink, credentials, WebView)
feature/widget/ → Home-screen next-lesson widget
feature/notifications/ → Assessment reminders + notice polling
feature/calendar-sync/ → Google Calendar timetable sync
feature/*/ → Home, timetable, courses, assessments, messages, notices, portals, settings
domainhas no Android/framework dependenciesdataimplementsdomainrepositoriesfeature/*depends ondomain+core:designsystem(+ shared core modules as needed)appwires everything with Hilt
| Flow | Scheme / UI | Description |
|---|---|---|
| SEQTA QR SSO | seqtalearn://sso/, seqta://sso/ |
JWT exchange → JSESSIONID |
| Extension connect | desqta://connect/, betterseqtalearn://connect/ |
Session cookie + heartbeat |
| WebView | School web tab | Loads {baseUrl}/seqta/learn, captures JSESSIONID |
| Direct login | Sign in tab | Username/password via /seqta/student/login |
Cold start validates stored sessions with a SEQTA heartbeat before entering the app.
Sessions are stored in EncryptedSharedPreferences via SecureSessionStore (credentials are not persisted).
SeqtaAuthInterceptor mirrors desqta netgrab.rs:
- JSESSIONID cookie + Origin/Referer headers
- JWT Bearer transition when token starts with
eyJ - 401 → session cleared
- 10s connect / 30s read timeouts, 3 retries
- Next lesson widget — periodic timetable fetch (DesQTA parity)
- Notifications — assessment reminders (3d, 1d, due, overdue) and new SEQTA notices
- Calendar sync — optional sync to a dedicated on-device calendar via
CalendarContract
Configure toggles in Settings.
Semantic tokens ported from BetterSEQTA-Plus (theme.scss):
- Primary accent
#3B82F6 - Surface tiers for light/dark
- White text in dark mode
org.bettersetqa.betterseqtalearn