Skip to content

Commit 1f96ff6

Browse files
ayc1facebook-github-bot
authored andcommitted
Fix accessibilityRole value lookup
Summary: Accessibility roles are enums that are looked up by matching a string accessibility role from JS to the enum's name using .toUpperCase(). .toUpperCase() causes issues in certain languages such as Turkish because the "i"s translate to "?". D9402330 tried to address this by forcing the .toUpperCase to use Locale.US, but now it sometimes translates to "?" Use .equalsIgnoreCase() instead to avoid translations. Reviewed By: mdvacca, mmmulani Differential Revision: D9497494 fbshipit-source-id: 0f8b7f2071b08ccb86655fee7bfd2d009ddde8eb
1 parent 47dc31d commit 1f96ff6

File tree

4 files changed

+61
-25
lines changed

4 files changed

+61
-25
lines changed

ReactAndroid/src/main/java/com/facebook/react/uimanager/AccessibilityDelegateUtil.java

+6-17
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,12 @@
55

66
package com.facebook.react.uimanager;
77

8-
import android.annotation.TargetApi;
98
import android.content.Context;
10-
import android.os.Build;
119
import android.support.v4.view.AccessibilityDelegateCompat;
1210
import android.support.v4.view.ViewCompat;
1311
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
1412
import android.view.View;
15-
import android.view.accessibility.AccessibilityNodeInfo;
1613
import com.facebook.react.R;
17-
import com.facebook.react.bridge.ReadableArray;
1814
import java.util.Locale;
1915
import javax.annotation.Nullable;
2016

@@ -58,11 +54,11 @@ public String getValue() {
5854

5955
public static AccessibilityRole fromValue(String value) {
6056
for (AccessibilityRole role : AccessibilityRole.values()) {
61-
if (role.getValue() != null && role.getValue().equals(value)) {
57+
if (role.name().equalsIgnoreCase(value)) {
6258
return role;
6359
}
6460
}
65-
return AccessibilityRole.NONE;
61+
throw new IllegalArgumentException("Invalid accessibility role value: " + value);
6662
}
6763
}
6864

@@ -82,7 +78,10 @@ public void onInitializeAccessibilityNodeInfo(
8278
View host, AccessibilityNodeInfoCompat info) {
8379
super.onInitializeAccessibilityNodeInfo(host, info);
8480
String accessibilityHint = (String) view.getTag(R.id.accessibility_hint);
85-
AccessibilityRole accessibilityRole = getAccessibilityRole((String) view.getTag(R.id.accessibility_role));
81+
AccessibilityRole accessibilityRole = (AccessibilityRole) view.getTag(R.id.accessibility_role);
82+
if (accessibilityRole == null) {
83+
accessibilityRole = AccessibilityRole.NONE;
84+
}
8685
setRole(info, accessibilityRole, view.getContext());
8786
if (!(accessibilityHint == null)) {
8887
String contentDescription=(String)info.getContentDescription();
@@ -127,14 +126,4 @@ public static void setRole(AccessibilityNodeInfoCompat nodeInfo, final Accessibi
127126
nodeInfo.setClickable(true);
128127
}
129128
}
130-
131-
/**
132-
* Method for setting accessibilityRole on view properties.
133-
*/
134-
public static AccessibilityRole getAccessibilityRole(String role) {
135-
if (role == null) {
136-
return AccessibilityRole.NONE;
137-
}
138-
return AccessibilityRole.valueOf(role.toUpperCase());
139-
}
140129
}

ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java

+3-8
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import android.view.ViewParent;
1212
import com.facebook.react.R;
1313
import com.facebook.react.bridge.ReadableArray;
14+
import com.facebook.react.uimanager.AccessibilityDelegateUtil.AccessibilityRole;
1415
import com.facebook.react.uimanager.annotations.ReactProp;
1516
import com.facebook.react.uimanager.util.ReactFindViewUtil;
1617
import java.util.Locale;
@@ -131,14 +132,8 @@ public void setAccessibilityRole(T view, String accessibilityRole) {
131132
if (accessibilityRole == null) {
132133
return;
133134
}
134-
try {
135-
AccessibilityDelegateUtil.AccessibilityRole.valueOf(accessibilityRole.toUpperCase(Locale.US));
136-
} catch (NullPointerException e) {
137-
throw new IllegalArgumentException("Invalid Role " + accessibilityRole + " Passed In");
138-
} catch (IllegalArgumentException e) {
139-
throw new IllegalArgumentException("Invalid Role " + accessibilityRole + " Passed In");
140-
}
141-
view.setTag(R.id.accessibility_role, accessibilityRole);
135+
136+
view.setTag(R.id.accessibility_role, AccessibilityRole.fromValue(accessibilityRole));
142137
}
143138

144139
@ReactProp(name = PROP_ACCESSIBILITY_STATES)

ReactAndroid/src/test/java/com/facebook/react/uimanager/BUCK

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ rn_robolectric_test(
55
# TODO Disabled temporarily until Yoga linking is fixed t14964130
66
# srcs = glob(['**/*.java']),
77
srcs = [
8+
"BaseViewManagerTest.java",
89
"MatrixMathHelperTest.java",
910
"SimpleViewPropertyTest.java",
1011
],
@@ -33,6 +34,7 @@ rn_robolectric_test(
3334
react_native_target("java/com/facebook/react/uimanager/annotations:annotations"),
3435
react_native_target("java/com/facebook/react/views/text:text"),
3536
react_native_target("java/com/facebook/react/views/view:view"),
37+
react_native_target("res:uimanager"),
3638
react_native_tests_target("java/com/facebook/react/bridge:testhelpers"),
3739
],
3840
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* Copyright (c) 2015-present, Facebook, Inc.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package com.facebook.react.uimanager;
9+
10+
import static org.mockito.Mockito.mock;
11+
12+
import android.content.Context;
13+
import android.support.v4.view.ViewCompat;
14+
import com.facebook.react.uimanager.AccessibilityDelegateUtil.AccessibilityRole;
15+
import com.facebook.react.views.view.ReactViewGroup;
16+
import com.facebook.react.views.view.ReactViewManager;
17+
import com.facebook.react.R;
18+
import java.util.Locale;
19+
import org.junit.Before;
20+
import org.junit.Test;
21+
import org.junit.runner.RunWith;
22+
import org.robolectric.RuntimeEnvironment;
23+
import org.robolectric.RobolectricTestRunner;
24+
import static org.fest.assertions.api.Assertions.assertThat;
25+
26+
@RunWith(RobolectricTestRunner.class)
27+
public class BaseViewManagerTest {
28+
29+
private BaseViewManager mViewManager;
30+
private ReactViewGroup mView;
31+
32+
@Before
33+
public void setUp() {
34+
mViewManager = new ReactViewManager();
35+
mView = new ReactViewGroup(RuntimeEnvironment.application);
36+
}
37+
38+
@Test
39+
public void testAccessibilityRoleNone() {
40+
mViewManager.setAccessibilityRole(mView, "none");
41+
assertThat(mView.getTag(R.id.accessibility_role)).isEqualTo(AccessibilityRole.NONE);
42+
}
43+
44+
@Test
45+
public void testAccessibilityRoleTurkish() {
46+
Locale.setDefault(Locale.forLanguageTag("tr-TR"));
47+
mViewManager.setAccessibilityRole(mView, "image");
48+
assertThat(mView.getTag(R.id.accessibility_role)).isEqualTo(AccessibilityRole.IMAGE);
49+
}
50+
}

0 commit comments

Comments
 (0)