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
This commit is contained in:
Samuel Susla
2019-11-19 07:54:16 -08:00
committed by Facebook Github Bot
parent 3f7e0a2c96
commit 5a9b7d7adc
4 changed files with 46 additions and 10 deletions
@@ -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
+1 -2
View File
@@ -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 {
@@ -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
@@ -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