- i18n: translate connection screen + chat tab keys into 13 locales;
add "Send my contact" (advert) strings in all locales
- feat: move self-advert from home header into composer "+" action menu
(new lib/utils/advert_helper.dart, always shows Flood/Direct sheet)
- fix: hide-repeaters map toggle was bypassed in simple mode
- fix: simple mode map now shows only favourite chat contacts
- fix: wrap ListTiles in Material (contact_tile secondary actions,
inferred contact group card) to satisfy Flutter ink assertions
- device-authoritative contact/channel sync and UX review fixes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Tapping signal/battery in header now also shows device's own telemetry
(temperature, humidity, pressure, GPS) when available. Triggers a self
telemetry request on sheet open. Data comes from the device contact's
telemetry field.
- pushAdvert (0x80): import advert into firmware via cmdGetAdvertPath
before fetching contact, so name/type/location are available
- pushNewAdvert (0x8A): fire-and-forget importReceivedAdvert to store
contact in firmware (data already in push payload)
- controlData (0x8E) discovery: no firmware import (matches official app),
just lookup existing contacts and show generic labels for unknown nodes
- Update meshcore_client git ref to bcbeff0 (burst sync + advert import)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove SseClientService and ConnectionMode.sseClient
- Add ConnectionMode.tcp with MeshCoreTcpService (port 5000)
- NetworkScannerService: scan TCP port 5000 via raw Socket.connect
- mDNS service type changed to _meshcore._tcp
- connection_dialog: connect via connectTcp() instead of connectToSseServer()
- home_screen: show WiFi icon and label for TCP mode
- Bump meshcore_client to pick up TCP transport support