2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://floralicense.org/license/
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.
18 #include <Elementary.h>
21 #include <vconf-keys.h>
23 #include <ui-gadget.h>
27 #include "sim-state.h"
32 #define DEFAULT_BG_PATH "/opt/share/settings/Wallpapers/Home_default.jpg"
33 #define SYSTEM_RESUME "system_wakeup"
35 static Evas_Coord pos_down_y = 0;
37 void _set_win_property(Evas_Object * win)
42 LOGD("[Error:%s] Invalid argument: win is NULL", __func__);
45 xwin = elm_win_xwindow_get(win);
47 LOGD("[Error:%s] Cannot get xwindow", __func__);
51 ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION);
53 utilx_set_system_notification_level(ecore_x_display_get(), xwin, UTILX_NOTIFICATION_LEVEL_NORMAL);
55 utilx_set_window_opaque_state(ecore_x_display_get(), xwin, UTILX_OPAQUE_STATE_ON);
58 Evas_Object *_add_layout(Evas_Object *parent, const char *file, const char *group)
66 ly = elm_layout_add(parent);
70 r = elm_layout_file_set(ly, file, group);
75 evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
82 Evas_Object *_make_top_layout(struct appdata *ad)
87 Evas_Object *eo = NULL;
88 Evas_Object *conform = NULL;
90 conform = elm_conformant_add(ad->win);
96 elm_object_style_set(conform, "indicator_overlap");
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", "");
103 eo = _add_layout(conform, EDJEFILE, "lock-main");
107 evas_object_size_hint_weight_set(conform, 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);
117 Evas_Object *_make_slider(Evas_Object *parent)
119 Evas_Object *layout = NULL;
121 if (parent == NULL) {
122 LOCK_SCREEN_TRACE_DBG("The parent of slider is null");
126 layout = _add_layout(parent, EDJEFILE, "lock-slider");
127 if (layout == NULL) {
134 Evas_Object *_get_bg_image(Evas_Object *parent)
136 Evas_Object *bg = NULL;
138 Eina_Bool ret = EINA_FALSE;
143 if ((file = vconf_get_str(VCONFKEY_IDLE_LOCK_BGSET)) == NULL) {
144 file = vconf_get_str(VCONFKEY_BGSET);
147 bg = elm_icon_add(parent);
150 elm_icon_aspect_fixed_set(bg, EINA_FALSE);
153 ret = elm_icon_file_set(bg, file, NULL);
154 if (ret == EINA_FALSE) {
155 elm_icon_file_set(bg, DEFAULT_BG_PATH, NULL);
159 elm_icon_file_set(bg, DEFAULT_BG_PATH, NULL);
164 void lockscreen_info_show(struct appdata *ad)
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);
179 void lockscreen_info_hide(struct appdata *ad)
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);
194 static void _app_exit(void *data, Evas_Object *obj, const char *emission, const char *source)
196 struct appdata *ad = data;
200 static int _init_heynoti(void *data)
202 struct appdata *ad = data;
206 int fd = -1, ret = -1;
207 LOCK_SCREEN_TRACE_DBG("[ == %s == ]", __func__);
211 LOCK_SCREEN_TRACE_DBG("Heynoti init error\n");
215 ret = heynoti_subscribe(fd, SYSTEM_RESUME, update_time, ad);
217 LOCK_SCREEN_TRACE_DBG("[Error] heynoti_subscribe : system_wakeup\n");
221 ret = heynoti_attach_handler(fd);
223 LOCK_SCREEN_TRACE_DBG("[Error] heynoti_attach_handler failed.\n");
232 static void _fini_heynoti(void *data)
234 struct appdata *ad = data;
238 LOCK_SCREEN_TRACE_DBG("[ == %s == ]", __func__);
239 heynoti_unsubscribe(ad->heynoti_fd, SYSTEM_RESUME, update_time);
240 heynoti_close(ad->heynoti_fd);
244 static void _pm_state_cb(keynode_t * node, void *data)
246 LOCK_SCREEN_TRACE_DBG("_pm_state_cb");
248 struct appdata *ad = data;
251 if (vconf_get_int(VCONFKEY_PM_STATE, &val) < 0) {
252 LOCK_SCREEN_TRACE_ERR("Cannot get VCONFKEY_PM_STATE");
256 if (val == VCONFKEY_PM_STATE_NORMAL) {
257 LOCK_SCREEN_TRACE_DBG("LCD on");
260 elm_access_highlight_set(ad->ao_bg);
263 init_slider_touch_variables(ad);
267 static Eina_Bool _mouse_cb(void *data, Evas_Object *obj, void *action_info)
269 struct appdata *ad = data;
270 if (!ad) return EINA_FALSE;
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);
277 static Eina_Bool bDrag = EINA_FALSE;
278 static int event = 0;
279 static int origin_x = -1;
280 static int origin_y = -1;
286 event = a->mouse_type;
292 edje_object_signal_emit(_EDJ(ad->slider), "press",
294 edje_object_signal_emit(_EDJ(ad->slider), "press02",
296 } else if(event == 1) {
297 if(bDrag == EINA_FALSE) {
300 if(abs(a->y - origin_y) > _X(80)){
303 step_width = _X(360)/14;
304 step_number = abs(a->x - origin_x) / step_width;
305 alpha = 255 - (2.55 * step_number *3);
307 if (step_number < 1) {
308 edje_object_signal_emit(_EDJ(ad->slider), "press02",
310 } else if (step_number < 2) {
311 edje_object_signal_emit(_EDJ(ad->slider), "press03",
313 } else if (step_number < 3) {
314 edje_object_signal_emit(_EDJ(ad->slider), "press04",
316 } else if (step_number < 4) {
317 edje_object_signal_emit(_EDJ(ad->slider), "press05",
319 } else if (step_number < 5) {
320 edje_object_signal_emit(_EDJ(ad->slider), "press06",
322 } else if (step_number < 6) {
323 edje_object_signal_emit(_EDJ(ad->slider), "press07",
325 } else if (step_number < 7) {
326 edje_object_signal_emit(_EDJ(ad->slider), "press08",
328 } else if (step_number < 8) {
329 edje_object_signal_emit(_EDJ(ad->slider), "press09",
331 } else if (step_number < 9) {
332 edje_object_signal_emit(_EDJ(ad->slider), "press10",
334 } else if (step_number < 10) {
335 edje_object_signal_emit(_EDJ(ad->slider), "press11",
337 } else if (step_number < 11) {
338 edje_object_signal_emit(_EDJ(ad->slider), "press12",
340 } else if (step_number < 12) {
341 edje_object_signal_emit(_EDJ(ad->slider), "press13",
343 } else if (step_number < 13) {
344 edje_object_signal_emit(_EDJ(ad->slider), "press14",
347 edje_object_signal_emit(_EDJ(ad->slider), "press15",
350 evas_object_color_set(ad->ly_main, alpha, alpha, alpha, alpha);
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);
358 if(bDrag == EINA_TRUE && abs(a->x - origin_x) > _X(360)) {
361 evas_object_del(ad->slider);
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);
374 static Evas_Object *_access_object_get(Evas_Object *obj, const char *part)
376 if(obj == NULL || part == NULL){
377 LOCK_SCREEN_TRACE_ERR("");
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);
384 LOCK_SCREEN_TRACE_ERR("");
387 ao = elm_access_object_get(to);
389 ao = elm_access_object_register(to, obj);
394 const char *_lock_info_access_activate_cb(void *data, Evas_Object *obj)
396 struct appdata *ad = data;
397 if(ad == NULL || obj == NULL) {
400 if(ad->ly_main == NULL || ad->info == NULL) {
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");
412 text = elm_object_part_text_get(ad->info, "txt.clock");
414 text = evas_textblock_text_markup_to_utf8(NULL, text);
416 eina_strbuf_append(str_buf, text);
419 text = elm_object_part_text_get(ad->info, "txt.date");
421 text = evas_textblock_text_markup_to_utf8(NULL, text);
423 eina_strbuf_append(str_buf, text);
426 text = strdup(eina_strbuf_string_get(str_buf));
427 eina_strbuf_free(str_buf);
429 return text?strdup(text):NULL;
432 static Eina_Bool _init_widget_cb(void *data)
434 struct appdata *ad = data;
435 LOGD("[ == %s == ]", __func__);
437 return ECORE_CALLBACK_CANCEL;
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,
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,
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);
460 if(_init_heynoti(ad) != EXIT_SUCCESS) {
461 LOCK_SCREEN_TRACE_DBG("heynoti ERR..!!");
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");
469 vconf_get_bool(VCONFKEY_LOCKSCREEN_EVENT_NOTIFICATION_DISPLAY, &state);
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);
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);
482 edje_object_signal_callback_add(_EDJ(ad->ly_main), "exit,app", "event", _app_exit, ad);
484 Eina_List *chain_list = NULL;
486 ad->ao_bg = _access_object_get(ad->ly_main, "tts.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);
492 Evas_Object *ao_title = _access_object_get(ad->ly_main, "tts.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);
499 Evas_Object *ao_sim = _access_object_get(ad->ly_main, "tts.sim.state");
501 const char *text_sim = elm_object_part_text_get(ad->ly_main, "sim.state");
503 elm_access_info_set(ao_sim, ELM_ACCESS_INFO, text_sim);
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);
509 Evas_Object *ao_info = _access_object_get(ad->ly_main, "tts.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);
516 elm_object_focus_custom_chain_set(ad->ly_main, chain_list);
518 vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_LOCK);
520 return ECORE_CALLBACK_CANCEL;
523 int _app_create(struct appdata *ad)
527 LOGD("[ == %s == ]", __func__);
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);
533 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
535 ad->ly_main = _make_top_layout(ad);
536 if (ad->ly_main == NULL)
538 ad->event_bg = _get_bg_image(ad->ly_main);
539 if (ad->event_bg == NULL)
541 elm_object_part_content_set(ad->ly_main, "sw.bg", ad->event_bg);
546 int _app_reset(struct appdata *ad)
552 ug_destroy(ad->emgc_ug);
556 static int initted = 0;
558 ecore_idler_add(_init_widget_cb, ad);
565 int _app_resume(struct appdata *ad)
573 int _app_terminate(struct appdata *ad)
576 LOGD("[_app_terminate] Invalid argument : struct appdata is NULL\n");
580 vconf_ignore_key_changed(VCONFKEY_PM_STATE, _pm_state_cb);
584 LOGD("[%s] app termiante", __func__);
590 static void __layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
599 base = ug_get_layout(ug);
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);
610 case UG_MODE_FRAMEVIEW:
617 static void __result_cb(ui_gadget_h ug, service_h service, void *priv)
619 LOCK_SCREEN_TRACE_DBG("result_cb\n");
622 static void __destroy_cb(ui_gadget_h ug, void *priv)
624 struct appdata *ad = (struct appdata *)priv;
629 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
635 void launch_emgcall(struct appdata *ad)
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));
645 service_destroy(service);
648 cbs->layout_cb = __layout_cb;
649 cbs->result_cb = __result_cb;
650 cbs->destroy_cb = __destroy_cb;
651 cbs->priv = (void *)ad;
653 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
656 service_destroy(service);
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);
667 LOCK_SCREEN_TRACE_DBG("dialer ug failed");