0
Fork 0
mirror of https://github.com/Silent1566/webhtv.git synced 2026-10-20 10:22:50 +00:00

fix(theme): 修复对话框主题缺 tv* 属性导致的黑色边框,并收口代码挂环的硬编码宽度

用户实机报告两点:
1. 「现在选中播放器看不出选中的效果,好像是黑色的边框,不应该是统一的选中边框颜色吗?」
2. 「还有个性推荐等卡片的边框粗细没有改小没有统一」

缺陷一(上一轮引入的回归):selector_control_sheet_button(播放器控制面板按钮)的焦点环
从写死半透明白改成 ?attr/tvPlayerRing / ?attr/tvPlayerCurrentRing,但这两个属性当时只在
Theme.Base(= Theme.App)里绑定,而播放器控制面板(ControlDialog,BottomSheet)用的是
Material 默认 bottomSheetDialogTheme、Alert 对话框用的是 Theme.Material3.DayNight.Dialog.Alert
—— 两者都不继承 Theme.WebHTV。属性解析不到时 ?attr/xxx 静默退化为黑色/透明且不崩溃,
这就是「黑色边框」的来源(Robolectric 实测:Theme.WebHTV.Dialog / bottomSheetDialogTheme
下 tvPlayerRing = UNRESOLVED,修复后 = #FF447BF5)。

修法:Theme.WebHTV(基底)/ Theme.WebHTV.Dialog / ThemeOverlay.WebHTV.Dialog 三处都绑定
全部五项 tv* 属性;selector_control_sheet_button 补上缺失的 state_activated 分支
(部分入口用 ArrayAdapter.setActivated 表达「当前生效」,缺该分支就完全看不到选中环)。

缺陷二:前几轮统一的是 drawable 层的环宽,而一批控件是代码挂环(直接 setStrokeWidth /
GradientDrawable.setStroke),全部漏掉:TmdbRecommendationPresenter(FOCUS_WIDTH_DP=3)、
TmdbCardFocusHelper(FOCUS_STROKE_DP=3)、TmdbEpisodeAdapter(3)、TmdbVideoAdapter(2)、
InlineEpisodeAdapter(2)、TmdbDetailActivity(11 处 FOCUS_STROKE_DP=3)。
修法:全部改为从 @dimen/webhtv_focus_ring_width 读像素;TmdbCardFocusHelper.foregroundBorder
参数语义由 dp 改为 px(避免再次隐式写死);TmdbRecommendationPresenter 环色改走
ThemeController.focusRingColor(原来直接取颜色常量,绕过主题覆写通道)。

新增防回归契约:
- ThemeContractTest.everyReferencedTvFocusAttrIsAssignedByATheme:扫描全部 ?attr/tv* 引用,
  断言每个都被至少一个主题赋值,且基底主题自带全部五项(这类回归不崩溃、只有人眼能发现)
- TvFocusRingContractTest.noJavaCodeHardcodesAFocusRingWidth:扫描 9 个 Java 源,
  断言「按焦点分支设描边宽度」的真分支不含 dp 字面量/ *_DP 常量(实测扫到 12 处;
  实施中真的抓出一处漏改:TmdbDetailActivity.applyInlineEpisodeModeButtonState)
- TvFocusRingContractTest.noJavaCodeHardcodesAFocusRingColour

验证:
- ThemeContractTest 全绿;TvFocusRingContractTest 18/18
- :app:testLeanbackArm64_v8aDebugUnitTest 4166 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 包):选集项焦点环实测 3px #447BF5(此前 3dp 写死色);
  Robolectric 复核 dialog_control#player 的 focus/selected/activated 三态分别为
  #FF447BF5 / #FF00A95A / #FF00A95A

Verification: 三个对话框主题补绑 tv* 五项 + control_sheet_button 补 state_activated 分支(黑框回归消失,实测 dialog_control#player activated 由无描边变为 #FF00A95A);6 个 Java 挂环位置改读 @dimen/webhtv_focus_ring_width(个性化推荐等卡片宽度统一);新增 3 条防回归契约;leanback 4166 + mobile 4981 tests 0 failures;check_ui_tokens violations=1(=基线);dev1 实机选集项环 3px #447BF5

Task-Guard: tv-ring-dialog-attr-recommendation

Verification: Theme.WebHTV/Theme.WebHTV.Dialog/ThemeOverlay.WebHTV.Dialog 三处补绑 tv* 五项(Robolectric 实测 dialog 主题 tvPlayerRing 由 UNRESOLVED→#FF447BF5);selector_control_sheet_button 补 state_activated 分支(dialog_control#player activated 由无描边→#FF00A95A);6 个 Java 代码挂环位置(TmdbRecommendationPresenter/TmdbCardFocusHelper/TmdbEpisodeAdapter/TmdbVideoAdapter/InlineEpisodeAdapter/TmdbDetailActivity 11 处)改读 @dimen/webhtv_focus_ring_width;新增 3 条防回归契约(tv 属性必被主题赋值、Java 不得写死环宽/环色);leanback 4166 + mobile 4981 tests 0 failures;check_ui_tokens violations=1(=基线) hex_drawables=0;dev1 实机选集项焦点环 3px #447BF5

Task-Guard: tv-ring-dialog-attr-recommendation
This commit is contained in:
Silent1566 2026-10-10 21:56:12 +08:00
commit 7948c8e979
13 changed files with 361 additions and 37 deletions