github meshtastic/Meshtastic-Android v2.8.2
v2.8.2 (29322440)

4 hours ago

Highlights

Messaging: swipe to reply, double-tap reactions, per-contact drafts, pinned and unread conversations, bubbles, proven delivery receipts. A Units setting. One search bar for nodes, messages, settings and docs. Settings take labels, units and firmware gates from the schema. Map layer opacity and role filters. Lightning, particulate and soil telemetry. Tap phones to share a contact or channel. KML import works again.

What's Changed

🏗️ Features

  • perf(ui): render QR codes at display density instead of fixed 960px by @jamesarich in #6793
  • feat: report Android 17 memory-limiter kills via ApplicationExitInfo by @jamesarich in #6792
  • feat(privacy): shield sensitive UI content from non-tool accessibility services by @jamesarich in #6794
  • feat(hardware): fetch bootloader OTA quirks from the API, seeded from the bundled asset by @jamesarich in #6802
  • feat(hardware): fetch the maintenance UF2 manifest from the API, digest-pinned by @jamesarich in #6803
  • feat(messaging): swipe to reply, double-tap reactions, day separators by @jamesarich in #6850
  • feat(messaging): per-contact drafts and a quieter composer by @jamesarich in #6851
  • feat(messaging): name the sender on the jump-to-latest control by @jamesarich in #6856
  • feat(notifications): offer conversations as bubbles by @jamesarich in #6858
  • feat(messaging): mark unread, swipe row actions, and pinned conversations by @jamesarich in #6857
  • feat(messaging): close the quick reaction bar on a tap outside it by @jamesarich in #6865
  • feat(settings): send the optional ham long_name alongside the call sign by @vidplace7 in #6875
  • feat(appfunctions): reconcile system state instead of blind-writing it by @jamesarich in #6908
  • feat(units): resolve units from the device region, add a Units setting, render through ICU by @jamesarich in #6916
  • feat(connections): notice when transmit is disabled by @jamesarich in #6945
  • feat(agents): add the run-meshtastic-android skill with desktop and emulator drivers by @jamesarich in #6955
  • feat(map): give every map layer its own opacity slider by @jamesarich in #6958
  • feat(map): filter the map by node role and by how a node was heard by @jamesarich in #6959
  • feat(settings): align the Mesh Beacon config editor with design#140 by @jamesarich in #6963
  • feat(discovery): suppress beacon invitations for channels the radio already has by @jamesarich in #6964
  • feat(network): configure HTTP client engines and add platform User-Agent headers by @jamesarich in #7008
  • feat(ui): blend noise floor into signal quality rating (design#15) by @jamesarich in #7009
  • feat(map): offline banner and Google basemap auto-fallback on connectivity loss by @jamesarich in #6998
  • feat(node): add an update-status shortcut to the local node menu by @jamesarich in #7047
  • feat: mark nodes not heard since the LoRa config changed by @jamesarich in #7055
  • chore: device link disclosure by @jamesarich in #7068
  • feat(node): overflow the time frame selector instead of crushing it by @jamesarich in #7097
  • perf: cache-window the hot lists, and modernize the nav3 and adaptive wiring by @jamesarich in #7093
  • feat(docs): use the real M3 search bar for doc search by @jamesarich in #7098
  • feat(nfc): share a contact or channel by tapping phones, no tag needed by @jamesarich in #7124
  • feat(ui): share the link from the share dialog, and say what the dialog does by @jamesarich in #7126
  • feat(node): signed and verified indicators in place of the PKI lock by @jamesarich in #7117
  • fix(node): keep a contact's public key when a different one arrives by @jamesarich in #7118
  • feat(settings): show the license notice on the About screen by @jamesarich in #7191
  • feat(map): clamp zoom when framing bounds, and let style images use hardware bitmaps by @jamesarich in #7245
  • refactor(navigation): route deep links through navigation3 UriDeepLinkMatcher by @jamesarich in #7246
  • refactor(settings): read numeric field bounds from the protobufs field registry by @jamesarich in #7242
  • feat(telemetry): surface lightning, PM status and soil-water metrics by @jamesarich in #7237
  • feat(node): rank maker hardware between supported and community in the device badge by @jamesarich in #7263
  • feat(settings): gate config fields on the schema's firmware versions by @jamesarich in #7262
  • feat(settings): hide module settings the node reports compiled out by @jamesarich in #7272
  • feat(mqtt): surface a refused subscription from the broker by @jamesarich in #7290
  • feat(settings): drive the module gates from the schema by @jamesarich in #7296
  • feat(settings): label enum pickers from the schema by @jamesarich in #7298
  • feat(settings): read the labels and helper text the schema already has by @jamesarich in #7302
  • feat(beacon): honour the advertised frequency slot by @jamesarich in #7305
  • feat(settings): emit the enum key prefixes the schema strings use by @jamesarich in #7306
  • feat(search): one M3 search bar, settings search, and node status in search by @jamesarich in #7303
  • feat(settings): show the unit the schema declares by @jamesarich in #7304
  • feat(connections): handle hardware without Bluetooth for Android XR by @jamesarich in #7318
  • feat(connections): handle hardware without USB host for Android XR by @jamesarich in #7322
  • refactor(connections): give Demo Mode its own section by @jamesarich in #7326
  • feat(messaging): show whether a delivery receipt was proven by @jamesarich in #7284
  • feat(messaging): record signing and ack proof on reactions by @jamesarich in #7339

🖥️ Desktop

  • fix(desktop): disable macOS notifications when the process has no app bundle by @jamesarich in #6876
  • fix(desktop): test the bundle path, not the identifier, before notifying by @jamesarich in #6885
  • fix(desktop): use standard SPDX license identifier for RPM packaging by @RCGV1 in #7043
  • fix(desktop): pin the Flathub screenshots to a commit that survives the squash by @jamesarich in #7243
  • fix(desktop): keep MapLibre's FFI upcall methods through ProGuard by @jamesarich in #7287
  • refactor(model): parse the selected device address once by @jamesarich in #7328

🛠️ Fixes

  • fix(navigation): clear deep-link replay cache once applied to the backstack by @jamesarich in #6796
  • fix(ui): give feedback when a contact or channel import arrives while disconnected by @jamesarich in #6798
  • fix(database): rebuild the packet FTS index after the schema-52 table recreation by @jamesarich in #6808
  • fix(map): raise android-maps-utils to 5.1.1 so KML import survives xmlutil 1.0.x by @jamesarich in #6811
  • fix(database): give every SQLite connection a busy timeout by @jamesarich in #6809
  • fix(firmware): show the erase wait and upload retries during Legacy DFU by @jamesarich in #6812
  • fix(map): parse KMZ archives in the F-Droid map overlay renderer by @jamesarich in #6834
  • fix(firmware): map SoftDevice variants for the new nrf52840 boards by @jamesarich in #6843
  • fix(navigation): never let the active backstack empty under NavDisplay by @jamesarich in #6844
  • fix(metrics): eliminate the Vico canvas restore underflow crash by @jamesarich in #6847
  • fix(ui): bound pane content height under the adaptive three-pane scaffold by @jamesarich in #6845
  • fix(connection): extend BLE handshake deadlines while config progress flows by @jamesarich in #6848
  • fix(map): survive the WebView provider update race in Site Planner by @jamesarich in #6846
  • fix(mqtt): tolerate object-typed payload in MQTT JSON messages by @jamesarich in #6839
  • fix(messaging): clear and suppress notifications for the conversation on screen by @jamesarich in #6849
  • fix(messaging): fire swipe row actions once per swipe, and let the snackbar go by @jamesarich in #6863
  • Stabilize Mid-Session Locale Unit State Test by @jeremiah-k in #6870
  • Demote Repeated Offline Heartbeat Rejection Logs to Debug by @jeremiah-k in #6872
  • Use Scan-Only Probes After Prolonged Bonded BLE Reconnect Failures by @jeremiah-k in #6871
  • fix(permissions): recover from a skipped, denied, or revoked permission instead of dead-ending by @jamesarich in #6880
  • fix(node): convert temperature before labelling it °F, and show wind in km/h by @jamesarich in #6925
  • fix(settings): drop the beacon single-target scalars protobufs reserved by @jamesarich in #6942
  • fix(node): scroll traceroute/log history detail popups by @beecho01 in #6708
  • fix(ui): show device roles by name, and stop doubling two percent signs by @jamesarich in #6962
  • fix(map): gate the MapLibre waypoint editor on isModifiableBy by @jamesarich in #6969
  • fix(ai): bound assistant messages at what the send path will actually encode by @jamesarich in #6970
  • fix(firmware): hide USB maintenance where the platform cannot run it by @jamesarich in #6974
  • fix(map): resolve the persisted basemap before the map first renders by @jamesarich in #6978
  • fix(network): point the API base URL at the R2-backed apiv2 host by @jamesarich in #7004
  • fix(settings): floor the beacon broadcast-target list at one row by @jamesarich in #7010
  • fix(settings): re-learn the node number when the first region set renumbers the radio by @jamesarich in #7021
  • fix(connections): scope region warnings to the active connection by @jeremiah-k in #7015
  • fix(mqtt): downgrade unparseable-payload decode logs from error to warn by @jamesarich in #7040
  • fix(node): gate direct messages on holding a public key by @jamesarich in #7050
  • fix(takserver): skip compressed v1 TAK packets to stop duplicate contacts by @texaskst in #7020
  • fix(firmware): move firmware artifact fetching onto the R2 hosts by @jamesarich in #7073
  • fix(settings): fetch Mesh Beacon config from remote-admin nodes by @jamesarich in #7077
  • fix(messaging): keep the composer IME session stable while the node list changes by @jamesarich in #7079
  • fix(network): never send heartbeat nonce 1, the firmware NodeInfo-ping trigger by @jamesarich in #7078
  • fix(lora): correct preset SNR floors and signal colors by @jamesarich in #7110
  • fix(settings): allow all available spread factors by @gargomoma in #7119
  • fix(nfc): write to tags that have never been NDEF-formatted by @jamesarich in #7123
  • fix(node): stop presenting MQTT-only nodes as unheard on the current LoRa by @jamesarich in #7138
  • fix(node): revert the time frame selector to a segmented row by @jamesarich in #7142
  • fix(messaging): keep the Enter key in the message composer by @jamesarich in #7155
  • fix(storeforward): dedupe a router replay by original_id by @jamesarich in #7158
  • fix(service): keep the process alive and awake through firmware updates and scans by @jamesarich in #7159
  • fix(messaging): key conversations to channel identity, not slot index by @jamesarich in #7162
  • fix(ui): drop the lazy list cache windows that crash inside a lookahead scope by @jamesarich in #7185
  • fix(settings): state lockdown's irreversibility in the enable dialog by @jamesarich in #7171
  • fix(network): point the API base URL at the production host by @jamesarich in #7197
  • fix(discovery): write a dwell and its parent check in one transaction by @jamesarich in #7204
  • fix(map): keep the 300 ms ease on MapLibre camera nudges by @jamesarich in #7240
  • fix(ble): replace deprecated preConflate with bufferCapacity by @jamesarich in #7236
  • fix(model): fold 0xAE into the hash of an AEAD channel by @jamesarich in #7239
  • fix(model): align the US first-setup preset with the device screen by @jamesarich in #7244
  • fix(settings): name config exports after the long name, not the short name by @jamesarich in #7248
  • fix(nodes): the direct filter no longer returns MQTT nodes by @jamesarich in #7256
  • fix(mqtt): TLS switch shows and sets the stored flag for the public broker by @jamesarich in #7255
  • fix(connection): name the transport in handshake stall reports by @jamesarich in #7276
  • fix(mqtt): subscribe with the options the negotiated protocol version allows by @jamesarich in #7273
  • fix(analytics): give crash reports the radio that produced them, a real blame frame, and a ceiling by @jamesarich in #7274
  • fix(settings): write the external notification duration in milliseconds by @jamesarich in #7307
  • fix(node): keep the node counts visible while searching by @jamesarich in #7311
  • fix(ble): don't arm a BLE transport on hardware without Bluetooth by @jamesarich in #7321
  • fix(connections): refuse serial addresses without USB host by @jamesarich in #7327
  • fix(service): stop a stale saved address overwriting a newer selection by @jamesarich in #7329
  • fix(service): stay foreground only for an address that can connect by @jamesarich in #7330
  • fix(messaging): clarify the message filter controls by @jamesarich in #7324
  • fix(notifications): give bubbles an adaptive icon by @jamesarich in #7336
  • fix(position): send no coordinates with a position request when we have none by @jamesarich in #7361

📝 Other Changes

  • refactor(settings): edit the status message on the user screen by @jamesarich in #6951
  • refactor(map): retire the maps-utils workarounds its 5.1 fixes made stale by @jamesarich in #7046
  • refactor(prefs): keep each surface's filters in one state object by @jamesarich in #7120
  • refactor(appfunctions): migrate to AppFunctionServiceEntryPoint by @jamesarich in #7340

New Contributors

Full Changelog: v2.8.1...v2.8.2

Don't miss a new Meshtastic-Android release

NewReleases is sending notifications on new releases.