0
Fork 0
mirror of https://github.com/Silent1566/webhtv.git synced 2026-10-18 07:09:16 +00:00

fix(theme): 全屏播放不再失去焦点环,改为画面内侧内缩环

用户实机报告(附大窗形态播放截图):「这里没有选中效果,或者说看不出来」。

根因(像素级证据):用户截图 817x483 中播放面板四边完全没有描边色——边界从黑直接
过渡到紫灰壁纸(仅 1px #232228 抗锯齿),候选环色(#447BF5/#7695C5/#A8C7FA/白)
全部 0 像素,面板四角为直角。排查确认两个全屏入口都在无条件移除焦点环,而宿主在
这两种形态下仍然 focusable:
- VideoActivity.enterFullscreen(): mBinding.video.setForeground(null)
  全屏后 @id/video 仍 focused="true"(uiautomator dump 实测),环却被移除;
- TmdbDetailActivity.updatePlayerPanelFocus(): inlineFullscreen || inlinePiPLayout
  分支 setStrokeColor(0)+setStrokeWidth(0) 后 return,面板仍 focusable=true。
即「可以聚焦但零视觉反馈」。

修法(方案 A):两个入口都改为在画面内侧画一圈内缩焦点环,用 InsetDrawable 把描边
推离屏幕物理边缘,避免全屏时被切掉一半、也不侵入画面中央:
- 宽度取 @dimen/webhtv_focus_ring_width(全 TV 唯一来源)
- 颜色取 ThemeController.focusRingColor()(= ?attr/tvPlayerRing 同一来源,视频层主题派生色)
- 内缩 12dp / 圆角 8dp
新增 VideoActivity.fullscreenVideoRing() 与 TmdbDetailActivity.insetFocusRing()。

新增防回归契约:
- TvFocusRingContractTest.fullscreenPlayerPathsKeepAnInsetFocusRing(断言两个入口不得再
  用 setForeground(null)/清零分支移除环,且新环必须走 token 宽度 + 主题色 + InsetDrawable)
- TmdbDetailChipFillTest.fullscreenPlayerPanelDrawsAnInsetThemeFocusRing(栅格化全屏面板:
  焦点态必须画出内缩主题环、非焦点态无环、环不得触及屏幕物理边缘)

验证:
- TvFocusRingContractTest 19/19;TmdbDetailChipFillTest 3/3
- :app:testLeanbackArm64_v8aDebugUnitTest 4168 tests / 0 failures
- :app:testMobileArm64_v8aDebugUnitTest 4981 tests / 0 failures
- scripts/check_ui_tokens.sh:violations=1(=基线)、hex_drawables=0、contrast failures=0
- dev1 实机(覆盖安装同签名 Debug 包,全屏播放态):环色像素 0 → 17256;环 bbox
  x 24..1895 / y 24..1055(内缩 24px = 12dp);左/上边界剖面 #0B57D0 环带清晰可见

Verification: VideoActivity.enterFullscreen 与 TmdbDetailActivity 全屏/PiP 分支由「移除环」改为「画面内侧内缩主题环」(宽度 token + ThemeController.focusRingColor + InsetDrawable 12dp/8dp);新增 2 条防回归契约;leanback 4168 + mobile 4981 tests 0 failures;check_ui_tokens violations=1(=基线);dev1 实机全屏播放环像素 0→17256、bbox 内缩 24px

Task-Guard: inline-player-panel-focus-ring

Verification: 两个全屏入口由移除焦点环改为画面内侧内缩环:VideoActivity.enterFullscreen 用 fullscreenVideoRing()(InsetDrawable 12dp 内缩 + @dimen/webhtv_focus_ring_width + ThemeController.focusRingColor),TmdbDetailActivity 全屏/PiP 分支用 insetFocusRing();新增 TvFocusRingContractTest.fullscreenPlayerPathsKeepAnInsetFocusRing(19/19)与 TmdbDetailChipFillTest.fullscreenPlayerPanelDrawsAnInsetThemeFocusRing(3/3,栅格化断言焦点态有环/非焦点态无环/环不触物理边缘);leanback 4168 + mobile 4981 tests 0 failures;check_ui_tokens violations=1(=基线);dev1 实机全屏播放环色像素 0→17256、bbox x24..1895 y24..1055(内缩 24px=12dp)、边界剖面 #0B57D0

Task-Guard: inline-player-panel-focus-ring
This commit is contained in:
Silent1566 2026-10-10 23:30:07 +08:00
commit 0209015d62
5 changed files with 257 additions and 3 deletions