From 5bb2a94a55449fa03b995e61af9b0bdd4a6013e8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Artur=20=C5=9Awigo=C5=84?= Date: Fri, 8 Jul 2022 11:44:15 +0200 Subject: [PATCH] [NUI][AT-SPI] Store AccessibilityAttributes in NUI (#4389) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Having a modifiable attribute dictionary in NUI removes the performance penalty of having to go through interops on every modification. A new override for GetAttributes in NUIViewAccessible will now collect the attributes stored in NUI. Co-authored-by: Artur Świgoń --- src/Tizen.NUI.Components/Controls/AlertDialog.cs | 2 +- src/Tizen.NUI.Components/Controls/Dialog.cs | 2 +- src/Tizen.NUI.Components/Controls/Menu.cs | 2 +- src/Tizen.NUI.Components/Controls/Pagination.cs | 2 +- src/Tizen.NUI.Components/Controls/Popup.cs | 2 +- .../src/internal/Interop/Interop.ControlDevel.cs | 20 +++++-------- .../src/public/BaseComponents/CustomView.cs | 1 - .../src/public/BaseComponents/ViewAccessibility.cs | 34 ++-------------------- .../BaseComponents/ViewAccessibilityProperties.cs | 2 +- .../BaseComponents/ViewAccessibilityWrappers.cs | 20 ++++++++++++- 10 files changed, 35 insertions(+), 52 deletions(-) diff --git a/src/Tizen.NUI.Components/Controls/AlertDialog.cs b/src/Tizen.NUI.Components/Controls/AlertDialog.cs index 754c88a..26a4b46 100755 --- a/src/Tizen.NUI.Components/Controls/AlertDialog.cs +++ b/src/Tizen.NUI.Components/Controls/AlertDialog.cs @@ -472,7 +472,7 @@ namespace Tizen.NUI.Components { base.OnInitialize(); AccessibilityRole = Role.Dialog; - AppendAccessibilityAttribute("sub-role", "Alert"); + AccessibilityAttributes["sub-role"] = "Alert"; Show(); // calls RegisterDefaultLabel(); Hide() will call UnregisterDefaultLabel() } diff --git a/src/Tizen.NUI.Components/Controls/Dialog.cs b/src/Tizen.NUI.Components/Controls/Dialog.cs index 00fce27..7ba4cb6 100755 --- a/src/Tizen.NUI.Components/Controls/Dialog.cs +++ b/src/Tizen.NUI.Components/Controls/Dialog.cs @@ -134,7 +134,7 @@ namespace Tizen.NUI.Components { base.OnInitialize(); AccessibilityRole = Role.Dialog; - AppendAccessibilityAttribute("sub-role", "Alert"); + AccessibilityAttributes["sub-role"] = "Alert"; Show(); // calls RegisterDefaultLabel(); Hide() will call UnregisterDefaultLabel() } diff --git a/src/Tizen.NUI.Components/Controls/Menu.cs b/src/Tizen.NUI.Components/Controls/Menu.cs index b3851ca..29e2214 100755 --- a/src/Tizen.NUI.Components/Controls/Menu.cs +++ b/src/Tizen.NUI.Components/Controls/Menu.cs @@ -697,7 +697,7 @@ namespace Tizen.NUI.Components { base.OnInitialize(); AccessibilityRole = Role.PopupMenu; - AppendAccessibilityAttribute("sub-role", "Alert"); + AccessibilityAttributes["sub-role"] = "Alert"; } /// diff --git a/src/Tizen.NUI.Components/Controls/Pagination.cs b/src/Tizen.NUI.Components/Controls/Pagination.cs index ad914bc..5e6e78c 100755 --- a/src/Tizen.NUI.Components/Controls/Pagination.cs +++ b/src/Tizen.NUI.Components/Controls/Pagination.cs @@ -512,7 +512,7 @@ namespace Tizen.NUI.Components base.OnInitialize(); AccessibilityRole = Role.ScrollBar; AccessibilityHighlightable = true; - AppendAccessibilityAttribute("style", "pagecontrolbyvalue"); + AccessibilityAttributes["style"] = "pagecontrolbyvalue"; container = new View() { diff --git a/src/Tizen.NUI.Components/Controls/Popup.cs b/src/Tizen.NUI.Components/Controls/Popup.cs index 2ebe2ab..e76fb5a 100755 --- a/src/Tizen.NUI.Components/Controls/Popup.cs +++ b/src/Tizen.NUI.Components/Controls/Popup.cs @@ -783,7 +783,7 @@ namespace Tizen.NUI.Components { base.OnInitialize(); AccessibilityRole = Role.Dialog; - AppendAccessibilityAttribute("sub-role", "Alert"); + AccessibilityAttributes["sub-role"] = "Alert"; container.Add(this); container.SetTouchConsumed(true); diff --git a/src/Tizen.NUI/src/internal/Interop/Interop.ControlDevel.cs b/src/Tizen.NUI/src/internal/Interop/Interop.ControlDevel.cs index 1879c7d..22a02d5 100755 --- a/src/Tizen.NUI/src/internal/Interop/Interop.ControlDevel.cs +++ b/src/Tizen.NUI/src/internal/Interop/Interop.ControlDevel.cs @@ -84,18 +84,6 @@ namespace Tizen.NUI public static extern void DaliToolkitDevelControlClearAccessibilityRelations(HandleRef arg1); [EditorBrowsable(EditorBrowsableState.Never)] - [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_AppendAccessibilityAttribute")] - public static extern void DaliToolkitDevelControlAppendAccessibilityAttribute(HandleRef arg1, string arg2, string arg3); - - [EditorBrowsable(EditorBrowsableState.Never)] - [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_RemoveAccessibilityAttribute")] - public static extern void DaliToolkitDevelControlRemoveAccessibilityAttribute(HandleRef arg1, string arg2); - - [EditorBrowsable(EditorBrowsableState.Never)] - [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_ClearAccessibilityAttributes")] - public static extern void DaliToolkitDevelControlClearAccessibilityAttributes(HandleRef arg1); - - [EditorBrowsable(EditorBrowsableState.Never)] [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_SetAccessibilityReadingInfoType2")] public static extern void DaliToolkitDevelControlSetAccessibilityReadingInfoTypes(HandleRef arg1, int arg2); @@ -387,6 +375,14 @@ namespace Tizen.NUI public delegate IntPtr AccessibilityGetRangeExtents(IntPtr self, int startOffset, int endOffset, int coordType); [EditorBrowsable(EditorBrowsableState.Never)] public AccessibilityGetRangeExtents GetRangeExtents; // 36 + + [EditorBrowsable(EditorBrowsableState.Never)] + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void AccessibilityGetAttributesCallback(string key, string value, IntPtr userData); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void AccessibilityGetAttributes(IntPtr self, AccessibilityGetAttributesCallback callback, IntPtr userData); + [EditorBrowsable(EditorBrowsableState.Never)] + public AccessibilityGetAttributes GetAttributes; // 37 } [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Accessibility_DuplicateString")] diff --git a/src/Tizen.NUI/src/public/BaseComponents/CustomView.cs b/src/Tizen.NUI/src/public/BaseComponents/CustomView.cs index 972bdd8..92edb87 100755 --- a/src/Tizen.NUI/src/public/BaseComponents/CustomView.cs +++ b/src/Tizen.NUI/src/public/BaseComponents/CustomView.cs @@ -146,7 +146,6 @@ namespace Tizen.NUI.BaseComponents public virtual void OnInitialize() { AccessibilityRole = Role.Unknown; - AppendAccessibilityAttribute("class", this.GetType().Name); } /// diff --git a/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibility.cs b/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibility.cs index 461c496..2bf62df 100755 --- a/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibility.cs +++ b/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibility.cs @@ -56,40 +56,10 @@ namespace Tizen.NUI.BaseComponents /////////////////////////////////////////////////////////////////// /// - /// Adds or modifies the value matched with given key. + /// Dictionary of accessibility attributes (key-value pairs of strings). /// - /// - /// Modification takes place if key was previously set. - /// - /// The key to insert - /// The value to insert - [EditorBrowsable(EditorBrowsableState.Never)] - public void AppendAccessibilityAttribute(string key, string value) - { - Interop.ControlDevel.DaliToolkitDevelControlAppendAccessibilityAttribute(SwigCPtr, key, value); - if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); - } - - /// - /// Erases a key with its value from accessibility attributes. - /// - /// The key to remove [EditorBrowsable(EditorBrowsableState.Never)] - public void RemoveAccessibilityAttribute(string key) - { - Interop.ControlDevel.DaliToolkitDevelControlRemoveAccessibilityAttribute(SwigCPtr, key); - if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); - } - - /// - /// Clears accessibility attributes. - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public void ClearAccessibilityAttributes() - { - Interop.ControlDevel.DaliToolkitDevelControlClearAccessibilityAttributes(SwigCPtr); - if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); - } + protected Dictionary AccessibilityAttributes { get; } = new Dictionary(); /////////////////////////////////////////////////////////////////// // ************************** Highlight ************************ // diff --git a/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibilityProperties.cs b/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibilityProperties.cs index b738c15..5eb7340 100755 --- a/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibilityProperties.cs +++ b/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibilityProperties.cs @@ -160,7 +160,7 @@ namespace Tizen.NUI.BaseComponents set { base.AutomationId = value; - AppendAccessibilityAttribute("automationId", value); + AccessibilityAttributes["automationId"] = value; } } } diff --git a/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibilityWrappers.cs b/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibilityWrappers.cs index e4a86e0..f867cec 100644 --- a/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibilityWrappers.cs +++ b/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibilityWrappers.cs @@ -87,6 +87,7 @@ namespace Tizen.NUI.BaseComponents var ad = Interop.ControlDevel.AccessibilityDelegate.Instance; ad.CalculateStates = AccessibilityCalculateStatesWrapper; + ad.GetAttributes = AccessibilityGetAttributes; // Not a wrapper, entirely private implementation ad.GetDescription = AccessibilityGetDescriptionWrapper; ad.GetInterfaces = AccessibilityGetInterfaces; // Not a wrapper, entirely private implementation ad.GetName = AccessibilityGetNameWrapper; @@ -97,7 +98,7 @@ namespace Tizen.NUI.BaseComponents View view = GetViewFromRefObject(self); if (view == null) return 0UL; - + ulong bitMask = 0UL; lock (AccessibilityInitialStates) @@ -110,6 +111,23 @@ namespace Tizen.NUI.BaseComponents return bitMask; } + private static void AccessibilityGetAttributes(IntPtr self, Interop.ControlDevel.AccessibilityDelegate.AccessibilityGetAttributesCallback callback, IntPtr userData) + { + var view = GetViewFromRefObject(self); + var attributes = view.AccessibilityAttributes; + var classKey = "class"; + + if (!attributes.ContainsKey(classKey)) + { + attributes[classKey] = view.GetType().Name; + } + + foreach (var attribute in attributes) + { + callback(attribute.Key, attribute.Value, userData); + } + } + private static IntPtr AccessibilityGetDescriptionWrapper(IntPtr self) { string description = GetViewFromRefObject(self).AccessibilityGetDescription(); -- 2.7.4