Update minictrl and assistive_light
[apps/core/preloaded/quickpanel.git] / daemon / settings / settings_icon_common.c
1 /*
2  * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved
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 #include <Elementary.h>
19
20 #include <tzsh.h>
21 #include <tzsh_quickpanel_service.h>
22 #include <sound_manager.h>
23 #include <E_DBus.h>
24
25 #include "media.h"
26 #include "quickpanel-ui.h"
27 #include "quickpanel_def.h"
28 #include "common_uic.h"
29 #include "common.h"
30 #include "modules.h"
31 #include "settings.h"
32 #include "setting_utils.h"
33 #include "setting_module_api.h"
34 #include "accessibility.h"
35 #include "pager.h"
36 #include "pager_common.h"
37
38 #define E_DATA_ICON_CLICKED_CB "clicked_cb"
39 #define E_DATA_ICON_ORIGINAL_OBJ "original_obj"
40
41 #define TAP_AND_DELAY_LONG 1.000
42
43 static struct _info {
44         int down_x;
45         Eina_Bool is_longpressed;
46         Ecore_Timer *timer_longpress;
47 } s_info = {
48         .down_x = 0,
49         .is_longpressed = EINA_FALSE,
50         .timer_longpress = NULL,
51 };
52
53 static Eina_Bool _icon_handler_longpress(void *data)
54 {
55         DBG("");
56         Evas_Object *obj = data;
57         QP_Module_Setting *module = NULL;
58         retif(obj == NULL, ECORE_CALLBACK_CANCEL, "invalid argument");
59
60         struct appdata *ad = (struct appdata*)quickpanel_get_app_data();
61         retif(ad == NULL, ECORE_CALLBACK_CANCEL, "application data is NULL");
62
63         quickpanel_media_play_feedback();
64
65         ecore_timer_del(s_info.timer_longpress);
66         s_info.timer_longpress = NULL;
67         s_info.is_longpressed = EINA_TRUE;
68
69         module = evas_object_data_get(obj, E_DATA_MODULE_INFO);
70         if (module != NULL) {
71                 if (module->handler_longpress != NULL) {
72                         if (module->name) {
73                                 DBG("launch setting menu of %s", module->name);
74                         }
75                         module->handler_longpress(obj);
76
77                         elm_object_signal_emit(obj, "mouse,up,1", "background.super");
78                 }
79         }
80
81         return ECORE_CALLBACK_CANCEL;
82 }
83
84 static void _icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
85 {
86         int down_x = 0;
87         retif(obj == NULL, , "invalid argument");
88
89         quickpanel_page_get_touched_pos(&down_x, NULL);
90
91         if (s_info.down_x - down_x > 15 || s_info.down_x - down_x < -15) {
92                 if (s_info.timer_longpress != NULL) {
93                         ecore_timer_del(s_info.timer_longpress);
94                         s_info.timer_longpress = NULL;
95                 }
96         }
97 }
98
99 static void _icon_mouse_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
100 {
101         retif(obj == NULL, , "invalid argument");
102
103         if (s_info.timer_longpress != NULL) {
104                 ecore_timer_del(s_info.timer_longpress);
105                 s_info.timer_longpress = NULL;
106                 s_info.is_longpressed = EINA_FALSE;
107         }
108
109         evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE,
110                         _icon_mouse_move_cb);
111 }
112
113 static void _icon_mouse_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
114 {
115         retif(obj == NULL, , "invalid argument");
116
117         if (s_info.timer_longpress != NULL) {
118                 ecore_timer_del(s_info.timer_longpress);
119                 s_info.timer_longpress = NULL;
120         }
121
122         quickpanel_page_get_touched_pos(&(s_info.down_x), NULL);
123
124         s_info.is_longpressed = EINA_FALSE;
125         s_info.timer_longpress = ecore_timer_add(TAP_AND_DELAY_LONG,_icon_handler_longpress, obj);
126
127         evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE,
128                         _icon_mouse_move_cb, NULL);
129 }
130
131 #ifdef QP_SCREENREADER_ENABLE
132 static void _icon_focus_clicked_cb(void *data, Evas_Object *obj, void *event_info)
133 {
134         Evas_Object *icon = NULL;
135         Edje_Signal_Cb func = NULL;
136         retif(obj == NULL, , "invalid argument");
137
138         struct appdata *ad = (struct appdata*)quickpanel_get_app_data();
139         retif(ad == NULL, , "application data is NULL");
140
141         if (s_info.timer_longpress != NULL) {
142                 ecore_timer_del(s_info.timer_longpress);
143                 s_info.timer_longpress = NULL;
144         }
145
146         if (s_info.is_longpressed != EINA_TRUE) {
147                 quickpanel_media_play_feedback();
148         }
149
150         icon = evas_object_data_get(obj, E_DATA_ICON_ORIGINAL_OBJ);
151         if (icon != NULL) {
152                 func = evas_object_data_get(icon, E_DATA_ICON_CLICKED_CB);
153
154                 if (func != NULL && s_info.is_longpressed != EINA_TRUE) {
155                         func(data, icon,  "mouse,clicked,1", "background.super");
156                 }
157         }
158 }
159
160 static void _icon_focus_clicked_cb_without_feedback(void *data, Evas_Object *obj, void *event_info)
161 {
162         Evas_Object *icon = NULL;
163         Edje_Signal_Cb func = NULL;
164         retif(obj == NULL, , "invalid argument");
165
166         struct appdata *ad = (struct appdata*)quickpanel_get_app_data();
167         retif(ad == NULL, , "application data is NULL");
168
169         if (s_info.timer_longpress != NULL) {
170                 ecore_timer_del(s_info.timer_longpress);
171                 s_info.timer_longpress = NULL;
172         }
173
174         icon = evas_object_data_get(obj, E_DATA_ICON_ORIGINAL_OBJ);
175         if (icon != NULL) {
176                 func = evas_object_data_get(icon, E_DATA_ICON_CLICKED_CB);
177
178                 if (func != NULL && s_info.is_longpressed != EINA_TRUE) {
179                         func(data, icon,  "mouse,clicked,1", "background.super");
180                 }
181         }
182 }
183
184 HAPI int quickpanel_setting_icon_click_cb_add(Evas_Object *icon, Edje_Signal_Cb func, void *data)
185 {
186         retif(icon == NULL, QP_FAIL, "invalid parameter");
187         retif(func == NULL, QP_FAIL, "invalid parameter");
188
189         struct appdata *ad = (struct appdata*)quickpanel_get_app_data();
190         retif(ad == NULL, QP_FAIL, "application data is NULL");
191
192         elm_object_signal_callback_add(icon, "mouse,up,1", "background.super", _icon_mouse_up_cb, data);
193         elm_object_signal_callback_add(icon, "mouse,down,1", "background.super", _icon_mouse_down_cb, data);
194
195         evas_object_data_set(icon, E_DATA_ICON_CLICKED_CB, func);
196
197 #ifdef QP_SCREENREADER_ENABLE
198         Evas_Object *ao = NULL;
199         ao = quickpanel_accessibility_screen_reader_object_get(icon,
200                         SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon);
201         if (ao != NULL) {
202                 evas_object_smart_callback_add(ao, "clicked",
203                                 _icon_focus_clicked_cb, data);
204                 evas_object_data_set(ao, E_DATA_ICON_ORIGINAL_OBJ, icon);
205         }
206 #endif
207
208         return 0;
209 }
210
211 HAPI int quickpanel_setting_icon_click_cb_without_feedback_add(Evas_Object *icon, Edje_Signal_Cb func, void *data)
212 {
213         retif(icon == NULL, QP_FAIL, "invalid parameter");
214         retif(func == NULL, QP_FAIL, "invalid parameter");
215
216         struct appdata *ad = (struct appdata*)quickpanel_get_app_data();
217         retif(ad == NULL, QP_FAIL, "application data is NULL");
218
219         elm_object_signal_callback_add(icon, "mouse,up,1", "background.super", _icon_mouse_up_cb, data);
220         elm_object_signal_callback_add(icon, "mouse,down,1", "background.super", _icon_mouse_down_cb, data);
221
222         evas_object_data_set(icon, E_DATA_ICON_CLICKED_CB, func);
223
224 #ifdef QP_SCREENREADER_ENABLE
225         Evas_Object *ao = NULL;
226         ao = quickpanel_accessibility_screen_reader_object_get(icon,
227                         SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon);
228         if (ao != NULL) {
229                 evas_object_smart_callback_add(ao, "clicked",
230                                 _icon_focus_clicked_cb_without_feedback, data);
231                 evas_object_data_set(ao, E_DATA_ICON_ORIGINAL_OBJ, icon);
232         }
233 #endif
234
235         return 0;
236 }
237
238 HAPI int quickpanel_setting_icon_click_cb_del(Evas_Object *icon, Edje_Signal_Cb func)
239 {
240         retif(icon == NULL, QP_FAIL, "invalid parameter");
241         retif(func == NULL, QP_FAIL, "invalid parameter");
242
243         struct appdata *ad = (struct appdata*)quickpanel_get_app_data();
244         retif(ad == NULL, QP_FAIL, "application data is NULL");
245
246         elm_object_signal_callback_del(icon, "mouse,clicked,1", "background.super", func);
247
248         return QP_OK;
249 }
250
251 HAPI void quickpanel_setting_icon_handler_longpress(const char *pkgname, void *data)
252 {
253         int ret;
254
255         ret = quickpanel_uic_launch_ug_by_appcontrol(pkgname, data);
256         quickpanel_uic_launch_app_inform_result(pkgname, ret);
257         quickpanel_uic_close_quickpanel(true, 1);
258 }
259 #endif
260