2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
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.
18 using System.Collections.Generic;
19 using System.Runtime.InteropServices;
22 namespace ElmSharp.Wearable
25 /// RotaryEventManager serve functions for global Rotary event like Galaxy Gear.
27 /// <since_tizen> preview </since_tizen>
28 public static class RotaryEventManager
30 static Dictionary<RotaryEventHandler, Interop.Eext.Eext_Rotary_Handler_Cb> s_rotaryEventHandlers = new Dictionary<RotaryEventHandler, Interop.Eext.Eext_Rotary_Handler_Cb>();
33 /// Rotated will triggered when rotatable device like Galaxy Gear Bezel is rotated.
35 /// <since_tizen> preview </since_tizen>
36 public static event RotaryEventHandler Rotated
40 if (s_rotaryEventHandlers.ContainsKey(value)) return;
42 Interop.Eext.Eext_Rotary_Handler_Cb cb = (data, infoPtr) =>
44 var info = Interop.Eext.FromIntPtr(infoPtr);
45 value.Invoke(new RotaryEventArgs
47 IsClockwise = info.Direction == Interop.Eext.Eext_Rotary_Event_Direction.Clockwise,
48 Timestamp = info.TimeStamp
52 Interop.Eext.eext_rotary_event_handler_add(cb, IntPtr.Zero);
53 s_rotaryEventHandlers[value] = cb;
58 Interop.Eext.Eext_Rotary_Handler_Cb cb;
59 if (s_rotaryEventHandlers.TryGetValue(value, out cb))
61 Interop.Eext.eext_rotary_event_handler_del(cb);
62 s_rotaryEventHandlers.Remove(value);
70 /// RotaryEventManager serve extension functions for Rotary event to EvasObject on device like Galaxy Gear.
72 /// <since_tizen> preview </since_tizen>
73 public static class RotaryEventExtensions
75 static Dictionary<EvasObject, RotaryEventHandler> s_rotaryObjectEventHandlers = new Dictionary<EvasObject, RotaryEventHandler>();
76 static Dictionary<EvasObject, Interop.Eext.Eext_Rotary_Event_Cb> s_rotaryObjectEventMap = new Dictionary<EvasObject, Interop.Eext.Eext_Rotary_Event_Cb>();
79 /// Add a handler for Rotary event on specific EvasObject.
81 /// <param name="obj">Target EvasObject</param>
82 /// <param name="handler">Event handler for Rotary event</param>
83 /// <since_tizen> preview </since_tizen>
84 public static void AddRotaryEventHandler(this EvasObject obj, RotaryEventHandler handler)
86 EnableRotaryEventHandler(obj);
88 if (s_rotaryObjectEventHandlers.ContainsKey(obj))
90 s_rotaryObjectEventHandlers[obj] += handler;
94 s_rotaryObjectEventHandlers[obj] = handler;
99 /// Remove a handler on specific EvasObject for Rotary event.
101 /// <param name="obj">Target EvasObject</param>
102 /// <param name="handler">Event handler for Rotary event</param>
103 /// <since_tizen> preview </since_tizen>
104 public static void RemoveRotaryEventHandler(this EvasObject obj, RotaryEventHandler handler)
106 if (s_rotaryObjectEventHandlers.ContainsKey(obj))
108 s_rotaryObjectEventHandlers[obj] -= handler;
109 if (s_rotaryObjectEventHandlers[obj] == null)
111 DisableRotaryEventHandler(obj, false);
112 s_rotaryObjectEventHandlers.Remove(obj);
118 /// Activate this circle widget can take Rotary event.
120 /// <param name="widget">Target circle widget</param>
121 /// <since_tizen> preview </since_tizen>
122 public static void Activate(this IRotaryActionWidget widget)
124 Interop.Eext.eext_rotary_object_event_activated_set(widget.CircleHandle, true);
128 /// Deactivate this circle widget is blocked from Rotary event.
130 /// <param name="widget">Target circle widget</param>
131 /// <since_tizen> preview </since_tizen>
132 public static void Deactivate(this IRotaryActionWidget widget)
134 Interop.Eext.eext_rotary_object_event_activated_set(widget.CircleHandle, false);
138 /// Activate this object can take Rotary event.
140 /// <param name="obj">Target object</param>
141 /// <since_tizen> preview </since_tizen>
142 public static void Activate(this EvasObject obj)
144 Interop.Eext.eext_rotary_object_event_activated_set(obj, true);
148 /// Deactivate this object is blocked from Rotary event.
150 /// <param name="obj">Target object</param>
151 /// <since_tizen> preview </since_tizen>
152 public static void Deactivate(this EvasObject obj)
154 Interop.Eext.eext_rotary_object_event_activated_set(obj, false);
157 static void EnableRotaryEventHandler(EvasObject obj)
159 if (!s_rotaryObjectEventMap.ContainsKey(obj))
161 Interop.Eext.Eext_Rotary_Event_Cb cb = (d, o, i) =>
163 RotaryEventHandler events;
164 if (s_rotaryObjectEventHandlers.TryGetValue(obj, out events))
166 var info = Interop.Eext.FromIntPtr(i);
167 events?.Invoke(new RotaryEventArgs
169 IsClockwise = info.Direction == Interop.Eext.Eext_Rotary_Event_Direction.Clockwise,
170 Timestamp = info.TimeStamp
175 Interop.Eext.eext_rotary_object_event_callback_add(obj, cb, IntPtr.Zero);
176 s_rotaryObjectEventMap[obj] = cb;
177 obj.Deleted += (s, e) => DisableRotaryEventHandler(obj, true);
181 static void DisableRotaryEventHandler(EvasObject obj, bool removeHandler)
183 Interop.Eext.Eext_Rotary_Event_Cb cb;
184 if (s_rotaryObjectEventMap.TryGetValue(obj, out cb))
186 Interop.Eext.eext_rotary_object_event_callback_del(obj, cb);
187 s_rotaryObjectEventMap.Remove(obj);
189 if (removeHandler && s_rotaryObjectEventHandlers.ContainsKey(obj))
191 s_rotaryObjectEventHandlers.Remove(obj);
197 /// Handler for Rotary event
199 /// <param name="args">Rotary event information</param>
200 /// <since_tizen> preview </since_tizen>
201 public delegate void RotaryEventHandler(RotaryEventArgs args);
204 /// RotaryEventArgs serve information for triggered rotary event.
206 /// <since_tizen> preview </since_tizen>
207 public class RotaryEventArgs : EventArgs
210 /// IsClockwise is true when Rotary device rotated clockwise direction or false on counter clockwise.
212 /// <since_tizen> preview </since_tizen>
213 public bool IsClockwise { get; set; }
216 /// Timestamp of rotary event
218 /// <since_tizen> preview </since_tizen>
219 public uint Timestamp { get; set; }