fix(android): lock horizontal spec swipes (#189)
This commit is contained in:
@@ -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"
|
||||
|
||||
|
||||
+24
-2
@@ -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
|
||||
}
|
||||
|
||||
+21
@@ -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))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user