From d3f2f96f9373ea84975ff44b5c447ad3bcaf6edd Mon Sep 17 00:00:00 2001 From: "Andrew Chen (Eng)" Date: Mon, 1 Oct 2018 18:34:57 -0700 Subject: [PATCH] Fix default accessibility delegate Summary: The current accessibility implementation tries to generalize every view's accessibility node info by setting an accessibility delegate on every view -- regardless of whether or not any accessibility properties are set. This delegate however doesn't correctly set the appropriate accessibility node fields for every view. For example, ScrollViews needs AccessibilityNode.setScrollable(true) set, but the generic delegate does not account for this. For now let's avoid unnecessarily setting an accessibility delegate on views that don't have any accessibility props set, which will likely fix the majority of these issues. Reviewed By: mdvacca Differential Revision: D10138128 fbshipit-source-id: b999b41e7256e3dce94cd70e9b944979d52f74fd --- .../uimanager/AccessibilityDelegateUtil.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/AccessibilityDelegateUtil.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/AccessibilityDelegateUtil.java index 347103949..647b4bf8e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/AccessibilityDelegateUtil.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/AccessibilityDelegateUtil.java @@ -67,9 +67,13 @@ public class AccessibilityDelegateUtil { } public static void setDelegate(final View view) { + final String accessibilityHint = (String) view.getTag(R.id.accessibility_hint); + final AccessibilityRole accessibilityRole = (AccessibilityRole) view.getTag(R.id.accessibility_role); // if a view already has an accessibility delegate, replacing it could cause problems, // so leave it alone. - if (!ViewCompat.hasAccessibilityDelegate(view)) { + if (!ViewCompat.hasAccessibilityDelegate(view) && + accessibilityHint != null && + accessibilityRole != null) { ViewCompat.setAccessibilityDelegate( view, new AccessibilityDelegateCompat() { @@ -77,11 +81,6 @@ public class AccessibilityDelegateUtil { public void onInitializeAccessibilityNodeInfo( View host, AccessibilityNodeInfoCompat info) { super.onInitializeAccessibilityNodeInfo(host, info); - String accessibilityHint = (String) view.getTag(R.id.accessibility_hint); - AccessibilityRole accessibilityRole = (AccessibilityRole) view.getTag(R.id.accessibility_role); - if (accessibilityRole == null) { - accessibilityRole = AccessibilityRole.NONE; - } setRole(info, accessibilityRole, view.getContext()); if (!(accessibilityHint == null)) { String contentDescription=(String)info.getContentDescription(); @@ -103,7 +102,10 @@ public class AccessibilityDelegateUtil { //TODO: Eventually support for other languages on talkback - public static void setRole(AccessibilityNodeInfoCompat nodeInfo, final AccessibilityRole role, final Context context) { + public static void setRole(AccessibilityNodeInfoCompat nodeInfo, AccessibilityRole role, final Context context) { + if (role == null) { + role = AccessibilityRole.NONE; + } nodeInfo.setClassName(role.getValue()); if (Locale.getDefault().getLanguage().equals(new Locale("en").getLanguage())) { if (role.equals(AccessibilityRole.LINK)) {