GPS: safe on-device recovery, net-kcal model, poll/watchPosition dedup

- native_root(): pick app root by presence of gps_live/gps_points files.
  app_data_dir() is the root directly on this Tauri; the old .parent().parent()
  read the wrong dir, so background (screen-off) points were never imported.
- recoverFromFiles: match file->session by id/date, plus session id stamped
  into the native file name (gps_points_<ms>_s<id>.jsonl) for exact binding
  (gps_set_session_id -> Kotlin bindSessionIfPending). Proximity dedup +-2.5s,
  recalc with noDelete (never runs the destructive glitch/>24h filter that
  once wiped real rides), delete already-imported files. Progress bar UI.
- bike kcal is NET (daily balance already books BMR*activityLevel): pedaling =
  max(physics power/efficiency, MET-net by speed), coasting (power<=0, the bike
  would roll unpowered) = basal only. Elevation via cumulative hysteresis.
  recomputeAllStats + "recompute elevation/kcal" menu refresh stored tracks
  without touching points.
- live recording: the native file is the DB source of truth; watchPosition
  only drives the live marker, so a fix is not stored twice with two timestamps.
- track list pagination, SAF local-file picker, tile regions from router.
This commit is contained in:
4aiman 2026-07-29 15:35:18 +03:00
commit 56c2ff4ec7
12 changed files with 854 additions and 190 deletions

10
.gitignore vendored
View file

@ -12,3 +12,13 @@ fitotrack_src/
fitotrack_v156/
fitotrack_*.apk
de.tadris.fitness_*.tar.gz
# Offline map artifacts: raw PNG tiles and packed tile DBs (regenerable, large)
data/tiles/
tiles_*.db
# Local DB backups pulled from the phone
db_backups/
# Session-local analysis harnesses, copied DBs, pulled 50Hz sensor dumps (large)
test_recovery/