Skip to content

Commit cff4b51

Browse files
eulpheanberickson1
authored andcommitted
Expose setAccessibilityFocus from Native-Common AccessibilityUtil and expose setting accessibility focus on RX.TextInput. (#69)
* Expose setAccessibilityFocus from Native-Common AccessibilityUtil, so components can leverage native-common instance directly to set focus on iOS and Android platforms. * Code review feedback. * PR feedback. * PR feedback. * Nit: Space * PR feedback. Rename platform specific files to AccessibilityUtil. Rename AccessibilityNativeUtil to AccessibilityPlatformUtil as that is more in sync with all the comments in the codebase.
1 parent 538b777 commit cff4b51

File tree

14 files changed

+104
-49
lines changed

14 files changed

+104
-49
lines changed

src/android/AccessibilityUtil.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import React = require('react');
1111
import RN = require('react-native');
1212

1313
import Accessibility from '../native-common/Accessibility';
14-
import { AccessibilityUtil as CommonAccessibilityUtil } from '../native-common/AccessibilityUtil';
14+
import { AccessibilityPlatformUtil as CommonAccessibilityNativeUtil } from '../common/AccessibilityUtil';
1515

16-
export class AccessibilityUtil extends CommonAccessibilityUtil {
16+
export class AccessibilityUtil extends CommonAccessibilityNativeUtil {
1717
private _sendAccessibilityEvent(component: React.Component<any, any>, eventId: number) {
1818
// See list of events here:
1919
// https://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html

src/android/Button.tsx

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/android/ReactXP.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { default as AccessibilityImpl, Accessibility as AccessibilityType } from
2020
import { default as ActivityIndicatorImpl, ActivityIndicator as ActivityIndicatorType } from '../native-common/ActivityIndicator';
2121
import { default as AlertImpl, Alert as AlertType } from '../native-common/Alert';
2222
import { default as AppImpl, App as AppType } from '../native-common/App';
23-
import { default as ButtonImpl, Button as ButtonType } from './Button';
23+
import { default as ButtonImpl, Button as ButtonType } from '../native-common/Button';
2424
import { default as PickerImpl, Picker as PickerType } from '../native-common/Picker';
2525
import { default as ImageImpl, Image as ImageType } from './Image';
2626
import { default as ClipboardImpl, Clipboard as ClipboardType } from '../native-common/Clipboard';
@@ -43,7 +43,7 @@ import { default as TextInputImpl, TextInput as TextInputType } from '../native-
4343
import { default as ProfilingImpl, Profiling as ProfilingType } from '../native-common/Profiling';
4444
import { default as UserInterfaceImpl, UserInterface as UserInterfaceType } from '../native-common/UserInterface';
4545
import { default as UserPresenceImpl, UserPresence as UserPresenceType } from '../native-common/UserPresence';
46-
import { default as ViewImpl, View as ViewType } from './View';
46+
import { default as ViewImpl, View as ViewType } from '../native-common/View';
4747
import { default as WebViewImpl, WebView as WebViewType } from '../native-common/WebView';
4848
import ViewBase from '../native-common/ViewBase';
4949

@@ -55,6 +55,14 @@ const _defaultViewStyle = StylesImpl.createViewStyle({
5555
});
5656
ViewBase.setDefaultViewStyle(_defaultViewStyle);
5757

58+
// Initialize Android implementation of platform accessibility helpers inside the singleton
59+
// instance of native-common AccessibilityUtil. This is to let native-common components access
60+
// platform specific APIs through native-common implementation itself.
61+
import AccessibilityUtil from '../native-common/AccessibilityUtil';
62+
import AccessibilityPlatformUtil from './AccessibilityUtil';
63+
64+
AccessibilityUtil.setAccessibilityPlatformUtil(AccessibilityPlatformUtil);
65+
5866
// -- STRANGE THINGS GOING ON HERE --
5967
// See web/ReactXP.tsx for more details.
6068

src/android/Text.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import React = require('react');
1111
import RN = require('react-native');
1212

13-
import AccessibilityUtil from './AccessibilityUtil';
13+
import AccessibilityUtil from '../native-common/AccessibilityUtil';
1414
import { Text as CommonText } from '../native-common/Text';
1515
import Types = require('../common/Types');
1616
import Styles from '../native-common/Styles';
@@ -48,10 +48,6 @@ export class Text extends CommonText {
4848
</RN.Text>
4949
);
5050
}
51-
52-
focus() {
53-
AccessibilityUtil.setAccessibilityFocus(this);
54-
}
5551
}
5652

5753
export default Text;

src/android/View.tsx

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/common/AccessibilityUtil.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
* Common accessibility interface for platform-specific accessibility utilities.
88
*/
99

10+
import React = require('react');
11+
1012
import Types = require('../common/Types');
1113

1214
export const ImportantForAccessibilityMap = {
@@ -16,6 +18,12 @@ export const ImportantForAccessibilityMap = {
1618
[Types.ImportantForAccessibility.NoHideDescendants]: 'no-hide-descendants'
1719
};
1820

21+
22+
// Platform specific helpers exposed through Native-Common AccessibilityUtil.
23+
export abstract class AccessibilityPlatformUtil {
24+
abstract setAccessibilityFocus(component: React.Component<any, any>): void;
25+
}
26+
1927
export abstract class AccessibilityUtil {
2028
isHidden(importantForAccessibility: Types.ImportantForAccessibility): boolean {
2129
if (importantForAccessibility) {

src/ios/AccessibilityUtil.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* AccessibilityUtil.ts
3+
*
4+
* Copyright (c) Microsoft Corporation. All rights reserved.
5+
* Licensed under the MIT license.
6+
*
7+
* iOS-specific accessibility utils.
8+
*/
9+
10+
import React = require('react');
11+
import RN = require('react-native');
12+
13+
import Accessibility from '../native-common/Accessibility';
14+
import { AccessibilityPlatformUtil } from '../common/AccessibilityUtil';
15+
16+
export class AccessibilityUtil extends AccessibilityPlatformUtil {
17+
setAccessibilityFocus(component: React.Component<any, any>): void {
18+
// NO-OP
19+
}
20+
}
21+
22+
export default new AccessibilityUtil();

src/ios/ReactXP.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ const _defaultViewStyle = StylesImpl.createViewStyle({
5555
});
5656
ViewBase.setDefaultViewStyle(_defaultViewStyle);
5757

58+
// Initialize iOS implementation of platform accessibility helpers inside the singleton
59+
// instance of native-common AccessibilityUtil. This is to let native-common components access
60+
// platform specific APIs through native-common implementation itself.
61+
import AccessibilityUtil from '../native-common/AccessibilityUtil';
62+
import AccessibilityPlatformUtil from './AccessibilityUtil';
63+
64+
AccessibilityUtil.setAccessibilityPlatformUtil(AccessibilityPlatformUtil);
65+
5866
// -- STRANGE THINGS GOING ON HERE --
5967
// See web/ReactXP.tsx for more details.
6068

src/native-common/AccessibilityUtil.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@
99
*/
1010

1111
import _ = require('./lodashMini');
12+
import assert = require('assert');
13+
import React = require('react');
14+
import RN = require('react-native');
15+
16+
import { AccessibilityUtil as CommonAccessibilityUtil, AccessibilityPlatformUtil } from '../common/AccessibilityUtil';
1217

13-
import { AccessibilityUtil as CommonAccessibilityUtil } from '../common/AccessibilityUtil';
1418
import Types = require('../common/Types');
1519

1620
const liveRegionMap = {
@@ -54,6 +58,13 @@ const componentTypeMap = {
5458
};
5559

5660
export class AccessibilityUtil extends CommonAccessibilityUtil {
61+
// Handle to accessibility platform helper instance that gets initialized during ReactXP initialization using the setter.
62+
private _instance: AccessibilityPlatformUtil;
63+
64+
setAccessibilityPlatformUtil(instance: AccessibilityPlatformUtil) {
65+
this._instance = instance;
66+
}
67+
5768
// Converts an AccessibilityTrait to a string, but the returned value is only needed for iOS. Other platforms ignore it. Presence
5869
// of an AccessibilityTrait.None can make an element non-accessible on Android. We use the override traits if they are present, else
5970
// use the deafult trait.
@@ -89,6 +100,11 @@ export class AccessibilityUtil extends CommonAccessibilityUtil {
89100
}
90101
return undefined;
91102
}
103+
104+
// Platform specific accessibility APIs.
105+
setAccessibilityFocus(component: React.Component<any, any>): void {
106+
this._instance.setAccessibilityFocus(component);
107+
}
92108
}
93109

94110
export default new AccessibilityUtil();

src/native-common/Text.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export class Text extends RX.Text<{}> {
5252
}
5353

5454
focus() {
55-
// No-op
55+
AccessibilityUtil.setAccessibilityFocus(this);
5656
}
5757

5858
blur() {

0 commit comments

Comments
 (0)