Android mobile client
Native Kotlin + Jetpack Compose app in android-app/.
Local mirror (Windows): C:\Users\Dverh\Documents\android app school V2 — sync via android-app/scripts/sync-android-copy.ps1 (see android-app/README.md).
Auth and API
| Mechanism | Detail |
|---|---|
| REST | Same /api/* routes as web (server.ts, lib/walletTransportRoutes.ts) |
| Session | Cookie omnitrack.sid via OkHttp CookieJar |
| Realtime | Socket.io /socket.io (requires session cookie; no Bearer JWT) |
| Client header | X-OmniTrack-Client: android |
| Routing | GET /api/routing/drive (auth + rate limit; OSRM via OSRM_ROUTING_URL on server) |
Wallet / Mollie
POST /api/wallet/top-up/mollie accepts optional body field redirectUrl (base deep link, e.g. omnitransitiq://wallet). Server appends ?walletIntent=<id> or &walletIntent=….
Fallback when header is android and no redirectUrl: env MOBILE_WALLET_REDIRECT_SCHEME (default omnitransitiq://wallet).
Roles and UI (native Android)
| Role | Shell |
|---|---|
driver | Modern slide-out sidebar (DriverShell.kt), default Home |
| Others | Home default + ModalNavigationDrawer sidebar (DashboardShell.kt) — no bottom bar on phone |
Post-login chrome:
OmniSidebarModern— glass sidebar, thin outlined icons viaOmniIcons.ktOmniAppTopBar— hamburger, title, language/refresh/actionsHomeScreen.kt— role-aware stats + quick actionsRoutePlannerScreen.kt+NavigationMode.kt— in-app turn-by-turn (no external maps)- Map — Carto Positron Light tiles from
assets/map-style.json; ring markers + dual-layer routes inMapScreen.kt
Pre-v2 bottom-nav UI is archived in android-app-legacy/ — restore via android-app/scripts/restore-from-legacy.ps1.
Login uses the native hero + glass card flow (ui/auth/AuthScreens.kt).
Nav visibility follows the same rules as web (src/App.tsx); labels from synced locales. Permissions mirror src/authzClient.ts.
Location
ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION for map pickup and in-app navigation. FOREGROUND_SERVICE + FOREGROUND_SERVICE_LOCATION declared for navigation sessions.
i18n
Locales loaded from assets (android-app/app/src/main/assets/locales/), synced from src/locales/*.json via android-app/scripts/sync-locales.mjs. Home keys: dashboard.home*; navigation: nav.*.
Local dev
docker compose upon host (port 3000)- Emulator uses
http://10.0.2.2:3000(debug BuildConfig) - Physical device: set LAN IP in login advanced settings
- After edits on network drive:
powershell -ExecutionPolicy Bypass -File android-app/scripts/sync-android-copy.ps1 -Direction push
CI
Optional workflow: .github/workflows/android-app.yml runs assembleDebug when android-app/** changes.
References
android-app/README.md- iOS twin:
mobile-ios.md - Network boundaries:
identity-and-network-boundary.md