Modifier for the dialog.
From b4988ba93a99fc662425a83a5235668feb0e5efb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 26 Sep 2026 19:11:55 +0000 Subject: [PATCH] docs: publish channels: main api --- .../-mock-radio-transport.html | 2 +- .../-mock-radio-transport/address.html | 2 +- .../-mock-radio-transport/close.html | 2 +- .../handle-send-to-radio.html | 2 +- .../-mock-radio-transport/index.html | 2 +- .../-mock-radio-transport/start.html | 2 +- .../-robolectric-ble-bonding/index.html | 2 +- .../-meshtastic-dialog.html | 2 +- .../-meshtastic-search-bar.html | 2 +- main/assets/css/just-the-docs-dark.css.map | 2 +- main/assets/css/just-the-docs-default.css.map | 2 +- main/assets/css/just-the-docs-light.css.map | 2 +- .../css/just-the-docs-meshtastic-dark.css.map | 2 +- .../css/just-the-docs-meshtastic.css.map | 2 +- main/assets/js/search-data.json | 2 +- main/docs/developer/testing.html | Bin 10364 -> 7759 bytes main/en/developer/testing.html | 7 ++++--- main/index.json | 2 +- 18 files changed, 20 insertions(+), 19 deletions(-) diff --git a/api/core/network/org.meshtastic.core.network.radio/-mock-radio-transport/-mock-radio-transport.html b/api/core/network/org.meshtastic.core.network.radio/-mock-radio-transport/-mock-radio-transport.html index e39507ced5..24d430254d 100644 --- a/api/core/network/org.meshtastic.core.network.radio/-mock-radio-transport/-mock-radio-transport.html +++ b/api/core/network/org.meshtastic.core.network.radio/-mock-radio-transport/-mock-radio-transport.html @@ -94,7 +94,7 @@
A simulated radio, selected as "Demo Mode" in the Connections screen.
It answers the app's real two-stage want_config handshake and then feeds a small synthetic mesh — a populated node list with positions, signal readings and battery levels, one channel conversation, one direct-message thread, and telemetry that keeps accruing while the app is open. That makes the app fully explorable without any LoRa hardware, which is what an app-store reviewer and a first-time user both need.
Three properties of the real protocol have to be honoured or the app never leaves "Loading node list":
The handshake is two-stage (HandshakeConstants.CONFIG_NONCE then HandshakeConstants.NODE_INFO_NONCE). Each stage must answer with only its own frames and its own config_complete_id. Re-sending my_info on stage 2 resets the app's handshake state machine and the stage-2 completion is then rejected.
node_info frames are only accepted inside the handshake window, so every simulated node has to ship in stage 2.
Radio metrics (SNR/RSSI/hops) are only taken from packets that look like direct LoRa receptions — transport_mechanism = TRANSPORT_LORA and hop_start == hop_limit. Frames left at the proto defaults are treated as internal traffic and contribute no signal information at all.
A simulated radio, selected as "Demo Mode" in the Connections screen.
It answers the app's real two-stage want_config handshake and then feeds a small synthetic mesh — a populated node list with positions, signal readings and battery levels, one channel conversation, one direct-message thread, and telemetry that keeps accruing while the app is open. That makes the app fully explorable without any LoRa hardware, which is what an app-store reviewer and a first-time user both need.
Three properties of the real protocol have to be honoured or the app never leaves "Loading node list":
The handshake is two-stage (HandshakeConstants.CONFIG_NONCE then HandshakeConstants.NODE_INFO_NONCE). Each stage must answer with only its own frames and its own config_complete_id. Re-sending my_info on stage 2 resets the app's handshake state machine and the stage-2 completion is then rejected.
node_info frames are only accepted inside the handshake window, so every simulated node has to ship in stage 2.
Radio metrics (SNR/RSSI/hops) are only taken from packets that look like direct LoRa receptions — transport_mechanism = TRANSPORT_LORA and hop_start == hop_limit. Frames left at the proto defaults are treated as internal traffic and contribute no signal information at all.
Reusable Robolectric helpers for driving Android Bluetooth bonding logic in androidHostTest source sets.
These let a unit test exercise the real AndroidBluetoothRepository.bond() (and any future BLE bonding code) without an emulator and without a production seam. They rely on two Robolectric behaviors (verified against Robolectric 4.16.x):
android.bluetooth.BluetoothAdapter.getRemoteDevice caches the returned BluetoothDevice by address in a static map, so the shadow configured here is the same instance production code reads when it calls getRemoteDevice(mac) internally.
ShadowBluetoothDevice.createBond calls checkForBluetoothConnectPermission() first, so tests must call grantBluetoothConnectPermission or createBond() throws SecurityException instead of returning a value.
Isolation note: because the device cache is static and survives across tests in the same JVM, give each test a distinct MAC so bond-state cannot bleed between tests.
Reusable Robolectric helpers for driving Android Bluetooth bonding logic in androidHostTest source sets.
These let a unit test exercise the real AndroidBluetoothRepository.bond() (and any future BLE bonding code) without an emulator and without a production seam. They rely on two Robolectric behaviors (verified against Robolectric 4.16.x):
android.bluetooth.BluetoothAdapter.getRemoteDevice caches the returned BluetoothDevice by address in a static map, so the shadow configured here is the same instance production code reads when it calls getRemoteDevice(mac) internally.
ShadowBluetoothDevice.createBond calls checkForBluetoothConnectPermission() first, so tests must call grantBluetoothConnectPermission or createBond() throws SecurityException instead of returning a value.
Isolation note: because the device cache is static and survives across tests in the same JVM, give each test a distinct MAC so bond-state cannot bleed between tests.
A comprehensive and flexible dialog component for the Meshtastic application.
Modifier for the dialog.
The title text of the dialog.
The title string resource of the dialog.
Optional plain text message.
Optional string resource message.
Optional color for the plain text message; Color.Unspecified uses the default text color.
Optional HTML formatted message.
Optional leading icon.
Optional custom composable content for the body.
Text for the confirmation button.
String resource for the confirmation button.
Callback for the confirmation button.
Text for the dismiss button.
String resource for the dismiss button.
Callback for when the dialog is dismissed or the dismiss button is clicked.
If provided, displays a list of buttons instead of the standard confirm/dismiss actions.
Whether the dialog can be dismissed by clicking outside or pressing back.
A comprehensive and flexible dialog component for the Meshtastic application.
Modifier for the dialog.
The title text of the dialog.
The title string resource of the dialog.
Optional plain text message.
Optional string resource message.
Optional color for the plain text message; Color.Unspecified uses the default text color.
Optional HTML formatted message.
Optional leading icon.
Optional custom composable content for the body.
Text for the confirmation button.
String resource for the confirmation button.
Callback for the confirmation button.
Text for the dismiss button.
String resource for the dismiss button.
Callback for when the dialog is dismissed or the dismiss button is clicked.
If provided, displays a list of buttons instead of the standard confirm/dismiss actions.
Whether the dialog can be dismissed by clicking outside or pressing back.
The Material 3 search bar every Meshtastic search field is built from: a collapsed SearchBar that expands into a results surface over the screen.
The expanded half follows Material's own rule rather than the caller's: full-screen on compact width, docked on anything wider, because a full-screen dialog over a tablet or desktop window hides context the user was reading.
the text the field starts with, so a query that survived process death restores into the bar. Later changes to it are ignored; the field is the source of truth once it exists. See resetKey.
called for every edit made through the field.
shown in the empty field, and the field's accessibility name.
change this to make the field take query again, for a caller that clears the search from outside.
test tag for the collapsed field; the expanded one takes it plus SEARCH_BAR_EXPANDED_TAG_SUFFIX.
lets the bar react to the content scrolling under it; see SearchBarDefaults.enterAlwaysSearchBarScrollBehavior.
extra icons after the clear button, for controls that belong to the search itself (a sort menu, a filter menu). They render in the collapsed and expanded field alike.
the results shown under the field once expanded.
The Material 3 search bar every Meshtastic search field is built from: a collapsed SearchBar that expands into a results surface over the screen.
The expanded half follows Material's own rule rather than the caller's: full-screen on compact width, docked on anything wider, because a full-screen dialog over a tablet or desktop window hides context the user was reading.
the text the field starts with, so a query that survived process death restores into the bar. Later changes to it are ignored; the field is the source of truth once it exists. See resetKey.
called for every edit made through the field.
shown in the empty field, and the field's accessibility name.
change this to make the field take query again, for a caller that clears the search from outside.
test tag for the collapsed field; the expanded one takes it plus SEARCH_BAR_EXPANDED_TAG_SUFFIX.
lets the bar react to the content scrolling under it; see SearchBarDefaults.enterAlwaysSearchBarScrollBehavior.
extra icons after the clear button, for controls that belong to the search itself (a sort menu, a filter menu). They render in the collapsed and expanded field alike.
the results shown under the field once expanded.
Og2)qzk}t7;8{C3OwT{)g{o|x$SHU`06Rw<6^+;p|Y?N@q%_R+=9}wEu2$V2&Hu>
zgONW7Gy4$>OigL#Tf7BOnJ+D|sBrxOce7a1H8Yiaw;A=D9x^Ia#k!N(8
Located in commonTest or jvmTest source sets.
Uses Android Gradle Plugin’s native (layoutlib) screenshot testing framework, split across two modules: