- Persist the entire CellGuardState (serving, neighbors, PLMN, frames,
alerts) to disk and reload on start; carry forward last-known values so
no field blanks on a transient poll miss and the app never opens empty.
- Log every observed tower with GPS position, timestamp and signal to a
framework-SQLite database (SurveyDb), clustering sightings into 2.5-mile
areas; travelling past 2.5 mi starts a new area. Framework LocationManager
only (no Google Play Services); GPS speed drives a 'traveling' indicator.
- New SURVEY LOG tab lists areas and the towers seen in each. Declare the
location foreground-service type, claimed only when the permission is held.
- Post the ongoing status on a fresh LOW channel (cellguard_status_v2) and
delete the legacy channel, whose importance was stuck at HIGH (a channel's
importance is immutable after creation) and heads-up'd on every 4s poll.
- Read the live capture total from the /proc/cgcap/frames header instead of
the detector's snapshot, which could lag behind.
- Accumulate neighbor towers across polls with a 120s TTL instead of
publishing the raw per-poll getAllCellInfo list, which blinked empty
whenever a scan returned only the serving cell.