Screen & Route Catalog
Complete inventory of every screen in the Visla GPS Android app, organised by feature area. For navigation architecture details (back stack management, deep links, transition behaviour), see navigation.md.
Bottom Navigation Tabsβ
The bottom bar contains four root tabs, always visible regardless of navigation depth.
| Tab | Route | Icon | Root Screen |
|---|---|---|---|
| Map | map | Icons.Filled.Map | MapScreen |
| Devices | devices | Icons.Filled.Router | DevicesListScreen |
| Activity | activity | Icons.Filled.Notifications | NotificationScreen |
| Settings | settings (via settings_graph) | Icons.Filled.Settings | SettingsScreen |
The Settings tab navigates to the nested graph route settings_graph rather than the settings composable directly. See navigation.md for details.
Screen Inventory by Feature Areaβ
Mapβ
| Screen | Route | ViewModel | Purpose |
|---|---|---|---|
MapScreen | map | DevicesViewModel (shared) + own MapViewModel | Live device map with real-time positions and device selection |
Navigates to: DeviceDetail, History, Sharing
Devicesβ
| Screen | Route | ViewModel | Purpose |
|---|---|---|---|
DevicesListScreen | devices | DevicesViewModel (shared) + AddDeviceViewModel | Lists all claimed/shared devices with status indicators |
DeviceDetailScreen | device_detail/{deviceId} | DeviceDetailViewModel | Device info, quick actions, and navigation hub to sub-screens |
DeviceSettingsScreen | device_settings/{deviceId} | DeviceSettingsViewModel | Edit device name, icon category, and icon selection |
DeviceNotificationsScreen | device_notifications/{deviceId} | DeviceNotificationsViewModel | Per-device notification types and contact management |
Note: AddDeviceScreen is rendered as a bottom sheet within DevicesListScreen, not as a routed screen. It uses AddDeviceViewModel for QR scanning and device claiming.
Location Historyβ
| Screen | Route | ViewModel | Purpose |
|---|---|---|---|
HistoryScreen | history/{deviceId}/{deviceName} | HistoryViewModel | Playback of device position history with speed control and date filtering |
Sharingβ
| Screen | Route | ViewModel | Purpose |
|---|---|---|---|
SharingScreen | sharing/{deviceId}/{deviceName}/{isOwner} | SharingViewModel | Manage device shares: invite users, revoke access, leave shared devices |
InvitesListScreen | invites | InvitesListViewModel | View and accept/decline incoming device sharing invitations |
Geofencesβ
| Screen | Route | ViewModel | Purpose |
|---|---|---|---|
GeofencesListScreen | geofences/{deviceId}/{deviceName} | GeofencesListViewModel | List geofences for a device with delete support |
GeofenceEditorScreen | geofence_editor/{deviceId}/{deviceName}?id={geofenceId} | GeofenceEditorViewModel | Create or edit geofences (circle/polygon) with multi-phase draw β details UI |
Commandsβ
| Screen | Route | ViewModel | Purpose |
|---|---|---|---|
CommandsHistoryScreen | commands/{deviceId}/{model} | CommandsHistoryViewModel + SendCommandViewModel | View command history and send new commands to a device |
Notificationsβ
| Screen | Route | ViewModel | Purpose |
|---|---|---|---|
NotificationScreen | activity | NotificationViewModel (shared) | Unread notification feed with real-time WebSocket updates |
NotificationArchiveScreen | notification_archive | NotificationArchiveViewModel | Read/archived notifications with pagination and bulk delete |
NotificationSettingsScreen | notification_settings | NotificationSettingsViewModel | Notification sound preferences |
Settingsβ
| Screen | Route | ViewModel | Purpose |
|---|---|---|---|
SettingsScreen | settings | SettingsViewModel | Settings hub: profile, security, notifications, legal, billing |
EditProfileScreen | edit_profile | EditProfileViewModel | Edit user name and timezone |
ChangePasswordScreen | change_password | ChangePasswordViewModel | Change account password with current password verification |
SetPasswordScreen | set_password | SetPasswordViewModel | Set password for OAuth-only users who have no password yet |
DeleteAccountScreen | delete_account | DeleteAccountViewModel | Permanent account deletion with "DELETE" text confirmation |
TwoFactorSetupScreen | two_factor_setup | TwoFactorSetupViewModel | Enable/disable 2FA with QR code, verification, and backup codes |
LegalDocumentScreen | terms_of_service | LegalDocumentViewModel | Displays Terms of Service in user locale |
LegalDocumentScreen | privacy_policy | LegalDocumentViewModel | Displays Privacy Policy in user locale |
SupportScreen | support | (none) | Support/help page |
Note: LegalDocumentScreen is reused for both Terms of Service and Privacy Policy, differentiated by the documentType parameter ("terms" or "privacy").
Billing & Subscriptionsβ
| Screen | Route | ViewModel | Purpose |
|---|---|---|---|
SubscriptionManagementScreen | subscription_management | SubscriptionManagementViewModel | View active subscription, license info, and initiate plan changes |
SubscriptionScreen | subscription_plans?current={current}&active={active}&period={period} | (none β billing-driven) | Plan selection and in-app purchase flow |
These screens live in ui/subscription/ rather than ui/screens/.
Authentication (Pre-Login)β
Auth screens are not part of the NavHost. They are rendered by a when-based screen switcher in MainActivity.AuthContent, driven by the AuthScreen sealed class in AuthNavigationViewModel.
| Screen | AuthScreen State | ViewModel | Purpose |
|---|---|---|---|
LoginScreen | AuthScreen.Login | LoginViewModel | Email/password login with Google and Facebook OAuth |
RegisterScreen | AuthScreen.Register | RegisterViewModel | New account registration with password validation |
VerificationCodeScreen | AuthScreen.Verification(email) | VerificationViewModel | Email verification via OTP code with auto-submit |
TermsAcceptanceScreen | AuthScreen.TermsAcceptance(userName) | TermsAcceptanceViewModel | Terms acceptance for social login users |
ForgotPasswordScreen | AuthScreen.ForgotPassword | ForgotPasswordViewModel | Request password reset email |
ResetCodeScreen | AuthScreen.ResetCode(email) | ResetCodeViewModel | Enter password reset verification code |
ResetPasswordScreen | AuthScreen.ResetPassword(email, code) | ResetPasswordViewModel | Set new password after code verification |
TwoFactorScreen | (inline in LoginScreen) | TwoFactorViewModel | 2FA code entry during login (rendered as overlay within LoginScreen) |
Auth flow: Login β Register Β· Login β ForgotPassword β ResetCode β ResetPassword Β· Login β Verification Β· Login β TermsAcceptance Β· Login β TwoFactor Β· Any successful auth β AuthScreen.Main β MainNavigation
Route Parameters Referenceβ
Path Parametersβ
| Route | Parameter | Type | Description |
|---|---|---|---|
device_detail/{deviceId} | deviceId | Int | Device ID |
history/{deviceId}/{deviceName} | deviceId | Int | Device ID |
deviceName | String | Device display name | |
sharing/{deviceId}/{deviceName}/{isOwner} | deviceId | Int | Device ID |
deviceName | String | Device display name | |
isOwner | Boolean | Whether current user owns the device | |
geofences/{deviceId}/{deviceName} | deviceId | Int | Device ID |
deviceName | String | Device display name | |
geofence_editor/{deviceId}/{deviceName}?id={geofenceId} | deviceId | Int | Device ID |
deviceName | String | Device display name | |
commands/{deviceId}/{model} | deviceId | Int | Device ID |
model | String | Device model (URL-encoded) | |
device_settings/{deviceId} | deviceId | Int | Device ID |
device_notifications/{deviceId} | deviceId | Int | Device ID |
Query Parameters (Optional)β
| Route | Parameter | Type | Default | Description |
|---|---|---|---|---|
geofence_editor/β¦?id={geofenceId} | geofenceId | Int | -1 | Geofence ID; -1 means create new |
subscription_plans?β¦ | current | Int | -1 | Current plan device count |
active | Int | -1 | Active device count | |
period | String | "NONE" | Current billing period (MONTHLY, YEARLY, NONE) |
Navigation Relationshipsβ
DeviceDetail Hubβ
DeviceDetailScreen is the central hub for device-related sub-screens:
Settings Hubβ
SettingsScreen links to all settings sub-screens within the nested settings_graph:
Cross-Tab Navigationβ
| From | To | Trigger |
|---|---|---|
| Map | DeviceDetail | Tap device info |
| Map | History | Tap device history action |
| Map | Sharing | Tap device share action |
| Devices | DeviceDetail | Tap device in list |
| Devices | History | Swipe action on device |
| Devices | Sharing | Swipe action on device |
| Devices | SubscriptionPlans | Tap upgrade when over license |
| Activity | Map | Tap notification (sets pending navigation) |
| Invites | (triggers refresh) | Accept invite refreshes devices + WebSocket |
Shared ViewModelsβ
Two ViewModels are scoped to MainNavigation and passed to multiple screens:
| ViewModel | Screens | Purpose |
|---|---|---|
DevicesViewModel | MapScreen, DevicesListScreen, DeviceDetailScreen (indirectly), SharingScreen, InvitesListScreen, DeviceSettingsScreen, GeofencesListScreen | Single source of truth for device list, selection state, and WebSocket connection |
NotificationViewModel | NotificationScreen | Notification feed state with WebSocket real-time updates |
Source File Locationsβ
Most screen composables and ViewModels are in ui/screens/ as flat files (no subdirectories). A small number of ViewModels live in ui/viewmodels/:
| File | Contains |
|---|---|
MapScreen.kt | MapScreen composable |
DevicesListScreen.kt | DevicesListScreen composable |
DevicesViewModel.kt | DevicesViewModel class |
DevicesUiState.kt | UI state models for devices |
DeviceDetailScreen.kt | DeviceDetailScreen composable |
DeviceDetailViewModel.kt | DeviceDetailViewModel class |
DeviceSettingsScreen.kt | DeviceSettingsScreen composable |
DeviceSettingsViewModel.kt | DeviceSettingsViewModel class |
DeviceNotificationsScreen.kt | DeviceNotificationsScreen composable |
DeviceNotificationsViewModel.kt | DeviceNotificationsViewModel class |
HistoryScreen.kt | HistoryScreen composable |
HistoryViewModel.kt | HistoryViewModel class |
SharingScreen.kt | SharingScreen composable |
SharingViewModel.kt | SharingViewModel class |
InvitesListScreen.kt | InvitesListScreen composable |
InvitesListViewModel.kt | InvitesListViewModel class |
GeofencesListScreen.kt | GeofencesListScreen composable |
GeofencesListViewModel.kt | GeofencesListViewModel class |
GeofenceEditorScreen.kt | GeofenceEditorScreen composable |
GeofenceEditorViewModel.kt | GeofenceEditorViewModel class |
CommandsHistoryScreen.kt | CommandsHistoryScreen composable |
CommandsHistoryViewModel.kt | CommandsHistoryViewModel class |
SendCommandViewModel.kt | SendCommandViewModel class |
NotificationScreen.kt | NotificationScreen composable |
NotificationViewModel.kt | NotificationViewModel class |
NotificationArchiveScreen.kt | NotificationArchiveScreen composable |
NotificationArchiveViewModel.kt | NotificationArchiveViewModel class |
NotificationSettingsScreen.kt | NotificationSettingsScreen composable |
SettingsScreen.kt | SettingsScreen composable |
SettingsViewModel.kt | SettingsViewModel class |
EditProfileScreen.kt | EditProfileScreen composable |
EditProfileViewModel.kt | EditProfileViewModel class |
ChangePasswordScreen.kt | ChangePasswordScreen composable |
ChangePasswordViewModel.kt | ChangePasswordViewModel class |
SetPasswordScreen.kt | SetPasswordScreen composable |
SetPasswordViewModel.kt | SetPasswordViewModel class |
DeleteAccountScreen.kt | DeleteAccountScreen composable |
DeleteAccountViewModel.kt | DeleteAccountViewModel class |
TwoFactorSetupScreen.kt | TwoFactorSetupScreen composable |
TwoFactorSetupViewModel.kt | TwoFactorSetupViewModel class |
TwoFactorScreen.kt | TwoFactorScreen composable |
TwoFactorViewModel.kt | TwoFactorViewModel class |
LoginScreen.kt | LoginScreen composable |
LoginViewModel.kt | LoginViewModel class |
RegisterScreen.kt | RegisterScreen composable |
RegisterViewModel.kt | RegisterViewModel class |
VerificationCodeScreen.kt | VerificationCodeScreen composable |
VerificationViewModel.kt | VerificationViewModel class |
TermsAcceptanceScreen.kt | TermsAcceptanceScreen composable |
TermsAcceptanceViewModel.kt | TermsAcceptanceViewModel class |
ForgotPasswordScreen.kt | ForgotPasswordScreen composable |
ForgotPasswordViewModel.kt | ForgotPasswordViewModel class |
ResetCodeScreen.kt | ResetCodeScreen composable |
ResetCodeViewModel.kt | ResetCodeViewModel class |
ResetPasswordScreen.kt | ResetPasswordScreen composable |
ResetPasswordViewModel.kt | ResetPasswordViewModel class |
LegalDocumentScreen.kt | LegalDocumentScreen composable |
LegalDocumentViewModel.kt | LegalDocumentViewModel class |
SupportScreen.kt | SupportScreen composable |
AddDeviceScreen.kt | AddDeviceScreen composable (bottom sheet) |
AddDeviceViewModel.kt | AddDeviceViewModel class |
AuthNavigationViewModel.kt | AuthNavigationViewModel, AuthScreen sealed class |
ViewModels that are not co-located with their screens are in ui/viewmodels/:
| File | Contains |
|---|---|
MapViewModel.kt | MapViewModel class |
NotificationSettingsViewModel.kt | NotificationSettingsViewModel class |
Subscription screens are in ui/subscription/:
| File | Contains |
|---|---|
SubscriptionScreen.kt | SubscriptionScreen composable |
SubscriptionManagementScreen.kt | SubscriptionManagementScreen composable |
SubscriptionManagementViewModel.kt | SubscriptionManagementViewModel class |
Navigation infrastructure is in ui/navigation/:
| File | Contains |
|---|---|
MainNavigation.kt | Screen sealed class, NavHost setup, all composable routes |
NavigationBar.kt | Custom bottom navigation bar component |
ProfilePreloadEntryPoint.kt | Hilt entry point for preloading user profile |