feat(android): 回填卡片改用受限手势点击进入订单详情 #310

Open
opened 2026-09-18 11:25:37 +08:00 by ila · 0 comments
Owner

来源:2026-09-18 真机现场分析。依赖 #309。

问题

clickBackfill 硬性要求 node.isClickable:

if (!node.isClickable || !node.isEnabled || !node.isVisibleToUser || ...) return false
return node.performAction(AccessibilityNodeInfo.ACTION_CLICK)

而 PDD 订单列表的卡片容器 clickable=false(见 #309 现场证据),无障碍树里不存在可点的卡片入口。#309 修正识别后,卡片仍然点不动,扫描无法进入订单详情页。

#307 已为「全部」导航 tab 开过手势点击(dispatchCenterTap),本工单是同一机制向卡片的受限扩展。

方案

卡片点击目标不是卡片容器本身,而是卡片内的商品标题文本节点,以手势点击。必须同时满足:

  1. 位于已识别卡片的 bounds 内
  2. 文本长度 ≥ 4
  3. 与任何含禁词的可见节点无几何重叠
  4. 在该卡片内唯一确定(多个候选时取最靠上者,仍不唯一则放弃该卡片)

现场验证:第一张卡片的商品标题在 [291,471][876,585],动作行在 [180,900][1047,990],垂直相距 300+ 像素,条件 3 天然成立。

[必须] 仍然是「点击一个真实存在的节点中心」,不是按固定坐标盲点。目标节点必须在当次快照中重新定位并逐项校验后才允许下发手势。

[必须] 手势点击只对通过上述全部条件的卡片内文本开放,动作按钮、支付、下单类节点一律不得走此路径。

非目标

  • 不放宽禁词表与几何重叠规则。
  • 不对订单详情页内的节点开放手势点击(expansion() 的「展开」按钮本身 clickable=true,无需改动)。
  • 不引入无节点依据的坐标点击。

风险

卡片区域邻近订单动作按钮。缓解手段是条件 3 的几何重叠校验与条件 1 的卡片边界约束;两者任一不满足即放弃该卡片而非降级点击。

验收

  • 能从订单列表进入订单详情页。
  • 与禁词控件重叠的候选一律被拒绝。
  • 卡片内无唯一合格目标时跳过该卡片,不回退到坐标点击。
  • 动作按钮无法通过该路径被点击。
  • 既有单测全部通过。

验证

./gradlew :app:testDebugUnitTest;真机复跑一次回填,确认能进入详情页并读到订单编号与下单时间。

文档影响

手势点击边界扩展属于长期安全事实,必须更新 Business-Rules-and-Glossary 与 Android-Agent-API-Contract 中回填只读边界条目。

> 来源:2026-09-18 真机现场分析。依赖 #309。 ## 问题 `clickBackfill` 硬性要求 `node.isClickable`: ```kotlin if (!node.isClickable || !node.isEnabled || !node.isVisibleToUser || ...) return false return node.performAction(AccessibilityNodeInfo.ACTION_CLICK) ``` 而 PDD 订单列表的卡片容器 `clickable=false`(见 #309 现场证据),无障碍树里不存在可点的卡片入口。#309 修正识别后,卡片仍然点不动,扫描无法进入订单详情页。 `#307` 已为「全部」导航 tab 开过手势点击(`dispatchCenterTap`),本工单是同一机制向卡片的受限扩展。 ## 方案 卡片点击目标**不是卡片容器本身**,而是卡片内的商品标题文本节点,以手势点击。必须同时满足: 1. 位于已识别卡片的 bounds 内 2. 文本长度 ≥ 4 3. 与任何含禁词的可见节点**无几何重叠** 4. 在该卡片内唯一确定(多个候选时取最靠上者,仍不唯一则放弃该卡片) 现场验证:第一张卡片的商品标题在 `[291,471][876,585]`,动作行在 `[180,900][1047,990]`,垂直相距 300+ 像素,条件 3 天然成立。 `[必须]` 仍然是「点击一个真实存在的节点中心」,不是按固定坐标盲点。目标节点必须在当次快照中重新定位并逐项校验后才允许下发手势。 `[必须]` 手势点击只对通过上述全部条件的卡片内文本开放,动作按钮、支付、下单类节点一律不得走此路径。 ## 非目标 - 不放宽禁词表与几何重叠规则。 - 不对订单详情页内的节点开放手势点击(`expansion()` 的「展开」按钮本身 `clickable=true`,无需改动)。 - 不引入无节点依据的坐标点击。 ## 风险 卡片区域邻近订单动作按钮。缓解手段是条件 3 的几何重叠校验与条件 1 的卡片边界约束;两者任一不满足即放弃该卡片而非降级点击。 ## 验收 - [ ] 能从订单列表进入订单详情页。 - [ ] 与禁词控件重叠的候选一律被拒绝。 - [ ] 卡片内无唯一合格目标时跳过该卡片,不回退到坐标点击。 - [ ] 动作按钮无法通过该路径被点击。 - [ ] 既有单测全部通过。 ## 验证 `./gradlew :app:testDebugUnitTest`;真机复跑一次回填,确认能进入详情页并读到订单编号与下单时间。 ## 文档影响 手势点击边界扩展属于长期安全事实,必须更新 Business-Rules-and-Glossary 与 Android-Agent-API-Contract 中回填只读边界条目。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#310