2 * Copyright(c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 using System.ComponentModel;
20 using System.Runtime.InteropServices;
21 using Tizen.NUI.BaseComponents;
22 using System.Diagnostics.CodeAnalysis;
24 using tlog = Tizen.Log;
27 namespace Tizen.NUI.Accessibility
30 /// Accessibility provides Dali-ATSPI interface which has functionality of Screen-Reader and general accessibility
32 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
33 [SuppressMessage("Microsoft.Design", "CA1724: Type names should not match namespaces")]
34 [SuppressMessage("Microsoft.Design", "CA1001:Types that own disposable fields should be disposable", Justification = "This is a singleton class and is not disposed")]
35 [EditorBrowsable(EditorBrowsableState.Never)]
36 public class Accessibility
38 #region Constructor, Destructor, Dispose
39 private Accessibility()
42 dummy.Name = "dali-atspi-singleton";
45 /// destructor. This is HiddenAPI. recommended not to use in public.
49 Tizen.Log.Debug("NUI", $"Accessibility is destroyed\n");
51 #endregion Constructor, Destructor, Dispose
56 /// Instance for singleton
58 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
59 [EditorBrowsable(EditorBrowsableState.Never)]
60 public static Accessibility Instance
69 /// Get the current status
71 /// <returns>Current enabled status</returns>
72 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
73 [EditorBrowsable(EditorBrowsableState.Never)]
74 static public bool GetStatus()
82 /// <param name="sentence">Content to be spoken</param>
83 /// <param name="discardable">true to be stopped and discarded when other Say is triggered</param>
84 /// <returns></returns>
85 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
86 [EditorBrowsable(EditorBrowsableState.Never)]
87 public bool Say(string sentence, bool discardable)
89 IntPtr callbackIntPtr = IntPtr.Zero;
90 if (sayFinishedEventHandler != null)
92 callback = SayFinishedEventCallback;
93 callbackIntPtr = Marshal.GetFunctionPointerForDelegate<Delegate>(callback);
95 bool ret = Interop.Accessibility.Say(View.getCPtr(dummy), sentence, discardable, callbackIntPtr);
96 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
101 /// To make Say be paused or resumed
103 /// <param name="pause">true to be paused, false to be resumed</param>
104 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
105 [EditorBrowsable(EditorBrowsableState.Never)]
106 public void PauseResume(bool pause)
108 Interop.Accessibility.PauseResume(View.getCPtr(dummy), pause);
109 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
113 /// Cancels anything screen-reader is reading / has queued to read
115 /// <param name="alsoNonDiscardable">whether to cancel non-discardable readings as well</param>
116 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
117 [EditorBrowsable(EditorBrowsableState.Never)]
118 public void StopReading(bool alsoNonDiscardable)
120 Interop.Accessibility.StopReading(View.getCPtr(dummy), alsoNonDiscardable);
121 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
125 /// Get View that is used to highlight widget.
127 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
128 [EditorBrowsable(EditorBrowsableState.Never)]
129 public View GetHighlightFrameView()
131 var ptr = Interop.ControlDevel.DaliAccessibilityAccessibleGetHighlightActor();
132 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
133 if (ptr == IntPtr.Zero)
135 return new View(ptr, true);
139 /// Set view that will be used to highlight widget.
141 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
142 [EditorBrowsable(EditorBrowsableState.Never)]
143 public void SetHighlightFrameView(View view)
145 Interop.ControlDevel.DaliAccessibilityAccessibleSetHighlightActor(View.getCPtr(view));
146 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
150 /// Get highligted View.
152 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
153 [EditorBrowsable(EditorBrowsableState.Never)]
154 public View GetCurrentlyHighlightedView()
156 var ptr = Interop.ControlDevel.DaliAccessibilityAccessibleGetCurrentlyHighlightedActor();
157 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
158 if (ptr == IntPtr.Zero)
160 return new View(ptr, true);
166 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
167 [EditorBrowsable(EditorBrowsableState.Never)]
168 public bool ClearCurrentlyHighlightedView()
170 using (View view = GetCurrentlyHighlightedView())
172 return view.ClearAccessibilityHighlight();
178 #region Event, Enum, Struct, ETC
180 /// Say Finished event arguments
182 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
183 [EditorBrowsable(EditorBrowsableState.Never)]
184 public class SayFinishedEventArgs : EventArgs
187 /// The state of Say finished
189 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
190 [EditorBrowsable(EditorBrowsableState.Never)]
191 public SayFinishedState State
197 internal SayFinishedEventArgs(int result)
199 State = (SayFinishedState)(result);
200 tlog.Fatal(tag, $"SayFinishedEventArgs Constructor! State={State}");
205 /// Enum of Say finished event argument status
207 [Obsolete("Please do not use! This will be removed. Please use Accessibility.SayFinishedState instead!")]
208 [EditorBrowsable(EditorBrowsableState.Never)]
209 public enum SayFinishedStates
214 [Obsolete("Please do not use! This will be removed. Please use Accessibility.SayFinishedState.Invalid instead!")]
215 [EditorBrowsable(EditorBrowsableState.Never)]
220 [Obsolete("Please do not use! This will be removed. Please use Accessibility.SayFinishedState.Invalid instead!")]
221 [EditorBrowsable(EditorBrowsableState.Never)]
226 [Obsolete("Please do not use! This will be removed. Please use Accessibility.SayFinishedState.Invalid instead!")]
227 [EditorBrowsable(EditorBrowsableState.Never)]
232 [Obsolete("Please do not use! This will be removed. Please use Accessibility.SayFinishedState.Invalid instead!")]
233 [EditorBrowsable(EditorBrowsableState.Never)]
238 /// Enum of Say finished event argument status
240 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
241 [EditorBrowsable(EditorBrowsableState.Never)]
242 public enum SayFinishedState
247 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
248 [EditorBrowsable(EditorBrowsableState.Never)]
253 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
254 [EditorBrowsable(EditorBrowsableState.Never)]
259 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
260 [EditorBrowsable(EditorBrowsableState.Never)]
265 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
266 [EditorBrowsable(EditorBrowsableState.Never)]
271 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
272 [EditorBrowsable(EditorBrowsableState.Never)]
277 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
278 [EditorBrowsable(EditorBrowsableState.Never)]
283 /// When Say is finished, this event is triggered
285 // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
286 [EditorBrowsable(EditorBrowsableState.Never)]
287 public event EventHandler<SayFinishedEventArgs> SayFinished
289 add => sayFinishedEventHandler += value;
290 remove => sayFinishedEventHandler -= value;
292 #endregion Event, Enum, Struct, ETC
296 internal void PauseResume(View target, bool pause)
298 Interop.Accessibility.PauseResume(View.getCPtr(target), pause);
299 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
302 internal bool Say(View target, string sentence, bool discardable)
304 IntPtr callbackIntPtr = IntPtr.Zero;
305 if (sayFinishedEventHandler != null)
307 callback = SayFinishedEventCallback;
308 callbackIntPtr = Marshal.GetFunctionPointerForDelegate<Delegate>(callback);
310 bool ret = Interop.Accessibility.Say(View.getCPtr(target), sentence, discardable, callbackIntPtr);
311 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
318 private static readonly Accessibility accessibility = new Accessibility();
320 private event EventHandler<SayFinishedEventArgs> sayFinishedEventHandler;
322 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
323 private delegate void SayFinishedEventCallbackType(int result);
325 private SayFinishedEventCallbackType callback = null;
327 private void SayFinishedEventCallback(int result)
329 tlog.Fatal(tag, $"sayFinishedEventCallback(res={result}) called!");
330 sayFinishedEventHandler?.Invoke(this, new SayFinishedEventArgs(result));
335 private static string tag = "NUITEST";