@@ -141,12 +141,21 @@ void FrameworkElementViewManager::TransferProperties(XamlView oldView, XamlView
141141 }
142142}
143143
144+ static folly::dynamic GetAccessibilityStateProps () {
145+ folly::dynamic props = folly::dynamic::object ();
146+
147+ props.update (folly::dynamic::object (" selected" , " boolean" )(" disabled" , " boolean" )(" checked" , " string" )(
148+ " busy" , " boolean" )(" expanded" , " boolean" ));
149+ return props;
150+ }
151+
144152folly::dynamic FrameworkElementViewManager::GetNativeProps () const {
145153 folly::dynamic props = Super::GetNativeProps ();
146154 props.update (folly::dynamic::object (" accessible" , " boolean" )(" accessibilityRole" , " string" )(
147- " accessibilityStates" , " array" )(" accessibilityHint" , " string" )(" accessibilityLabel" , " string" )(
148- " accessibilityPosInSet" , " number" )(" accessibilitySetSize" , " number" )(" testID" , " string" )(" tooltip" , " string" )(
149- " accessibilityActions" , " array" )(" accessibilityLiveRegion" , " string" ));
155+ " accessibilityStates" , " array" )(" accessibilityState" , GetAccessibilityStateProps ())(
156+ " accessibilityHint" , " string" )(" accessibilityLabel" , " string" )(" accessibilityPosInSet" , " number" )(
157+ " accessibilitySetSize" , " number" )(" testID" , " string" )(" tooltip" , " string" )(" accessibilityActions" , " array" )(
158+ " accessibilityLiveRegion" , " string" ));
150159 return props;
151160}
152161
@@ -410,6 +419,49 @@ bool FrameworkElementViewManager::UpdateProperty(
410419 }
411420 }
412421
422+ DynamicAutomationProperties::SetAccessibilityStateSelected (
423+ element, states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Selected)]);
424+ DynamicAutomationProperties::SetAccessibilityStateDisabled (
425+ element, states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Disabled)]);
426+ DynamicAutomationProperties::SetAccessibilityStateChecked (
427+ element, states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Checked)]);
428+ DynamicAutomationProperties::SetAccessibilityStateUnchecked (
429+ element, states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Unchecked)]);
430+ DynamicAutomationProperties::SetAccessibilityStateBusy (
431+ element, states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Busy)]);
432+ DynamicAutomationProperties::SetAccessibilityStateExpanded (
433+ element, states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Expanded)]);
434+ DynamicAutomationProperties::SetAccessibilityStateCollapsed (
435+ element, states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Collapsed)]);
436+ } else if (propertyName == " accessibilityState" ) {
437+ bool states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::CountStates)] = {};
438+
439+ if (propertyValue.isObject ()) {
440+ for (const auto &pair : propertyValue.items ()) {
441+ const std::string &innerName = pair.first .getString ();
442+ const folly::dynamic &innerValue = pair.second ;
443+
444+ if (innerName == " selected" )
445+ states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Selected)] = innerValue.getBool ();
446+ else if (innerName == " disabled" )
447+ states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Disabled)] = innerValue.getBool ();
448+ else if (innerName == " checked" ) {
449+ states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Checked)] =
450+ innerValue.isBool () && innerValue.getBool ();
451+ states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Unchecked)] =
452+ innerValue.isBool () && !innerValue.getBool ();
453+ // If the state is "mixed" we'll just set both Checked and Unchecked to false,
454+ // then later in the IToggleProvider implementation it will return the Intermediate state
455+ // due to both being set to false (see DynamicAutomationPeer::ToggleState()).
456+ } else if (innerName == " busy" )
457+ states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Busy)] = innerValue.getBool ();
458+ else if (innerName == " expanded" ) {
459+ states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Expanded)] = innerValue.getBool ();
460+ states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Collapsed)] = !innerValue.getBool ();
461+ }
462+ }
463+ }
464+
413465 DynamicAutomationProperties::SetAccessibilityStateSelected (
414466 element, states[static_cast <int32_t >(winrt::react::uwp::AccessibilityStates::Selected)]);
415467 DynamicAutomationProperties::SetAccessibilityStateDisabled (
0 commit comments