Skip to content

Commit 55c0df4

Browse files
fabOnReactfacebook-github-bot
authored andcommitted
Adding pager, scrollview, viewgroup, webview, drawer roles (facebook#34477)
Summary: - adds missing roles - adds custom roles that don't exist in TalkBack (see the [compositor.json][10] and [string.xml][11] files). - fixes [issues with Drawer][12] - fixes issues with ScrollView missing roles - seek control already exist as adjustable facebook@d460d09 Relevant facebook#30839 (comment) fixes facebook#30839 ## Changelog [Android] [Fixed] - Adding pager, scrollview, viewgroup, webview, drawer roles Pull Request resolved: facebook#34477 Test Plan: Android - Drawer Layout and ScrollView (02/09/22) facebook#34477 (comment) - sliding drawer, drawer layout, icon menu facebook#34477 (comment) - Horizontal and Vertical ScrollView facebook#34477 (comment) - Toast facebook#34477 (comment) - CheckedTextView facebook#34477 (comment) - Spinner (dropdownlist) facebook#34477 (comment) - EditText facebook#34477 (comment) - WebView facebook#34477 (comment) - Testing chime_up and chime_down sound feedback in Scrollable facebook#34477 (comment) iOS facebook#34477 (comment) [10]: https://github.com/google/talkback/blob/771de7cdbf55b6adb4ca4c64c27a52584f2337cc/compositor/src/main/res/raw/compositor.json#L1082-L1108 [11]: https://github.com/google/talkback/blob/771de7cdbf55b6adb4ca4c64c27a52584f2337cc/compositor/src/main/res/values/strings.xml#L223 [12]: facebook#34477 (comment) Reviewed By: NickGerleman Differential Revision: D39894307 Pulled By: blavalla fbshipit-source-id: 4a8da78bae485ead0523689631d88d1031a07b74
1 parent 78aabd2 commit 55c0df4

File tree

9 files changed

+357
-106
lines changed

9 files changed

+357
-106
lines changed

Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import dismissKeyboard from '../../Utilities/dismissKeyboard';
2121
import Platform from '../../Utilities/Platform';
2222
import StatusBar from '../StatusBar/StatusBar';
2323
import View from '../View/View';
24+
import type {AccessibilityRole} from '../../Components/View/ViewAccessibility';
2425
import AndroidDrawerLayoutNativeComponent, {
2526
Commands,
2627
} from './AndroidDrawerLayoutNativeComponent';
@@ -36,6 +37,8 @@ type DrawerSlideEvent = $ReadOnly<{|
3637
|}>;
3738

3839
type Props = $ReadOnly<{|
40+
accessibilityRole?: ?AccessibilityRole,
41+
3942
/**
4043
* Determines whether the keyboard gets dismissed in response to a drag.
4144
* - 'none' (the default), drags do not dismiss the keyboard.

Libraries/Components/View/ViewAccessibility.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import type {SyntheticEvent} from '../../Types/CoreEventTypes';
1616
export type AccessibilityRole =
1717
| 'none'
1818
| 'button'
19+
| 'dropdownlist'
1920
| 'togglebutton'
2021
| 'link'
2122
| 'search'
@@ -44,7 +45,15 @@ export type AccessibilityRole =
4445
| 'timer'
4546
| 'list'
4647
| 'toolbar'
47-
| 'grid';
48+
| 'grid'
49+
| 'pager'
50+
| 'scrollview'
51+
| 'horizontalscrollview'
52+
| 'viewgroup'
53+
| 'webview'
54+
| 'drawerlayout'
55+
| 'slidingdrawer'
56+
| 'iconmenu';
4857

4958
// Role types for web
5059
export type Role =

React/Views/RCTViewManager.m

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ @implementation RCTConvert (UIAccessibilityTraits)
2828
(@{
2929
@"none" : @(UIAccessibilityTraitNone),
3030
@"button" : @(UIAccessibilityTraitButton),
31+
@"dropdownlist" : @(UIAccessibilityTraitNone),
3132
@"togglebutton" : @(UIAccessibilityTraitButton),
3233
@"link" : @(UIAccessibilityTraitLink),
3334
@"header" : @(UIAccessibilityTraitHeader),
@@ -63,6 +64,15 @@ @implementation RCTConvert (UIAccessibilityTraits)
6364
@"tablist" : @(UIAccessibilityTraitNone),
6465
@"timer" : @(UIAccessibilityTraitNone),
6566
@"toolbar" : @(UIAccessibilityTraitNone),
67+
@"grid" : @(UIAccessibilityTraitNone),
68+
@"pager" : @(UIAccessibilityTraitNone),
69+
@"scrollview" : @(UIAccessibilityTraitNone),
70+
@"horizontalscrollview" : @(UIAccessibilityTraitNone),
71+
@"viewgroup" : @(UIAccessibilityTraitNone),
72+
@"webview" : @(UIAccessibilityTraitNone),
73+
@"drawerlayout" : @(UIAccessibilityTraitNone),
74+
@"slidingdrawer" : @(UIAccessibilityTraitNone),
75+
@"iconmenu" : @(UIAccessibilityTraitNone),
6676
@"list" : @(UIAccessibilityTraitNone),
6777
@"grid" : @(UIAccessibilityTraitNone),
6878
}),

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ private void scheduleAccessibilityEventSender(View host) {
9696
public enum AccessibilityRole {
9797
NONE,
9898
BUTTON,
99+
DROPDOWNLIST,
99100
TOGGLEBUTTON,
100101
LINK,
101102
SEARCH,
@@ -123,20 +124,30 @@ public enum AccessibilityRole {
123124
TIMER,
124125
LIST,
125126
GRID,
127+
PAGER,
128+
SCROLLVIEW,
129+
HORIZONTALSCROLLVIEW,
130+
VIEWGROUP,
131+
WEBVIEW,
132+
DRAWERLAYOUT,
133+
SLIDINGDRAWER,
134+
ICONMENU,
126135
TOOLBAR;
127136

128137
public static String getValue(AccessibilityRole role) {
129138
switch (role) {
130139
case BUTTON:
131140
return "android.widget.Button";
141+
case DROPDOWNLIST:
142+
return "android.widget.Spinner";
132143
case TOGGLEBUTTON:
133144
return "android.widget.ToggleButton";
134145
case SEARCH:
135146
return "android.widget.EditText";
136147
case IMAGE:
137148
return "android.widget.ImageView";
138149
case IMAGEBUTTON:
139-
return "android.widget.ImageButon";
150+
return "android.widget.ImageButton";
140151
case KEYBOARDKEY:
141152
return "android.inputmethodservice.Keyboard$Key";
142153
case TEXT:
@@ -155,6 +166,22 @@ public static String getValue(AccessibilityRole role) {
155166
return "android.widget.AbsListView";
156167
case GRID:
157168
return "android.widget.GridView";
169+
case SCROLLVIEW:
170+
return "android.widget.ScrollView";
171+
case HORIZONTALSCROLLVIEW:
172+
return "android.widget.HorizontalScrollView";
173+
case PAGER:
174+
return "androidx.viewpager.widget.ViewPager";
175+
case DRAWERLAYOUT:
176+
return "androidx.drawerlayout.widget.DrawerLayout";
177+
case SLIDINGDRAWER:
178+
return "android.widget.SlidingDrawer";
179+
case ICONMENU:
180+
return "com.android.internal.view.menu.IconMenuView";
181+
case VIEWGROUP:
182+
return "android.view.ViewGroup";
183+
case WEBVIEW:
184+
return "android.webkit.WebView";
158185
case NONE:
159186
case LINK:
160187
case SUMMARY:

ReactAndroid/src/main/java/com/facebook/react/views/drawer/BUCK

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,6 @@ rn_android_library(
2929
react_native_target("java/com/facebook/react/uimanager/annotations:annotations"),
3030
react_native_target("java/com/facebook/react/views/scroll:scroll"),
3131
react_native_root_target(":generated_components_java-FBReactNativeComponentSpec"),
32+
react_native_target("res:uimanager"),
3233
],
3334
)

ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayout.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,16 @@
1010
import android.view.Gravity;
1111
import android.view.MotionEvent;
1212
import android.view.View;
13+
import android.view.accessibility.AccessibilityEvent;
14+
import androidx.core.view.AccessibilityDelegateCompat;
15+
import androidx.core.view.ViewCompat;
16+
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
1317
import androidx.drawerlayout.widget.DrawerLayout;
1418
import com.facebook.common.logging.FLog;
19+
import com.facebook.react.R;
1520
import com.facebook.react.bridge.ReactContext;
1621
import com.facebook.react.common.ReactConstants;
22+
import com.facebook.react.uimanager.ReactAccessibilityDelegate.AccessibilityRole;
1723
import com.facebook.react.uimanager.events.NativeGestureUtil;
1824

1925
/**
@@ -29,6 +35,30 @@
2935

3036
public ReactDrawerLayout(ReactContext reactContext) {
3137
super(reactContext);
38+
ViewCompat.setAccessibilityDelegate(
39+
this,
40+
new AccessibilityDelegateCompat() {
41+
@Override
42+
public void onInitializeAccessibilityNodeInfo(
43+
View host, AccessibilityNodeInfoCompat info) {
44+
super.onInitializeAccessibilityNodeInfo(host, info);
45+
final AccessibilityRole accessibilityRole =
46+
(AccessibilityRole) host.getTag(R.id.accessibility_role);
47+
if (accessibilityRole != null) {
48+
info.setClassName(AccessibilityRole.getValue(accessibilityRole));
49+
}
50+
}
51+
52+
@Override
53+
public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
54+
super.onInitializeAccessibilityEvent(host, event);
55+
final AccessibilityRole accessibilityRole =
56+
(AccessibilityRole) host.getTag(R.id.accessibility_role);
57+
if (accessibilityRole != null) {
58+
event.setClassName(AccessibilityRole.getValue(accessibilityRole));
59+
}
60+
}
61+
});
3262
}
3363

3464
@Override

0 commit comments

Comments
 (0)