Skip to content

Commit b26e704

Browse files
[Fabric] Added UIA Event Trigger For accessibilityAnnotation Property Changes (#15039)
* Added UIA Event Triggers for accessibilityAnnotation Property Changes * Added UIA Event Triggers for accessibilityAnnotation Property Changes * wrapped to single call - UpdateUIAPropertiesForAnnotation * Annotation Props UIA Event method call * removed yarn change file * Review Changes done * UpdateUiaPropertyForAnnotation method removed. * UpdateUiaProperty long method param added. * yarn format changes * AccessibilityAnnotation default valued assigned. --------- Co-authored-by: Vineeth <[email protected]>
1 parent 07f0064 commit b26e704

File tree

4 files changed

+54
-0
lines changed

4 files changed

+54
-0
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
3+
"comment": "Added UIA Event Triggers for accessibilityAnnotation Property Changes",
4+
"packageName": "react-native-windows",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,10 @@ void ComponentView::updateAccessibilityProps(
831831
oldViewProps.accessibilityValue.text,
832832
newViewProps.accessibilityValue.text);
833833

834+
// Handle annotation properties with single call
835+
winrt::Microsoft::ReactNative::implementation::UpdateUiaPropertiesForAnnotation(
836+
EnsureUiaProvider(), oldViewProps.accessibilityAnnotation, newViewProps.accessibilityAnnotation);
837+
834838
if ((oldViewProps.accessibilityState.has_value() && oldViewProps.accessibilityState->selected.has_value()) !=
835839
((newViewProps.accessibilityState.has_value() && newViewProps.accessibilityState->selected.has_value()))) {
836840
auto compProvider =

vnext/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,15 @@ void UpdateUiaProperty(winrt::IInspectable provider, PROPERTYID propId, int oldV
175175
UiaRaiseAutomationPropertyChangedEvent(spProviderSimple.get(), propId, CComVariant(oldValue), CComVariant(newValue));
176176
}
177177

178+
void UpdateUiaProperty(winrt::IInspectable provider, PROPERTYID propId, long oldValue, long newValue) noexcept {
179+
auto spProviderSimple = provider.try_as<IRawElementProviderSimple>();
180+
181+
if (spProviderSimple == nullptr || oldValue == newValue || !WasUiaPropertyAdvised(spProviderSimple, propId))
182+
return;
183+
184+
UiaRaiseAutomationPropertyChangedEvent(spProviderSimple.get(), propId, CComVariant(oldValue), CComVariant(newValue));
185+
}
186+
178187
void UpdateUiaProperty(
179188
winrt::IInspectable provider,
180189
PROPERTYID propId,
@@ -199,6 +208,29 @@ void UpdateUiaProperty(
199208
UpdateUiaProperty(provider, propId, oldData, newData);
200209
}
201210

211+
void UpdateUiaPropertiesForAnnotation(
212+
winrt::IInspectable provider,
213+
const std::optional<facebook::react::AccessibilityAnnotation> &oldAnnotation,
214+
const std::optional<facebook::react::AccessibilityAnnotation> &newAnnotation) noexcept {
215+
// if no value fall back to a default value.
216+
const auto &old_annotation = oldAnnotation.value_or(facebook::react::AccessibilityAnnotation());
217+
const auto &new_annotation = newAnnotation.value_or(facebook::react::AccessibilityAnnotation());
218+
219+
// Update all annotation properties
220+
UpdateUiaProperty(
221+
provider,
222+
UIA_AnnotationAnnotationTypeIdPropertyId,
223+
GetAnnotationTypeId(old_annotation.typeID),
224+
GetAnnotationTypeId(new_annotation.typeID));
225+
226+
UpdateUiaProperty(
227+
provider, UIA_AnnotationAnnotationTypeNamePropertyId, old_annotation.typeName, new_annotation.typeName);
228+
229+
UpdateUiaProperty(provider, UIA_AnnotationAuthorPropertyId, old_annotation.author, new_annotation.author);
230+
231+
UpdateUiaProperty(provider, UIA_AnnotationDateTimePropertyId, old_annotation.dateTime, new_annotation.dateTime);
232+
}
233+
202234
long GetLiveSetting(const std::string &liveRegion) noexcept {
203235
if (liveRegion == "polite") {
204236
return LiveSetting::Polite;

vnext/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ void UpdateUiaProperty(
3535
int oldValue,
3636
int newValue) noexcept;
3737

38+
void UpdateUiaProperty(
39+
winrt::Windows::Foundation::IInspectable provider,
40+
PROPERTYID propId,
41+
long oldValue,
42+
long newValue) noexcept;
43+
3844
void UpdateUiaProperty(
3945
winrt::Windows::Foundation::IInspectable provider,
4046
PROPERTYID propId,
@@ -47,6 +53,11 @@ void UpdateUiaProperty(
4753
const std::optional<std::string> &oldValue,
4854
const std::optional<std::string> &newValue) noexcept;
4955

56+
void UpdateUiaPropertiesForAnnotation(
57+
winrt::Windows::Foundation::IInspectable provider,
58+
const std::optional<facebook::react::AccessibilityAnnotation> &oldAnnotation,
59+
const std::optional<facebook::react::AccessibilityAnnotation> &newAnnotation) noexcept;
60+
5061
long GetLiveSetting(const std::string &liveRegion) noexcept;
5162

5263
long GetAnnotationTypeId(const std::string &annotationType) noexcept;

0 commit comments

Comments
 (0)