Meshtastic-Android/core/resources
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
..
src feat(mqtt): adopt mqttastic 0.2.0 — sealed ConnectionState + Test Connection probe 2026-04-17 21:14:38 -05:00
build.gradle.kts fix(resources): add resourcePrefix to KMP + widget modules, rename prefixed resources (#5111) 2026-04-13 18:25:23 +00:00
README.md refactor: BLE transport and UI for Kotlin Multiplatform unification (#4911) 2026-03-25 02:15:51 +00:00

:core:resources

Overview

The :core:resources module is the centralized source for all UI strings and localizable resources. It uses the Compose Multiplatform Resource library to provide a type-safe way to access strings.

Key Features

  • Single Source of Truth: All UI strings must be defined in this module, not in the app module or feature modules.
  • Type-Safety: Generates a Res object that allows accessing strings like Res.string.your_key with compile-time checking.

Usage

The library provides a standard way to access strings in Jetpack Compose.

import org.jetbrains.compose.resources.stringResource
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.your_string_key

Text(text = stringResource(Res.string.your_string_key))

Module dependency graph

graph TB
  :core:resources[resources]:::kmp-library-compose

classDef android-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef android-application-compose fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef compose-desktop-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef android-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
classDef android-library fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
classDef android-library-compose fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
classDef android-test fill:#A0C4FF,stroke:#000,stroke-width:2px,color:#000;
classDef jvm-library fill:#BDB2FF,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-library-compose fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-library fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
classDef unknown fill:#FFADAD,stroke:#000,stroke-width:2px,color:#000;