421ee7d1ad5018b5ff45c0b5c265857b50f7c35c
[apps/home/lockscreen.git] / src / util.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
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 #include <Ecore_X.h>
18 #include <Elementary.h>
19 #include <utilX.h>
20 #include <vconf.h>
21 #include <vconf-keys.h>
22 #include <ail.h>
23 #include <ui-gadget.h>
24 #include <heynoti.h>
25
26 #include "util.h"
27 #include "sim-state.h"
28 #include "info.h"
29 #include "bg.h"
30 #include "noti.h"
31
32 #define DEFAULT_BG_PATH     "/opt/share/settings/Wallpapers/Home_default.jpg"
33 #define SYSTEM_RESUME       "system_wakeup"
34
35 static Evas_Coord pos_down_y = 0;
36
37 void _set_win_property(Evas_Object * win)
38 {
39         Ecore_X_Window xwin;
40
41         if (win == NULL) {
42                 LOGD("[Error:%s] Invalid argument: win is NULL", __func__);
43                 return;
44         }
45         xwin = elm_win_xwindow_get(win);
46         if (xwin == 0) {
47                 LOGD("[Error:%s] Cannot get xwindow", __func__);
48                 return;
49         }
50
51         ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION);
52
53         utilx_set_system_notification_level(ecore_x_display_get(), xwin, UTILX_NOTIFICATION_LEVEL_NORMAL);
54
55         utilx_set_window_opaque_state(ecore_x_display_get(), xwin, UTILX_OPAQUE_STATE_ON);
56 }
57
58 Evas_Object *_add_layout(Evas_Object *parent, const char *file, const char *group)
59 {
60         if (parent == NULL)
61                 return NULL;
62
63         Evas_Object *ly;
64         int r;
65
66         ly = elm_layout_add(parent);
67         if (ly == NULL)
68                 return NULL;
69
70         r = elm_layout_file_set(ly, file, group);
71         if (!r) {
72                 evas_object_del(ly);
73                 return NULL;
74         }
75         evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
76
77         evas_object_show(ly);
78
79         return ly;
80 }
81
82 Evas_Object *_make_top_layout(struct appdata *ad)
83 {
84         if (ad == NULL)
85                 return NULL;
86
87         Evas_Object *eo = NULL;
88         Evas_Object *conform = NULL;
89
90         conform = elm_conformant_add(ad->win);
91         if(conform == NULL) {
92                 return NULL;
93         }
94
95 #if 0
96         elm_object_style_set(conform, "indicator_overlap");
97 #else
98         elm_object_signal_emit(conform, "elm,state,virtualkeypad,disable", "");
99         elm_object_signal_emit(conform, "elm,state,indicator,overlap", "");
100         elm_object_signal_emit(conform, "elm,state,clipboard,disable", "");
101 #endif
102
103         eo = _add_layout(conform, EDJEFILE, "lock-main");
104         if (eo == NULL)
105                 return NULL;
106
107         evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND,
108                                                  EVAS_HINT_EXPAND);
109         elm_win_resize_object_add(ad->win, conform);
110         elm_object_content_set(conform, eo);
111         evas_object_show(conform);
112         evas_object_resize(eo, ad->win_w, ad->win_h);
113
114         return eo;
115 }
116
117 Evas_Object *_make_slider(Evas_Object *parent)
118 {
119         Evas_Object *layout = NULL;
120
121         if (parent == NULL) {
122                 LOCK_SCREEN_TRACE_DBG("The parent of slider is null");
123                 return NULL;
124         }
125
126         layout = _add_layout(parent, EDJEFILE, "lock-slider");
127         if (layout == NULL) {
128                 return NULL;
129         }
130
131         return layout;
132 }
133
134 Evas_Object *_get_bg_image(Evas_Object *parent)
135 {
136         Evas_Object *bg = NULL;
137         char *file = NULL;
138         Eina_Bool ret = EINA_FALSE;
139
140         if (parent == NULL)
141                 return NULL;
142
143         if ((file = vconf_get_str(VCONFKEY_IDLE_LOCK_BGSET)) ==  NULL) {
144                 file = vconf_get_str(VCONFKEY_BGSET);
145         }
146
147         bg = elm_icon_add(parent);
148         if (bg == NULL)
149                 return NULL;
150         elm_icon_aspect_fixed_set(bg, EINA_FALSE);
151
152         if (file) {
153                 ret = elm_icon_file_set(bg, file, NULL);
154                 if (ret == EINA_FALSE) {
155                         elm_icon_file_set(bg, DEFAULT_BG_PATH, NULL);
156                 }
157                 free(file);
158         } else {
159                 elm_icon_file_set(bg, DEFAULT_BG_PATH, NULL);
160         }
161         return bg;
162 }
163
164 void lockscreen_info_show(struct appdata *ad)
165 {
166         if(ad == NULL){
167                 return;
168         }
169
170         edje_object_signal_emit(_EDJ(ad->ly_main), "show,text.area", "text.area");
171         edje_object_signal_emit(_EDJ(ad->ly_main), "show,sw.noti", "sw.noti");
172         edje_object_signal_emit(_EDJ(ad->ly_main), "show,sim.state", "sim.state");
173         edje_object_signal_emit(_EDJ(ad->ly_main), "show,rect.info", "rect.info");
174         if(ad->slider != NULL) {
175                 evas_object_show(ad->slider);
176         }
177 }
178
179 void lockscreen_info_hide(struct appdata *ad)
180 {
181         if(ad == NULL){
182                 return;
183         }
184
185         edje_object_signal_emit(_EDJ(ad->ly_main), "hide,text.area", "text.area");
186         edje_object_signal_emit(_EDJ(ad->ly_main), "hide,sw.noti", "sw.noti");
187         edje_object_signal_emit(_EDJ(ad->ly_main), "hide,sim.state", "sim.state");
188         edje_object_signal_emit(_EDJ(ad->ly_main), "hide,rect.info", "rect.info");
189         if(ad->slider != NULL) {
190                 evas_object_hide(ad->slider);
191         }
192 }
193
194 static void _app_exit(void *data, Evas_Object *obj, const char *emission, const char *source)
195 {
196         struct appdata *ad = data;
197         _app_terminate(ad);
198 }
199
200 static int _init_heynoti(void *data)
201 {
202         struct appdata *ad = data;
203         if (ad == NULL) {
204                 return EXIT_FAILURE;
205         }
206         int fd = -1, ret = -1;
207         LOCK_SCREEN_TRACE_DBG("[ == %s == ]", __func__);
208
209         fd = heynoti_init();
210         if (fd == -1) {
211                 LOCK_SCREEN_TRACE_DBG("Heynoti init error\n");
212                 return EXIT_FAILURE;
213         }
214
215         ret = heynoti_subscribe(fd, SYSTEM_RESUME, update_time, ad);
216         if (ret == -1) {
217                 LOCK_SCREEN_TRACE_DBG("[Error] heynoti_subscribe : system_wakeup\n");
218                 return EXIT_FAILURE;
219         }
220
221         ret = heynoti_attach_handler(fd);
222         if (ret == -1) {
223                 LOCK_SCREEN_TRACE_DBG("[Error] heynoti_attach_handler failed.\n");
224                 return EXIT_FAILURE;
225         }
226
227         ad->heynoti_fd = fd;
228
229         return EXIT_SUCCESS;
230 }
231
232 static void _fini_heynoti(void *data)
233 {
234         struct appdata *ad = data;
235         if (ad == NULL) {
236                 return;
237         }
238         LOCK_SCREEN_TRACE_DBG("[ == %s == ]", __func__);
239         heynoti_unsubscribe(ad->heynoti_fd, SYSTEM_RESUME, update_time);
240         heynoti_close(ad->heynoti_fd);
241         ad->heynoti_fd = 0;
242 }
243
244 static void _pm_state_cb(keynode_t * node, void *data)
245 {
246         LOCK_SCREEN_TRACE_DBG("_pm_state_cb");
247
248         struct appdata *ad = data;
249         int val = -1;
250
251         if (vconf_get_int(VCONFKEY_PM_STATE, &val) < 0) {
252                 LOCK_SCREEN_TRACE_ERR("Cannot get VCONFKEY_PM_STATE");
253                 return;
254         }
255
256         if (val == VCONFKEY_PM_STATE_NORMAL) {
257                 LOCK_SCREEN_TRACE_DBG("LCD on");
258                 update_time(ad);
259                 if(ad->ao_bg) {
260                         elm_access_highlight_set(ad->ao_bg);
261                 }
262         } else {
263                 init_slider_touch_variables(ad);
264         }
265 }
266
267 static Eina_Bool _mouse_cb(void *data, Evas_Object *obj, void *action_info)
268 {
269         struct appdata *ad = data;
270         if (!ad) return EINA_FALSE;
271
272         Elm_Access_Action_Info *a;
273         a = (Elm_Access_Action_Info *) action_info;
274         if (!a) return EINA_FALSE;
275         LOCK_SCREEN_TRACE_DBG("event : %d, read x: %d, y: %d\n", a->mouse_type, a->x, a->y);
276
277         static Eina_Bool bDrag = EINA_FALSE;
278         static int event = 0;
279         static int origin_x = -1;
280         static int origin_y = -1;
281
282         int step_width = 0;
283         int step_number = 0;
284         int alpha = 0;
285
286         event = a->mouse_type;
287         if(event == 0) {
288                 origin_x = a->x;
289                 origin_y = a->y;
290                 bDrag = EINA_TRUE;
291
292                 edje_object_signal_emit(_EDJ(ad->slider), "press",
293                                 "lock.image.l");
294                 edje_object_signal_emit(_EDJ(ad->slider), "press02",
295                                 "lock.image.r");
296         } else if(event == 1) {
297                 if(bDrag == EINA_FALSE) {
298                         return EINA_FALSE;
299                 }
300                 if(abs(a->y - origin_y) > _X(80)){
301                         bDrag = EINA_FALSE;
302                 } else {
303                         step_width = _X(360)/14;
304                         step_number = abs(a->x - origin_x) / step_width;
305                         alpha = 255 - (2.55 * step_number *3);
306
307                         if (step_number < 1) {
308                                 edje_object_signal_emit(_EDJ(ad->slider), "press02",
309                                                 "lock.image.r");
310                         } else if (step_number < 2) {
311                                 edje_object_signal_emit(_EDJ(ad->slider), "press03",
312                                                 "lock.image.r");
313                         } else if (step_number < 3) {
314                                 edje_object_signal_emit(_EDJ(ad->slider), "press04",
315                                                 "lock.image.r");
316                         } else if (step_number < 4) {
317                                 edje_object_signal_emit(_EDJ(ad->slider), "press05",
318                                                 "lock.image.r");
319                         } else if (step_number < 5) {
320                                 edje_object_signal_emit(_EDJ(ad->slider), "press06",
321                                                 "lock.image.r");
322                         } else if (step_number < 6) {
323                                 edje_object_signal_emit(_EDJ(ad->slider), "press07",
324                                                 "lock.image.r");
325                         } else if (step_number < 7) {
326                                 edje_object_signal_emit(_EDJ(ad->slider), "press08",
327                                                 "lock.image.r");
328                         } else if (step_number < 8) {
329                                 edje_object_signal_emit(_EDJ(ad->slider), "press09",
330                                                 "lock.image.r");
331                         } else if (step_number < 9) {
332                                 edje_object_signal_emit(_EDJ(ad->slider), "press10",
333                                                 "lock.image.r");
334                         } else if (step_number < 10) {
335                                 edje_object_signal_emit(_EDJ(ad->slider), "press11",
336                                                 "lock.image.r");
337                         } else if (step_number < 11) {
338                                 edje_object_signal_emit(_EDJ(ad->slider), "press12",
339                                                 "lock.image.r");
340                         } else if (step_number < 12) {
341                                 edje_object_signal_emit(_EDJ(ad->slider), "press13",
342                                                 "lock.image.r");
343                         } else if (step_number < 13) {
344                                 edje_object_signal_emit(_EDJ(ad->slider), "press14",
345                                                 "lock.image.r");
346                         } else {
347                                 edje_object_signal_emit(_EDJ(ad->slider), "press15",
348                                                 "lock.image.r");
349                         }
350                         evas_object_color_set(ad->ly_main, alpha, alpha, alpha, alpha);
351                 }
352         } else if(event == 2) {
353                 edje_object_signal_emit(_EDJ(ad->slider), "release", "lock.image.l");
354                 edje_object_signal_emit(_EDJ(ad->slider), "release", "lock.image.r");
355                 evas_object_color_set(ad->ly_main, 255, 255, 255, 255);
356                 ad->bDrag = 0;
357
358                 if(bDrag == EINA_TRUE && abs(a->x - origin_x) > _X(360)) {
359
360                         if(ad->slider) {
361                                 evas_object_del(ad->slider);
362                                 ad->slider = NULL;
363                         }
364                         LOCK_SCREEN_TRACE_DBG("unlock the lock-screen");
365                         elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_HIDE);
366                         elm_object_signal_emit(ad->ly_main, "transit,clipper", "clipper");
367                         vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK);
368                 }
369                 bDrag = EINA_FALSE;
370         }
371         return EINA_TRUE;
372 }
373
374 static Evas_Object *_access_object_get(Evas_Object *obj, const char *part)
375 {
376         if(obj == NULL || part == NULL){
377                 LOCK_SCREEN_TRACE_ERR("");
378                 return NULL;
379         }
380         Evas_Object *to = NULL;
381         Evas_Object *ao = NULL;
382         to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(obj), part);
383         if(to == NULL) {
384                 LOCK_SCREEN_TRACE_ERR("");
385                 return NULL;
386         }
387         ao = elm_access_object_get(to);
388         if(ao == NULL) {
389                 ao = elm_access_object_register(to, obj);
390         }
391         return ao;
392 }
393
394 const char *_lock_info_access_activate_cb(void *data, Evas_Object *obj)
395 {
396         struct appdata *ad = data;
397         if(ad == NULL || obj == NULL) {
398                 return NULL;
399         }
400         if(ad->ly_main == NULL || ad->info == NULL) {
401                 return NULL;
402         }
403
404         const char *text = NULL;
405         Eina_Strbuf *str_buf = NULL;
406         str_buf = eina_strbuf_new();
407         if(str_buf == NULL) {
408                 LOCK_SCREEN_TRACE_ERR("eina_strbuf_new() failed");
409                 return NULL;
410         }
411
412         text = elm_object_part_text_get(ad->info, "txt.clock");
413         if(text) {
414                 text = evas_textblock_text_markup_to_utf8(NULL, text);
415                 if(text)
416                         eina_strbuf_append(str_buf, text);
417         }
418
419         text = elm_object_part_text_get(ad->info, "txt.date");
420         if(text) {
421                 text = evas_textblock_text_markup_to_utf8(NULL, text);
422                 if(text)
423                         eina_strbuf_append(str_buf, text);
424         }
425
426         text = strdup(eina_strbuf_string_get(str_buf));
427         eina_strbuf_free(str_buf);
428
429         return text?strdup(text):NULL;
430 }
431
432 static void _response_cb(void *data, Evas_Object *obj, void *event_info)
433 {
434         elm_exit();
435 }
436
437 static Eina_Bool _init_widget_cb(void *data)
438 {
439         struct appdata *ad = data;
440         LOGD("[ == %s == ]", __func__);
441         if (ad == NULL)
442                 return ECORE_CALLBACK_CANCEL;
443
444         ad->slider = _make_slider(ad->ly_main);
445         evas_object_resize(ad->slider, ad->win_w, SLIDER_RATIO_H * ad->win_h);
446         evas_object_move(ad->slider, 0, SLIDER_RATIO_Y * ad->win_h);
447         evas_object_show(ad->slider);
448         evas_object_geometry_get(
449                         edje_object_part_object_get(_EDJ(ad->slider), "lock.wrapper.image.l"),
450                         &ad->slider_rel1.x, &ad->slider_rel1.y, &ad->slider_rel1.w,
451                         &ad->slider_rel1.h);
452         evas_object_geometry_get(
453                         edje_object_part_object_get(_EDJ(ad->slider), "lock.wrapper.image.r"),
454                         &ad->slider_rel2.x, &ad->slider_rel2.y, &ad->slider_rel2.w,
455                         &ad->slider_rel2.h);
456
457         set_sim_state(ad);
458
459         ad->info = elm_layout_add(ad->win);
460         elm_layout_file_set(ad->info, EDJEFILE, "lock-info");
461         evas_object_show(ad->info);
462         elm_object_part_content_set(ad->ly_main, "rect.info", ad->info);
463         _set_info(ad);
464
465         if(_init_heynoti(ad) != EXIT_SUCCESS) {
466                 LOCK_SCREEN_TRACE_DBG("heynoti ERR..!!");
467         }
468
469         if (vconf_notify_key_changed(VCONFKEY_PM_STATE, _pm_state_cb, ad) != 0) {
470                 LOCK_SCREEN_TRACE_ERR("Fail vconf_notify_key_changed : VCONFKEY_PM_STATE");
471         }
472
473         int state = 0;
474         vconf_get_bool(VCONFKEY_LOCKSCREEN_EVENT_NOTIFICATION_DISPLAY, &state);
475         if(state){
476                 noti_process(ad);
477         }
478
479         evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb_s, ad);
480         evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb_s, ad);
481         evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb_s, ad);
482         evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_DOWN, _slider_down_cb, ad);
483         evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_UP, _slider_up_cb, ad);
484         evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_MOVE, _slider_move_cb, ad);
485         if(evas_alloc_error() != EVAS_ALLOC_ERROR_NONE) {
486                 LOCK_SCREEN_TRACE_ERR("evas_object_event_callback_add() failed");
487                 Evas_Object *popup = NULL;
488                 Evas_Object *button = NULL;
489                 popup = elm_popup_add(ad->ly_main);
490                 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
491                 elm_object_text_set(popup, _NOT_LOCALIZED("callback add failed"));
492                 button = elm_button_add(popup);
493                 elm_object_text_set(button, _S("IDS_COM_SK_OK"));
494                 elm_object_part_content_set(popup, "button1", button);
495                 evas_object_smart_callback_add(button, "clicked", _response_cb, popup);
496                 evas_object_show(popup);
497                 return ECORE_CALLBACK_CANCEL;
498         } else {
499                 LOCK_SCREEN_TRACE_DBG("evas_object_event_callback_add() success");
500         }
501
502         edje_object_signal_callback_add(_EDJ(ad->ly_main), "exit,app", "event", _app_exit, ad);
503
504         Eina_List *chain_list = NULL;
505
506         ad->ao_bg = _access_object_get(ad->ly_main, "tts.bg");
507         if(ad->ao_bg) {
508                 elm_access_action_cb_set(ad->ao_bg, ELM_ACCESS_ACTION_MOUSE, _mouse_cb, ad);
509                 elm_object_focus_allow_set(ad->ao_bg, EINA_TRUE);
510                 chain_list = eina_list_append(chain_list, ad->ao_bg);
511         }
512         Evas_Object *ao_title = _access_object_get(ad->ly_main, "tts.title");
513         if(ao_title) {
514                 elm_access_info_set(ao_title, ELM_ACCESS_INFO, "Life Magazine");
515                 elm_access_info_set(ao_title, ELM_ACCESS_TYPE, "");
516                 elm_object_focus_allow_set(ao_title, EINA_TRUE);
517                 chain_list = eina_list_append(chain_list, ao_title);
518         }
519         Evas_Object *ao_sim = _access_object_get(ad->ly_main, "tts.sim.state");
520         if(ao_sim) {
521                 const char *text_sim = elm_object_part_text_get(ad->ly_main, "sim.state");
522                 if(text_sim) {
523                         elm_access_info_set(ao_sim, ELM_ACCESS_INFO, text_sim);
524                 }
525                 elm_access_info_set(ao_sim, ELM_ACCESS_TYPE, "");
526                 elm_object_focus_allow_set(ao_sim, EINA_TRUE);
527                 chain_list = eina_list_append(chain_list, ao_sim);
528         }
529         Evas_Object *ao_info = _access_object_get(ad->ly_main, "tts.info");
530         if(ao_info) {
531                 elm_access_info_cb_set(ao_info, ELM_ACCESS_INFO, _lock_info_access_activate_cb, ad);
532                 elm_access_info_set(ao_info, ELM_ACCESS_TYPE, "");
533                 elm_object_focus_allow_set(ao_info, EINA_TRUE);
534                 chain_list = eina_list_append(chain_list, ao_info);
535         }
536         elm_object_focus_custom_chain_set(ad->ly_main, chain_list);
537
538         vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_LOCK);
539
540         return ECORE_CALLBACK_CANCEL;
541 }
542
543 int _app_create(struct appdata *ad)
544 {
545         if (ad == NULL)
546                 return -1;
547         LOGD("[ == %s == ]", __func__);
548
549         ecore_x_icccm_name_class_set(elm_win_xwindow_get(ad->win), "LOCK_SCREEN", "LOCK_SCREEN");
550         evas_object_show(ad->win);
551         _set_win_property(ad->win);
552
553         elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
554
555         ad->ly_main = _make_top_layout(ad);
556         if (ad->ly_main == NULL)
557                 return -1;
558         ad->event_bg = _get_bg_image(ad->ly_main);
559         if (ad->event_bg == NULL)
560                 return -1;
561         elm_object_part_content_set(ad->ly_main, "sw.bg", ad->event_bg);
562
563         return 0;
564 }
565
566 int _app_reset(struct appdata *ad)
567 {
568         if (ad == NULL)
569                 return -1;
570
571         if (ad->emgc_ug) {
572                 ug_destroy(ad->emgc_ug);
573                 ad->emgc_ug = NULL;
574         }
575
576         static int initted = 0;
577         if(initted == 0) {
578                 ecore_idler_add(_init_widget_cb, ad);
579                 initted = 1;
580         }
581
582         return 0;
583 }
584
585 int _app_resume(struct appdata *ad)
586 {
587         if (ad == NULL)
588                 return -1;
589
590         return 0;
591 }
592
593 int _app_terminate(struct appdata *ad)
594 {
595         if (ad == NULL) {
596                 LOGD("[_app_terminate] Invalid argument : struct appdata is NULL\n");
597                 return -1;
598         }
599
600         vconf_ignore_key_changed(VCONFKEY_PM_STATE, _pm_state_cb);
601         fini_sim_state(ad);
602         _fini_heynoti(ad);
603
604         LOGD("[%s] app termiante", __func__);
605         elm_exit();
606
607         return 0;
608 }
609
610 static void __layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
611 {
612         struct appdata *ad;
613         Evas_Object *base;
614
615         if (!ug || !priv)
616                 return;
617
618         ad = priv;
619         base = ug_get_layout(ug);
620         if (!base)
621                 return;
622
623         switch(mode) {
624         case UG_MODE_FULLVIEW:
625                 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
626                 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
627                 elm_win_resize_object_add(ad->win, base);
628                 evas_object_show(base);
629                 break;
630         case UG_MODE_FRAMEVIEW:
631                 break;
632         default:
633                 break;
634         }
635 }
636
637 static void __result_cb(ui_gadget_h ug, service_h service, void *priv)
638 {
639         LOCK_SCREEN_TRACE_DBG("result_cb\n");
640 }
641
642 static void __destroy_cb(ui_gadget_h ug, void *priv)
643 {
644         struct appdata *ad = (struct appdata *)priv;
645
646         if (!ug || !ad) {
647                 return;
648         }
649         LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
650
651         ug_destroy(ug);
652         ug = NULL;
653 }
654
655 void launch_emgcall(struct appdata *ad)
656 {
657         if (ad == NULL)
658                 return;
659
660         service_h service;
661         service_create(&service);
662         UG_INIT_EFL(ad->win, UG_OPT_INDICATOR_ENABLE);
663         struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
664         if (cbs == NULL) {
665                 service_destroy(service);
666                 return;
667         }
668         cbs->layout_cb = __layout_cb;
669         cbs->result_cb = __result_cb;
670         cbs->destroy_cb = __destroy_cb;
671         cbs->priv = (void *)ad;
672
673         LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
674
675         if (!service) {
676                 service_destroy(service);
677                 free(cbs);
678                 return;
679         }
680
681         service_add_extra_data(service, "emergency_dialer", "emergency");
682         ad->emgc_ug = ug_create(NULL, "dialer-efl", UG_MODE_FULLVIEW, service, cbs);
683         service_destroy(service);
684         free(cbs);
685
686         if (!ad->emgc_ug) {
687                 LOCK_SCREEN_TRACE_DBG("dialer ug failed");
688                 return;
689         }
690 }