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
This commit is contained in:
Samuel Susla
2020-06-12 11:19:49 -07:00
committed by Facebook GitHub Bot
parent fb2a7765ac
commit 8dce59cee8
5 changed files with 48 additions and 0 deletions
@@ -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 */
@@ -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
@@ -28,6 +28,11 @@ AccessibilityProps::AccessibilityProps(
"accessibilityRole",
sourceProps.accessibilityTraits,
AccessibilityTraits::None)),
accessibilityState(convertRawProp(
rawProps,
"accessibilityState",
sourceProps.accessibilityState,
{})),
accessibilityLabel(convertRawProp(
rawProps,
"accessibilityLabel",
@@ -26,6 +26,7 @@ class AccessibilityProps {
bool accessible{false};
AccessibilityTraits accessibilityTraits{AccessibilityTraits::None};
AccessibilityState accessibilityState;
std::string accessibilityLabel{""};
std::string accessibilityHint{""};
std::vector<std::string> accessibilityActions{};
@@ -9,6 +9,7 @@
#include <folly/dynamic.h>
#include <react/components/view/AccessibilityPrimitives.h>
#include <react/core/propsConversions.h>
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<std::string, RawValue>)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