Package-level declarations
Types
A global manager for displaying alerts across the application. This allows ViewModels to trigger alerts without direct dependencies on UI components.
Filtered ADD-mode preview: the visible channel list paired with its default selections (always size-matched).
Platform-neutral representation of a discovered node for map rendering. Contains only the data needed to place and style a marker — no Room entities or platform types leak into the map provider API.
Neighbor type classification for discovery map markers.
Interface for providing a flavored MapView. This allows the map feature to be decoupled from specific map implementations (Google Maps vs OSMDroid). Platform implementations create their own ViewModel via Koin.
The UX-relevant state of a runtime permission, as recommended by the Android permissions guidance (https://developer.android.com/training/permissions/requesting). Declared in lifecycle order.
A reactive snapshot of a runtime permission plus the actions a caller can take. Produced by the rememberXxxPermissionState() composables and recomputed on ON_RESUME so it stays fresh when the user returns from a permission dialog or the system settings screen.
A global manager for displaying snackbars across the application. This allows ViewModels to trigger transient feedback messages without direct dependencies on UI components or SnackbarHostState.
Properties
Provides an embeddable discovery map composable that renders discovered node markers and topology polylines for a Local Mesh Discovery scan session. Unlike LocalMapViewProvider, this does not include node clustering, waypoints, location tracking, or any main-map features — it is designed to be embedded inside the discovery summary scaffold.
Provides the active EventFirmwareEdition (if any) to the composition tree. When a connected device reports an event firmware edition, this local is populated at the app root so consumers can pick it up without per-screen wiring: the Connections screen surfaces the edition itself, and LocalEventTheme derives the ambient theme from it. The app-bar logo is deliberately not one of those consumers — the Meshtastic identity stays in place regardless of the firmware running on the device.
Provides the platform-specific Map Main Screen. On Desktop or JVM targets where native maps aren't available yet, it falls back to a PlaceholderScreen.
The connected device's mesh Send/Receive activity stream, provided once at the app root (see MeshtasticAppShell).
The connected device's active LoRa modem preset, provided once at the app root (see MeshtasticAppShell) so signal quality can be rated relative to the preset's demodulation floor without threading it through every node/message composable. Null — the default before a device connects, and in previews/tests — falls back to the LongFast limit in ModemPreset?.snrLimit.
Provides the platform-specific Map Screen for a Node (e.g. Google Maps or OSMDroid on Android). On Desktop or JVM targets where native maps aren't available yet, it falls back to a PlaceholderScreen.
Provides an embeddable position-track map composable that renders a polyline with markers for the given positions. Unlike LocalNodeMapScreenProvider, this does not include a Scaffold or AppBar — it is designed to be embedded inside another screen layout (e.g. the position-log adaptive layout).
Whether the Site Planner coverage-estimate flow is available (Google flavor only, backed by the official hosted planner). Gates the "Estimate coverage" action on the node detail screen; the map's own control is gated equivalently in the Google MapView. Defaults to false so F-Droid/release never surface a dead action.
Provides an embeddable traceroute map composable that renders node markers and forward/return offset polylines for a traceroute result. Unlike LocalMapViewProvider, this does not include a Scaffold, AppBar, waypoints, location tracking, custom tiles, or any main-map features — it is designed to be embedded inside TracerouteMapScreen's scaffold.
Provides the platform-specific Traceroute Map Screen. On Desktop or JVM targets where native maps aren't available yet, it falls back to a PlaceholderScreen.
Functions
Parses the edition's #RRGGBB EventFirmwareEdition.accentColor into a Color, or null if absent/malformed.
A helper component that renders an AlertManager.AlertData using the same logic as MainScreen.
Parses HTML into an AnnotatedString with platform-appropriate rendering.
Parses HTML into an AnnotatedString with platform-appropriate rendering.
JVM stub — returns the raw HTML as plain text (no HTML rendering on Desktop).
Converts a raw neighbor info string into an AnnotatedString with SNR values highlighted according to their quality.
Converts a raw traceroute string into an AnnotatedString with SNR values highlighted according to their quality.
The edition's high-contrast detail color — theme.colors.accent (DEF CON's pink against its navy primary), falling back to theme.colors.secondary. Distinct from accentColorOrNull, which is the primary used for the ambient wash: the wash wants the calm color, small details want the loud one.
The edition's full brand palette (theme.palette) as colors, malformed entries dropped. Falls back to the named theme.colors (primary/secondary/accent) and finally the top-level accentColor, so an edition that carries only one color still yields a usable, non-empty list where one exists.
Pure classifier for a runtime permission's UX state. Kept platform-agnostic and side-effect-free so it can be unit-tested in commonTest without an Android Activity.
Event branding icon: loads the hosted EventFirmwareEdition.iconUrl when present and safe to fetch, falling back to the bundled per-edition drawable (eventIconFor), and finally the Meshtastic logo. The fallback painter also backs Coil's loading/error states so there is never an empty slot.
Bundled branding drawable for an edition, or null. Used as the offline fallback by EventBrandingIcon when a hosted EventFirmwareEdition.iconUrl is absent or fails to load.
Builds a Channel list from the difference between two ChannelSettings lists. Only changes are included in the resulting list.
Builds the filtered ADD-mode preview for QR import: existing channels followed by only the unique incoming channels.
A constant PermissionUiState for platforms / API levels where a permission is not gated at runtime.
Imports a ChannelSet as an authoritative REPLACE: writes every channel and — when present and actually different — the imported LoRa config, all inside one RadioController.editLocalSettings transaction, then replaces the local channel cache.
Returns whether Bluetooth is currently turned off at the system level (the adapter exists but is disabled). Always false on devices without Bluetooth and on platforms where the concept doesn't apply.
Returns whether Bluetooth is currently turned off at the system level (the adapter exists but is disabled). Always false on devices without Bluetooth and on platforms where the concept doesn't apply.
JVM — Bluetooth adapter state is not surfaced on Desktop.
Returns whether GPS/location services are currently disabled at the system level. Always false on platforms where this concept doesn't apply.
Returns whether GPS/location services are currently disabled at the system level. Always false on platforms where this concept doesn't apply.
JVM — GPS is never disabled on Desktop (concept doesn't apply).
Whether url is safe to fetch or open — see safeBrandUrlOrNull, which callers should prefer for the value.
Returns whether the device currently lacks any transport that can back the network-scan discovery (no active Wi-Fi, Ethernet, or VPN). Cellular alone is not sufficient — a carrier uplink does not place the device on the same segment as a Meshtastic node — so a cellular-only state surfaces the "connect to Wi-Fi" hint. The function name is historical: the original implementation checked Wi-Fi alone, later widened to Ethernet, and now also recognizes VPN (ZeroTier/Tailscale) as a valid reachability path for a TCP node. The name is retained to avoid churning the expect/actual contract and every consumer. Always false where the concept doesn't apply.
Returns whether the device currently lacks any transport that can back the network-scan discovery (no active Wi-Fi, Ethernet, or VPN). Cellular alone is not sufficient — a carrier uplink does not place the device on the same segment as a Meshtastic node — so a cellular-only state surfaces the "connect to Wi-Fi" hint. The function name is historical: the original implementation checked Wi-Fi alone, later widened to Ethernet, and now also recognizes VPN (ZeroTier/Tailscale) as a valid reachability path for a TCP node. The name is retained to avoid churning the expect/actual contract and every consumer. Always false where the concept doesn't apply.
JVM — local-network availability is not gated on Desktop.
Parses a #RRGGBB brand color into a Color, or null if absent/malformed. Tolerates a missing # and any case.
Returns the reactive PermissionUiState for the Bluetooth scan/connect permissions. On pre-Android-12 devices BLE scanning is gated by the location permission, so the returned state delegates to rememberLocationPermissionState.
Returns the reactive PermissionUiState for the Bluetooth scan/connect permissions. On pre-Android-12 devices BLE scanning is gated by the location permission, so the returned state delegates to rememberLocationPermissionState.
JVM — Desktop does not gate Bluetooth behind a runtime permission.
Returns the reactive PermissionUiState for the CAMERA permission. Always PermissionStatus.GRANTED on platforms that don't require a runtime camera permission.
Returns the reactive PermissionUiState for the CAMERA permission. Always PermissionStatus.GRANTED on platforms that don't require a runtime camera permission.
JVM — Desktop does not gate the camera behind a runtime permission.
Returns the reactive PermissionUiState for the ACCESS_LOCAL_NETWORK permission. Always PermissionStatus.GRANTED on API levels / platforms that don't gate local-network access behind a runtime permission.
Returns the reactive PermissionUiState for the ACCESS_LOCAL_NETWORK permission. Always PermissionStatus.GRANTED on API levels / platforms that don't gate local-network access behind a runtime permission.
JVM — Desktop does not gate local-network access behind a runtime permission.
Returns the reactive PermissionUiState for the location permissions, recomputed on ON_RESUME. On platforms without runtime permissions the status is always PermissionStatus.GRANTED.
Returns the reactive PermissionUiState for the location permissions, recomputed on ON_RESUME. On platforms without runtime permissions the status is always PermissionStatus.GRANTED.
JVM — Desktop does not gate location behind a runtime permission.
Returns the reactive PermissionUiState for the POST_NOTIFICATIONS permission. Always PermissionStatus.GRANTED on API levels / platforms that don't gate notifications behind a runtime permission.
Returns the reactive PermissionUiState for the POST_NOTIFICATIONS permission. Always PermissionStatus.GRANTED on API levels / platforms that don't gate notifications behind a runtime permission.
JVM — Desktop does not gate notifications behind a runtime permission.
Returns a function that opens this app's system settings page (where the user can change any permission).
Returns a function that opens this app's system settings page (where the user can change any permission).
JVM stub — app settings are not available on Desktop.
Returns a launcher to open the platform's Bluetooth settings.
Returns a launcher to open the platform's Bluetooth settings.
JVM stub — Bluetooth settings are not available on Desktop.
Returns a launcher that prompts the user to pick a directory. The callback receives a tree URI, or null if the user cancelled.
Returns a launcher that prompts the user to pick a directory. The callback receives a tree URI, or null if the user cancelled.
JVM — Opens a native dialog to pick a directory.
Returns a launcher function to prompt the user to open/pick a file. The callback receives the selected file URI.
Returns a launcher function to prompt the user to open/pick a file. The callback receives the selected file URI.
JVM — Opens a native file dialog to pick a file.
Returns a launcher to open the platform's location settings.
Returns a launcher to open the platform's location settings.
Returns a launcher to open the platform's location settings.
Returns a function to open the platform's map application at the given coordinates.
Returns a function to open the platform's map application at the given coordinates.
JVM stub — map opening is not available on Desktop.
Returns a function to open the platform's NFC settings.
Returns a function to open the platform's NFC settings.
JVM stub — NFC settings are not available on Desktop.
Returns a function to open the platform's browser with the given URL.
Returns a function to open the platform's browser with the given URL.
JVM stub — URL opening via Desktop browse API.
Returns a launcher to open the platform's Wi-Fi settings.
Returns a launcher to open the platform's Wi-Fi settings.
JVM stub — Wi-Fi settings are not available on Desktop.
Generates a QR code painter directly using the Skia/Compose canvas API in pure Kotlin.
Returns a suspend function that reads up to maxChars characters of text from a CommonUri. Returns null if the file is empty or cannot be read.
Returns a suspend function that reads up to maxChars characters of text from a CommonUri. Returns null if the file is empty or cannot be read.
JVM — Reads text from a file URI.
Returns a launcher function to prompt the user to save a file. The callback receives the saved file URI.
Returns a launcher function to prompt the user to save a file. The callback receives the saved file URI.
Returns a function to show a toast message.
Returns a function to show a toast message.
JVM stub — toast messages are logged instead.
Returns a function to show a toast message from a string resource.
Returns a function to show a toast message from a string resource.
JVM stub — toast messages are logged instead.
Whether url is safe to fetch or open from event metadata: an absolute https URL whose authority is a valid host with an optional numeric port.
Links that are safe to open, carrying the normalized URL — see safeBrandUrlOrNull. Unsafe or blank entries are dropped rather than rendered and refused on tap.
A Composable that sets the screen brightness while it is in the composition.
A Composable that sets the screen brightness while it is in the composition.
JVM no-op — screen brightness control is not available on Desktop.