[NUI][AT-SPI] Clean up APIs related to AccessibilityStates (#3904)
authorArtur Świgoń <aswigon@yandex.com>
Tue, 8 Feb 2022 09:32:09 +0000 (10:32 +0100)
committerSangHyeon Jade Lee <dltkdgus1764@gmail.com>
Wed, 16 Feb 2022 08:40:57 +0000 (00:40 -0800)
Co-authored-by: Artur Świgoń <a.swigon@samsung.com>
13 files changed:
src/Tizen.NUI.Components/Controls/AlertDialog.cs
src/Tizen.NUI.Components/Controls/Button.cs
src/Tizen.NUI.Components/Controls/Dialog.cs
src/Tizen.NUI.Components/Controls/Menu.cs
src/Tizen.NUI.Components/Controls/Navigation/Navigator.cs
src/Tizen.NUI.Components/Controls/Popup.cs
src/Tizen.NUI.Components/Controls/SelectButton.cs
src/Tizen.NUI.Components/Controls/Switch.cs
src/Tizen.NUI/src/internal/Interop/Interop.ControlDevel.cs
src/Tizen.NUI/src/public/BaseComponents/ViewAccessibility.cs
src/Tizen.NUI/src/public/BaseComponents/ViewAccessibilityEnum.cs
src/Tizen.NUI/src/public/BaseComponents/ViewPublicMethods.cs
test/Tizen.NUI.Tests/Tizen.NUI.Devel.Tests/testcase/public/BaseComponents/TSViewAccessibility.cs

index a0b1c9b..c67aa3f 100755 (executable)
@@ -472,13 +472,14 @@ namespace Tizen.NUI.Components
         /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override AccessibilityStates AccessibilityCalculateStates(ulong states)
+        protected override AccessibilityStates AccessibilityCalculateStates()
         {
-            var accessibilityStates = base.AccessibilityCalculateStates(states);
-            FlagSetter(ref accessibilityStates, AccessibilityStates.Modal, true);
-            return accessibilityStates;
-        }
+            var states = base.AccessibilityCalculateStates();
+
+            states[AccessibilityState.Modal] = true;
 
+            return states;
+        }
 
         /// <summary>
         /// Default title content of AlertDialog.
index 501d902..70595df 100755 (executable)
@@ -100,7 +100,7 @@ namespace Tizen.NUI.Components
 
                     if (Accessibility.Accessibility.IsEnabled && instance.IsHighlighted)
                     {
-                        instance.EmitAccessibilityStatesChangedEvent(AccessibilityStates.Checked, newSelected);
+                        instance.EmitAccessibilityStateChangedEvent(AccessibilityState.Checked, newSelected);
                     }
                 }
             }
@@ -217,12 +217,14 @@ namespace Tizen.NUI.Components
         /// Calculates current states for the button<br />
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override AccessibilityStates AccessibilityCalculateStates(ulong states)
+        protected override AccessibilityStates AccessibilityCalculateStates()
         {
-            var accessibilityStates = base.AccessibilityCalculateStates(states);
-            FlagSetter(ref accessibilityStates, AccessibilityStates.Checked, this.IsSelected);
-            FlagSetter(ref accessibilityStates, AccessibilityStates.Enabled, this.IsEnabled);
-            return accessibilityStates;
+            var states = base.AccessibilityCalculateStates();
+
+            states[AccessibilityState.Checked] = this.IsSelected;
+            states[AccessibilityState.Enabled] = this.IsEnabled;
+
+            return states;
         }
 
         /// <summary>
index 419a0e6..5b258ec 100755 (executable)
@@ -142,11 +142,13 @@ namespace Tizen.NUI.Components
         /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override AccessibilityStates AccessibilityCalculateStates(ulong states)
+        protected override AccessibilityStates AccessibilityCalculateStates()
         {
-            var accessibilityStates = base.AccessibilityCalculateStates(states);
-            FlagSetter(ref accessibilityStates, AccessibilityStates.Modal, true);
-            return accessibilityStates;
+            var states = base.AccessibilityCalculateStates();
+
+            states[AccessibilityState.Modal] = true;
+
+            return states;
         }
 
         private void OnRelayout(object sender, EventArgs e)
index ee50541..91c6e69 100755 (executable)
@@ -395,7 +395,7 @@ namespace Tizen.NUI.Components
 
             CalculateSizeAndPosition();
             RegisterDefaultLabel();
-            NotifyAccessibilityStatesChange(AccessibilityStates.Visible | AccessibilityStates.Showing, AccessibilityStatesNotifyMode.Recursive);
+            NotifyAccessibilityStatesChange(new AccessibilityStates(AccessibilityState.Visible, AccessibilityState.Showing), AccessibilityStatesNotifyMode.Recursive);
         }
 
         /// <summary>
@@ -407,7 +407,7 @@ namespace Tizen.NUI.Components
         {
             Hide();
             UnregisterDefaultLabel();
-            NotifyAccessibilityStatesChange(AccessibilityStates.Visible | AccessibilityStates.Showing, AccessibilityStatesNotifyMode.Recursive);
+            NotifyAccessibilityStatesChange(new AccessibilityStates(AccessibilityState.Visible, AccessibilityState.Showing), AccessibilityStatesNotifyMode.Recursive);
             Dispose();
         }
 
@@ -660,11 +660,13 @@ namespace Tizen.NUI.Components
         /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override AccessibilityStates AccessibilityCalculateStates(ulong states)
+        protected override AccessibilityStates AccessibilityCalculateStates()
         {
-            var accessibilityStates = base.AccessibilityCalculateStates(states);
-            FlagSetter(ref accessibilityStates, AccessibilityStates.Modal, true);
-            return accessibilityStates;
+            var states = base.AccessibilityCalculateStates();
+
+            states[AccessibilityState.Modal] = true;
+
+            return states;
         }
     }
 }
index e6e096c..94ca551 100755 (executable)
@@ -863,14 +863,14 @@ namespace Tizen.NUI.Components
                 View curHighlightedView = Accessibility.Accessibility.Instance.GetCurrentlyHighlightedView();
                 if (curHighlightedView != null)
                 {
-                    curHighlightedView.NotifyAccessibilityStatesChange(AccessibilityStates.Visible | AccessibilityStates.Showing, AccessibilityStatesNotifyMode.Single);
+                    curHighlightedView.NotifyAccessibilityStatesChange(new AccessibilityStates(AccessibilityState.Visible, AccessibilityState.Showing), AccessibilityStatesNotifyMode.Single);
                 }
             }
 
             if (appearedPage != null)
             {
                 appearedPage.RegisterDefaultLabel();
-                appearedPage.NotifyAccessibilityStatesChange(AccessibilityStates.Visible | AccessibilityStates.Showing, AccessibilityStatesNotifyMode.Single);
+                appearedPage.NotifyAccessibilityStatesChange(new AccessibilityStates(AccessibilityState.Visible, AccessibilityState.Showing), AccessibilityStatesNotifyMode.Single);
             }
         }
 
index 14c25ae..59d93a6 100755 (executable)
@@ -810,11 +810,13 @@ namespace Tizen.NUI.Components
         /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override AccessibilityStates AccessibilityCalculateStates(ulong states)
+        protected override AccessibilityStates AccessibilityCalculateStates()
         {
-            var accessibilityStates = base.AccessibilityCalculateStates(states);
-            FlagSetter(ref accessibilityStates, AccessibilityStates.Modal, true);
-            return accessibilityStates;
+            var states = base.AccessibilityCalculateStates();
+
+            states[AccessibilityState.Modal] = true;
+
+            return states;
         }
 
         private void UpdateView()
index 290bcf5..62b10f2 100755 (executable)
@@ -216,7 +216,7 @@ namespace Tizen.NUI.Components
             {
                 if (Accessibility.Accessibility.IsEnabled && IsHighlighted)
                 {
-                    EmitAccessibilityStatesChangedEvent(AccessibilityStates.Checked, info.CurrentState.Contains(ControlState.Selected));
+                    EmitAccessibilityStateChangedEvent(AccessibilityState.Checked, info.CurrentState.Contains(ControlState.Selected));
                 }
 
                 // SelectedChanged is invoked when button or key is unpressed.
index 97c587f..75df8ec 100755 (executable)
@@ -78,11 +78,13 @@ namespace Tizen.NUI.Components
         /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override AccessibilityStates AccessibilityCalculateStates(ulong states)
+        protected override AccessibilityStates AccessibilityCalculateStates()
         {
-            var accessibilityStates = base.AccessibilityCalculateStates(states);
-            FlagSetter(ref accessibilityStates, AccessibilityStates.Checked, this.IsSelected);
-            return accessibilityStates;
+            var states = base.AccessibilityCalculateStates();
+
+            states[AccessibilityState.Checked] = this.IsSelected;
+
+            return states;
         }
 
         /// <summary>
@@ -367,7 +369,7 @@ namespace Tizen.NUI.Components
         {
             if (Accessibility.Accessibility.IsEnabled && IsHighlighted)
             {
-                EmitAccessibilityStatesChangedEvent(AccessibilityStates.Checked, IsSelected);
+                EmitAccessibilityStateChangedEvent(AccessibilityState.Checked, IsSelected);
             }
 
             ((SwitchExtension)Extension)?.OnSelectedChanged(this);
index b274caf..ee59e07 100755 (executable)
@@ -122,24 +122,20 @@ namespace Tizen.NUI
             public static extern bool DaliToolkitDevelControlGrabAccessibilityHighlight(global::System.Runtime.InteropServices.HandleRef arg1);
 
             [EditorBrowsable(EditorBrowsableState.Never)]
-            [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_GetAccessibilityState")]
+            [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_GetAccessibilityStates")]
             public static extern ulong DaliToolkitDevelControlGetAccessibilityStates(global::System.Runtime.InteropServices.HandleRef arg1);
 
             [EditorBrowsable(EditorBrowsableState.Never)]
-            [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_ConvertState")]
-            public static extern IntPtr DaliToolkitDevelControlConvertState(ulong arg1);
-
-            [EditorBrowsable(EditorBrowsableState.Never)]
-            [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_NotifyAccessibilityStateChange2")]
-            public static extern global::System.IntPtr DaliToolkitDevelControlNotifyAccessibilityStatesChange(global::System.Runtime.InteropServices.HandleRef arg1, ulong arg2, int arg3);
+            [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_NotifyAccessibilityStateChange")]
+            public static extern global::System.IntPtr DaliToolkitDevelControlNotifyAccessibilityStateChange(global::System.Runtime.InteropServices.HandleRef arg1, ulong arg2, int arg3);
 
             [EditorBrowsable(EditorBrowsableState.Never)]
             [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Accessibility_EmitAccessibilityEvent")]
             public static extern global::System.IntPtr DaliAccessibilityEmitAccessibilityEvent(global::System.Runtime.InteropServices.HandleRef arg1, int arg2_event);
 
             [EditorBrowsable(EditorBrowsableState.Never)]
-            [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Accessibility_EmitAccessibilityStateChangedEvent2")]
-            public static extern global::System.IntPtr DaliAccessibilityEmitAccessibilityStatesChangedEvent(global::System.Runtime.InteropServices.HandleRef arg1, ulong arg2_state, int arg3);
+            [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Accessibility_EmitAccessibilityStateChangedEvent")]
+            public static extern global::System.IntPtr DaliAccessibilityEmitAccessibilityStateChangedEvent(global::System.Runtime.InteropServices.HandleRef arg1, int arg2_state, int arg3);
 
             [EditorBrowsable(EditorBrowsableState.Never)]
             [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Accessibility_EmitTextInsertedEvent")]
@@ -203,8 +199,12 @@ namespace Tizen.NUI
                 [EditorBrowsable(EditorBrowsableState.Never)]
                 public AccessibilityDoAction DoAction; // 3
 
+                // Note: this method departs from the usual idiom of having the same
+                // parameter types as the Accessible method in DALi, because states
+                // calculated by ControlAccessible::CalculateStates are passed here
+                // as a parameter.
                 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-                public delegate IntPtr AccessibilityCalculateStates(ulong states);
+                public delegate ulong AccessibilityCalculateStates(ulong states);
                 [EditorBrowsable(EditorBrowsableState.Never)]
                 public AccessibilityCalculateStates CalculateStates; // 4
 
index 72e513f..0c854a9 100755 (executable)
@@ -329,14 +329,20 @@ namespace Tizen.NUI.BaseComponents
         /// Notifies sending notifications about the current states to accessibility clients.
         /// </summary>
         /// <remarks>
-        /// If recursive is true, all children of the Accessibility object will also re-emit the states.
+        /// In essence, this is equivalent to calling EmitAccessibilityStateChangedEvent in a loop for all specified states.
+        /// If recursive mode is specified, all children of the Accessibility object will also re-emit the states.
         /// </remarks>
         /// <param name="states">Accessibility States</param>
         /// <param name="notifyMode">Controls the notification strategy</param>
         [EditorBrowsable(EditorBrowsableState.Never)]
         public void NotifyAccessibilityStatesChange(AccessibilityStates states, AccessibilityStatesNotifyMode notifyMode)
         {
-            Interop.ControlDevel.DaliToolkitDevelControlNotifyAccessibilityStatesChange(SwigCPtr, (ulong)states, (int)notifyMode);
+            if (states is null)
+            {
+                throw new ArgumentNullException(nameof(states));
+            }
+
+            Interop.ControlDevel.DaliToolkitDevelControlNotifyAccessibilityStateChange(SwigCPtr, states.BitMask, (int)notifyMode);
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
         }
 
@@ -347,7 +353,7 @@ namespace Tizen.NUI.BaseComponents
         [EditorBrowsable(EditorBrowsableState.Never)]
         public AccessibilityStates GetAccessibilityStates()
         {
-            AccessibilityStates result = (AccessibilityStates) Interop.ControlDevel.DaliToolkitDevelControlGetAccessibilityStates(SwigCPtr);
+            var result = new AccessibilityStates {BitMask = Interop.ControlDevel.DaliToolkitDevelControlGetAccessibilityStates(SwigCPtr)};
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
             return result;
         }
@@ -373,9 +379,9 @@ namespace Tizen.NUI.BaseComponents
         /// <param name="state">Accessibility state</param>
         /// <param name="equal">True if the state is set or enabled, otherwise false</param>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public void EmitAccessibilityStatesChangedEvent(AccessibilityStates state, bool equal)
+        public void EmitAccessibilityStateChangedEvent(AccessibilityState state, bool equal)
         {
-            Interop.ControlDevel.DaliAccessibilityEmitAccessibilityStatesChangedEvent(SwigCPtr, (ulong)state, Convert.ToInt32(equal));
+            Interop.ControlDevel.DaliAccessibilityEmitAccessibilityStateChangedEvent(SwigCPtr, (int)state, Convert.ToInt32(equal));
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
         }
 
@@ -451,14 +457,21 @@ namespace Tizen.NUI.BaseComponents
             return Interop.ControlDevel.DaliToolkitDevelControlAccessibleImplNUIDuplicateString(value ?? "");
         }
 
-        private IntPtr DuplicateStates(AccessibilityStates states)
+        private IntPtr DuplicateRange(AccessibilityRange range)
         {
-            return Interop.ControlDevel.DaliToolkitDevelControlConvertState((ulong)states);
+            return Interop.ControlDevel.DaliAccessibilityNewRange(range.StartOffset, range.EndOffset, range.Content);
         }
 
-        private IntPtr DuplicateRange(AccessibilityRange range)
+        private static AccessibilityStates AccessibilityInitialStates = new AccessibilityStates();
+
+        private ulong AccessibilityCalculateStatesWrapper(ulong initialStates)
         {
-            return Interop.ControlDevel.DaliAccessibilityNewRange(range.StartOffset, range.EndOffset, range.Content);
+            lock (AccessibilityInitialStates)
+            {
+                AccessibilityInitialStates.BitMask = initialStates;
+
+                return AccessibilityCalculateStates().BitMask;
+            }
         }
 
         private Interop.ControlDevel.AccessibilityDelegate accessibilityDelegate = null;
@@ -484,7 +497,7 @@ namespace Tizen.NUI.BaseComponents
                     GetName = () => DuplicateString(AccessibilityGetName()),
                     GetDescription = () => DuplicateString(AccessibilityGetDescription()),
                     DoAction = (name) => AccessibilityDoAction(Marshal.PtrToStringAnsi(name)),
-                    CalculateStates = (states) => DuplicateStates(AccessibilityCalculateStates(states)),
+                    CalculateStates = (states) => AccessibilityCalculateStatesWrapper(states),
                     GetActionCount = () => AccessibilityGetActionCount(),
                     GetActionName = (index) => DuplicateString(AccessibilityGetActionName(index)),
                     ShouldReportZeroChildren = () => AccessibilityShouldReportZeroChildren(),
@@ -527,28 +540,6 @@ namespace Tizen.NUI.BaseComponents
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
         }
 
-        /// <summary>
-        /// A helper method to manipulate individual bit flags (e.g. turn them on or off)
-        /// </summary>
-        /// <param name="obj">An object that accumulates combination of bit flags</param>
-        /// <param name="bit">A bit flag to be operated</param>
-        /// <param name="state">A state of the bit flag to be set (0 == off, 1 == on)</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        static public void FlagSetter<T>(ref T obj ,T bit, bool state)
-        {
-            dynamic result = obj;
-            dynamic param = bit;
-            if (state)
-            {
-                result |= param;
-            }
-            else
-            {
-                result &= (~param);
-            }
-            obj = result;
-        }
-
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected override void Dispose(bool disposing)
         {
@@ -624,15 +615,15 @@ namespace Tizen.NUI.BaseComponents
         }
 
         [EditorBrowsable(EditorBrowsableState.Never)]
-        protected virtual AccessibilityStates AccessibilityCalculateStates(ulong states)
+        protected virtual AccessibilityStates AccessibilityCalculateStates()
         {
-            AccessibilityStates accessibilityStates = (AccessibilityStates)states;
+            var states = AccessibilityInitialStates;
 
-            FlagSetter(ref accessibilityStates, AccessibilityStates.Focused, this.State == States.Focused);
-            FlagSetter(ref accessibilityStates, AccessibilityStates.Enabled, this.State != States.Disabled);
-            FlagSetter(ref accessibilityStates, AccessibilityStates.Sensitive, this.Sensitive);
+            states[AccessibilityState.Focused] = this.State == States.Focused;
+            states[AccessibilityState.Enabled] = this.State != States.Disabled;
+            states[AccessibilityState.Sensitive] = this.Sensitive;
 
-            return accessibilityStates;
+            return states;
         }
 
         [EditorBrowsable(EditorBrowsableState.Never)]
index 9ab448c..0da2876 100755 (executable)
@@ -321,249 +321,290 @@ namespace Tizen.NUI.BaseComponents
     };
 
     /// <summary>
-    /// The states of accessibility object.
+    /// Enumeration of possible AT-SPI states for an object.
     /// </summary>
+    /// <seealso cref="AccessibilityStates"/>
     /// <remarks>
     /// Object can be in many states at the same time.
     /// </remarks>
     [EditorBrowsable(EditorBrowsableState.Never)]
-    [Flags]
-    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1028:EnumStorageShouldBeInt32", Justification = "System.Int32 type wouldn't have sufficient capacity")]
-    public enum AccessibilityStates : ulong
+    public enum AccessibilityState
     {
         /// <summary>
         /// Invalid state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Invalid                = (1UL << 0),
+        Invalid                = 0,
         /// <summary>
         /// Active state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Active                 = (1UL << 1),
+        Active                 = 1,
         /// <summary>
         /// Armed state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Armed                  = (1UL << 2),
+        Armed                  = 2,
         /// <summary>
         /// Busy state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Busy                   = (1UL << 3),
+        Busy                   = 3,
         /// <summary>
         /// Checked state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Checked                = (1UL << 4),
+        Checked                = 4,
         /// <summary>
         /// Collapsed state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Collapsed              = (1UL << 5),
+        Collapsed              = 5,
         /// <summary>
         /// Defunct state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Defunct                = (1UL << 6),
+        Defunct                = 6,
         /// <summary>
         /// Editable state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Editable               = (1UL << 7),
+        Editable               = 7,
         /// <summary>
         /// Enabled state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Enabled                = (1UL << 8),
+        Enabled                = 8,
         /// <summary>
         /// Expandable state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Expandable             = (1UL << 9),
+        Expandable             = 9,
         /// <summary>
         /// Expanded state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Expanded               = (1UL << 10),
+        Expanded               = 10,
         /// <summary>
         /// Focusable state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Focusable              = (1UL << 11),
+        Focusable              = 11,
         /// <summary>
         /// Focused state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Focused                = (1UL << 12),
+        Focused                = 12,
         /// <summary>
         /// Had tooltip state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        HasTooltip             = (1UL << 13),
+        HasTooltip             = 13,
         /// <summary>
         /// Horizontal state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Horizontal             = (1UL << 14),
+        Horizontal             = 14,
         /// <summary>
         /// Iconified state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Iconified              = (1UL << 15),
+        Iconified              = 15,
         /// <summary>
         /// Modal state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Modal                  = (1UL << 16),
+        Modal                  = 16,
         /// <summary>
         /// Multi-line state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        MultiLine              = (1UL << 17),
+        MultiLine              = 17,
         /// <summary>
         /// Multi-selectable state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        MultiSelectable        = (1UL << 18),
+        MultiSelectable        = 18,
         /// <summary>
         /// Opaque state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Opaque                 = (1UL << 19),
+        Opaque                 = 19,
         /// <summary>
         /// Pressed state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Pressed                = (1UL << 20),
+        Pressed                = 20,
         /// <summary>
         /// Resizeable state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Resizeable             = (1UL << 21),
+        Resizeable             = 21,
         /// <summary>
         /// Selectable state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Selectable             = (1UL << 22),
+        Selectable             = 22,
         /// <summary>
         /// Selected state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Selected               = (1UL << 23),
+        Selected               = 23,
         /// <summary>
         /// Sensitive state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Sensitive              = (1UL << 24),
+        Sensitive              = 24,
         /// <summary>
         /// Showing state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Showing                = (1UL << 25),
+        Showing                = 25,
         /// <summary>
         /// Single line state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        SingleLine             = (1UL << 26),
+        SingleLine             = 26,
         /// <summary>
         /// Stale state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Stale                  = (1UL << 27),
+        Stale                  = 27,
         /// <summary>
         /// Transient state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Transient              = (1UL << 28),
+        Transient              = 28,
         /// <summary>
         /// Vertical state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Vertical               = (1UL << 29),
+        Vertical               = 29,
         /// <summary>
         /// Visible state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Visible                = (1UL << 30),
+        Visible                = 30,
         /// <summary>
         /// Managed descendants state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        ManagesDescendants     = (1UL << 31),
+        ManagesDescendants     = 31,
         /// <summary>
         /// Indeterminate state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Indeterminate          = (1UL << 32),
+        Indeterminate          = 32,
         /// <summary>
         /// Required state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Required               = (1UL << 33),
+        Required               = 33,
         /// <summary>
         /// Truncated state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Truncated              = (1UL << 34),
+        Truncated              = 34,
         /// <summary>
         /// Animated state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Animated               = (1UL << 35),
+        Animated               = 35,
         /// <summary>
         /// Invalid entry state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        InvalidEntry           = (1UL << 36),
+        InvalidEntry           = 36,
         /// <summary>
         /// Supported auto completion state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        SupportsAutocompletion = (1UL << 37),
+        SupportsAutocompletion = 37,
         /// <summary>
         /// Selectable text state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        SelectableText         = (1UL << 38),
+        SelectableText         = 38,
         /// <summary>
         /// Default state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        IsDefault              = (1UL << 39),
+        IsDefault              = 39,
         /// <summary>
         /// Visited state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Visited                = (1UL << 40),
+        Visited                = 40,
         /// <summary>
         /// Checkable state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Checkable              = (1UL << 41),
+        Checkable              = 41,
         /// <summary>
         /// Had popup state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        HasPopup               = (1UL << 42),
+        HasPopup               = 42,
         /// <summary>
         /// Read only state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        ReadOnly               = (1UL << 43),
+        ReadOnly               = 43,
         /// <summary>
         /// Highlighted state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Highlighted            = (1UL << 44),
+        Highlighted            = 44,
         /// <summary>
         /// Highlightable state.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        Highlightable          = (1UL << 45),
+        Highlightable          = 45,
     };
 
     /// <summary>
+    /// A collection of AccessibilityStates
+    /// </summary>
+    /// <seealso cref="AccessibilityState"/>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class AccessibilityStates
+    {
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public AccessibilityStates(params AccessibilityState[] states)
+        {
+            foreach (var state in states)
+            {
+                BitMask |= (1UL << (int)state);
+            }
+        }
+
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        internal ulong BitMask { get; set; } = 0UL;
+
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public bool this[AccessibilityState state]
+        {
+            get
+            {
+                return Convert.ToBoolean(BitMask & (1UL << (int)state));
+            }
+            set
+            {
+                if (value)
+                {
+                    // Set N-th bit
+                    BitMask |= (1UL << (int)state);
+                }
+                else
+                {
+                    // Clear N-th bit
+                    BitMask &= ~(1UL << (int)state);
+                }
+            }
+        }
+    }
+
+    /// <summary>
     /// Notify mode for AccessibilityStates.
     /// </summary>
     [EditorBrowsable(EditorBrowsableState.Never)]
index 7842671..489c7c0 100755 (executable)
@@ -307,13 +307,13 @@ namespace Tizen.NUI.BaseComponents
         {
             SetVisible(true);
 
-            if (((GetAccessibilityStates() & AccessibilityStates.Modal) != 0))
+            if (GetAccessibilityStates()[AccessibilityState.Modal])
             {
                 RegisterDefaultLabel();
 
                 if (Accessibility.Accessibility.IsEnabled)
                 {
-                    EmitAccessibilityStatesChangedEvent(AccessibilityStates.Showing, true);
+                    EmitAccessibilityStateChangedEvent(AccessibilityState.Showing, true);
                 }
             }
         }
@@ -331,13 +331,13 @@ namespace Tizen.NUI.BaseComponents
         {
             SetVisible(false);
 
-            if (((GetAccessibilityStates() & AccessibilityStates.Modal) != 0))
+            if (GetAccessibilityStates()[AccessibilityState.Modal])
             {
                 UnregisterDefaultLabel();
 
                 if (Accessibility.Accessibility.IsEnabled)
                 {
-                    EmitAccessibilityStatesChangedEvent(AccessibilityStates.Showing, false);
+                    EmitAccessibilityStateChangedEvent(AccessibilityState.Showing, false);
                 }
             }
         }
index afe1034..09c2b1c 100755 (executable)
@@ -179,7 +179,7 @@ namespace Tizen.NUI.Devel.Tests
             var testingTarget = new AccessibilityRange();
             Assert.IsNotNull(testingTarget, "Can't create success object AccessibilityRange");
             Assert.IsInstanceOf<AccessibilityRange>(testingTarget, "Should be an instance of AccessibilityRange type.");
-                
+
             testingTarget.StartOffset = 10;
             Assert.AreEqual(10, testingTarget.StartOffset, "Should be equal!");
 
@@ -354,7 +354,7 @@ namespace Tizen.NUI.Devel.Tests
                     testingTarget.AppendAccessibilityRelation(child, AccessibilityRelationType.MemberOf);
                     var result = testingTarget.GetAccessibilityRelations();
                     tlog.Debug(tag, "AccessibilityRelations : " + result);
-                    
+
                     testingTarget.RemoveAccessibilityRelation(child, AccessibilityRelationType.MemberOf);
                     testingTarget.ClearAccessibilityRelations();
                 }
@@ -426,7 +426,7 @@ namespace Tizen.NUI.Devel.Tests
             Assert.IsNotNull(testingTarget, "Can't create success object View");
             Assert.IsInstanceOf<View>(testingTarget, "Should be an instance of View type.");
 
-           
+
             testingTarget.SetAccessibilityReadingInfoTypes(AccessibilityReadingInfoTypes.Description);
             var result = testingTarget.GetAccessibilityReadingInfoTypes();
             tlog.Debug(tag, "AccessibilityReadingInfoTypes : " + result);
@@ -457,7 +457,7 @@ namespace Tizen.NUI.Devel.Tests
             Assert.IsNotNull(testingTarget, "Can't create success object View");
             Assert.IsInstanceOf<View>(testingTarget, "Should be an instance of View type.");
 
-            testingTarget.NotifyAccessibilityStatesChange(AccessibilityStates.Busy, AccessibilityStatesNotifyMode.Recursive);
+            testingTarget.NotifyAccessibilityStatesChange(new AccessibilityStates(AccessibilityState.Busy), AccessibilityStatesNotifyMode.Recursive);
             var result = testingTarget.GetAccessibilityStates();
             tlog.Debug(tag, "AccessibilityStates : " + result);
 
@@ -540,14 +540,14 @@ namespace Tizen.NUI.Devel.Tests
 
         [Test]
         [Category("P1")]
-        [Description("ViewAccessibility.EmitAccessibilityStatesChangedEvent.")]
-        [Property("SPEC", "Tizen.NUI.ViewAccessibility.EmitAccessibilityStatesChangedEvent M")]
+        [Description("ViewAccessibility.EmitAccessibilityStateChangedEvent.")]
+        [Property("SPEC", "Tizen.NUI.ViewAccessibility.EmitAccessibilityStateChangedEvent M")]
         [Property("SPEC_URL", "-")]
         [Property("CRITERIA", "MR")]
         [Property("AUTHOR", "guowei.wang@samsung.com")]
-        public void ViewAccessibilityEmitAccessibilityStatesChangedEvent()
+        public void ViewAccessibilityEmitAccessibilityStateChangedEvent()
         {
-            tlog.Debug(tag, $"ViewAccessibilityEmitAccessibilityStatesChangedEvent START");
+            tlog.Debug(tag, $"ViewAccessibilityEmitAccessibilityStateChangedEvent START");
 
             var testingTarget = new CheckBox()
             {
@@ -560,7 +560,7 @@ namespace Tizen.NUI.Devel.Tests
 
             try
             {
-                testingTarget.EmitAccessibilityStatesChangedEvent(AccessibilityStates.Checked, true);
+                testingTarget.EmitAccessibilityStateChangedEvent(AccessibilityState.Checked, true);
             }
             catch (Exception e)
             {
@@ -569,7 +569,7 @@ namespace Tizen.NUI.Devel.Tests
             }
 
             testingTarget.Dispose();
-            tlog.Debug(tag, $"ViewAccessibilityEmitAccessibilityStatesChangedEvent END (OK)");
+            tlog.Debug(tag, $"ViewAccessibilityEmitAccessibilityStateChangedEvent END (OK)");
         }
 
         [Test]