James Rich
5dd5ebc074
chore: remove more dead dependencies + stability annotations
...
- feature/map: remove unused core.data, core.database, core.datastore;
add missing core.common, core.repository (actual dependencies)
- feature/node: remove unused core.datastore
- feature/connections: remove unused core.database
- Add @Immutable to NodesUiState, NodeFilterState
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
0b5791a61d
refactor: remove getPacketId() from public interface
...
- Remove getPacketId() from MessageSender interface (SDK owns packet IDs)
- Remove requestId parameter from requestTraceroute/requestNeighborInfo
- Make getPacketId() private in SdkRadioController (still used internally
for delivery tracking correlation)
- Replace radioController.getPacketId() in map with local Random.nextInt()
for waypoint ID generation (only needs uniqueness, not SDK correlation)
- Remove messageSender dependency from CommonNodeRequestActions
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
f4c6cee332
feat: typed telemetry dispatch + MeshTopology service
...
- Replace magic int dispatch in requestTelemetry with TelemetryType enum
- Update DataRequester interface: remove requestId param, use TelemetryType directly
- Add HEALTH and TRAFFIC_MANAGEMENT to TelemetryType, remove stale PAX variant
- Create MeshTopologyService wrapping SDK's MeshTopology with thread-safe Mutex
- Wire NeighborInfo packet ingestion in SdkStateBridge → topology graph
- Clear topology on node snapshot (reconnect)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
3fb45e05bd
fix: architecture review P0/P1 fixes
...
- P0: setDeviceAddress now persists address to RadioPrefs before reconnect
- P0: Document nodedbReset firmware limitation (preserveFavorites is local-only)
- P1: Add writeAction helper for AdminException → sendError in RadioConfigViewModel
- P1: Wrap CommonNodeRequestActions scope.launch with runCatching for crash safety
- P1: Create CongestionLevel typealias in core/model to decouple feature modules from SDK
- P1: Cancel prior loadJob in setResponseStateLoading to prevent stale results
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
140e062eee
refactor: eliminate ProcessRadioResponseUseCase and packet-ID correlation
...
Replace the manual packet-ID tracking and meshPacketFlow subscription in
RadioConfigViewModel with direct typed returns from the SDK via
RadioConfigUseCase. The ViewModel now awaits typed results (User, Config,
ModuleConfig, channels, etc.) from suspend calls and maps AdminException
to UI error states.
Key changes:
- Delete ProcessRadioResponseUseCase (130 lines of manual proto decode)
- Remove requestIds state, registerRequestId, processPacketResponse,
sendAdminRequest, and meshPacketFlow subscription from ViewModel
- Rewrite setResponseStateLoading to use direct coroutine calls
- Admin actions (reboot/shutdown/etc.) fire directly without session key
preflight (SDK handles retryOnSessionExpiry transparently)
- All setters (setConfig, setModuleConfig, setOwner, updateChannels)
no longer return/track packetIds
- Remove messageSender dependency from NodeManagementActions
- Update InstallProfileUseCase to use editSettings {} receiver pattern
- Update all callers: CleanNodeDatabaseUseCase, Esp32OtaUpdateHandler,
NodeManagementActions
- Rewrite RadioConfigViewModelTest for new direct-await semantics
- Update RadioConfigUseCaseTest and InstallProfileUseCaseTest
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
31f792c71e
fix: remove SFPP vestige, resource-back badge strings, add bridge tests
...
- Remove handleStoreForwardPlusPlus() from interface + impl (dead code post-SDK cutover)
- Move StoreForwardBadge/CongestionBadge hardcoded strings to string resources (i18n)
- Add SdkStateBridge tests: congestion warning → ServiceRepository, S&F server propagation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
64464196b0
feat: SFPP delegation to SDK, NeighborInfo SDK model, congestion + S&F badges
...
- SdkStateBridge: handle SfppLinkProvided/SfppCanonAnnounced events from SDK
- StoreForwardPacketHandlerImpl: SFPP parsing removed (SDK-owned)
- NeighborInfoHandlerImpl: delegate formatting to SDK NeighborInfo.fromProto()
- NodeStatusIcons: CongestionBadge (yellow/orange/red for MEDIUM/HIGH/CRITICAL)
- NodeStatusIcons: StoreForwardBadge (blue cloud icon for S&F servers)
- NodeListViewModel: expose congestionLevel + storeForwardServers flows
- Tests updated for SFPP bridge coverage
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
27b2c19e69
refactor: narrow ViewModel injections, add ConnectionAware, delete dead code, integration tests
...
ViewModel Narrowing:
- V1: Created ConnectionAware interface; MessageSender, DeviceAdmin, DeviceControl extend it
- V2: Narrowed 6 ViewModels/actions to focused sub-interfaces (DeviceAdmin, MessageSender, DataRequester, DeviceControl)
Cleanup:
- C1: Deleted dead MeshDataMapper and its DI registration
Integration Tests:
- T2: SdkStateBridgeTest verifying WentOffline/CameOnline presence handling
- Verified Koin resolution, full test suite passes
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
e9cb439849
feat: rearchitect around SDK — decompose RadioController, simplify DataPacket, integrate SDK utilities
...
Android rearchitecture consuming meshtastic-sdk improvements:
A1 — ConnectionState Enrichment:
- Rich sealed interface with Connecting(attempt), Configuring(phase, progress), Reconnecting(attempt)
- SdkStateBridge maps SDK states preserving metadata
A2 — MessageHandle Integration:
- MessageDeliveryTracker: tracks delivery via SDK MessageHandle
- SdkRadioController captures handles on send
A3 — RadioController Decomposition:
- Split into 5 focused interfaces: MessageSender, DeviceAdmin, RemoteAdmin, DeviceControl, DataRequester
- RadioController extends all; SdkRadioController binds all via Koin
A4 — DataPacket Simplification:
- to/from fields changed from String? to Int (node numbers directly)
- Removed string ID parsing layer; added BROADCAST/LOCAL constants
- Updated ~40 consumer files across feature modules
A5 — SDK Utility Consumption:
- DeviceVersion, Capabilities, SfppHasher, LocationUtils delegate to SDK
- Removed duplicated protocol logic
A6 — Presence Events:
- SdkStateBridge handles NodeChange.WentOffline/CameOnline
- Updates node online status via repository
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
3cdad0da28
refactor: delete transport layer and dead intermediaries, slim RadioInterfaceService
...
- Delete entire transport layer: BleRadioTransport, TcpRadioTransport,
SerialRadioTransport, StreamTransport, HeartbeatSender, StreamFrameCodec,
AndroidRadioTransportFactory, BaseRadioTransportFactory, MockRadioTransport,
NopRadioTransport, BleReconnectPolicy, TcpTransport, SerialTransport
- Delete MeshConfigHandler interface + impl (replaced by RadioConfigRepository)
- Delete RadioTransportCallback, RadioTransport, RadioTransportFactory interfaces
- Delete FakeRadioTransport, RadioTransportTest, MeshConfigHandlerImplTest
- Delete UseCase tests (impls restored, tests for deleted patterns removed)
- Slim RadioInterfaceService interface: remove transport internals, keep only
device-address/connection surface needed by Scanner and connections UIs
- Create SdkRadioInterfaceService: thin SDK-backed impl delegating to
RadioPrefs + RadioClientAccessor
- Update NoopRadioInterfaceService to match slimmed interface
- Update JvmUsbScanner to use SDK's JvmSerialPorts.list() instead of
deleted SerialTransport.getAvailablePorts()
- Remove DesktopRadioTransportFactory from desktop DI module
- Fix NodeListViewModel: replace RadioInterfaceService with RadioPrefs
- Fix MeshServiceOrchestratorTest: align with updated constructor params
- Fix UIViewModel: use emptyFlow() for meshActivity (SDK doesn't emit
raw transport-level activity events)
All targets compile clean, all JVM + Android unit tests pass.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-06 17:52:05 -05:00
James Rich
82926fd734
feat: event firmware easter egg with ambient branding ( #5354 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-05-04 19:37:47 +00:00
James Rich
2822290908
refactor(build): build-logic cleanup, CC safety, and detekt 2.0 upgrade ( #5311 )
2026-05-01 02:48:37 +00:00
James Rich
228d872f9d
feat(connections): unified device list, ACCESS_LOCAL_NETWORK, transport filter chips ( #5219 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-22 19:34:22 +00:00
James Rich
f14ae2643c
feat(node): smoother remote-admin UX with per-node session tracking ( #5217 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-22 14:21:04 -05:00
James Rich
38c2e9fb33
fix(compass): stop coarse network fixes from clobbering GPS fixes ( #5200 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-21 14:06:19 +00:00
Copilot
7492a33cf8
Fix node-details remove action to preserve confirmation flow ( #5192 )
...
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: jamesarich <2199651+jamesarich@users.noreply.github.com >
Co-authored-by: James Rich <james.a.rich@gmail.com >
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-20 15:59:20 +00:00
James Rich
b979663e24
refactor: consolidate metric formatting through MetricFormatter ( #5169 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-17 17:13:01 +00:00
James Rich
90f6e21a9c
fix(ui): stable LazyColumn keys, semantic roles, and content descriptions ( #5168 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-17 16:24:18 +00:00
James Rich
df3b5365f9
fix(node): don't recreate Vico CartesianChartModelProducer on channel switch ( #5160 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-17 02:40:17 +00:00
James Rich
a2763bdfeb
fix(charts): apply Vico 3.1.0 best-practice audit fixes ( #5138 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-15 02:20:33 +00:00
James Rich
72b981f73b
chore: KMP audit — commonize code, centralize utilities, eliminate dead abstractions ( #5133 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-15 02:17:50 +00:00
James Rich
bf0deef708
fix(icons): audit and correct icon migration regressions from #5030 #5040 #5056 ( #5136 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-15 01:14:31 +00:00
James Rich
f48fc61729
feat(environment): add 1-Wire multi-thermometer (DS18B20) display support ( #5130 )
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-15 00:03:24 +00:00
James Rich
3c7e1266f8
fix: truncate traceroute chart x-values to whole seconds to prevent Vico crash ( #5122 )
2026-04-14 11:01:03 +00:00
James Rich
e46a8296cb
feat(core/ui): add safeLaunch, UiState, KMP permissions, and CMP lifecycle modernization ( #5118 )
2026-04-14 00:45:34 +00:00
James Rich
938a951737
refactor: leverage CMP 1.11 + Lifecycle 2.11 — v2 test API, Json privacy, dropUnlessResumed nav guards ( #5112 )
2026-04-13 20:02:31 +00:00
James Rich
76386e419c
refactor: migrate remaining raw stateIn(WhileSubscribed) to stateInWhileSubscribed extension ( #5113 )
2026-04-13 20:02:06 +00:00
James Rich
39620d063b
fix(nav): restore broken traceroute map navigation ( #5104 )
2026-04-13 12:25:21 +00:00
James Rich
0441093ce8
refactor(node): move Position to last in telemetry list on node details ( #5068 )
2026-04-11 17:06:17 +00:00
James Rich
3794c79dae
refactor: adopt M3 Expressive components from material3 1.11.0-alpha06 ( #5063 )
2026-04-11 02:10:03 +00:00
James Rich
a6423d0a0f
feat(metrics): redesign position log with SelectableMetricCard and add CSV export to all metrics screens ( #5062 )
2026-04-11 01:26:26 +00:00
James Rich
37e9e2c8f0
fix(charts): hoist rememberVicoZoomState above vararg layers to prevent ClassCastException ( #5060 )
2026-04-11 00:05:56 +00:00
James Rich
ce32e640de
fix(icons): replace outline (FILL=0) pathData with filled (FILL=1) from upstream Material Symbols ( #5056 )
2026-04-10 22:15:43 +00:00
James Rich
520fa717a9
refactor(metrics/map): DRY up charts, decompose MapView monoliths, add test coverage ( #5049 )
2026-04-10 20:54:09 +00:00
James Rich
02f6fd67b8
fix: clean up flaky, duplicated, and misplaced tests; remove redundant deps ( #5048 )
2026-04-10 19:46:45 +00:00
James Rich
1390a3cd4f
ci: cache Robolectric SDK jars to prevent flaky SocketException failures ( #5045 )
2026-04-10 10:05:07 -05:00
James Rich
dba037466e
refactor(icons): migrate to self-hosted VectorDrawable XMLs via MeshtasticIcons ( #5030 )
2026-04-10 01:35:52 +00:00
James Rich
9c0e9b82d6
feat(charts): adopt Vico best practices, add sensor data, and migrate TracerouteLog ( #5026 )
2026-04-09 23:44:59 +00:00
James Rich
60cc2f4237
fix: resolve bugs across connection, PKI, admin, packet flow, and stability subsystems ( #5011 )
2026-04-09 13:20:06 +00:00
James Rich
51251ab16a
feat(ci): shard test suite and enable JUnit 5 parallel execution ( #4977 )
2026-04-03 13:08:49 +00:00
James Rich
464a12b9f7
chore: standardize resources and update documentation for Navigation 3 ( #4961 )
2026-03-31 21:25:37 +00:00
James Rich
f2d09ff79d
Refactor nav3 architecture and enhance adaptive layouts ( #4944 )
...
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com >
2026-03-27 14:43:44 +00:00
James Rich
141b54ff9c
feat: migrate to Material 3 Expressive APIs ( #4934 )
...
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com >
2026-03-26 16:42:46 +00:00
James Rich
a005231d94
Refactor map layer management and navigation infrastructure ( #4921 )
...
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com >
2026-03-26 00:29:24 +00:00
James Rich
b0e91a390c
feat: implement unified deep link routing for Kotlin Multiplatform ( #4910 )
...
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com >
2026-03-25 00:21:24 +00:00
James Rich
553ca2f8ed
feat: implement global SnackbarManager and consolidate common UI setup ( #4909 )
...
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com >
2026-03-24 22:31:40 +00:00
James Rich
96060a0a4d
refactor: coroutine dispatchers and modernize testing infrastructure ( #4901 )
...
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com >
2026-03-24 01:31:48 +00:00
James Rich
664ebf218e
refactor: null safety, update date/time libraries, and migrate tests ( #4900 )
...
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com >
2026-03-23 23:17:50 +00:00
James Rich
57242d905c
refactor: Consolidate UI preference handling ( #4895 )
2026-03-23 19:36:02 +00:00
James Rich
7b327215f3
refactor: adaptive UI components for Navigation 3 ( #4891 )
2026-03-23 12:35:02 -05:00