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