diff --git a/change/@react-native-windows-cli-147ac6d3-f365-44a4-b0e2-773bf7ea4ed7.json b/change/@react-native-windows-cli-147ac6d3-f365-44a4-b0e2-773bf7ea4ed7.json new file mode 100644 index 00000000000..1b0188e6cf6 --- /dev/null +++ b/change/@react-native-windows-cli-147ac6d3-f365-44a4-b0e2-773bf7ea4ed7.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Upgrade dotnet version", + "packageName": "@react-native-windows/cli", + "email": "10109130+sharath2727@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/react-native-windows-2c05e8fe-45d8-4c6b-817d-65fa2f7f728f.json b/change/react-native-windows-2c05e8fe-45d8-4c6b-817d-65fa2f7f728f.json new file mode 100644 index 00000000000..118897bdc1f --- /dev/null +++ b/change/react-native-windows-2c05e8fe-45d8-4c6b-817d-65fa2f7f728f.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Upgrade dotnet version", + "packageName": "react-native-windows", + "email": "10109130+sharath2727@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/react-native-windows-a648cb52-86ff-47b1-b2be-04d168a7f110.json b/change/react-native-windows-a648cb52-86ff-47b1-b2be-04d168a7f110.json new file mode 100644 index 00000000000..b48cab15d27 --- /dev/null +++ b/change/react-native-windows-a648cb52-86ff-47b1-b2be-04d168a7f110.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Added UIA Event Triggers for accessibilityAnnotation Property Changes", + "packageName": "react-native-windows", + "email": "gsaran252000@gmail.com", + "dependentChangeType": "patch" +} diff --git a/change/react-native-windows-b21e071e-d9f2-45d1-92d6-b65b6246555b.json b/change/react-native-windows-b21e071e-d9f2-45d1-92d6-b65b6246555b.json new file mode 100644 index 00000000000..c3022810b3e --- /dev/null +++ b/change/react-native-windows-b21e071e-d9f2-45d1-92d6-b65b6246555b.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "adding UIA event handler changes for navigator", + "packageName": "react-native-windows", + "email": "protikbiswas100@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp b/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp index d67f6d9ca29..e8da5dc3d53 100644 --- a/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +++ b/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp @@ -1009,7 +1009,9 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::Expand() { if (!strongView) return UIA_E_ELEMENTNOTAVAILABLE; + DispatchAccessibilityAction(m_view, "expand"); + return S_OK; } @@ -1018,7 +1020,9 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::Collapse() { if (!strongView) return UIA_E_ELEMENTNOTAVAILABLE; + DispatchAccessibilityAction(m_view, "collapse"); + return S_OK; } diff --git a/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp b/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp index 2426128f1a3..b53b7057344 100644 --- a/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +++ b/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp @@ -831,6 +831,30 @@ void ComponentView::updateAccessibilityProps( oldViewProps.accessibilityValue.text, newViewProps.accessibilityValue.text); + // Handle annotation properties with single call + winrt::Microsoft::ReactNative::implementation::UpdateUiaPropertiesForAnnotation( + EnsureUiaProvider(), oldViewProps.accessibilityAnnotation, newViewProps.accessibilityAnnotation); + + // Handle expand/collapse state changes + if (oldViewProps.accessibilityState.has_value() != newViewProps.accessibilityState.has_value() || + (oldViewProps.accessibilityState.has_value() && newViewProps.accessibilityState.has_value() && + oldViewProps.accessibilityState->expanded != newViewProps.accessibilityState->expanded)) { + auto oldExpanded = + oldViewProps.accessibilityState.has_value() && oldViewProps.accessibilityState->expanded.has_value() + ? oldViewProps.accessibilityState->expanded.value() + : false; + auto newExpanded = + newViewProps.accessibilityState.has_value() && newViewProps.accessibilityState->expanded.has_value() + ? newViewProps.accessibilityState->expanded.value() + : false; + + winrt::Microsoft::ReactNative::implementation::UpdateUiaProperty( + EnsureUiaProvider(), + UIA_ExpandCollapseExpandCollapseStatePropertyId, + static_cast(winrt::Microsoft::ReactNative::implementation::GetExpandCollapseState(oldExpanded)), + static_cast(winrt::Microsoft::ReactNative::implementation::GetExpandCollapseState(newExpanded))); + } + if ((oldViewProps.accessibilityState.has_value() && oldViewProps.accessibilityState->selected.has_value()) != ((newViewProps.accessibilityState.has_value() && newViewProps.accessibilityState->selected.has_value()))) { auto compProvider = diff --git a/vnext/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp b/vnext/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp index 20c34577355..f2f12530ed1 100644 --- a/vnext/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp +++ b/vnext/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp @@ -175,6 +175,15 @@ void UpdateUiaProperty(winrt::IInspectable provider, PROPERTYID propId, int oldV UiaRaiseAutomationPropertyChangedEvent(spProviderSimple.get(), propId, CComVariant(oldValue), CComVariant(newValue)); } +void UpdateUiaProperty(winrt::IInspectable provider, PROPERTYID propId, long oldValue, long newValue) noexcept { + auto spProviderSimple = provider.try_as(); + + if (spProviderSimple == nullptr || oldValue == newValue || !WasUiaPropertyAdvised(spProviderSimple, propId)) + return; + + UiaRaiseAutomationPropertyChangedEvent(spProviderSimple.get(), propId, CComVariant(oldValue), CComVariant(newValue)); +} + void UpdateUiaProperty( winrt::IInspectable provider, PROPERTYID propId, @@ -199,6 +208,29 @@ void UpdateUiaProperty( UpdateUiaProperty(provider, propId, oldData, newData); } +void UpdateUiaPropertiesForAnnotation( + winrt::IInspectable provider, + const std::optional &oldAnnotation, + const std::optional &newAnnotation) noexcept { + // if no value fall back to a default value. + const auto &old_annotation = oldAnnotation.value_or(facebook::react::AccessibilityAnnotation()); + const auto &new_annotation = newAnnotation.value_or(facebook::react::AccessibilityAnnotation()); + + // Update all annotation properties + UpdateUiaProperty( + provider, + UIA_AnnotationAnnotationTypeIdPropertyId, + GetAnnotationTypeId(old_annotation.typeID), + GetAnnotationTypeId(new_annotation.typeID)); + + UpdateUiaProperty( + provider, UIA_AnnotationAnnotationTypeNamePropertyId, old_annotation.typeName, new_annotation.typeName); + + UpdateUiaProperty(provider, UIA_AnnotationAuthorPropertyId, old_annotation.author, new_annotation.author); + + UpdateUiaProperty(provider, UIA_AnnotationDateTimePropertyId, old_annotation.dateTime, new_annotation.dateTime); +} + long GetLiveSetting(const std::string &liveRegion) noexcept { if (liveRegion == "polite") { return LiveSetting::Polite; diff --git a/vnext/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h b/vnext/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h index b1f0e268c00..3d63c0c3e2b 100644 --- a/vnext/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h +++ b/vnext/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h @@ -35,6 +35,12 @@ void UpdateUiaProperty( int oldValue, int newValue) noexcept; +void UpdateUiaProperty( + winrt::Windows::Foundation::IInspectable provider, + PROPERTYID propId, + long oldValue, + long newValue) noexcept; + void UpdateUiaProperty( winrt::Windows::Foundation::IInspectable provider, PROPERTYID propId, @@ -47,6 +53,11 @@ void UpdateUiaProperty( const std::optional &oldValue, const std::optional &newValue) noexcept; +void UpdateUiaPropertiesForAnnotation( + winrt::Windows::Foundation::IInspectable provider, + const std::optional &oldAnnotation, + const std::optional &newAnnotation) noexcept; + long GetLiveSetting(const std::string &liveRegion) noexcept; long GetAnnotationTypeId(const std::string &annotationType) noexcept;