Revert "Revert "[NUI] Rebase DevelNUI (#2507)" (#2508)"
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / Accessibility / Accessibility.cs
1 /*
2  * Copyright(c) 2019 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 using global::System;
19 using System.ComponentModel;
20 using System.Runtime.InteropServices;
21 using Tizen.NUI.BaseComponents;
22 using System.Diagnostics.CodeAnalysis;
23 #if (NUI_DEBUG_ON)
24 using tlog = Tizen.Log;
25 #endif
26
27 namespace Tizen.NUI.Accessibility
28 {
29     /// <summary>
30     /// Accessibility provides Dali-ATSPI interface which has funtionality of Screen-Reader and general accessibility
31     /// </summary>
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
37     {
38         #region Constructor, Distructor, Dispose
39         private Accessibility()
40         {
41             dummy = new View();
42             dummy.Name = "dali-atspi-singleton";
43         }
44         /// <summary>
45         /// destructor. This is HiddenAPI. recommended not to use in public.
46         /// </summary>
47         ~Accessibility()
48         {
49             Tizen.Log.Debug("NUI",$"Accessibility is destroyed\n");
50         }
51         #endregion Constructor, Distructor, Dispose
52
53
54         #region Property
55         /// <summary>
56         /// Instance for singleton
57         /// </summary>
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
61         {
62             get => _accessibility;
63         }
64         #endregion Property
65
66
67         #region Method
68         /// <summary>
69         /// Get the current status
70         /// </summary>
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()
75         {
76             return true;
77         }
78
79         /// <summary>
80         /// Start to speak
81         /// </summary>
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)
88         {
89             IntPtr callbackIntPtr = IntPtr.Zero;
90             if (_sayFinishedEventHandler != null)
91             {
92                 callback = _sayFinishedEventCallback;
93                 callbackIntPtr = Marshal.GetFunctionPointerForDelegate<Delegate>(callback);
94             }
95             bool ret = Interop.Accessibility.Say(View.getCPtr(dummy), sentence, discardable, callbackIntPtr);
96             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
97             return ret;
98         }
99
100         /// <summary>
101         /// To make Say be paused or resumed
102         /// </summary>
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)
107         {
108             Interop.Accessibility.PauseResume(View.getCPtr(dummy), pause);
109             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
110         }
111         #endregion Method
112
113
114         #region Event, Enum, Struct, ETC
115         /// <summary>
116         ///  Say Finished event arguments
117         /// </summary>
118         // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
119         [EditorBrowsable(EditorBrowsableState.Never)]
120         public class SayFinishedEventArgs : EventArgs
121         {
122             /// <summary>
123             /// The state of Say finished
124             /// </summary>
125             // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
126             [EditorBrowsable(EditorBrowsableState.Never)]
127             public SayFinishedState State
128             {
129                 private set;
130                 get;
131             }
132
133             internal SayFinishedEventArgs(int result)
134             {
135                 State = (SayFinishedState)(result);
136                 tlog.Fatal(tag, $"SayFinishedEventArgs Constructor! State={State}");
137             }
138         }
139
140         /// <summary>
141         /// Enum of Say finished event argument status
142         /// </summary>
143         [Obsolete("Please do not use! This will be removed. Please use Accessibility.SayFinishedState instead!")]
144         [EditorBrowsable(EditorBrowsableState.Never)]
145         public enum SayFinishedStates
146         {
147             /// <summary>
148             /// Invalid
149             /// </summary>
150             [Obsolete("Please do not use! This will be removed. Please use Accessibility.SayFinishedState.Invalid instead!")]
151             [EditorBrowsable(EditorBrowsableState.Never)]
152             Invalid = -1,
153             /// <summary>
154             /// Cancelled
155             /// </summary>
156             [Obsolete("Please do not use! This will be removed. Please use Accessibility.SayFinishedState.Invalid instead!")]
157             [EditorBrowsable(EditorBrowsableState.Never)]
158             Cancelled = 1,
159             /// <summary>
160             /// Stopped
161             /// </summary>
162             [Obsolete("Please do not use! This will be removed. Please use Accessibility.SayFinishedState.Invalid instead!")]
163             [EditorBrowsable(EditorBrowsableState.Never)]
164             Stopped = 2,
165             /// <summary>
166             /// Skipped
167             /// </summary>
168             [Obsolete("Please do not use! This will be removed. Please use Accessibility.SayFinishedState.Invalid instead!")]
169             [EditorBrowsable(EditorBrowsableState.Never)]
170             Skipped = 3
171         }
172
173         /// <summary>
174         /// Enum of Say finished event argument status
175         /// </summary>
176         // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
177         [EditorBrowsable(EditorBrowsableState.Never)]
178         public enum SayFinishedState
179         {
180             /// <summary>
181             /// Invalid
182             /// </summary>
183             // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
184             [EditorBrowsable(EditorBrowsableState.Never)]
185             Invalid = -1,
186             /// <summary>
187             /// Cancelled
188             /// </summary>
189             // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
190             [EditorBrowsable(EditorBrowsableState.Never)]
191             Cancelled = 1,
192             /// <summary>
193             /// Stopped
194             /// </summary>
195             // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
196             [EditorBrowsable(EditorBrowsableState.Never)]
197             Stopped = 2,
198             /// <summary>
199             /// Skipped
200             /// </summary>
201             // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
202             [EditorBrowsable(EditorBrowsableState.Never)]
203             Skipped = 3
204         }
205
206         /// <summary>
207         /// When Say is finished, this event is triggered
208         /// </summary>
209         // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
210         [EditorBrowsable(EditorBrowsableState.Never)]
211         public event EventHandler<SayFinishedEventArgs> SayFinished
212         {
213             add => _sayFinishedEventHandler += value;
214             remove => _sayFinishedEventHandler -= value;
215         }
216         #endregion Event, Enum, Struct, ETC
217
218
219         #region Internal
220         internal void PauseResume(View target, bool pause)
221         {
222             Interop.Accessibility.PauseResume(View.getCPtr(target), pause);
223             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
224         }
225
226         internal bool Say(View target, string sentence, bool discardable)
227         {
228             IntPtr callbackIntPtr = IntPtr.Zero;
229             if (_sayFinishedEventHandler != null)
230             {
231                 callback = _sayFinishedEventCallback;
232                 callbackIntPtr = Marshal.GetFunctionPointerForDelegate<Delegate>(callback);
233             }
234             bool ret = Interop.Accessibility.Say(View.getCPtr(target), sentence, discardable, callbackIntPtr);
235             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
236             return ret;
237         }
238         #endregion Internal
239
240
241         #region Private
242         private static readonly Accessibility _accessibility = new Accessibility();
243
244         private event EventHandler<SayFinishedEventArgs> _sayFinishedEventHandler;
245
246         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
247         private delegate void _sayFinishedEventCallbackType(int result);
248
249         private _sayFinishedEventCallbackType callback = null;
250
251         private void _sayFinishedEventCallback(int result)
252         {
253             tlog.Fatal(tag, $"_sayFinishedEventCallback(res={result}) called!");
254             _sayFinishedEventHandler?.Invoke(this, new SayFinishedEventArgs(result));
255         }
256
257         private View dummy;
258
259         private static string tag = "NUITEST";
260         #endregion Private
261     }
262 }