[NUI][AT-SPI] Make GetAccessibilityRelations() usable
authorArtur Świgoń <a.swigon@samsung.com>
Fri, 13 May 2022 11:30:12 +0000 (13:30 +0200)
committerdongsug-song <35130733+dongsug-song@users.noreply.github.com>
Fri, 27 May 2022 06:02:37 +0000 (15:02 +0900)
The Address type is useless in NUI, as there is no way to convert an
Address to a View or obtain an Address of a View. With this change,
GetAccessibilityRelations() returns a mapping from the relation type
to a collection of View. Address and AddressCollection are removed
altogether.

src/Tizen.NUI/src/internal/Interop/Interop.ControlDevel.cs
src/Tizen.NUI/src/public/BaseComponents/ViewAccessibility.cs

index 33a6dfe..a8811a7 100755 (executable)
@@ -72,20 +72,12 @@ namespace Tizen.NUI
             public static extern void DaliToolkitDevelControlRemoveAccessibilityRelation(HandleRef arg1, HandleRef arg2, int arg3);
 
             [EditorBrowsable(EditorBrowsableState.Never)]
-            [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_new_GetAccessibilityRelations")]
-            public static extern IntPtr DaliToolkitDevelControlNewGetAccessibilityRelations(HandleRef arg1);
+            [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+            public delegate void GetAccessibilityRelationsCallback(int relationType, IntPtr relationTarget, IntPtr userData);
 
             [EditorBrowsable(EditorBrowsableState.Never)]
-            [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_AccessibilityRelations_RelationSize")]
-            public static extern uint DaliToolkitDevelControlAccessibilityRelationsRelationSize(BaseComponents.AddressCollection arg1, int relation);
-
-            [EditorBrowsable(EditorBrowsableState.Never)]
-            [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_AccessibilityRelations_At")]
-            public static extern string DaliToolkitDevelControlAccessibilityRelationsAt(BaseComponents.AddressCollection arg1, int rel, int pos, int id);
-
-            [EditorBrowsable(EditorBrowsableState.Never)]
-            [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_delete_AccessibilityRelations")]
-            public static extern void DaliToolkitDevelControlDeleteAccessibilityRelations(IntPtr arg1);
+            [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_GetAccessibilityRelations")]
+            public static extern void DaliToolkitDevelControlGetAccessibilityRelations(HandleRef arg1_control, GetAccessibilityRelationsCallback arg2_callback, IntPtr arg3_userData);
 
             [EditorBrowsable(EditorBrowsableState.Never)]
             [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_ClearAccessibilityRelations")]
index be93bbe..7ad8da8 100755 (executable)
@@ -16,6 +16,7 @@
  */
 
 using System;
+using System.Collections.Generic;
 using System.ComponentModel;
 using System.Runtime.InteropServices;
 using Tizen.NUI;
@@ -23,109 +24,6 @@ using Tizen.NUI;
 namespace Tizen.NUI.BaseComponents
 {
     /// <summary>
-    /// Address represents an unique object address on accessibility bus.
-    /// </summary>
-    [EditorBrowsable(EditorBrowsableState.Never)]
-    public class Address
-    {
-        /// <summary>
-        /// Creates an initialized Address.
-        /// </summary>
-        /// <param name="bus">Accessibility bus</param>
-        /// <param name="path">Accessibility path</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public Address(string bus, string path)
-        {
-            Bus = bus;
-            Path = path;
-        }
-
-        /// <summary>
-        /// Gets or sets accessibility bus.
-        /// </summary>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public string Bus { get; set; }
-
-        /// <summary>
-        /// Gets or sets accessibility path.
-        /// </summary>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public string Path { get; set; }
-    }
-
-    /// <summary>
-    /// AddressCollection.
-    /// </summary>
-    [EditorBrowsable(EditorBrowsableState.Never)]
-    public class AddressCollection : SafeHandle
-    {
-        /// <summary>
-        /// Creates an initialized AddressCollection.
-        /// </summary>
-        /// <param name="collection">Initialized AddressCollection</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public AddressCollection(IntPtr collection) : base(collection, true)
-        {
-        }
-
-        /// <summary>
-        /// Checks whether this handle is invalid or not.
-        /// </summary>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public override bool IsInvalid
-        {
-            get
-            {
-                return this.handle == IntPtr.Zero;
-            }
-        }
-
-        /// <summary>
-        /// Gets the size of accessibility relation.
-        /// </summary>
-        /// <param name="relation">Accessibility relation</param>
-        /// <returns>The size of relation, which means the number of elements</returns>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public uint GetRelationSize(AccessibilityRelationType relation)
-        {
-            uint result = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsRelationSize(this, Convert.ToInt32(relation));
-            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-            return result;
-        }
-
-        /// <summary>
-        /// Gets Address object using contained bus and path.
-        /// </summary>
-        /// <param name="relation">Accessibility relation</param>
-        /// <param name="position">Position</param>
-        /// <returns>Accessibility Adress</returns>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public Address GetAddressAt(AccessibilityRelationType relation, int position)
-        {
-            var bus = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsAt(this, Convert.ToInt32(relation), position, 0);
-            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-
-            var path = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsAt(this, Convert.ToInt32(relation), position, 1);
-            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-
-            return new Address(bus, path);
-        }
-
-        /// <summary>
-        /// Releases handle itself.
-        /// </summary>
-        /// <returns>true when released successfully.</returns>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override bool ReleaseHandle()
-        {
-            Interop.ControlDevel.DaliToolkitDevelControlDeleteAccessibilityRelations(handle);
-            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-            this.SetHandle(IntPtr.Zero);
-            return true;
-        }
-    }
-
-    /// <summary>
     /// AccessibilityRange is used to store data related with Text.
     /// </summary>
     [EditorBrowsable(EditorBrowsableState.Never)]
@@ -285,15 +183,44 @@ namespace Tizen.NUI.BaseComponents
         /// <summary>
         /// Gets accessibility collection connected with the current object.
         /// </summary>
-        /// <returns>AddressCollection</returns>
+        /// <returns>A dictionary mapping a relation type to a set of objects in that relation</returns>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public AddressCollection GetAccessibilityRelations()
+        public Dictionary<AccessibilityRelationType, List<View>> GetAccessibilityRelations()
         {
-            var result = new AddressCollection(Interop.ControlDevel.DaliToolkitDevelControlNewGetAccessibilityRelations(SwigCPtr));
+            var list = new List<KeyValuePair<int, IntPtr>>();
+            var listHandle = GCHandle.Alloc(list);
+            var callback = new Interop.ControlDevel.GetAccessibilityRelationsCallback(GetAccessibilityRelationsCallback);
+
+            Interop.ControlDevel.DaliToolkitDevelControlGetAccessibilityRelations(SwigCPtr, callback, GCHandle.ToIntPtr(listHandle));
+            listHandle.Free();
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+
+            var result = new Dictionary<AccessibilityRelationType, List<View>>();
+
+            foreach (var pair in list)
+            {
+                var key = (AccessibilityRelationType)pair.Key;
+                var value = this.GetInstanceSafely<View>(pair.Value);
+
+                if (!result.ContainsKey(key))
+                {
+                    result[key] = new List<View>();
+                }
+
+                result[key].Add(value);
+            }
+
             return result;
         }
 
+        private static void GetAccessibilityRelationsCallback(int relationType, IntPtr relationTarget, IntPtr userData)
+        {
+            var handle = GCHandle.FromIntPtr(userData);
+            var list = (List<KeyValuePair<int, IntPtr>>)handle.Target;
+
+            list.Add(new KeyValuePair<int, IntPtr>(relationType, relationTarget));
+        }
+
         ///////////////////////////////////////////////////////////////////
         // ********************* ReadingInfoType *********************** //
         ///////////////////////////////////////////////////////////////////