Skip to content

v1.0.43

Choose a tag to compare

@github-actions github-actions released this 22 Aug 18:58

Changed

  • Settings overview groups categories by topic (Map, Sampling & alerts, App,
    Data, System) with uppercase headers and a one-line description on each
    category tile.

Added

  • Hidden achievement "Быть легендой mesh сетей Смоленска" (💎): unlocks while
    the connected companion radio reports a node name starting with "Ya_",
    "Yakut", or "Якут" (case-insensitive). The badge stays invisible on the
    Achievements screen until it is unlocked. The device's own MeshCore advert
    name is now parsed from the SELF_INFO handshake response and tracked while
    the companion is connected; it is separate from the Bluetooth/USB transport
    name.
  • Auto-ping pause on bad GPS: when the configured number of consecutive
    position fixes is rejected by the location quality filters, automatic pings
    pause until the next valid fix instead of pinging a stale position. The
    feature is on by default after 5 rejected fixes; the toggle and threshold
    live in Settings → Location Quality Filters → Auto-Ping Pause and are
    included in settings export/import. A snackbar announces each pause and
    resume.
  • Audible link-loss alert: when the LoRa companion radio disconnects
    unexpectedly, the app plays a distinctive double-beep tone with vibration.
    A disconnect made explicitly from the map stays silent. The alert can be
    turned off in Settings → Feedback ("Link Loss Alert", enabled by default)
    and is included in settings export/import.
  • Automatic reconnection to the LoRa companion radio after an unexpected
    connection loss (USB unplugged or Bluetooth link dropped). Reconnect attempts
    use exponential backoff (3 s doubling up to once a minute) and refresh the
    contact list on success. Auto-ping suspended by the loss resumes when the
    link is restored. A disconnect made explicitly from the map is never followed
    by an automatic reconnection.
  • In-app language (System / English / Русский) under Settings → App & device;
    Russian UI.
  • Impossible Zones in Location Quality Filters: user-defined circles
    where you cannot physically be. GPS or Wi-Fi fixes inside a zone are
    discarded (no sample, no ping) and the map keeps the last valid
    position. They can be added from Settings or by long-pressing the map;
    they are not drawn on the map.
  • Long-pressing the map now opens a choice of what to add: a planned repeater,
    a privacy zone, or a GPS-impossible zone.
  • Before a GPS fix is available, the map opens on the average of stored
    measurements at a city-scale zoom. Spread-out samples zoom out to fit. With
    no samples it keeps the previous default view, and the first GPS fix still
    recenters as before.
  • Long-press the map Play button to start a new recording on a blank map
    without deleting stored samples. Short press still shows all coverage. An
    empty session (no GPS points) asks whether to keep it; discarding or deleting
    the session on the map falls back to the latest saved session.
  • Battery saver can now be turned off in Settings → App & device. Automatic
    ping-interval doubling at ≤20% battery stays on by default and can be changed
    while a recording is running.
  • Direction-arrow mode now offers a figure-8 compass calibration when Android
    reports the magnetometer as unreliable. A compact map banner appears after a
    short delay, Later snoozes it for a day, and Calibrate Compass remains in
    Settings or via a long-press on the compass button.
  • Interface and map themes can now be selected independently. Existing installs
    keep their previous map appearance when the new setting is initialized.
  • Map LOD (geohash grouping of coverage, edges, and samples at low zoom) can now
    be turned off in Map display. It stays on by default. With it off, the map
    shows native coverage cells and individual GPS sample points.
  • Added a map-provider investigation covering Yandex Tiles API, Yandex MapKit,
    hosted alternatives, offline support, migration effort, and licensing risks.
  • GitHub Actions CI runs format checks, analyzer, tests, and a debug APK build
    on main. A manual Release APK workflow publishes a signed APK to GitHub
    Releases using repository signing secrets and the version from pubspec.yaml.
  • Location rejection thresholds are now configurable in a dedicated expandable
    Settings group, with user-friendly km/h speed inputs and one-tap restoration
    of the previous built-in defaults.
  • Settings now use a modern Android-style overview with grouped category cards
    and dedicated child pages for each category.
  • Starting a recording now requests precise and always-on location access plus
    an exemption from Android battery optimization. When beaconDB Wi-Fi
    positioning is enabled, the app also links to Developer options to disable
    Wi-Fi scan throttling and holds a Wi-Fi lock during foreground tracking.
  • Optional beaconDB Wi-Fi positioning can now be enabled in Settings. It scans
    nearby access points every 30 seconds and gives a valid Wi-Fi-only estimate
    priority over Android fused/GPS positions. IP and cell fallbacks are disabled,
    _nomap, hidden, randomized, and stale networks are excluded, and the active
    Wi-Fi position is shown with a cyan marker.
  • Discovery response collection is now configurable: fast mode finishes three
    seconds after the first response, while thorough mode keeps listening until
    the configured discovery timeout.
  • Fresh installs now use the regional meshcoretel.ru upload endpoint for
    Russian locales and meshcoretel.io elsewhere.
  • A new Keep Screen On setting prevents the display from sleeping while the
    app is open, without interfering with the existing tracking wakelock.
  • The current GPS marker can now be switched between the classic blue circle
    and a compass-aware direction arrow in Settings. The arrow falls back to GPS
    course while moving when a compass sensor is unavailable. In arrow mode, the
    compass button toggles heading-up rotation; rotating the map manually stops
    heading-up tracking.
  • An app-wide offline banner now detects restricted or unavailable internet
    access with a short periodic connectivity check. GPS tracking, radio
    communication, and local sample storage continue while offline.
  • Successful pings heard by at least three positioned repeaters now show a
    temporary grey radio-position estimate and its uncertainty circle. The
    estimate is visually distinct from the blue GPS position and can be hidden
    in map settings without disabling its calculation.

Fixed

  • Dialogs, bottom sheets, file pickers, and nested screens opened from a
    Settings category now return to that category instead of the overview.
  • Community coverage tiles now use exact geohash bounds and the same LOD
    precision as local coverage, so they line up with the user's grid. They stay
    visible regardless of the session filter and are hidden only by their own
    map-display toggle. Tap details use the same aggregated cells as the overlay.
  • Long-pressing Play starts a blank-map session. The Play button no longer uses
    a Material tooltip, which was swallowing the long-press gesture.
  • Session History "Tap to view on map" uses the theme primary color so it stays
    readable on dark cards.
  • Quick Settings no longer crashes when Discovery Timeout is 5s or 25s, or when
    ping distance is Frequent (50 m) or another value missing from the compact
    menus. Those lists now match Settings and still accept unknown saved values.
  • Settings text fields now keep their controllers alive until dialog dismissal
    finishes, preventing crashes and cascading layout errors after saving location
    quality thresholds and other editable preferences.
  • Location quality controls now open as a dedicated submenu and no longer rely
    on Flutter's ExpansionTile announcement event, which Android API 36 reports
    as deprecated.
  • The map now keeps searching for a fused Android position whenever it is open,
    even before recording starts. A watchdog restarts stalled or closed location
    streams and resumes automatically after Location Services are re-enabled.
  • Android-reported mock locations are excluded from the map and recorded
    wardrive data. GPS samples and trip distance retain their five-metre movement
    threshold even though the live position stream updates more frequently.
  • Discovery pings now persist one sample for every unique repeater response,
    including each response's latency, while duplicate responses from the same
    node remain de-duplicated.
  • Coverage-to-repeater lines now match full and short node IDs without case
    sensitivity, and coverage details show two-byte repeater prefixes.
  • The connect action is disabled for the full USB/Bluetooth connection attempt
    so overlapping scans and connection requests cannot be started.
  • Repeater names containing Cyrillic characters or emoji are now decoded and
    displayed correctly.
  • Radio ping results are now shown as soon as the first tagged discovery
    response arrives, with the actual response time. Additional repeater
    responses are still collected for radio-position estimation without delaying
    feedback, and overlapping discovery cycles are prevented.
  • Companion-radio communication now parses firmware layout 13 while correctly
    negotiating the documented app response layout 3. Golden protocol tests pin
    command/response assignments, USB/BLE framing, discovery, contacts,
    SELF_INFO, channel data, UTF-8 text, coordinates, and malformed-frame
    handling. Channel messages no longer use UTF-16 bytes or append an extra
    NUL, and quarter-dB SNR is preserved until the integer application boundary.
    BLE connections use the official UART UUIDs and request MTU 512.
  • Update checks now time out quickly and show a concise offline error instead
    of leaving the request hanging.
  • Android location fixes now use the fused provider so GPS, cellular, and
    nearby Wi-Fi positioning can work together.
  • Very inaccurate fixes and probable in-flight samples are ignored without
    blocking legitimate drives on high-altitude roads.
  • Tracking startup failures now show a specific permission, settings, or
    service error.

Changed

  • Dart and Android plugins are updated within the Flutter 3.47 / API 36
    toolchain. BLE connect now uses FlutterBluePlus's nonprofit license. The map
    stack stays on flutter_map 7 because flutter_map_heatmap still does not
    support v8. Packages that need Android 17 (API 37) or AGP 9 built-in Kotlin
    stay on the last versions that compile against API 36.
  • Android builds now follow the Flutter 3.47 toolchain: Gradle 9.3.1, Android
    Gradle Plugin 9.1.0, and Kotlin 2.4.0. CI and release workflows pin Flutter
    3.47.1 so the Gradle/AGP/Kotlin warnings no longer appear. Gradle 9 no longer
    provides jcenter(), so the Android build maps leftover plugin calls to
    Maven Central. Android library plugins are compiled against API 36 so they
    satisfy AGP 9's compile SDK requirement.
  • The update check and the "View on GitHub" entry in Settings → About now
    point at the fork's releases. The check uses the releases list endpoint so
    prerelease-only repositories are detected, and release tags are matched by
    their dotted version regardless of prefix.
  • Bluetooth device selection no longer waits for the scan timeout. Previously
    used and paired companion radios appear immediately, and newly found devices
    are added to the list while scanning continues.
  • Settings now open as a dedicated full-screen page and are grouped into
    Android-style categories for map display, positioning, alerts, Carpeater,
    app/device preferences, discovery, statistics, data, diagnostics, and online
    services.
  • Fresh installs default to metric units, geohash precision 7, time-based
    pings every 30 seconds, and a 10-second discovery timeout. Additional
    20-second, 25-second, and 45-second ping intervals are available.