Skip to content

Commit

Permalink
Add incomplete support for accessibility state prop
Browse files Browse the repository at this point in the history
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
  • Loading branch information
sammy-SC authored and facebook-github-bot committed Jun 12, 2020
1 parent fb2a776 commit 8dce59c
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 0 deletions.
12 changes: 12 additions & 0 deletions React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -228,11 +228,23 @@ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &
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 */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ AccessibilityProps::AccessibilityProps(
"accessibilityRole",
sourceProps.accessibilityTraits,
AccessibilityTraits::None)),
accessibilityState(convertRawProp(
rawProps,
"accessibilityState",
sourceProps.accessibilityState,
{})),
accessibilityLabel(convertRawProp(
rawProps,
"accessibilityLabel",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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{};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include <folly/dynamic.h>
#include <react/components/view/AccessibilityPrimitives.h>
#include <react/core/propsConversions.h>

namespace facebook {
namespace react {
Expand Down Expand Up @@ -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

0 comments on commit 8dce59c

Please sign in to comment.