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

feat(tv): 播放器错误层补上重试动作,复用既有的重置路径

设计文档 §9.9 要求错误态有「重试动作」。改动前播放器错误层只有一个 56dp 警告图标
加一行失败原因,没有任何可操作的东西——播放失败后用户唯一的办法是退出重进。
而播放器其实早就有正确的动作:控制层的「重置」按钮 onReset()。

根因不是缺能力,是错误层从来没把已有能力暴露出来:浮层里没有任何 focusable 控件,
而播放页平时把焦点放在视频面上(mBinding.video.requestFocus() 共 6 处),
所以即使加了按钮,不主动交焦点遥控也未必走得到。

- view_widget_vod.xml 的 @id/error 内新增 @id/retry(可聚焦可点击,46dp 高,
  文案复用 TV-5 的 @string/error_retry);
- 背景用既有的 selector_control_sheet_button 而不是空态那套 selector_empty_action:
  错误面板是 shape_widget(black_40,两张表相同)属**固定深玻璃族**,焦点环必须取
  ?attr/tvPlayerRing;空态那套取 ?attr/tvFocusRing,浅色表在深玻璃上只有约 1.8:1。
  这条边界在 selector_control_sheet_button 的注释里已有记录,本批只是遵守它;
- showError 显示浮层后把焦点交给重试;hideError 仅在重试确实持有焦点时才交还视频面,
  避免抢走剧集网格等控件的焦点;
- 重试复用 guarded(this::onReset),与控制层「重置」完全同一条路径,
  因此不新写恢复逻辑、不会与既有的自动换源 startFlow() 形成第二套逻辑。

验证:leanback 定向测试 BUILD SUCCESSFUL(含新增 TvPlayerErrorRetryContractTest 4 项);
真机 192.168.50.3:5561 上用 iptables 只拦应用自身 uid 的出网制造真实播放失败:
错误层出现「重试」且自动获得焦点(焦点环清晰),移除拦截后按确认键错误层消失、
画面恢复播放并续播到 30:16/36:30,焦点归还视频面,无崩溃;规则已确认移除。

未单独验证:与自动换源 startFlow() 的竞态(本机这次错误层持续显示,说明自动换源
未生效或无可用源);全屏播放路径(与详情页预览共用同一 showError/hideError)。
详见 docs/TV-PLAYER-ERROR-RETRY-20261013.md §6.4。

环境限制:本会话无可用 bash,check_ui_tokens.sh 与 task_guard.sh 无法执行,
按同等意图手工暂存/提交/打 tag。
This commit is contained in:
Silent1566 2026-10-13 09:54:47 +08:00
commit a2932aeac2
4 changed files with 266 additions and 0 deletions