Skip to main content

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

MechanismDetail
RESTSame /api/* routes as web (server.ts, lib/walletTransportRoutes.ts)
SessionCookie omnitrack.sid via OkHttp CookieJar
RealtimeSocket.io /socket.io (requires session cookie; no Bearer JWT)
Client headerX-OmniTrack-Client: android
RoutingGET /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)

RoleShell
driverModern slide-out sidebar (DriverShell.kt), default Home
OthersHome default + ModalNavigationDrawer sidebar (DashboardShell.kt) — no bottom bar on phone

Post-login chrome:

  • OmniSidebarModern — glass sidebar, thin outlined icons via OmniIcons.kt
  • OmniAppTopBar — hamburger, title, language/refresh/actions
  • HomeScreen.kt — role-aware stats + quick actions
  • RoutePlannerScreen.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 in MapScreen.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

  1. docker compose up on host (port 3000)
  2. Emulator uses http://10.0.2.2:3000 (debug BuildConfig)
  3. Physical device: set LAN IP in login advanced settings
  4. 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