Implement lockscreen tts.
[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 Eina_Bool _init_widget_cb(void *data)
433 {
434         struct appdata *ad = data;
435         LOGD("[ == %s == ]", __func__);
436         if (ad == NULL)
437                 return ECORE_CALLBACK_CANCEL;
438
439         ad->slider = _make_slider(ad->ly_main);
440         evas_object_resize(ad->slider, ad->win_w, SLIDER_RATIO_H * ad->win_h);
441         evas_object_move(ad->slider, 0, SLIDER_RATIO_Y * ad->win_h);
442         evas_object_show(ad->slider);
443         evas_object_geometry_get(
444                         edje_object_part_object_get(_EDJ(ad->slider), "lock.wrapper.image.l"),
445                         &ad->slider_rel1.x, &ad->slider_rel1.y, &ad->slider_rel1.w,
446                         &ad->slider_rel1.h);
447         evas_object_geometry_get(
448                         edje_object_part_object_get(_EDJ(ad->slider), "lock.wrapper.image.r"),
449                         &ad->slider_rel2.x, &ad->slider_rel2.y, &ad->slider_rel2.w,
450                         &ad->slider_rel2.h);
451
452         set_sim_state(ad);
453
454         ad->info = elm_layout_add(ad->win);
455         elm_layout_file_set(ad->info, EDJEFILE, "lock-info");
456         evas_object_show(ad->info);
457         elm_object_part_content_set(ad->ly_main, "rect.info", ad->info);
458         _set_info(ad);
459
460         if(_init_heynoti(ad) != EXIT_SUCCESS) {
461                 LOCK_SCREEN_TRACE_DBG("heynoti ERR..!!");
462         }
463
464         if (vconf_notify_key_changed(VCONFKEY_PM_STATE, _pm_state_cb, ad) != 0) {
465                 LOCK_SCREEN_TRACE_ERR("Fail vconf_notify_key_changed : VCONFKEY_PM_STATE");
466         }
467
468         int state = 0;
469         vconf_get_bool(VCONFKEY_LOCKSCREEN_EVENT_NOTIFICATION_DISPLAY, &state);
470         if(state){
471                 noti_process(ad);
472         }
473
474         evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb_s, ad);
475         evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb_s, ad);
476         evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb_s, ad);
477
478         evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_DOWN, _slider_down_cb, ad);
479         evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_UP, _slider_up_cb, ad);
480         evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_MOVE, _slider_move_cb, ad);
481
482         edje_object_signal_callback_add(_EDJ(ad->ly_main), "exit,app", "event", _app_exit, ad);
483
484         Eina_List *chain_list = NULL;
485
486         ad->ao_bg = _access_object_get(ad->ly_main, "tts.bg");
487         if(ad->ao_bg) {
488                 elm_access_action_cb_set(ad->ao_bg, ELM_ACCESS_ACTION_MOUSE, _mouse_cb, ad);
489                 elm_object_focus_allow_set(ad->ao_bg, EINA_TRUE);
490                 chain_list = eina_list_append(chain_list, ad->ao_bg);
491         }
492         Evas_Object *ao_title = _access_object_get(ad->ly_main, "tts.title");
493         if(ao_title) {
494                 elm_access_info_set(ao_title, ELM_ACCESS_INFO, "Life Magazine");
495                 elm_access_info_set(ao_title, ELM_ACCESS_TYPE, "");
496                 elm_object_focus_allow_set(ao_title, EINA_TRUE);
497                 chain_list = eina_list_append(chain_list, ao_title);
498         }
499         Evas_Object *ao_sim = _access_object_get(ad->ly_main, "tts.sim.state");
500         if(ao_sim) {
501                 const char *text_sim = elm_object_part_text_get(ad->ly_main, "sim.state");
502                 if(text_sim) {
503                         elm_access_info_set(ao_sim, ELM_ACCESS_INFO, text_sim);
504                 }
505                 elm_access_info_set(ao_sim, ELM_ACCESS_TYPE, "");
506                 elm_object_focus_allow_set(ao_sim, EINA_TRUE);
507                 chain_list = eina_list_append(chain_list, ao_sim);
508         }
509         Evas_Object *ao_info = _access_object_get(ad->ly_main, "tts.info");
510         if(ao_info) {
511                 elm_access_info_cb_set(ao_info, ELM_ACCESS_INFO, _lock_info_access_activate_cb, ad);
512                 elm_access_info_set(ao_info, ELM_ACCESS_TYPE, "");
513                 elm_object_focus_allow_set(ao_info, EINA_TRUE);
514                 chain_list = eina_list_append(chain_list, ao_info);
515         }
516         elm_object_focus_custom_chain_set(ad->ly_main, chain_list);
517
518         vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_LOCK);
519
520         return ECORE_CALLBACK_CANCEL;
521 }
522
523 int _app_create(struct appdata *ad)
524 {
525         if (ad == NULL)
526                 return -1;
527         LOGD("[ == %s == ]", __func__);
528
529         ecore_x_icccm_name_class_set(elm_win_xwindow_get(ad->win), "LOCK_SCREEN", "LOCK_SCREEN");
530         evas_object_show(ad->win);
531         _set_win_property(ad->win);
532
533         elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
534
535         ad->ly_main = _make_top_layout(ad);
536         if (ad->ly_main == NULL)
537                 return -1;
538         ad->event_bg = _get_bg_image(ad->ly_main);
539         if (ad->event_bg == NULL)
540                 return -1;
541         elm_object_part_content_set(ad->ly_main, "sw.bg", ad->event_bg);
542
543         return 0;
544 }
545
546 int _app_reset(struct appdata *ad)
547 {
548         if (ad == NULL)
549                 return -1;
550
551         if (ad->emgc_ug) {
552                 ug_destroy(ad->emgc_ug);
553                 ad->emgc_ug = NULL;
554         }
555
556         static int initted = 0;
557         if(initted == 0) {
558                 ecore_idler_add(_init_widget_cb, ad);
559                 initted = 1;
560         }
561
562         return 0;
563 }
564
565 int _app_resume(struct appdata *ad)
566 {
567         if (ad == NULL)
568                 return -1;
569
570         return 0;
571 }
572
573 int _app_terminate(struct appdata *ad)
574 {
575         if (ad == NULL) {
576                 LOGD("[_app_terminate] Invalid argument : struct appdata is NULL\n");
577                 return -1;
578         }
579
580         vconf_ignore_key_changed(VCONFKEY_PM_STATE, _pm_state_cb);
581         fini_sim_state(ad);
582         _fini_heynoti(ad);
583
584         LOGD("[%s] app termiante", __func__);
585         elm_exit();
586
587         return 0;
588 }
589
590 static void __layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
591 {
592         struct appdata *ad;
593         Evas_Object *base;
594
595         if (!ug || !priv)
596                 return;
597
598         ad = priv;
599         base = ug_get_layout(ug);
600         if (!base)
601                 return;
602
603         switch(mode) {
604         case UG_MODE_FULLVIEW:
605                 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
606                 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
607                 elm_win_resize_object_add(ad->win, base);
608                 evas_object_show(base);
609                 break;
610         case UG_MODE_FRAMEVIEW:
611                 break;
612         default:
613                 break;
614         }
615 }
616
617 static void __result_cb(ui_gadget_h ug, service_h service, void *priv)
618 {
619         LOCK_SCREEN_TRACE_DBG("result_cb\n");
620 }
621
622 static void __destroy_cb(ui_gadget_h ug, void *priv)
623 {
624         struct appdata *ad = (struct appdata *)priv;
625
626         if (!ug || !ad) {
627                 return;
628         }
629         LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
630
631         ug_destroy(ug);
632         ug = NULL;
633 }
634
635 void launch_emgcall(struct appdata *ad)
636 {
637         if (ad == NULL)
638                 return;
639
640         service_h service;
641         service_create(&service);
642         UG_INIT_EFL(ad->win, UG_OPT_INDICATOR_ENABLE);
643         struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
644         if (cbs == NULL) {
645                 service_destroy(service);
646                 return;
647         }
648         cbs->layout_cb = __layout_cb;
649         cbs->result_cb = __result_cb;
650         cbs->destroy_cb = __destroy_cb;
651         cbs->priv = (void *)ad;
652
653         LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
654
655         if (!service) {
656                 service_destroy(service);
657                 free(cbs);
658                 return;
659         }
660
661         service_add_extra_data(service, "emergency_dialer", "emergency");
662         ad->emgc_ug = ug_create(NULL, "dialer-efl", UG_MODE_FULLVIEW, service, cbs);
663         service_destroy(service);
664         free(cbs);
665
666         if (!ad->emgc_ug) {
667                 LOCK_SCREEN_TRACE_DBG("dialer ug failed");
668                 return;
669         }
670 }