diff --git a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/GoAutoAccessibilityService.kt b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/GoAutoAccessibilityService.kt index b476286..062a47e 100644 --- a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/GoAutoAccessibilityService.kt +++ b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/GoAutoAccessibilityService.kt @@ -205,7 +205,7 @@ class GoAutoAccessibilityService : AccessibilityService(), UiDriver, PddCollecto BackfillPagePolicy.expansion(page)?.path == fresh.path || (fresh.label == "全部" && page.nodes.any { it.label in setOf("我的订单", "全部订单") }) if (allTab && !fresh.clickable) return dispatchCenterTap(Rect(fresh.bounds.left, fresh.bounds.top, fresh.bounds.right, fresh.bounds.bottom)) - if (!allowed || !BackfillPagePolicy.safe(page, fresh)) return false + if (!allowed || (!allTab && !BackfillPagePolicy.safe(page, fresh))) return false val root = rootInActiveWindow ?: return false if (root.packageName?.toString() != BackfillPagePolicy.PDD) return false var node = root diff --git a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/OrderBackfillScanner.kt b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/OrderBackfillScanner.kt index 8ef762e..fef5436 100644 --- a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/OrderBackfillScanner.kt +++ b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/OrderBackfillScanner.kt @@ -27,8 +27,15 @@ object BackfillPagePolicy { val tab = page.nodes.filter { it.visible && it.enabled && it.label == "全部" }.singleOrNull() ?: return null val peers = page.nodes.filter { it.visible && it.label in setOf("待付款", "待分享", "待发货", "待收货", "待评价") && it.bounds.top < tab.bounds.bottom && it.bounds.bottom > tab.bounds.top } - if (peers.map { it.label }.distinct().size < 2 || peers.any { it.bounds.left < tab.bounds.right }) return null - return tab.takeIf { safe(page, it.copy(clickable = true)) } + val centerX = tab.bounds.left.toLong() + tab.bounds.width / 2 + if (peers.map { it.label }.distinct().size < 2 || peers.any { + it.bounds.width <= 0 || it.bounds.left.toLong() + it.bounds.width / 2 <= centerX || + centerX >= it.bounds.left && centerX < it.bounds.right + }) return null + // WebView navigation labels can overlap by a few pixels. Exclude only + // these verified peers (e.g. 待付款), not actual payment/action nodes. + val navigationPage = page.copy(nodes = page.nodes.filter { it !in peers }) + return tab.takeIf { safe(navigationPage, it.copy(clickable = true)) } } fun confirmedList(page: UiSnapshot, tabConfirmed: Boolean): Boolean = list(page) || diff --git a/android/app/src/test/java/cn/ilapage/goauto/agent/OrderBackfillTest.kt b/android/app/src/test/java/cn/ilapage/goauto/agent/OrderBackfillTest.kt index a73d7d1..8d146b7 100644 --- a/android/app/src/test/java/cn/ilapage/goauto/agent/OrderBackfillTest.kt +++ b/android/app/src/test/java/cn/ilapage/goauto/agent/OrderBackfillTest.kt @@ -275,6 +275,26 @@ class OrderBackfillTest { assertNull(BackfillPagePolicy.allTab(p.copy(nodes = p.nodes + p.nodes[1].copy(path = "0/9", text = "去支付")))) } + @Test fun `real navigation bounds tolerate three pixel overlap but never payment actions`() { + val p = page( + node("0/0", "我的订单").copy(bounds = NodeBounds(438, 120, 642, 258)), + node("0/1", "全部").copy(clickable = false, bounds = NodeBounds(0, 258, 201, 372)), + node("0/2", "待付款").copy(clickable = false, bounds = NodeBounds(198, 258, 399, 372)), + node("0/3", "待分享").copy(clickable = false, bounds = NodeBounds(396, 258, 597, 372)), + node("0/4", "待发货").copy(clickable = false, bounds = NodeBounds(594, 258, 795, 372))) + assertEquals(p.nodes[1], BackfillPagePolicy.allTab(p)) + assertTrue(BackfillPagePolicy.confirmedList(p, true)) + assertFalse(BackfillPagePolicy.confirmedList(p, false)) + assertNull(BackfillPagePolicy.allTab(p.copy(nodes = p.nodes + + node("0/9", "去支付").copy(bounds = NodeBounds(198, 258, 399, 372))))) + assertNull(BackfillPagePolicy.allTab(p.copy(nodes = p.nodes.map { + if (it.label == "待付款") it.copy(bounds = NodeBounds(90, 258, 399, 372)) else it + }))) + assertNull(BackfillPagePolicy.allTab(p.copy(nodes = p.nodes.map { + if (it.label == "待付款") it.copy(bounds = NodeBounds(-100, 258, 90, 372)) else it + }))) + } + @Test fun `scanner waits for stable list and taps only all when selected is missing`() { var reads = 0 var clicks = 0