fix(android): lock horizontal spec swipes (#189)

This commit is contained in:
QiuSW
2026-09-01 16:49:35 +08:00
parent b5a08bfa1f
commit 37dea33b06
3 changed files with 47 additions and 4 deletions
+2 -2
View File
@@ -11,8 +11,8 @@ android {
applicationId = "cn.ilapage.goauto.agent"
minSdk = 23
targetSdk = 34
versionCode = 50
versionName = "0.9.37"
versionCode = 51
versionName = "0.9.38"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
@@ -438,8 +438,14 @@ class GoAutoAccessibilityService : AccessibilityService(), UiDriver, PddCollecto
kotlin.math.abs(bounds.centerY() - anchor.bounds.centerY) <= 32
) matches += node
}
if (matches.size != 1) return swipe(SemanticTarget.SPEC_PANEL, direction)
val horizontal = direction == SwipeDirection.LEFT || direction == SwipeDirection.RIGHT
if (matches.size != 1) {
if (!SpecSwipeSafety.allowGlobalFallback(direction)) {
Log.i("GoAutoCollector", "swipe direction=$direction result=blocked reason=anchor-not-unique matches=${matches.size}")
return false
}
return swipe(SemanticTarget.SPEC_PANEL, direction)
}
val scrollableAncestors = mutableListOf<AccessibilityNodeInfo>()
var current: AccessibilityNodeInfo? = matches.single()
while (current != null) {
@@ -458,7 +464,15 @@ class GoAutoAccessibilityService : AccessibilityService(), UiDriver, PddCollecto
if (anchoredTarget != null) {
val bounds = Rect().also(anchoredTarget::getBoundsInScreen)
Log.i("GoAutoCollector", "swipe direction=$direction anchored=true bounds=$bounds class=${anchoredTarget.className}")
return swipeNode(anchoredTarget, direction)
return swipeNode(
anchoredTarget,
direction,
preferScrollAction = SpecSwipeSafety.preferAccessibilityScrollAction(direction),
)
}
if (!SpecSwipeSafety.allowGlobalFallback(direction)) {
Log.i("GoAutoCollector", "swipe direction=$direction result=blocked reason=no-anchored-horizontal-container")
return false
}
return swipe(SemanticTarget.SPEC_PANEL, direction)
}
@@ -643,3 +657,11 @@ class GoAutoAccessibilityService : AccessibilityService(), UiDriver, PddCollecto
private set
}
}
internal object SpecSwipeSafety {
fun allowGlobalFallback(direction: SwipeDirection): Boolean =
direction == SwipeDirection.UP || direction == SwipeDirection.DOWN
fun preferAccessibilityScrollAction(direction: SwipeDirection): Boolean =
direction == SwipeDirection.UP || direction == SwipeDirection.DOWN
}
@@ -0,0 +1,21 @@
package cn.ilapage.goauto.agent.automation
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
class GoAutoAccessibilityServicePolicyTest {
@Test
fun horizontalSpecSwipeNeverFallsBackToAnotherPageContainer() {
assertFalse(SpecSwipeSafety.allowGlobalFallback(SwipeDirection.LEFT))
assertFalse(SpecSwipeSafety.allowGlobalFallback(SwipeDirection.RIGHT))
}
@Test
fun horizontalSpecSwipeUsesGestureInsteadOfAccessibilityScrollAction() {
assertFalse(SpecSwipeSafety.preferAccessibilityScrollAction(SwipeDirection.LEFT))
assertFalse(SpecSwipeSafety.preferAccessibilityScrollAction(SwipeDirection.RIGHT))
assertTrue(SpecSwipeSafety.preferAccessibilityScrollAction(SwipeDirection.UP))
assertTrue(SpecSwipeSafety.preferAccessibilityScrollAction(SwipeDirection.DOWN))
}
}