Skip to main content

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.

TabRouteIconRoot Screen
MapmapIcons.Filled.MapMapScreen
DevicesdevicesIcons.Filled.RouterDevicesListScreen
ActivityactivityIcons.Filled.NotificationsNotificationScreen
Settingssettings (via settings_graph)Icons.Filled.SettingsSettingsScreen

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​

ScreenRouteViewModelPurpose
MapScreenmapDevicesViewModel (shared) + own MapViewModelLive device map with real-time positions and device selection

Navigates to: DeviceDetail, History, Sharing


Devices​

ScreenRouteViewModelPurpose
DevicesListScreendevicesDevicesViewModel (shared) + AddDeviceViewModelLists all claimed/shared devices with status indicators
DeviceDetailScreendevice_detail/{deviceId}DeviceDetailViewModelDevice info, quick actions, and navigation hub to sub-screens
DeviceSettingsScreendevice_settings/{deviceId}DeviceSettingsViewModelEdit device name, icon category, and icon selection
DeviceNotificationsScreendevice_notifications/{deviceId}DeviceNotificationsViewModelPer-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​

ScreenRouteViewModelPurpose
HistoryScreenhistory/{deviceId}/{deviceName}HistoryViewModelPlayback of device position history with speed control and date filtering

Sharing​

ScreenRouteViewModelPurpose
SharingScreensharing/{deviceId}/{deviceName}/{isOwner}SharingViewModelManage device shares: invite users, revoke access, leave shared devices
InvitesListScreeninvitesInvitesListViewModelView and accept/decline incoming device sharing invitations

Geofences​

ScreenRouteViewModelPurpose
GeofencesListScreengeofences/{deviceId}/{deviceName}GeofencesListViewModelList geofences for a device with delete support
GeofenceEditorScreengeofence_editor/{deviceId}/{deviceName}?id={geofenceId}GeofenceEditorViewModelCreate or edit geofences (circle/polygon) with multi-phase draw β†’ details UI

Commands​

ScreenRouteViewModelPurpose
CommandsHistoryScreencommands/{deviceId}/{model}CommandsHistoryViewModel + SendCommandViewModelView command history and send new commands to a device

Notifications​

ScreenRouteViewModelPurpose
NotificationScreenactivityNotificationViewModel (shared)Unread notification feed with real-time WebSocket updates
NotificationArchiveScreennotification_archiveNotificationArchiveViewModelRead/archived notifications with pagination and bulk delete
NotificationSettingsScreennotification_settingsNotificationSettingsViewModelNotification sound preferences

Settings​

ScreenRouteViewModelPurpose
SettingsScreensettingsSettingsViewModelSettings hub: profile, security, notifications, legal, billing
EditProfileScreenedit_profileEditProfileViewModelEdit user name and timezone
ChangePasswordScreenchange_passwordChangePasswordViewModelChange account password with current password verification
SetPasswordScreenset_passwordSetPasswordViewModelSet password for OAuth-only users who have no password yet
DeleteAccountScreendelete_accountDeleteAccountViewModelPermanent account deletion with "DELETE" text confirmation
TwoFactorSetupScreentwo_factor_setupTwoFactorSetupViewModelEnable/disable 2FA with QR code, verification, and backup codes
LegalDocumentScreenterms_of_serviceLegalDocumentViewModelDisplays Terms of Service in user locale
LegalDocumentScreenprivacy_policyLegalDocumentViewModelDisplays Privacy Policy in user locale
SupportScreensupport(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​

ScreenRouteViewModelPurpose
SubscriptionManagementScreensubscription_managementSubscriptionManagementViewModelView active subscription, license info, and initiate plan changes
SubscriptionScreensubscription_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.

ScreenAuthScreen StateViewModelPurpose
LoginScreenAuthScreen.LoginLoginViewModelEmail/password login with Google and Facebook OAuth
RegisterScreenAuthScreen.RegisterRegisterViewModelNew account registration with password validation
VerificationCodeScreenAuthScreen.Verification(email)VerificationViewModelEmail verification via OTP code with auto-submit
TermsAcceptanceScreenAuthScreen.TermsAcceptance(userName)TermsAcceptanceViewModelTerms acceptance for social login users
ForgotPasswordScreenAuthScreen.ForgotPasswordForgotPasswordViewModelRequest password reset email
ResetCodeScreenAuthScreen.ResetCode(email)ResetCodeViewModelEnter password reset verification code
ResetPasswordScreenAuthScreen.ResetPassword(email, code)ResetPasswordViewModelSet new password after code verification
TwoFactorScreen(inline in LoginScreen)TwoFactorViewModel2FA 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​

RouteParameterTypeDescription
device_detail/{deviceId}deviceIdIntDevice ID
history/{deviceId}/{deviceName}deviceIdIntDevice ID
deviceNameStringDevice display name
sharing/{deviceId}/{deviceName}/{isOwner}deviceIdIntDevice ID
deviceNameStringDevice display name
isOwnerBooleanWhether current user owns the device
geofences/{deviceId}/{deviceName}deviceIdIntDevice ID
deviceNameStringDevice display name
geofence_editor/{deviceId}/{deviceName}?id={geofenceId}deviceIdIntDevice ID
deviceNameStringDevice display name
commands/{deviceId}/{model}deviceIdIntDevice ID
modelStringDevice model (URL-encoded)
device_settings/{deviceId}deviceIdIntDevice ID
device_notifications/{deviceId}deviceIdIntDevice ID

Query Parameters (Optional)​

RouteParameterTypeDefaultDescription
geofence_editor/…?id={geofenceId}geofenceIdInt-1Geofence ID; -1 means create new
subscription_plans?…currentInt-1Current plan device count
activeInt-1Active device count
periodString"NONE"Current billing period (MONTHLY, YEARLY, NONE)

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​

FromToTrigger
MapDeviceDetailTap device info
MapHistoryTap device history action
MapSharingTap device share action
DevicesDeviceDetailTap device in list
DevicesHistorySwipe action on device
DevicesSharingSwipe action on device
DevicesSubscriptionPlansTap upgrade when over license
ActivityMapTap 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:

ViewModelScreensPurpose
DevicesViewModelMapScreen, DevicesListScreen, DeviceDetailScreen (indirectly), SharingScreen, InvitesListScreen, DeviceSettingsScreen, GeofencesListScreenSingle source of truth for device list, selection state, and WebSocket connection
NotificationViewModelNotificationScreenNotification 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/:

FileContains
MapScreen.ktMapScreen composable
DevicesListScreen.ktDevicesListScreen composable
DevicesViewModel.ktDevicesViewModel class
DevicesUiState.ktUI state models for devices
DeviceDetailScreen.ktDeviceDetailScreen composable
DeviceDetailViewModel.ktDeviceDetailViewModel class
DeviceSettingsScreen.ktDeviceSettingsScreen composable
DeviceSettingsViewModel.ktDeviceSettingsViewModel class
DeviceNotificationsScreen.ktDeviceNotificationsScreen composable
DeviceNotificationsViewModel.ktDeviceNotificationsViewModel class
HistoryScreen.ktHistoryScreen composable
HistoryViewModel.ktHistoryViewModel class
SharingScreen.ktSharingScreen composable
SharingViewModel.ktSharingViewModel class
InvitesListScreen.ktInvitesListScreen composable
InvitesListViewModel.ktInvitesListViewModel class
GeofencesListScreen.ktGeofencesListScreen composable
GeofencesListViewModel.ktGeofencesListViewModel class
GeofenceEditorScreen.ktGeofenceEditorScreen composable
GeofenceEditorViewModel.ktGeofenceEditorViewModel class
CommandsHistoryScreen.ktCommandsHistoryScreen composable
CommandsHistoryViewModel.ktCommandsHistoryViewModel class
SendCommandViewModel.ktSendCommandViewModel class
NotificationScreen.ktNotificationScreen composable
NotificationViewModel.ktNotificationViewModel class
NotificationArchiveScreen.ktNotificationArchiveScreen composable
NotificationArchiveViewModel.ktNotificationArchiveViewModel class
NotificationSettingsScreen.ktNotificationSettingsScreen composable
SettingsScreen.ktSettingsScreen composable
SettingsViewModel.ktSettingsViewModel class
EditProfileScreen.ktEditProfileScreen composable
EditProfileViewModel.ktEditProfileViewModel class
ChangePasswordScreen.ktChangePasswordScreen composable
ChangePasswordViewModel.ktChangePasswordViewModel class
SetPasswordScreen.ktSetPasswordScreen composable
SetPasswordViewModel.ktSetPasswordViewModel class
DeleteAccountScreen.ktDeleteAccountScreen composable
DeleteAccountViewModel.ktDeleteAccountViewModel class
TwoFactorSetupScreen.ktTwoFactorSetupScreen composable
TwoFactorSetupViewModel.ktTwoFactorSetupViewModel class
TwoFactorScreen.ktTwoFactorScreen composable
TwoFactorViewModel.ktTwoFactorViewModel class
LoginScreen.ktLoginScreen composable
LoginViewModel.ktLoginViewModel class
RegisterScreen.ktRegisterScreen composable
RegisterViewModel.ktRegisterViewModel class
VerificationCodeScreen.ktVerificationCodeScreen composable
VerificationViewModel.ktVerificationViewModel class
TermsAcceptanceScreen.ktTermsAcceptanceScreen composable
TermsAcceptanceViewModel.ktTermsAcceptanceViewModel class
ForgotPasswordScreen.ktForgotPasswordScreen composable
ForgotPasswordViewModel.ktForgotPasswordViewModel class
ResetCodeScreen.ktResetCodeScreen composable
ResetCodeViewModel.ktResetCodeViewModel class
ResetPasswordScreen.ktResetPasswordScreen composable
ResetPasswordViewModel.ktResetPasswordViewModel class
LegalDocumentScreen.ktLegalDocumentScreen composable
LegalDocumentViewModel.ktLegalDocumentViewModel class
SupportScreen.ktSupportScreen composable
AddDeviceScreen.ktAddDeviceScreen composable (bottom sheet)
AddDeviceViewModel.ktAddDeviceViewModel class
AuthNavigationViewModel.ktAuthNavigationViewModel, AuthScreen sealed class

ViewModels that are not co-located with their screens are in ui/viewmodels/:

FileContains
MapViewModel.ktMapViewModel class
NotificationSettingsViewModel.ktNotificationSettingsViewModel class

Subscription screens are in ui/subscription/:

FileContains
SubscriptionScreen.ktSubscriptionScreen composable
SubscriptionManagementScreen.ktSubscriptionManagementScreen composable
SubscriptionManagementViewModel.ktSubscriptionManagementViewModel class

Navigation infrastructure is in ui/navigation/:

FileContains
MainNavigation.ktScreen sealed class, NavHost setup, all composable routes
NavigationBar.ktCustom bottom navigation bar component
ProfilePreloadEntryPoint.ktHilt entry point for preloading user profile