Skip to content

feat(map): draw the device's own movement track as a layer - #625

Merged
whes1015 merged 3 commits into
mainfrom
feat/location-track-layer
Oct 16, 2026
Merged

whes1015 merged 3 commits into
mainfrom
feat/location-track-layer

Conversation

@whes1015

Copy link
Copy Markdown
Member

這個 PR 做了什麼

裝置本來就會在本機記錄移動軌跡(LocationTrackStore.kt/LocationTrackStore.swift 寫入 location_track.db,50 MB 上限、從最舊的開始刪),但除了診斷報告的筆數和大小以外,使用者看不到它。這個 PR 在地圖圖層選單的「生活」分類新增「軌跡」圖層,並清楚註明資料只存在這支手機、不會上傳、移除 app 或清除資料後就會遺失。

記錄本身沒有改:一樣只在允許背景定位時記錄、沒有開關、沿用 50 MB 上限。

改動內容

正式程式碼

  • bc2ba2b5 refactor:解碼抽成共用,並新增串流讀取器
    • 背景 isolate 用資料庫游標一列一列讀,記憶體裡一次只有一列;只把有上限的摘要傳回 UI。
    • 既有的 LocationTrack 改用同一個解碼器,測試透過共用的 fixture helper 讀資料庫。
  • 3d3ddf37 新增「軌跡」圖層
    • 繪製:把軌跡畫成線,依時間分 8 個深淺;孤立的點畫成小圓點,最新位置有標記;圖例顯示「較新/較舊/最後位置」。
    • 時間範圍:今天/7 天/30 天/全部,預設 7 天。「今天」以台北午夜計算。
    • 低階手機:用網格稀疏化,不用 Douglas–Peucker。點對齊到格子,地圖只拿到每一段「格子到格子」的線一次,所以同一條通勤路線走 300 次和走 1 次成本一樣。格子從儲存精度(約 11 m)開始,短範圍完全不失真;格子加線段超過 4,000 時格子邊長加倍,最多約 8,000 個座標(約 160 KB)。理由寫在 lib/core/geo/track_digest.dart。
    • 斷點:相隔超過 2 小時的兩個點不會連起來,不會畫出橫越地圖的直線。
    • 不阻塞:每次載入只上傳一次到地圖,沒有每幀的工作;不會卡住地圖其他操作;被更新的讀取超過的慢讀取會被丟棄。
    • 更新:回到前景時,只有檔案統計變了才重讀(背景可能新增了點)。開啟圖層和切換範圍時鏡頭會框住軌跡,背景更新時不會動鏡頭。
    • 面板:收合時顯示「軌跡」、所選範圍的點數、範圍按鈕,以及一直看得到的說明「只存在這支手機、不會上傳、移除 app 或清除資料後會刪除」。收合高度是量出來的,確保說明不被導覽列擋住(測了 1.0x 和 1.3x 字級)。展開後顯示總點數與大小、最早日期、最後位置、容量說明(50 MB 約可存三百多萬點,以每天 100–300 點計約數十年,滿了從最舊的刪),以及 2 小時斷點的說明。
    • 清除軌跡:先確認「無法復原」,再呼叫既有的 clearTrack();確認檔案真的空了才顯示「已清除軌跡」。開發者頁的清除入口不變。
    • 空狀態:還沒有任何紀錄時(新安裝、沒有允許背景定位),說明允許背景定位後會自動開始記錄,並附「權限檢查」按鈕。
  • f56cc7d5 文件:ARCHITECTURE.md § Persistence 註明移動軌跡永遠不會離開裝置(repo 沒有獨立的隱私文件)。

測試

  • 稀疏化上限、斷點切分、範圍篩選(含台北午夜的「今天」)。
  • 空狀態、清除(含取消和失敗)、說明在 1.0x/1.3x 字級下不被導覽列擋住、圖層放在「生活」分類。

相關 issue

沒有對應的 issue。

怎麼驗

  • tool/commit.sh --push 通過(analyze、codegen、全部 Dart 測試、l10n)。新字串 12 個語系都有翻譯。
  • 請在實機上確認:
    • 低階 Android 手機、紀錄很多時,「全部」要多久(預估數百萬點約幾秒),期間轉圈、地圖仍可操作。
    • 兩個平台上,收合面板在實際導覽列和手勢區下的高度。
    • 背景記錄的點,回到 app 後會出現。
    • 兩個平台清除後真的清空。
    • 橘色的線在淺色/深色底圖、以及色覺輔助模式下都看得清楚。
    • 「權限檢查」按鈕會開啟權限清單。
  • 可能需要更新的上架說明(這個 PR 沒有改):
    • Play 的資料安全表單和背景位置聲明,可能要把軌跡列為背景位置的用途。
    • Apple 隱私標籤可能維持「不收集」,因為資料不會離開裝置。
    • iOS 的 NSLocationAlwaysAndWhenInUseUsageDescription 目前只提到警報。
    • 外部的隱私權政策。
  • 小地方: 選擇的時間範圍不會記住,重啟後回到 7 天。

合併注意:和 #616、#618 都在 ARB 檔尾端新增 key,後合併的需要 rebase 並重新產生 l10n。

檢查清單

  • tool/check/commits.sh 通過
  • 一個 commit 一件事
  • analyze 與測試通過(tool/commit.sh --push)
  • 新的使用者可見字串都走 AppLocalizations,12 個語系都有翻譯
  • 使用設計 token;大字級已測,深色模式與色覺模式待實機確認

Platform: all

New(zh-Hant): 地圖的「生活」分類新增「軌跡」圖層,可看今天、7 天、30 天或全部的移動紀錄;資料只存在這支手機,不會上傳
New(en-US): a new Track layer under Daily life on the map shows where this phone has been today, in the last 7 or 30 days, or ever; it stays on the device and is never uploaded
@codecov

codecov Bot commented Oct 16, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 94.45407% with 32 lines in your changes missing coverage. Please review.
✅ Project coverage is 94.47%. Comparing base (1c324db) to head (f56cc7d).

Files with missing lines Patch % Lines
.../map/presentation/layers/location_track_layer.dart 87.15% 28 Missing ⚠️
...map/presentation/widgets/location_track_sheet.dart 98.54% 3 Missing ⚠️
lib/core/geo/track_digest.dart 99.02% 1 Missing ⚠️

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@whes1015
whes1015 merged commit 03ce12a into main Oct 16, 2026
8 checks passed
@whes1015
whes1015 deleted the feat/location-track-layer branch October 16, 2026 12:04
@lowrt lowrt added this to the v26.4 milestone Oct 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants