X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2FTizen.NUI%2Fsrc%2Fpublic%2FAccessibility%2FAccessibility.cs;h=77ac71117af35500e04f673d7cc835ba0c75d65b;hb=8024def7eb53ab6c88704ac719a607ff7ab7f396;hp=32db1406561542b52f4368dadfd10eaaf915e9e1;hpb=497e7631261b47f523873c176b0ed863ce26c488;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git diff --git a/src/Tizen.NUI/src/public/Accessibility/Accessibility.cs b/src/Tizen.NUI/src/public/Accessibility/Accessibility.cs index 32db140..77ac711 100755 --- a/src/Tizen.NUI/src/public/Accessibility/Accessibility.cs +++ b/src/Tizen.NUI/src/public/Accessibility/Accessibility.cs @@ -30,35 +30,38 @@ namespace Tizen.NUI.Accessibility [SuppressMessage("Microsoft.Design", "CA1724: Type names should not match namespaces")] [SuppressMessage("Microsoft.Design", "CA1001:Types that own disposable fields should be disposable", Justification = "This is a singleton class and is not disposed")] [EditorBrowsable(EditorBrowsableState.Never)] - public class Accessibility + public static class Accessibility { - #region Constructor, Destructor, Dispose - private Accessibility() + #region Constructor + [SuppressMessage("Microsoft.Performance", "CA1810: Initialize reference type static fields inline", Justification = "Need to call native code")] + static Accessibility() { - dummy = new View(); - dummy.Name = "dali-atspi-singleton"; - } - /// - /// destructor. This is HiddenAPI. recommended not to use in public. - /// - ~Accessibility() - { - Tizen.Log.Debug("NUI", $"Accessibility is destroyed\n"); - } - #endregion Constructor, Destructor, Dispose + enabledSignalHandler = () => + { + Enabled?.Invoke(typeof(Accessibility), EventArgs.Empty); + }; + disabledSignalHandler = () => + { + Disabled?.Invoke(typeof(Accessibility), EventArgs.Empty); + }; - #region Property - /// - /// Instance for singleton - /// - // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) - [EditorBrowsable(EditorBrowsableState.Never)] - public static Accessibility Instance - { - get => accessibility; + screenReaderEnabledSignalHandler = () => + { + ScreenReaderEnabled?.Invoke(typeof(Accessibility), EventArgs.Empty); + }; + + screenReaderDisabledSignalHandler = () => + { + ScreenReaderDisabled?.Invoke(typeof(Accessibility), EventArgs.Empty); + }; + + Interop.Accessibility.RegisterEnabledDisabledSignalHandler(enabledSignalHandler, disabledSignalHandler); + Interop.Accessibility.RegisterScreenReaderEnabledDisabledSignalHandler(screenReaderEnabledSignalHandler, screenReaderDisabledSignalHandler); } + #endregion Constructor + #region Property /// /// Flag to check whether the state of Accessibility is enabled or not. /// @@ -75,21 +78,25 @@ namespace Tizen.NUI.Accessibility } } - #endregion Property - - - #region Method /// - /// Get the current status + /// Flag to check whether the state of Screen Reader is enabled or not. /// - /// Current enabled status - // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) + /// + /// Getter returns true if Screen Reader is enabled, false otherwise. + /// + /// This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) [EditorBrowsable(EditorBrowsableState.Never)] - static public bool GetStatus() + public static bool IsScreenReaderEnabled { - return true; + get + { + return (bool)Interop.Accessibility.IsScreenReaderEnabled(); + } } + #endregion Property + + #region Method /// /// Start to speak /// @@ -98,15 +105,10 @@ namespace Tizen.NUI.Accessibility /// // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) [EditorBrowsable(EditorBrowsableState.Never)] - public bool Say(string sentence, bool discardable) + public static bool Say(string sentence, bool discardable) { - IntPtr callbackIntPtr = IntPtr.Zero; - if (sayFinishedEventHandler != null) - { - callback = SayFinishedEventCallback; - callbackIntPtr = Marshal.GetFunctionPointerForDelegate(callback); - } - bool ret = Interop.Accessibility.Say(View.getCPtr(dummy), sentence, discardable, callbackIntPtr); + bool ret = Interop.Accessibility.Say(sentence, discardable, Marshal.GetFunctionPointerForDelegate(callback)); + if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } @@ -117,9 +119,9 @@ namespace Tizen.NUI.Accessibility /// true to be paused, false to be resumed // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) [EditorBrowsable(EditorBrowsableState.Never)] - public void PauseResume(bool pause) + public static void PauseResume(bool pause) { - Interop.Accessibility.PauseResume(View.getCPtr(dummy), pause); + Interop.Accessibility.PauseResume(pause); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } @@ -129,9 +131,9 @@ namespace Tizen.NUI.Accessibility /// whether to cancel non-discardable readings as well // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) [EditorBrowsable(EditorBrowsableState.Never)] - public void StopReading(bool alsoNonDiscardable) + public static void StopReading(bool alsoNonDiscardable) { - Interop.Accessibility.StopReading(View.getCPtr(dummy), alsoNonDiscardable); + Interop.Accessibility.StopReading(alsoNonDiscardable); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } @@ -141,9 +143,9 @@ namespace Tizen.NUI.Accessibility /// whether to suppress reading of screen-reader // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) [EditorBrowsable(EditorBrowsableState.Never)] - public bool SuppressScreenReader(bool suppress) + public static bool SuppressScreenReader(bool suppress) { - bool ret = Interop.Accessibility.SuppressScreenReader(View.getCPtr(dummy), suppress); + bool ret = Interop.Accessibility.SuppressScreenReader(suppress); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } @@ -180,7 +182,7 @@ namespace Tizen.NUI.Accessibility /// // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) [EditorBrowsable(EditorBrowsableState.Never)] - public View GetHighlightFrameView() + public static View GetHighlightFrameView() { var ptr = Interop.ControlDevel.DaliAccessibilityAccessibleGetHighlightActor(); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); @@ -194,7 +196,7 @@ namespace Tizen.NUI.Accessibility /// // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) [EditorBrowsable(EditorBrowsableState.Never)] - public void SetHighlightFrameView(View view) + public static void SetHighlightFrameView(View view) { Interop.ControlDevel.DaliAccessibilityAccessibleSetHighlightActor(View.getCPtr(view)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); @@ -205,13 +207,13 @@ namespace Tizen.NUI.Accessibility /// // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) [EditorBrowsable(EditorBrowsableState.Never)] - public View GetCurrentlyHighlightedView() + public static View GetCurrentlyHighlightedView() { var ptr = Interop.ControlDevel.DaliAccessibilityAccessibleGetCurrentlyHighlightedActor(); + if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); - if (ptr == IntPtr.Zero) - return null; - return new View(ptr, true); + + return dummyHandle.GetInstanceSafely(ptr); } /// @@ -219,12 +221,11 @@ namespace Tizen.NUI.Accessibility /// // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) [EditorBrowsable(EditorBrowsableState.Never)] - public bool ClearCurrentlyHighlightedView() + public static bool ClearCurrentlyHighlightedView() { - using (View view = GetCurrentlyHighlightedView()) - { - return view?.ClearAccessibilityHighlight() ?? false; - } + var view = GetCurrentlyHighlightedView(); + + return view?.ClearAccessibilityHighlight() ?? false; } #endregion Method @@ -280,53 +281,60 @@ namespace Tizen.NUI.Accessibility /// // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) [EditorBrowsable(EditorBrowsableState.Never)] - public event EventHandler SayFinished - { - add => sayFinishedEventHandler += value; - remove => sayFinishedEventHandler -= value; - } - #endregion Event, Enum, Struct, ETC + public static event EventHandler SayFinished; + /// + /// Triggered whenever the value of IsEnabled would change from false to true + /// + // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) + [EditorBrowsable(EditorBrowsableState.Never)] + public static event EventHandler Enabled; - #region Internal - internal void PauseResume(View target, bool pause) - { - Interop.Accessibility.PauseResume(View.getCPtr(target), pause); - if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); - } + /// + /// Triggered whenever the value of IsEnabled would change from true to false + /// + // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) + [EditorBrowsable(EditorBrowsableState.Never)] + public static event EventHandler Disabled; - internal bool Say(View target, string sentence, bool discardable) - { - IntPtr callbackIntPtr = IntPtr.Zero; - if (sayFinishedEventHandler != null) - { - callback = SayFinishedEventCallback; - callbackIntPtr = Marshal.GetFunctionPointerForDelegate(callback); - } - bool ret = Interop.Accessibility.Say(View.getCPtr(target), sentence, discardable, callbackIntPtr); - if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); - return ret; - } - #endregion Internal + /// + /// Triggered whenever the value of IsScreenReaderEnabled would change from false to true + /// + // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) + [EditorBrowsable(EditorBrowsableState.Never)] + public static event EventHandler ScreenReaderEnabled; + /// + /// Triggered whenever the value of IsScreenReaderEnabled would change from true to false + /// + // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API) + [EditorBrowsable(EditorBrowsableState.Never)] + public static event EventHandler ScreenReaderDisabled; - #region Private - private static readonly Accessibility accessibility = new Accessibility(); + #endregion Event, Enum, Struct, ETC - private event EventHandler sayFinishedEventHandler; + #region Private - [UnmanagedFunctionPointer(CallingConvention.StdCall)] + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void SayFinishedEventCallbackType(int result); - private SayFinishedEventCallbackType callback = null; + private static SayFinishedEventCallbackType callback = SayFinishedEventCallback; + + private static Interop.Accessibility.EnabledDisabledSignalHandler enabledSignalHandler = null; + + private static Interop.Accessibility.EnabledDisabledSignalHandler disabledSignalHandler = null; + + private static Interop.Accessibility.EnabledDisabledSignalHandler screenReaderEnabledSignalHandler = null; + + private static Interop.Accessibility.EnabledDisabledSignalHandler screenReaderDisabledSignalHandler = null; - private void SayFinishedEventCallback(int result) + private static void SayFinishedEventCallback(int result) { NUILog.Debug($"sayFinishedEventCallback(res={result}) called!"); - sayFinishedEventHandler?.Invoke(this, new SayFinishedEventArgs(result)); + SayFinished?.Invoke(typeof(Accessibility), new SayFinishedEventArgs(result)); } - private View dummy; + private static BaseHandle dummyHandle = new BaseHandle(); #endregion Private }