Skip to content

feat(app): add the shell, search, settings and player bar - #191

Merged
1morr merged 4 commits into
mainfrom
feat/app-shell
Sep 30, 2026
Merged

1morr merged 4 commits into
mainfrom
feat/app-shell

Conversation

@1morr

@1morr 1morr commented Sep 30, 2026

Copy link
Copy Markdown
Owner

M1 PR 12b:外殼、搜尋、設定、播放列、快捷鍵(ADR 0024 §決定 3、5、6、8;ADR 0023 §決定 2;擁有者決定 2)。完成後通過 M1 的端到端驗收。

做了什麼

  • 外殼:依內容區寬度切換導覽元件:< 600 用底部 NavigationBar,600–1199 用 NavigationRail,≥ 1200 用常駐 NavigationDrawer。導覽項只有「搜尋」「設定」。外殼會發佈底部被佔用的高度,提示就浮在播放列與導覽列之上。
  • 搜尋頁:
    • 輸入框、可橫向捲動的音源 chip 列、結果列表(封面、曲名、上傳者、時長)、「載入更多」、各種狀態畫面;
    • 較慢的舊搜尋結果回來時會丟掉,「載入更多」以曲目鍵去重;
    • 點一首就把整份結果和起點交給 PlaybackController;
    • 錯誤一律經 Toaster.error。
  • 設定頁:只有外觀組,≥ 840 用 list-detail 版面。
  • 播放列:封面、曲名、上傳者、上一首、播放暫停、下一首、進度條(放開才 seek)。曲名在各寬度都 ≥ 160dp,< 600 只有播放與下一首。
  • 快捷鍵:空白鍵、Ctrl+←/→、Shift+←/→(5 秒)、Ctrl+F、Ctrl+,、F6(在導覽、內容、播放列三區之間移動)。焦點在輸入框時這些鍵交還給輸入框,Tab 只在所在的區內移動。
  • 收尾:
    • 刪除身分頁與 --fmp-dev-playback,保留 --fmp-dev-plugin;
    • 播放列三段寬度的 golden 測試(alchemist,CI 版),失敗時上傳差異圖;
    • 新增 integration_test/toast_layering_test.dart,在實機上驗證提示浮在對話框與全螢幕頁之上;
    • 測試插件在關鍵字剛好是 fail 時會以限流失敗,給離線驗證錯誤提示用,只打包在 dev;
    • verify-on-device skill 與三份 spec 同步更新。

驗證

  • format、dart analyze --fatal-infos、flutter analyze 都零問題;flutter test 784 個通過,含 golden 與 guideline;哨兵通過;兩個 dev 建置都成功。
  • 平台:Windows 11(dev debug)|模式:測試插件,不連網
    • 搜尋後點一首,兩首連播,交接估計間隔 49 ms。
    • 空白鍵在輸入框外會切換播放暫停;在輸入框內只輸入空格,或交給中文輸入法選字,播放狀態不變。
    • 限流提示正常顯示;按鈕的 tooltip 附上按鍵。
    • 三種導覽樣式依視窗寬度切換。
    • Narrator 開著時送出提示:節點數 30 → 31,提示消失後從樹上移除,切換頁面照常更新,沒有凍結。
    • toast_layering_test.dart:2/2 通過。
  • 平台:Android 模擬器(dev debug,系統語言 en,-no-audio)|模式:測試插件,不連網
    • 底部導覽列;輸入框打得進空格;長按出現文字選取工具列。
    • 兩首連播;只要求一次音訊焦點,沒有放掉;提示在播放列與導覽列之上。
    • toast_layering_test.dart:2/2 通過。
  • M1 端到端驗收(模式:真實,B 站,最少操作)
    • Windows:搜尋「piano」,點第一首,播放中把進度條點到接近結尾,由前瞻接上第二首並繼續播。
      • 共 7 個 API GET:1 次搜尋,三首各一次 wbi/view 加一次 playurl。
      • 另有串流與封面圖的請求。
      • 開流只帶 Referer 和 User-Agent;log 裡沒有 CDN 網址,也沒有錯誤。
    • Android 模擬器:同樣流程,第一首自然播完後交接,估計間隔 40 ms,第二首照常播放。
      • 共 8 個 API GET。
      • 只要求一次音訊焦點。
    • 實作期間另有 1 次對 hdslb 的 GET,用來確認 B 站封面不需要 Referer。
  • opus 審查修了 3 個缺陷與 1 個腳本問題:
    • 已在目標頁時 Ctrl+F/Ctrl+, 不會移焦點;
    • 「載入更多」遇到排序變動會出現重複曲目;
    • 點已選取的 chip 會多搜一次;
    • window_shot.ps1 被存成 LF 行尾,在 Big5 系統上解析錯亂。

請擁有者確認

  • 焦點在一般按鈕或 chip 上時,空白鍵也是播放暫停,要按 Enter 才會觸發按鈕。這是照 ADR 0024 §決定 8 的表,但和 Windows 上「空白鍵觸發按鈕」的慣例不同。

後續(記在 M1 implement.md)

  • CDN 403 會對到 Unsupported(M2);
  • 跳過時不提示(M2);
  • 啟動 log 裡的資料目錄含系統使用者名稱,做診斷包時要去掉(M3);
  • 封面圖的轉址、大小上限、逾時(M6)。

@1morr
1morr merged commit c5770a1 into main Sep 30, 2026
10 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant