Meshtastic-Android/feature
James Rich 406a632a0e feat(mqtt): adopt mqttastic 0.2.0 — sealed ConnectionState + Test Connection probe
Bumps `org.meshtastic:mqtt-client` to 0.2.0 and absorbs the breaking shape change
of the library's `ConnectionState` (enum → sealed class with disconnect/reconnect
context). Surfaces the new context to users and wires up the new probe API.

What changed
- `MqttConnectionState` (core/model): enum → sealed class with `Inactive`,
  `Connecting`, `Connected`, `Reconnecting(attempt, lastError)`,
  `Disconnected(reason)` (+ `Idle` companion). Stays decoupled from the MQTT
  library — carries `String?` reasons rather than `MqttException`.
- `MqttProbeStatus` (core/model): new sealed type mirroring the library's
  `ProbeResult` shape so feature modules don't need a direct mqtt-client dep.
- `MqttManager.probe(...)`: new suspend method. `MqttManagerImpl` calls
  `MqttClient.probe()` and translates `ProbeResult` → `MqttProbeStatus`.
- `MqttManagerImpl.toAppState()`: rewritten as a sealed-class `when` that
  propagates disconnect reason / reconnect attempt + last error through to UI.
- `MQTTRepositoryImpl`: extracts `resolveEndpoint(rawAddress, tlsEnabled)` as
  a top-level `internal` function so it's directly testable; replaces the
  (removed) `ConnectionState.DISCONNECTED` initial value with
  `Disconnected.Idle`.
- `MQTTConfigItemList`: new "Test Connection" button beneath the address row
  that fires `viewModel.probeMqttConnection(...)` and renders the structured
  `MqttProbeStatus` outcome inline (Probing / Success(+server info) /
  Rejected / DnsFailure / TcpFailure / TlsFailure / Timeout / Other).
  `MqttStatusRow` now surfaces the disconnect reason and reconnect attempt
  context when present.
- `RadioConfigViewModel`: adds `mqttProbeStatus` flow, `probeMqttConnection()`,
  `clearMqttProbeStatus()`. Editing the address clears the last probe result.
- `MQTTRepositoryImplTest`: replaces the trivial inlined-parsing tests with
  real coverage of every `resolveEndpoint` branch (bare host ws/wss,
  explicit port, ws://, wss://, mqtt://, mqtts://).

Notes
- This branch will not compile until 0.2.0 lands on Maven Central (deliberate;
  per the chosen "branch_now_wait" strategy).
- Strings added to core/resources for the new probe/status messages.
- `MqttConnectionState.INACTIVE` callsite in `RadioConfigViewModelTest`
  updated to the new sealed-class form.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-17 21:14:38 -05:00
..
connections fix(ui): finish accessibility roles and action labels for clickable surfaces (#5170) 2026-04-17 17:33:38 +00:00
firmware refactor: use injected ioDispatcher and ApplicationCoroutineScope (#5167) 2026-04-17 16:18:45 +00:00
intro test: migrate Compose UI tests from androidTest to commonTest (#5091) 2026-04-12 20:20:00 +00:00
map feat(core/ui): add safeLaunch, UiState, KMP permissions, and CMP lifecycle modernization (#5118) 2026-04-14 00:45:34 +00:00
messaging fix(ui): finish accessibility roles and action labels for clickable surfaces (#5170) 2026-04-17 17:33:38 +00:00
node refactor: consolidate metric formatting through MetricFormatter (#5169) 2026-04-17 17:13:01 +00:00
settings feat(mqtt): adopt mqttastic 0.2.0 — sealed ConnectionState + Test Connection probe 2026-04-17 21:14:38 -05:00
widget chore: review-cleanup fleet (audit + fix + hardening) (#5158) 2026-04-17 00:02:59 +00:00
wifi-provision fix(ui): finish accessibility roles and action labels for clickable surfaces (#5170) 2026-04-17 17:33:38 +00:00