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 void _response_cb(void *data, Evas_Object *obj, void *event_info)
437 static Eina_Bool _init_widget_cb(void *data)
439 struct appdata *ad = data;
440 LOGD("[ == %s == ]", __func__);
442 return ECORE_CALLBACK_CANCEL;
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,
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,
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);
465 if(_init_heynoti(ad) != EXIT_SUCCESS) {
466 LOCK_SCREEN_TRACE_DBG("heynoti ERR..!!");
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");
474 vconf_get_bool(VCONFKEY_LOCKSCREEN_EVENT_NOTIFICATION_DISPLAY, &state);
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;
499 LOCK_SCREEN_TRACE_DBG("evas_object_event_callback_add() success");
502 edje_object_signal_callback_add(_EDJ(ad->ly_main), "exit,app", "event", _app_exit, ad);
504 Eina_List *chain_list = NULL;
506 ad->ao_bg = _access_object_get(ad->ly_main, "tts.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);
512 Evas_Object *ao_title = _access_object_get(ad->ly_main, "tts.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);
519 Evas_Object *ao_sim = _access_object_get(ad->ly_main, "tts.sim.state");
521 const char *text_sim = elm_object_part_text_get(ad->ly_main, "sim.state");
523 elm_access_info_set(ao_sim, ELM_ACCESS_INFO, text_sim);
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);
529 Evas_Object *ao_info = _access_object_get(ad->ly_main, "tts.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);
536 elm_object_focus_custom_chain_set(ad->ly_main, chain_list);
538 vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_LOCK);
540 return ECORE_CALLBACK_CANCEL;
543 int _app_create(struct appdata *ad)
547 LOGD("[ == %s == ]", __func__);
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);
553 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
555 ad->ly_main = _make_top_layout(ad);
556 if (ad->ly_main == NULL)
558 ad->event_bg = _get_bg_image(ad->ly_main);
559 if (ad->event_bg == NULL)
561 elm_object_part_content_set(ad->ly_main, "sw.bg", ad->event_bg);
566 int _app_reset(struct appdata *ad)
572 ug_destroy(ad->emgc_ug);
576 static int initted = 0;
578 ecore_idler_add(_init_widget_cb, ad);
585 int _app_resume(struct appdata *ad)
593 int _app_terminate(struct appdata *ad)
596 LOGD("[_app_terminate] Invalid argument : struct appdata is NULL\n");
600 vconf_ignore_key_changed(VCONFKEY_PM_STATE, _pm_state_cb);
604 LOGD("[%s] app termiante", __func__);
610 static void __layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
619 base = ug_get_layout(ug);
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);
630 case UG_MODE_FRAMEVIEW:
637 static void __result_cb(ui_gadget_h ug, service_h service, void *priv)
639 LOCK_SCREEN_TRACE_DBG("result_cb\n");
642 static void __destroy_cb(ui_gadget_h ug, void *priv)
644 struct appdata *ad = (struct appdata *)priv;
649 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
655 void launch_emgcall(struct appdata *ad)
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));
665 service_destroy(service);
668 cbs->layout_cb = __layout_cb;
669 cbs->result_cb = __result_cb;
670 cbs->destroy_cb = __destroy_cb;
671 cbs->priv = (void *)ad;
673 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
676 service_destroy(service);
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);
687 LOCK_SCREEN_TRACE_DBG("dialer ug failed");