Package-level declarations

Types

Link copied to clipboard
data class BasemapChoice(val id: String, val label: String)

One entry in the BasemapMenu.

Link copied to clipboard
data class ClusterMemberEntry(val nodeNum: Int, val title: String, val subtitle: String, val node: Node?)

One node in a cluster the map cannot zoom apart.

Link copied to clipboard
class MapFilterActions(val onToggleOnlyFavorites: () -> Unit, val onToggleShowWaypoints: () -> Unit, val onToggleShowPrecisionCircle: () -> Unit, val onSelectLastHeard: (LastHeardFilter) -> Unit, val onToggleRoleExcluded: (Config.DeviceConfig.Role) -> Unit, val onClearExcludedRoles: () -> Unit, val onToggleOnlyOnline: () -> Unit, val onToggleOnlyDirect: () -> Unit, val onToggleExcludeMqtt: () -> Unit, val onToggleShowIgnored: () -> Unit, val onToggleIncludeUnknown: () -> Unit)

What the map's filter menu can do.

Link copied to clipboard
class SitePlannerLaunch(val initialParams: SitePlannerParams, selectedNode: Node? = null)

A planner session and, for Node Details routes, the node whose location shortcut it must retain.

Link copied to clipboard
data class SitePlannerParams(val name: String, val latitude: Double, val longitude: Double, val txPowerWatts: Double = DEFAULT_TX_POWER_WATTS, val txFreqMhz: Double = DEFAULT_TX_FREQ_MHZ, val txHeightMeters: Double = DEFAULT_TX_HEIGHT_METERS, val txGainDbi: Double = DEFAULT_TX_GAIN_DBI, val colorScale: String = DEFAULT_COLOR_SCALE, val rxSensitivityDbm: Double = DEFAULT_RX_SENSITIVITY_DBM, val rxHeightMeters: Double = DEFAULT_RX_HEIGHT_METERS, val maxRangeKm: Double = DEFAULT_MAX_RANGE_KM, val highResolution: Boolean = false, val minDbm: Double = DEFAULT_MIN_DBM, val maxDbm: Double = DEFAULT_MAX_DBM, val overlayTransparency: Int = DEFAULT_OVERLAY_TRANSPARENCY)

Transmitter parameters for a Meshtastic Site Planner coverage estimate. Maps onto the planner's flat query contract (?lat=&lon=&name=&tx_power=&tx_freq=&tx_height=&tx_gain=), so toQueryUrl can hand a configured, auto-running view to the planner without knowing its internal parameter schema.

Properties

Link copied to clipboard

The hosted Site Planner. One definition, shared by the embedded host and the browser hand-off.

Functions

Link copied to clipboard
fun AddNetworkLayerDialog(onDismiss: () -> Unit, onConfirm: (String, String) -> Unit)
Link copied to clipboard
fun BasemapMenu(expanded: Boolean, onDismissRequest: () -> Unit, groups: List<List<BasemapChoice>>, selectedId: String?, onSelect: (BasemapChoice) -> Unit, modifier: Modifier = Modifier, trailingContent: @Composable () -> Unit = {})

The menu that picks what the map draws underneath the mesh.

Link copied to clipboard
fun ClusterMembersDialog(members: List<ClusterMemberEntry>, onMemberClick: (Int) -> Unit, onDismissRequest: () -> Unit, modifier: Modifier = Modifier)

Lists the nodes sharing one spot, when zooming in further will not separate them.

Link copied to clipboard
fun CustomMapLayersSheet(mapLayers: List<MapLayerItem>, onToggleVisibility: (String) -> Unit, onRemoveLayer: (String) -> Unit, onAddLayerClicked: () -> Unit, onRefreshLayer: (String) -> Unit, onAddNetworkLayer: (String, String) -> Unit, opacity: Map<String, Float>, onOpacityChange: (String, Float) -> Unit, modifier: Modifier = Modifier)
Link copied to clipboard
fun CustomTileProviderManager(providers: List<CustomTileProviderConfig>, onAdd: (CustomTileProviderConfig) -> Unit, onUpdate: (CustomTileProviderConfig) -> Unit, onDelete: (String) -> Unit, onAddLocalMbTiles: () -> Unit? = null, modifier: Modifier = Modifier)
Link copied to clipboard
fun DeleteWaypointDialog(canDeleteForEveryone: Boolean, onDeleteForMe: () -> Unit, onDeleteForEveryone: () -> Unit, onDismissRequest: () -> Unit, modifier: Modifier = Modifier)

Waypoint removal confirmation, shared by both map flavors. Confirming always drops our local copy — that needs no mesh-wide permission, so it stays available for a waypoint locked to another node. Broadcasting the removal to the mesh is the opt-in checkbox, offered only when canDeleteForEveryone (unlocked or locked to us, and connected).

Link copied to clipboard

Waypoint locked to another node (or offline): confirming removes only our local copy.

Link copied to clipboard

Waypoint we may modify mesh-wide while connected: the broadcast opt-in is offered.

Link copied to clipboard
fun EditWaypointDialog(waypoint: Waypoint, displayUnits: MeasurementSystem, myNodeNum: Int?, onSend: (Waypoint) -> Unit, onDelete: (Waypoint) -> Unit, onDismissRequest: () -> Unit, modifier: Modifier = Modifier, onBeginBoxAuthoring: (Waypoint) -> Unit = {})

Shared waypoint editor used by both the google and fdroid map flavors (DRY — replaces the two drifted per-flavor copies). Map-engine-specific concerns stay outside: drawing the box overlay and the drag-to-define gesture are triggered via onBeginBoxAuthoring, which hands the current draft back to the flavor's map so the user can define the bounding box there; the flavor re-opens this dialog with the drawn box applied.

Link copied to clipboard
fun LayerOpacitySlider(layerKey: String, opacity: Float, onOpacityChange: (String, Float) -> Unit, modifier: Modifier = Modifier)

One layer's opacity, as a slider that reports only when the drag ends.

Link copied to clipboard

The tag a layer's opacity slider carries, so a test can find the slider for one specific layer.

Link copied to clipboard
fun MapButton(icon: ImageVector, contentDescription: String, onClick: () -> Unit, modifier: Modifier = Modifier, iconTint: Color? = null)

A compact icon button used in map control overlays. Uses FilledIconButton for a consistent, compact appearance across both Google and F-Droid flavors.

Link copied to clipboard
fun MapControlsOverlay(modifier: Modifier = Modifier, onToggleFilterMenu: () -> Unit? = null, bearing: Float = 0.0f, onCompassClick: () -> Unit = {}, followPhoneBearing: Boolean = false, filterDropdownContent: @Composable () -> Unit = {}, filtersActive: Boolean = false, mapTypeContent: @Composable () -> Unit = {}, layersContent: @Composable () -> Unit = {}, onSitePlannerClick: () -> Unit? = null, isLocationTrackingEnabled: Boolean = false, onToggleLocationTracking: () -> Unit? = null, showRefresh: Boolean = false, isRefreshing: Boolean = false, onRefresh: () -> Unit = {})

Shared map controls overlay using HorizontalFloatingToolbar for Material 3 Expressive styling. Provides compass, filter button, location tracking button, and optional slots for flavor-specific content (map type selector, layers, refresh).

Link copied to clipboard

The standard wiring from a view model to MapFilterSheet.

Link copied to clipboard
fun MapFilterSheet(onDismissRequest: () -> Unit, filterState: BaseMapViewModel.MapFilterState, actions: MapFilterActions)

The main map's filters.

Link copied to clipboard
fun MapZoomControls(onZoomIn: () -> Unit, onZoomOut: () -> Unit, modifier: Modifier = Modifier)

Zoom in and out, stacked, for the corner of a map.

Link copied to clipboard
fun NodeTrackFilterMenu(expanded: Boolean, onDismissRequest: () -> Unit, selected: LastHeardFilter, onSelect: (LastHeardFilter) -> Unit)

The filter menu for one node's position track.

Link copied to clipboard
fun RasterOverlayToggles(available: List<RasterOverlaySource>, enabledIds: Set<String>, onToggle: (String) -> Unit, opacity: Map<String, Float>, onOpacityChange: (String, Float) -> Unit, modifier: Modifier = Modifier)

Checkboxes for the raster overlays a map can composite over its basemap.

Link copied to clipboard
fun roleFilterChipTestTag(role: Config.DeviceConfig.Role): String

The tag the chip for one role carries, so a test can pick out a single role.

Link copied to clipboard
fun SitePlannerBrowserSheet(initial: SitePlannerParams, onDismiss: () -> Unit, onUseNodeLocation: () -> Pair<Double, Double>? = null, onUseMapCenter: () -> Pair<Double, Double>? = null)

The Site Planner as a form that hands the finished parameters to the system browser.

Link copied to clipboard
fun SitePlannerSheet(initial: SitePlannerParams, onSubmit: (SitePlannerParams) -> Unit, onDismiss: () -> Unit, onUseCurrentLocation: () -> Unit? = null, onUseNodeLocation: () -> Unit? = null, onUseMapCenter: () -> Unit? = null, note: String? = null)

Bottom-sheet form for a Site Planner coverage estimate, pre-filled with initial. onSubmit receives the edited params once they validate. Location shortcut chips (onUseCurrentLocation/onUseNodeLocation/onUseMapCenter) re-seed the coordinate fields when provided, preserving edits to the other fields.

Link copied to clipboard
fun Node?.toSitePlannerParams(channelSet: ChannelSet?): SitePlannerParams

Seed Site Planner params from a node (name + position) and, when a radio is connected, from its actual config: transmit frequency (from the primary channel), transmit power (dBm→W), and a receiver sensitivity derived from the modem preset. Antenna gain/height aren't in the device config, so they keep the planner's stock defaults.

Link copied to clipboard
fun WaypointInfoDialog(waypoint: Waypoint, displayUnits: MeasurementSystem, alertsEnabled: Boolean, onToggleAlerts: (Boolean) -> Unit, onDismissRequest: () -> Unit, onEdit: () -> Unit? = null, onDeleteForMe: () -> Unit? = null, modifier: Modifier = Modifier)

Read-only view of a geofence waypoint the local device did NOT create. Editing/re-broadcasting someone else's geofence is not offered here; the one interactive control is the receiver-local opt-in that decides whether THIS device raises crossing notifications for it (foreign geofences are silent by default — see org.meshtastic.core.data.manager .GeofenceMonitor). Reached for both locked and unlocked foreign geofences, so the locked case gets a view at all. Unlocked foreign geofences are still editable — onEdit, when non-null, opens the full editor. onDeleteForMe drops only our local copy, so it needs no mesh-wide permission and is offered even when the geofence is locked to its creator.

Link copied to clipboard

Unlocked foreign geofence: opted in, with the Edit affordance into the full editor.

Link copied to clipboard

Locked foreign geofence: opt-in off, no Edit affordance — but the local delete is still offered.