aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-08-30 15:24:07 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2023-08-30 15:24:07 +0000
commit915949211341ef5e831837b323a8e18861bcc817 (patch)
treeff213d78308b29f532eed4b6430ee151cc44e3d0
parentcb17927c68b46dd192ba80c05cbd21d91c543106 (diff)
parent5edd6689bf1800cfca05c5c70529f1f83c072b81 (diff)
downloadsupport-snap-temp-L55200000962844795.tar.gz
Merge "Remove `traversalAfter` to avoid Samsung Voice Assistant crash" into snap-temp-L55200000962844795snap-temp-L55200000962844795
-rw-r--r--compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt24
-rw-r--r--compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt11
2 files changed, 22 insertions, 13 deletions
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
index 465ab5da2e0..dd2e3681c5d 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
@@ -718,15 +718,26 @@ class AndroidAccessibilityTest {
val node3 = rule.onNodeWithText(text3).fetchSemanticsNode()
val overlaidNode = rule.onNodeWithText(overlaidText).fetchSemanticsNode()
- val overlaidANI = provider.createAccessibilityNodeInfo(overlaidNode.id)
- val overlaidTraversalAfterValue =
- overlaidANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALAFTER_VAL)
+ val node3ANI = provider.createAccessibilityNodeInfo(node3.id)
+ val node3TraversalBefore =
+ node3ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
// Nodes 1, 2, and 3 are all children of a larger column; this means with a hierarchy
// comparison (like SemanticsSort), the third text node should come before the overlaid node
// — OverlaidNode should be read last
- assertNotEquals(overlaidTraversalAfterValue, 0)
- assertEquals(overlaidTraversalAfterValue, node3.id)
+ assertNotEquals(node3TraversalBefore, 0)
+ assertEquals(node3TraversalBefore, overlaidNode.id)
+
+ val overlaidANI = provider.createAccessibilityNodeInfo(overlaidNode.id)
+ // `getInt` returns the value associated with the given key, or 0 if no mapping of
+ // the desired type exists for the given key.
+ val overlaidTraversalAfter =
+ overlaidANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALAFTER_VAL)
+
+ // Older versions of Samsung voice assistant crash if both traversalBefore
+ // and traversalAfter redundantly express the same ordering relation, so
+ // we should only have traversalBefore here.
+ assertEquals(overlaidTraversalAfter, 0)
}
@Composable
@@ -1640,15 +1651,12 @@ class AndroidAccessibilityTest {
val child1 = rule.onNodeWithTag(childTag1).fetchSemanticsNode()
val child2 = rule.onNodeWithTag(childTag2).fetchSemanticsNode()
- val child1ANI = provider.createAccessibilityNodeInfo(child1.id)
val child2ANI = provider.createAccessibilityNodeInfo(child2.id)
val child2TraverseBefore = child2ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
- val child1TraverseAfter = child1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALAFTER_VAL)
// We want child2 to come before child1
assertEquals(2, root.replacedChildren.size)
assertEquals(child2TraverseBefore, child1.id)
- assertEquals(child1TraverseAfter, child2.id)
}
@Test
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
index a5dbd5b2abf..26b10654453 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
@@ -1250,14 +1250,15 @@ internal class AndroidComposeViewAccessibilityDelegateCompat(val view: AndroidCo
val afterId = idToAfterMap[virtualViewId]
afterId?.let {
val afterView = view.androidViewsHandler.semanticsIdToView(afterId)
+ // Specially use `traversalAfter` value if the node after is a View,
+ // as expressing the order using traversalBefore in this case would require mutating the
+ // View itself, which is not under Compose's full control.
if (afterView != null) {
info.setTraversalAfter(afterView)
- } else {
- info.setTraversalAfter(view, afterId)
+ addExtraDataToAccessibilityNodeInfoHelper(
+ virtualViewId, info.unwrap(), EXTRA_DATA_TEST_TRAVERSALAFTER_VAL, null
+ )
}
- addExtraDataToAccessibilityNodeInfoHelper(
- virtualViewId, info.unwrap(), EXTRA_DATA_TEST_TRAVERSALAFTER_VAL, null
- )
}
}