From be715ec7053a77fa6c9087990a493d17c1155de2 Mon Sep 17 00:00:00 2001 From: Mats Byrkeland Date: Wed, 18 Jul 2018 17:13:56 -0700 Subject: [PATCH] Make AccessibilityInfo.setAccessibilityFocus cross platform (#20229) Summary: Currently, `AccessibilityInfo.setAccessibilityFocus` is only available on iOS. The same behaviour can be achieved on Android by dispatching the proper accessibility event. I implemented the same function for Android, to make life slightly more convenient for the developer. Today, developers must write something like this: ``` if (Platform.OS === 'ios') { AccessibilityInfo.setAccessibilityFocus(reactTag) } else { UIManager.sendAccessibilityEvent(reactTag, 8) } ``` With this change, the following is enough for both Android and iOS: ``` AccessibilityInfo.setAccessibilityFocus(reactTag) ``` Pull Request resolved: https://github.com/facebook/react-native/pull/20229 Differential Revision: D8874107 Pulled By: mdvacca fbshipit-source-id: a6ffd7bb89ce56d6d65b06419633a71dcf3d0733 --- .../AccessibilityInfo/AccessibilityInfo.android.js | 13 +++++++++++++ .../AccessibilityInfo/AccessibilityInfo.ios.js | 2 -- .../react/uimanager/UIManagerModuleConstants.java | 2 ++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Libraries/Components/AccessibilityInfo/AccessibilityInfo.android.js b/Libraries/Components/AccessibilityInfo/AccessibilityInfo.android.js index dfa09b53a..09547ea06 100644 --- a/Libraries/Components/AccessibilityInfo/AccessibilityInfo.android.js +++ b/Libraries/Components/AccessibilityInfo/AccessibilityInfo.android.js @@ -12,6 +12,7 @@ const NativeModules = require('NativeModules'); const RCTDeviceEventEmitter = require('RCTDeviceEventEmitter'); +const UIManager = require('UIManager'); const RCTAccessibilityInfo = NativeModules.AccessibilityInfo; @@ -66,6 +67,18 @@ const AccessibilityInfo = { listener.remove(); _subscriptions.delete(handler); }, + + /** + * Set accessibility focus to a react component. + * + * See http://facebook.github.io/react-native/docs/accessibilityinfo.html#setaccessibilityfocus + */ + setAccessibilityFocus: function(reactTag: number): void { + UIManager.sendAccessibilityEvent( + reactTag, + UIManager.AccessibilityEventTypes.typeViewFocused, + ); + }, }; module.exports = AccessibilityInfo; diff --git a/Libraries/Components/AccessibilityInfo/AccessibilityInfo.ios.js b/Libraries/Components/AccessibilityInfo/AccessibilityInfo.ios.js index 8f2b0aa78..da1f6e4f1 100644 --- a/Libraries/Components/AccessibilityInfo/AccessibilityInfo.ios.js +++ b/Libraries/Components/AccessibilityInfo/AccessibilityInfo.ios.js @@ -93,8 +93,6 @@ const AccessibilityInfo = { /** * Set accessibility focus to a react component. * - * @platform ios - * * See http://facebook.github.io/react-native/docs/accessibilityinfo.html#setaccessibilityfocus */ setAccessibilityFocus: function(reactTag: number): void { diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstants.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstants.java index 1eea5018a..eb740fd08 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstants.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstants.java @@ -134,6 +134,8 @@ import java.util.Map; MapBuilder.of( "typeWindowStateChanged", AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, + "typeViewFocused", + AccessibilityEvent.TYPE_VIEW_FOCUSED, "typeViewClicked", AccessibilityEvent.TYPE_VIEW_CLICKED));