Update minictrl and assistive_light
[apps/core/preloaded/quickpanel.git] / daemon / settings / setting_utils.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 #include <glib.h>
20
21 #if defined(WINSYS_X11)
22 #include <Ecore_X.h>
23 #endif
24
25 #include <notification.h>
26 #include <tzsh.h>
27 #include <tzsh_quickpanel_service.h>
28 #include <E_DBus.h>
29
30 #include "settings.h"
31 #include "common.h"
32 #include "quickpanel_def.h"
33 #include "quickpanel-ui.h"
34 #include "setting_utils.h"
35 #ifdef QP_SCREENREADER_ENABLE
36 #include "accessibility.h"
37 #endif
38
39 #define DEFAULT_EDJ             EDJDIR"/"PACKAGE".edj"
40 #define _EDJ(o) elm_layout_edje_get(o)
41
42 #define TEXT_LEN 128
43 #define QP_SETTING_INITIAL_PAGE_NUM 0
44 #define DIVIDER_MAGIC 0xCAFECAFE
45 #define E_DATA_DIVIDER_MAGIC "divider_magic"
46
47 static inline void __escaped_text_set(Evas_Object *obj, const char *part, const char *text)
48 {
49         char buf[256] = {0,};
50         char *ecaped = NULL;
51
52         if (!obj) {
53                 return;
54         }
55
56         if (!part) {
57                 return;
58         }
59
60         strncpy(buf, text, sizeof(buf) - 1);
61         quickpanel_common_util_char_trim(buf);
62         ecaped = evas_textblock_text_utf8_to_markup(NULL, buf);
63
64         elm_object_part_text_set(obj, part, ecaped);
65
66         if (ecaped) {
67                 free(ecaped);
68         }
69 }
70
71 HAPI int quickpanel_setting_icon_text_set(Evas_Object *icon, const char *text, int state)
72 {
73         retif(icon == NULL, QP_FAIL, "invalid parameter");
74         retif(text == NULL, QP_FAIL, "invalid parameter");
75
76         __escaped_text_set(icon, "icon.text", text);
77
78 #ifdef QP_SCREENREADER_ENABLE
79         char buf[256] = {0,};
80         Evas_Object *ao = NULL;
81
82         ao = quickpanel_accessibility_screen_reader_object_get(icon,
83                         SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon);
84         if (ao != NULL) {
85                 elm_access_info_set(ao, ELM_ACCESS_TYPE, _NOT_LOCALIZED("Button"));
86                 strncpy(buf, text, sizeof(buf) - 1);
87                 quickpanel_common_util_char_replace(buf, '\n', ' ');
88                 elm_access_info_set(ao, ELM_ACCESS_INFO, buf);
89         }
90
91         ao = quickpanel_accessibility_screen_reader_object_get(icon,
92                         SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon);
93         if (ao != NULL) {
94                 if (state == ICON_VIEW_STATE_ON) {
95                         elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("On"));
96                 } else if (state == ICON_VIEW_STATE_DIM) {
97                         elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Turned off"));
98                 } else if (state == ICON_VIEW_STATE_OFF) {
99                         elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Off"));
100                 }
101         }
102 #endif
103
104         return QP_OK;
105 }
106
107 HAPI void quickpanel_setting_icon_access_text_set(Evas_Object *icon, const char *text)
108 {
109 #ifdef QP_SCREENREADER_ENABLE
110         char buf[256] = {0,};
111         Evas_Object *ao = NULL;
112 #endif
113
114         retif(icon == NULL, , "invalid parameter");
115         retif(text == NULL, , "invalid parameter");
116
117 #ifdef QP_SCREENREADER_ENABLE
118         ao = quickpanel_accessibility_screen_reader_object_get(icon,
119                         SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon);
120         if (ao != NULL) {
121                 elm_access_info_set(ao, ELM_ACCESS_TYPE, _NOT_LOCALIZED("Button"));
122                 strncpy(buf, text, sizeof(buf) - 1);
123                 quickpanel_common_util_char_replace(buf, '\n', ' ');
124                 elm_access_info_set(ao, ELM_ACCESS_INFO, buf);
125         }
126 #endif
127 }
128
129 HAPI Evas_Object *quickpanel_setting_icon_content_get(Evas_Object *icon)
130 {
131         retif(icon == NULL, NULL, "invalid parameter");
132
133         struct appdata *ad = (struct appdata*)quickpanel_get_app_data();
134         retif(ad == NULL, NULL, "application data is NULL");
135
136         return elm_object_part_content_get(icon, "icon.swallow.wvga");
137 }
138
139 HAPI int quickpanel_setting_icon_content_set(Evas_Object *icon, Evas_Object *content)
140 {
141         retif(icon == NULL, QP_FAIL, "invalid parameter");
142         retif(content == NULL, QP_FAIL, "invalid parameter");
143
144         struct appdata *ad = (struct appdata*)quickpanel_get_app_data();
145         retif(ad == NULL, QP_FAIL, "application data is NULL");
146
147         elm_object_part_content_set(icon, "icon.swallow.wvga", content);
148
149         return QP_OK;
150 }
151
152 HAPI int quickpanel_setting_icon_state_set(Evas_Object *icon, int state)
153 {
154 #ifdef QP_SCREENREADER_ENABLE
155         Evas_Object *ao = NULL;
156 #endif
157         retif(icon == NULL, -1, "invalid parameter");
158         SERR("icon:%p state:%d", icon, state);
159
160 #ifdef QP_SCREENREADER_ENABLE
161         ao = quickpanel_accessibility_screen_reader_object_get(icon,
162                         SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon);
163         if (ao != NULL) {
164                 if (state == ICON_VIEW_STATE_ON) {
165                         elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("On"));
166                 } else if (state == ICON_VIEW_STATE_DIM) {
167                         elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Turned off"));
168                 } else if (state == ICON_VIEW_STATE_OFF) {
169                         elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Off"));
170                 }
171         }
172 #endif
173
174         if (state == ICON_VIEW_STATE_ON) {
175                 elm_object_signal_emit(icon, "icon.on", "quickpanl.prog");
176         } else if (state == ICON_VIEW_STATE_DIM) {
177                 elm_object_signal_emit(icon, "icon.dim", "quickpanl.prog");
178         } else {
179                 elm_object_signal_emit(icon, "icon.off", "quickpanl.prog");
180         }
181
182         edje_object_message_signal_process(_EDJ(icon));
183
184         return 0;
185 }
186
187 HAPI int quickpanel_setting_icon_state_progress_set(Evas_Object *icon)
188 {
189         retif(icon == NULL, -1, "invalid parameter");
190
191         elm_object_signal_emit(icon, "icon.progress", "quickpanl.prog");
192         edje_object_message_signal_process(_EDJ(icon));
193
194         return 0;
195 }
196
197 HAPI Evas_Object *quickpanel_setting_icon_new(Evas_Object *parent)
198 {
199         const char *signal = NULL;
200         Evas_Object *icon = NULL;
201         retif(parent == NULL, NULL, "invalid parameter");
202
203         struct appdata *ad = quickpanel_get_app_data();
204         retif(ad == NULL, EINA_FALSE, "invalid data.");
205
206         icon = elm_layout_add(parent);
207         retif(!icon, NULL, "fail to add layout");
208
209         elm_layout_file_set(icon, DEFAULT_EDJ, "quickpanel/setting_icon_wvga");
210
211         evas_object_size_hint_weight_set(icon,
212                         EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
213         elm_object_signal_emit(icon, "icon.off", "quickpanl.prog");
214
215         Evas_Object *focus = quickpanel_accessibility_ui_get_focus_object(icon);
216         elm_object_part_content_set(icon, "focus", focus);
217
218         if (ad->angle == 0 || ad->angle == 180) {
219                 signal = "icon.portrait";
220         } else {
221                 signal = "icon.landscape";
222         }
223
224         elm_object_signal_emit(icon, signal, "quickpanl.prog");
225         edje_object_message_signal_process(_EDJ(icon));
226
227         return icon;
228 }
229
230 HAPI Evas_Object *quickpanel_setting_icon_image_new(Evas_Object *parent, const char *img_path)
231 {
232         Evas_Object *content = NULL;
233         retif(parent == NULL, NULL, "invalid parameter");
234         retif(img_path == NULL, NULL, "invalid parameter");
235
236         content = elm_image_add(parent);
237         retif(content == NULL, NULL, "failed to create image");
238
239         if (!elm_image_file_set(content, DEFAULT_EDJ, img_path)) {
240                 ERR("fail to set file[%s]", img_path);
241                 evas_object_del(content);
242                 content = NULL;
243                 return NULL;
244         }
245
246         return content;
247 }
248
249 static Evas_Object *quickpanel_setting_container_get(Evas_Object *base)
250 {
251         Evas_Object *container = NULL;
252         retif(base == NULL, NULL, "invalid parameter");
253
254         container = elm_object_part_content_get(base, QP_SETTING_BASE_PART);
255
256         return container;
257 }
258
259 HAPI Evas_Object *quickpanel_setting_scroller_get(Evas_Object *base)
260 {
261         Evas_Object *container = NULL;
262         Evas_Object *scroller = NULL;
263         retif(base == NULL, NULL, "invalid parameter");
264
265         struct appdata *ad = (struct appdata*)quickpanel_get_app_data();
266         retif(ad == NULL, NULL, "application data is NULL");
267
268         container = quickpanel_setting_container_get(base);
269
270         scroller = elm_object_part_content_get(container, QP_SETTING_SCROLLER_PART_WVGA);
271
272         retif(scroller == NULL, NULL, "invalid parameter");
273
274         return scroller;
275 }
276
277 HAPI Evas_Object *quickpanel_setting_box_get_from_scroller(Evas_Object *base)
278 {
279         Evas_Object *scroller = NULL;
280         Evas_Object *box = NULL;
281         retif(base == NULL, NULL, "invalid parameter");
282
283         scroller = quickpanel_setting_scroller_get(base);
284         retif(scroller == NULL, NULL, "invalid parameter");
285
286         box = elm_object_content_get(scroller);
287
288         return box;
289 }
290
291 HAPI Evas_Object *quickpanel_setting_box_get(Evas_Object *base)
292 {
293         Evas_Object *container = NULL;
294         Evas_Object *box = NULL;
295         retif(base == NULL, NULL, "invalid parameter");
296
297         container = quickpanel_setting_container_get(base);
298         retif(container == NULL, NULL, "invalid parameter");
299         box = elm_object_part_content_get(container, QP_SETTING_SCROLLER_PART_WVGA);
300
301         return box;
302 }
303
304 HAPI int quickpanel_setting_container_rotation_set(Evas_Object *base, int angle)
305 {
306         Evas_Object *container = NULL;
307         const char *signal = NULL;
308
309         retif(!base, -1, "base is NULL");
310         retif(angle < 0, -1, "angle is %d", angle);
311
312         container = quickpanel_setting_container_get(base);
313         retif(!container, -1, "box is NULL");
314
315         if (angle % 180 == 0) {
316                 signal = "portrait";
317         } else {
318                 signal = "landscape";
319         }
320
321         elm_object_signal_emit(container, signal, "background");
322         edje_object_message_signal_process(_EDJ(container));
323
324         return 0;
325 }
326
327 HAPI int quickpanel_setting_icons_rotation_set(Evas_Object *base, int angle)
328 {
329         Evas_Object *box = NULL;
330         Evas_Object *icon = NULL;
331         Eina_List *icons = NULL;
332         Eina_List *l = NULL;
333         const char *signal = NULL;
334
335         retif(!base, -1, "base is NULL");
336         retif(angle < 0, -1, "angle is %d", angle);
337
338         box = quickpanel_setting_box_get(base);
339         retif(!box, -1, "box is NULL");
340
341         icons = elm_box_children_get(box);
342         retif(!icons, -1, "icons list is NULL");
343
344         if (angle % 180 == 0) {
345                 signal = "icon.portrait";
346         } else {
347                 signal = "icon.landscape";
348         }
349
350         EINA_LIST_FOREACH(icons, l, icon) {
351                 elm_object_signal_emit(icon, signal, "quickpanl.prog");
352                 edje_object_message_signal_process(_EDJ(icon));
353         }
354
355         eina_list_free(icons);
356
357         return 0;
358 }
359
360 HAPI void quickpanel_setting_icons_emit_sig(Evas_Object *icon, const char *signal)
361 {
362         retif(!icon, , "icon is NULL");
363         retif(!signal, , "icon is NULL");
364
365         elm_object_signal_emit(icon, signal, "quickpanl.prog");
366         edje_object_message_signal_process(_EDJ(icon));
367 }
368
369 HAPI int quickpanel_setting_icons_dragging_set(Evas_Object *icon, int is_on)
370 {
371         const char *signal = NULL;
372         retif(!icon, QP_FAIL, "icon is NULL");
373
374         if (is_on == 1) {
375                 signal = "dragging.on";
376         } else {
377                 signal = "dragging.off";
378         }
379
380         elm_object_signal_emit(icon, signal, "quickpanl.prog");
381         edje_object_message_signal_process(_EDJ(icon));
382
383         return QP_OK;
384 }
385
386 HAPI int quickpanel_setting_icons_screen_mode_set(Evas_Object *icon, int screen_mode)
387 {
388         const char *signal = NULL;
389         retif(!icon, QP_FAIL, "icon is NULL");
390
391         if (screen_mode == 0) {
392                 signal = "icon.portrait";
393         } else {
394                 signal = "icon.landscape";
395         }
396
397         elm_object_signal_emit(icon, signal, "quickpanl.prog");
398         edje_object_message_signal_process(_EDJ(icon));
399
400         return QP_OK;
401 }
402
403 HAPI int quickpanel_setting_icon_pack(Evas_Object *box, Evas_Object *icon, int is_attach_divider)
404 {
405         retif(box == NULL, QP_FAIL, "box is NULL");
406
407         elm_box_pack_end(box, icon);
408
409         return QP_OK;
410 }
411
412 HAPI void quickpanel_setting_icon_unpack_all(Evas_Object *box)
413 {
414         Eina_List *l;
415         Eina_List *l_next;
416         Evas_Object *node = NULL;
417         Eina_List *list = NULL;
418         retif(box == NULL, , "invalid parameter");
419
420         list = elm_box_children_get(box);
421         retif(list == NULL, , "empty list");
422
423         elm_box_unpack_all(box);
424
425         EINA_LIST_FOREACH_SAFE(list, l, l_next, node) {
426                 if (node != NULL) {
427                         if (evas_object_data_get(node, E_DATA_DIVIDER_MAGIC) == (void *)DIVIDER_MAGIC) {
428                                 evas_object_del(node);
429                                 node = NULL;
430                         }
431                 }
432         }
433
434         eina_list_free(list);
435 }
436
437 HAPI int quickpanel_setting_scroll_page_get(void *data)
438 {
439         int page_h = 0x99;
440         struct appdata *ad = NULL;
441         retif(data == NULL, QP_FAIL, "Invalid parameter!");
442
443         ad = data;
444         retif(!ad->ly, QP_FAIL, "layout is NULL!");
445
446         Evas_Object *scroller = quickpanel_setting_scroller_get(ad->ly);
447         elm_scroller_current_page_get(scroller, &page_h, NULL);
448
449         return page_h;
450 }
451
452 HAPI int quickpanel_setting_set_scroll_page_width(void *data)
453 {
454         struct appdata *ad = NULL;
455         retif(data == NULL, QP_FAIL, "Invalid parameter!");
456
457         ad = data;
458         retif(!ad->ly, QP_FAIL, "layout is NULL!");
459
460         Evas_Object *scroller = quickpanel_setting_scroller_get(ad->ly);
461
462         int w, h;
463 #if defined(WINSYS_X11)
464         Ecore_X_Screen *screen = ecore_x_default_screen_get();
465         ecore_x_screen_size_get(screen, &w, &h);
466 #else
467         elm_win_screen_size_get(ad->win, NULL, NULL, &w, &h);
468 #endif
469
470         elm_scroller_page_size_set(scroller, w / QP_SETTING_NUM_PORTRAIT_ICONS, 0);
471
472         return 0;
473 }
474
475 HAPI int quickpanel_setting_start(Evas_Object *base)
476 {
477         Evas_Object *scroller = NULL;
478         retif(base == NULL, QP_FAIL, "Invalid parameter!");
479
480         scroller = quickpanel_setting_scroller_get(base);
481         retif(scroller == NULL, QP_FAIL, "Invalid parameter!");
482
483         elm_scroller_page_bring_in(scroller, 0, 0);
484
485         return QP_OK;
486 }
487
488 HAPI int quickpanel_setting_stop(Evas_Object *base, int is_bring_in)
489 {
490         int page = QP_SETTING_INITIAL_PAGE_NUM;
491         Evas_Object *scroller = NULL;
492         retif(base == NULL, QP_FAIL, "Invalid parameter!");
493
494         scroller = quickpanel_setting_scroller_get(base);
495         retif(scroller == NULL, QP_FAIL, "Invalid parameter!");
496
497         if (is_bring_in == 1) {
498                 elm_scroller_page_bring_in(scroller, page, 0);
499         } else {
500                 elm_scroller_page_show(scroller, page, 0);
501         }
502
503         return QP_OK;
504 }
505
506 HAPI int quickpanel_setting_layout_set(Evas_Object *base, Evas_Object *setting)
507 {
508         retif(base == NULL, QP_FAIL, "Invalid parameter!");
509         retif(setting == NULL, QP_FAIL, "Invalid parameter!");
510
511         elm_object_part_content_set(base, QP_SETTING_BASE_PART, setting);
512
513         return 0;
514 }
515
516 HAPI Evas_Object *quickpanel_setting_layout_get(Evas_Object *base, const char *setting_part)
517 {
518         retif(base == NULL, NULL, "Invalid parameter!");
519         retif(setting_part == NULL, NULL, "Invalid parameter!");
520
521         return elm_object_part_content_get(base, setting_part);
522 }
523
524 HAPI int quickpanel_setting_layout_remove(Evas_Object *base)
525 {
526         Evas_Object *container = NULL;
527         Evas_Object *scroller = NULL;
528         Evas_Object *box = NULL;
529         retif(base == NULL, QP_FAIL, "Invalid parameter!");
530
531         container = quickpanel_setting_container_get(base);
532         scroller = quickpanel_setting_scroller_get(base);
533         box = quickpanel_setting_box_get(base);
534
535         if (box) {
536                 elm_box_clear(box);
537                 evas_object_del(box);
538                 box = NULL;
539         }
540         if (scroller) {
541                 evas_object_del(scroller);
542                 scroller = NULL;
543         }
544         if (container) {
545                 evas_object_del(container);
546                 container = NULL;
547         }
548
549         return QP_OK;
550 }
551
552 HAPI void quickpanel_setting_create_confirm_popup(
553                 Evas_Object *parent,
554                 char *title,
555                 char *text,
556                 Evas_Smart_Cb func)
557 {
558         Evas_Object *popup = elm_popup_add(parent);
559         Evas_Object *btn = NULL;
560
561         if (popup == NULL) {
562                 return;
563         }
564
565         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND,
566                         EVAS_HINT_EXPAND);
567
568         if (title) {
569                 elm_object_part_text_set(popup, "title,text", title);
570         }
571
572         if (text) {
573                 elm_object_text_set(popup, text);
574         }
575
576         btn = elm_button_add(popup);
577         elm_object_style_set(btn, "popup");
578         elm_object_text_set(btn, _("IDS_ST_SK_OK"));
579         elm_object_part_content_set(popup, "button1", btn);
580         evas_object_smart_callback_add(btn, "clicked", func, popup);
581
582         evas_object_show(popup);
583         quickpanel_common_ui_set_current_popup(popup, func);
584 }
585
586 HAPI void quickpanel_setting_create_2button_confirm_popup(
587                 Evas_Object *parent,
588                 char *title,
589                 char *text,
590                 char *btn1_text,
591                 Evas_Smart_Cb btn1_func,
592                 char *btn2_text,
593                 Evas_Smart_Cb btn2_func)
594 {
595         Evas_Object *popup = elm_popup_add(parent);
596         Evas_Object *btn = NULL;
597
598         if (popup == NULL) {
599                 return;
600         }
601
602         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND,
603                         EVAS_HINT_EXPAND);
604
605         if (title) {
606                 elm_object_part_text_set(popup, "title,text", title);
607         }
608
609         if (text) {
610                 elm_object_text_set(popup, text);
611         }
612
613         if (btn1_func != NULL && btn1_text != NULL) {
614                 btn = elm_button_add(popup);
615                 elm_object_style_set(btn, "popup");
616                 elm_object_text_set(btn, btn1_text);
617                 elm_object_part_content_set(popup, "button1", btn);
618                 evas_object_smart_callback_add(btn, "clicked", btn1_func, popup);
619         }
620         if (btn2_func != NULL && btn2_text != NULL) {
621                 btn = elm_button_add(popup);
622                 elm_object_style_set(btn, "popup");
623                 elm_object_text_set(btn, btn2_text);
624                 elm_object_part_content_set(popup, "button2", btn);
625                 evas_object_smart_callback_add(btn, "clicked", btn2_func, popup);
626         }
627
628         evas_object_show(popup);
629         quickpanel_common_ui_set_current_popup(popup, btn1_func);
630 }
631
632 HAPI void quickpanel_setting_create_timeout_popup(Evas_Object *parent, char *msg)
633 {
634         retif(msg == NULL, , "invalid parameter");
635
636         notification_status_message_post(msg);
637 }