From 5a9b7d7adcb43d6c19a450018fe38dc1ba7fe400 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Tue, 19 Nov 2019 07:51:54 -0800 Subject: [PATCH] Make views tappable with screen reader Summary: Changelog: [Internal] In paper implementation: `accessibilityActivate` returns NO in case `onAccessibilityTap` is nil. In Fabric we have no option to detect whether `onAccessibilityTap` is nil or isn't but we don't want to prevent VoiceOver from tapping an element. This could potentially trigger action associated with element twice. Let's say you have `onPress` and `onAccessibilityTap`, it will trigger both if you trigger action through VoiceOver. Reviewed By: shergin Differential Revision: D18572432 fbshipit-source-id: c5ac002317c798a10045b6f05738299d0ae27456 --- .../View/RCTViewComponentView.mm | 32 ++++++++++++++----- React/Views/RCTView.m | 3 +- .../view/accessibility/AccessibilityProps.cpp | 16 ++++++++++ .../view/accessibility/AccessibilityProps.h | 5 +++ 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm index 5ce4369a459..5e53470f189 100644 --- a/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -531,26 +531,42 @@ static NSString *RCTRecursiveAccessibilityLabel(UIView *view) - (BOOL)accessibilityActivate { - _eventEmitter->onAccessibilityTap(); - return YES; + if (_eventEmitter && _props->onAccessibilityTap) { + _eventEmitter->onAccessibilityTap(); + return YES; + } else { + return NO; + } } - (BOOL)accessibilityPerformMagicTap { - _eventEmitter->onAccessibilityMagicTap(); - return YES; + if (_eventEmitter && _props->onAccessibilityMagicTap) { + _eventEmitter->onAccessibilityMagicTap(); + return YES; + } else { + return NO; + } } - (BOOL)accessibilityPerformEscape { - _eventEmitter->onAccessibilityEscape(); - return YES; + if (_eventEmitter && _props->onAccessibilityEscape) { + _eventEmitter->onAccessibilityEscape(); + return YES; + } else { + return NO; + } } - (BOOL)didActivateAccessibilityCustomAction:(UIAccessibilityCustomAction *)action { - _eventEmitter->onAccessibilityAction(RCTStringFromNSString(action.name)); - return YES; + if (_eventEmitter && _props->onAccessibilityAction) { + _eventEmitter->onAccessibilityAction(RCTStringFromNSString(action.name)); + return YES; + } else { + return NO; + } } - (SharedTouchEventEmitter)touchEventEmitterAtPoint:(CGPoint)point diff --git a/React/Views/RCTView.m b/React/Views/RCTView.m index b17cc681d88..831a1b52fc5 100644 --- a/React/Views/RCTView.m +++ b/React/Views/RCTView.m @@ -393,8 +393,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:unused) { if ([self performAccessibilityAction:@"activate"]) { return YES; - } - else if (_onAccessibilityTap) { + } else if (_onAccessibilityTap) { _onAccessibilityTap(nil); return YES; } else { diff --git a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp index 81e0b2a0b44..71c44e1f191 100644 --- a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp +++ b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp @@ -44,6 +44,22 @@ AccessibilityProps::AccessibilityProps( rawProps, "accessibilityIgnoresInvertColors", sourceProps.accessibilityIgnoresInvertColors)), + onAccessibilityTap(convertRawProp( + rawProps, + "onAccessibilityTap", + sourceProps.onAccessibilityTap)), + onAccessibilityMagicTap(convertRawProp( + rawProps, + "onAccessibilityMagicTap", + sourceProps.onAccessibilityMagicTap)), + onAccessibilityEscape(convertRawProp( + rawProps, + "onAccessibilityEscape", + sourceProps.onAccessibilityEscape)), + onAccessibilityAction(convertRawProp( + rawProps, + "onAccessibilityAction", + sourceProps.onAccessibilityAction)), testId(convertRawProp(rawProps, "testId", sourceProps.testId)) {} #pragma mark - DebugStringConvertible diff --git a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h index 344f8c74694..6ef8015d9bd 100644 --- a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h +++ b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h @@ -32,6 +32,11 @@ class AccessibilityProps { bool const accessibilityViewIsModal{false}; bool const accessibilityElementsHidden{false}; bool const accessibilityIgnoresInvertColors{false}; + bool const onAccessibilityTap{}; + bool const onAccessibilityMagicTap{}; + bool const onAccessibilityEscape{}; + bool const onAccessibilityAction{}; + std::string const testId{""}; #pragma mark - DebugStringConvertible