diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-08-30 15:24:07 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2023-08-30 15:24:07 +0000 |
commit | 915949211341ef5e831837b323a8e18861bcc817 (patch) | |
tree | ff213d78308b29f532eed4b6430ee151cc44e3d0 | |
parent | cb17927c68b46dd192ba80c05cbd21d91c543106 (diff) | |
parent | 5edd6689bf1800cfca05c5c70529f1f83c072b81 (diff) | |
download | support-snap-temp-L55200000962844795.tar.gz |
Merge "Remove `traversalAfter` to avoid Samsung Voice Assistant crash" into snap-temp-L55200000962844795snap-temp-L55200000962844795
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 - ) } } |