Releases: xarleyn/Meshcore-Wardrive-Android-Source
Release list
v1.0.44-x
Breaking change
- Changed the Android package ID from
mintylinux.meshcore.wardriveto
io.github.xarleyn.meshcore.wardrive. Android installs this fork separately
from the original application and from older fork builds. No data migration
is provided: the new package starts with empty local data and default
settings, and requires permissions, background/MIUI settings, device access,
widgets, offline maps, and credentials to be configured again.
Added
-
Full database backup (Settings → Backup): "Export Database" writes a
consistent copy of the entire SQLite database (samples, sessions, upload
tracking, planned markers, privacy zones, exclusion zones, devices) to a
file or the share sheet, and "Import Database" restores it back. The picked
file is validated (SQLite signature, expected schema, schema version) before
anything is replaced, the previous database is kept until the restored copy
reopens successfully, and backups from older app versions are upgraded
automatically. Tracking must be stopped before an import. -
Independent Map Display toggles for privacy zones and GPS exclusion zones.
Each enabled layer shows both the zone center and its configured radius;
both choices participate in settings export/import. -
Adjustable sample point size (Settings → Map Display): enable a fixed point
size to replace automatic sizing, then choose a diameter from 8 to 32 px.
The option is off by default and participates in settings export/import. -
Geohash sample grouping (Settings → Map Display): when enabled, every
measurement recorded inside one geohash cell collapses into a single marker
placed at the average measurement position, regardless of zoom and
independently of the low-zoom simplification setting. Tapping such a marker
still opens the grouped-measurements dialog with the full list inside.
Off by default. -
Optimistic coverage display (Settings → Map Display): when enabled, a cell
with at least one successful ping is painted as good and its failed pings
are ignored. The ping dates still matter — if the newest success is older
than a month and failures were recorded after it, the failures win again
because the coverage most likely went dark. The setting participates in
settings export/import. -
Carpeater target repeater picker: Settings → Carpeater now opens a
searchable list of previously found repeaters instead of a bare text field.
Each row shows the repeater's advertised name together with its ID, search
matches either of them, the currently selected repeater is highlighted, and
manual ID entry remains available as a fallback.
Changed
-
The privacy-zone and GPS-exclusion ("impossible zone") dialogs now let you
pick any radius between 50 m and 10 km with a slider, and an editable meters
field replaces the fixed 500 m / 1 km / 2 km / 5 km choices. The slider and
the field stay in sync, and typed values outside the range are clamped. A
"Preview on map" link collapses the dialog into a small bar at the bottom of
the screen and draws the zone circle on the map — the map stays interactive,
and the bar offers Edit, Add, and Close actions. -
Distance achievements (🚗 🛣️
✈️ ) now follow the selected distance unit in
both their descriptions and their unlock logic, without converting between
units: the thresholds stay 10/100/500, so 100 miles and 100 km unlock the
same badge depending on the setting. -
Debug builds now use
io.github.xarleyn.meshcore.wardrive.debug, allowing a
debug and signed release build of the fork to coexist. -
Fork releases use
base-xversion names such as1.0.44-x. The update
checker compares base versions, prefers fork builds over legacy tags
without the suffix, ignores downgrades, and selects the newest compatible
tag from multiple GitHub releases. -
The release workflow verifies package ID, version name, increasing version
code, APK signature, release tag, and asset name before publication, and
fills the GitHub release description from the matching CHANGELOG section.
Fixed
- "Show Successful Pings Only" now applies to every sample-derived layer, not
just the round sample markers. Coverage squares whose every ping failed are
hidden (cells with at least one success keep their color computed from the
full ping history), and the route trail and heatmap stop drawing failed
pings and GPS-only samples. - Carpeater neighbour scans now store SNR with the same half-away-from-zero
rounding as discovery pings. The scan previously truncated negative SNR
toward zero (for example -1.75 dB was stored as -1 dB), which made weak
links look better than measured in saved samples and sound feedback.
APK: meshcore-wardrive-xarleyn-1.0.44-x-47.apk
v1.0.43
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
onmain. A manual Release APK workflow publishes a signed APK to GitHub
Releases using repository signing secrets and the version frompubspec.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.ruupload endpoint for
Russian locales andmeshcoretel.ioelsewhere. - 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'sExpansionTileannouncement 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 W...
v1.0.42
Signed release APK for 1.0.42 (versionCode 45).