From 8dce59cee8ba8791aaa8aade5ac89c2428c6d53c Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Fri, 12 Jun 2020 11:16:40 -0700 Subject: [PATCH] Add incomplete support for accessibility state prop Summary: Changelog: [internal] Minimal implementation of `accessibilityState` that supports `disabled` and `selected` props. Complete implementation will need to support following props ``` export type AccessibilityState = { disabled?: boolean, selected?: boolean, checked?: ?boolean | 'mixed', busy?: boolean, expanded?: boolean, ... }; ``` Reviewed By: mdvacca Differential Revision: D22016743 fbshipit-source-id: 1748acc4279f60ec8a92c93d5d13b136f57eb8d3 --- .../ComponentViews/View/RCTViewComponentView.mm | 12 ++++++++++++ .../accessibility/AccessibilityPrimitives.h | 17 +++++++++++++++++ .../view/accessibility/AccessibilityProps.cpp | 5 +++++ .../view/accessibility/AccessibilityProps.h | 1 + .../accessibilityPropsConversions.h | 13 +++++++++++++ 5 files changed, 48 insertions(+) diff --git a/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm index 09bc95cb33d..c6503a635e9 100644 --- a/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -228,11 +228,23 @@ using namespace facebook::react; self.accessibilityElement.accessibilityElementsHidden = newViewProps.accessibilityElementsHidden; } + // `accessibilityTraits` if (oldViewProps.accessibilityTraits != newViewProps.accessibilityTraits) { self.accessibilityElement.accessibilityTraits = RCTUIAccessibilityTraitsFromAccessibilityTraits(newViewProps.accessibilityTraits); } + // `accessibilityState` + if (oldViewProps.accessibilityState != newViewProps.accessibilityState) { + self.accessibilityTraits &= ~(UIAccessibilityTraitNotEnabled | UIAccessibilityTraitSelected); + if (newViewProps.accessibilityState.selected) { + self.accessibilityTraits |= UIAccessibilityTraitSelected; + } + if (newViewProps.accessibilityState.disabled) { + self.accessibilityTraits |= UIAccessibilityTraitNotEnabled; + } + } + // `accessibilityIgnoresInvertColors` if (oldViewProps.accessibilityIgnoresInvertColors != newViewProps.accessibilityIgnoresInvertColors) { #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */ diff --git a/ReactCommon/fabric/components/view/accessibility/AccessibilityPrimitives.h b/ReactCommon/fabric/components/view/accessibility/AccessibilityPrimitives.h index a87cd35c53d..a17b9aa44f7 100644 --- a/ReactCommon/fabric/components/view/accessibility/AccessibilityPrimitives.h +++ b/ReactCommon/fabric/components/view/accessibility/AccessibilityPrimitives.h @@ -44,5 +44,22 @@ constexpr enum AccessibilityTraits operator&( return (enum AccessibilityTraits)((uint32_t)lhs & (uint32_t)rhs); } +struct AccessibilityState { + bool disabled{false}; + bool selected{false}; +}; + +constexpr bool operator==( + AccessibilityState const &lhs, + AccessibilityState const &rhs) { + return lhs.disabled == rhs.disabled && lhs.selected == rhs.selected; +} + +constexpr bool operator!=( + AccessibilityState const &lhs, + AccessibilityState const &rhs) { + return !(rhs == lhs); +} + } // namespace react } // namespace facebook diff --git a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp index b7f9bd7bfde..417eccd6565 100644 --- a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp +++ b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp @@ -28,6 +28,11 @@ AccessibilityProps::AccessibilityProps( "accessibilityRole", sourceProps.accessibilityTraits, AccessibilityTraits::None)), + accessibilityState(convertRawProp( + rawProps, + "accessibilityState", + sourceProps.accessibilityState, + {})), accessibilityLabel(convertRawProp( rawProps, "accessibilityLabel", diff --git a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h index b3994c99f8e..fc6088dbf0a 100644 --- a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h +++ b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h @@ -26,6 +26,7 @@ class AccessibilityProps { bool accessible{false}; AccessibilityTraits accessibilityTraits{AccessibilityTraits::None}; + AccessibilityState accessibilityState; std::string accessibilityLabel{""}; std::string accessibilityHint{""}; std::vector accessibilityActions{}; diff --git a/ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h b/ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h index a6b6b4e919d..c0239600a86 100644 --- a/ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h +++ b/ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h @@ -9,6 +9,7 @@ #include #include +#include namespace facebook { namespace react { @@ -109,5 +110,17 @@ inline void fromRawValue(const RawValue &value, AccessibilityTraits &result) { abort(); } +inline void fromRawValue(const RawValue &value, AccessibilityState &result) { + auto map = (better::map)value; + auto selected = map.find("selected"); + if (selected != map.end()) { + fromRawValue(selected->second, result.selected); + } + auto disabled = map.find("disabled"); + if (disabled != map.end()) { + fromRawValue(disabled->second, result.disabled); + } +} + } // namespace react } // namespace facebook