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 int _get_vconf_screenreader(void)
246 int is_screenreader = -1;
247 if(vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &is_screenreader) < 0) {
250 return is_screenreader;
253 static void _pm_state_cb(keynode_t * node, void *data)
255 LOCK_SCREEN_TRACE_DBG("_pm_state_cb");
257 struct appdata *ad = data;
260 if (vconf_get_int(VCONFKEY_PM_STATE, &val) < 0) {
261 LOCK_SCREEN_TRACE_ERR("Cannot get VCONFKEY_PM_STATE");
265 if (val == VCONFKEY_PM_STATE_NORMAL) {
266 LOCK_SCREEN_TRACE_DBG("LCD on");
268 if(_get_vconf_screenreader() && ad->ao_bg) {
269 elm_access_highlight_set(ad->ao_bg);
272 init_slider_touch_variables(ad);
276 static Eina_Bool _mouse_cb(void *data, Evas_Object *obj, void *action_info)
278 struct appdata *ad = data;
279 if (!ad) return EINA_FALSE;
281 Elm_Access_Action_Info *a;
282 a = (Elm_Access_Action_Info *) action_info;
283 if (!a) return EINA_FALSE;
284 LOCK_SCREEN_TRACE_DBG("event : %d, read x: %d, y: %d\n", a->mouse_type, a->x, a->y);
286 static Eina_Bool bDrag = EINA_FALSE;
287 static int event = 0;
288 static int origin_x = -1;
289 static int origin_y = -1;
295 event = a->mouse_type;
301 edje_object_signal_emit(_EDJ(ad->slider), "press",
303 edje_object_signal_emit(_EDJ(ad->slider), "press02",
305 } else if(event == 1) {
306 if(bDrag == EINA_FALSE) {
309 if(abs(a->y - origin_y) > _X(80)){
312 step_width = _X(360)/14;
313 step_number = abs(a->x - origin_x) / step_width;
314 alpha = 255 - (2.55 * step_number *3);
316 if (step_number < 1) {
317 edje_object_signal_emit(_EDJ(ad->slider), "press02",
319 } else if (step_number < 2) {
320 edje_object_signal_emit(_EDJ(ad->slider), "press03",
322 } else if (step_number < 3) {
323 edje_object_signal_emit(_EDJ(ad->slider), "press04",
325 } else if (step_number < 4) {
326 edje_object_signal_emit(_EDJ(ad->slider), "press05",
328 } else if (step_number < 5) {
329 edje_object_signal_emit(_EDJ(ad->slider), "press06",
331 } else if (step_number < 6) {
332 edje_object_signal_emit(_EDJ(ad->slider), "press07",
334 } else if (step_number < 7) {
335 edje_object_signal_emit(_EDJ(ad->slider), "press08",
337 } else if (step_number < 8) {
338 edje_object_signal_emit(_EDJ(ad->slider), "press09",
340 } else if (step_number < 9) {
341 edje_object_signal_emit(_EDJ(ad->slider), "press10",
343 } else if (step_number < 10) {
344 edje_object_signal_emit(_EDJ(ad->slider), "press11",
346 } else if (step_number < 11) {
347 edje_object_signal_emit(_EDJ(ad->slider), "press12",
349 } else if (step_number < 12) {
350 edje_object_signal_emit(_EDJ(ad->slider), "press13",
352 } else if (step_number < 13) {
353 edje_object_signal_emit(_EDJ(ad->slider), "press14",
356 edje_object_signal_emit(_EDJ(ad->slider), "press15",
359 evas_object_color_set(ad->ly_main, alpha, alpha, alpha, alpha);
361 } else if(event == 2) {
362 edje_object_signal_emit(_EDJ(ad->slider), "release", "lock.image.l");
363 edje_object_signal_emit(_EDJ(ad->slider), "release", "lock.image.r");
364 evas_object_color_set(ad->ly_main, 255, 255, 255, 255);
367 if(bDrag == EINA_TRUE && abs(a->x - origin_x) > _X(360)) {
370 evas_object_del(ad->slider);
373 LOCK_SCREEN_TRACE_DBG("unlock the lock-screen");
374 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_HIDE);
375 elm_object_signal_emit(ad->ly_main, "transit,clipper", "clipper");
376 vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK);
383 static Evas_Object *_access_object_get(Evas_Object *obj, const char *part)
385 if(obj == NULL || part == NULL){
386 LOCK_SCREEN_TRACE_ERR("");
389 Evas_Object *to = NULL;
390 Evas_Object *ao = NULL;
391 to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(obj), part);
393 LOCK_SCREEN_TRACE_ERR("");
396 ao = elm_access_object_get(to);
398 ao = elm_access_object_register(to, obj);
403 const char *_lock_info_access_activate_cb(void *data, Evas_Object *obj)
405 struct appdata *ad = data;
406 if(ad == NULL || obj == NULL) {
409 if(ad->ly_main == NULL || ad->info == NULL) {
413 const char *text = NULL;
414 Eina_Strbuf *str_buf = NULL;
415 str_buf = eina_strbuf_new();
416 if(str_buf == NULL) {
417 LOCK_SCREEN_TRACE_ERR("eina_strbuf_new() failed");
421 text = elm_object_part_text_get(ad->info, "txt.clock");
423 text = evas_textblock_text_markup_to_utf8(NULL, text);
425 eina_strbuf_append(str_buf, text);
428 text = elm_object_part_text_get(ad->info, "txt.date");
430 text = evas_textblock_text_markup_to_utf8(NULL, text);
432 eina_strbuf_append(str_buf, text);
435 text = strdup(eina_strbuf_string_get(str_buf));
436 eina_strbuf_free(str_buf);
438 return text?strdup(text):NULL;
441 static void _response_cb(void *data, Evas_Object *obj, void *event_info)
446 static Eina_Bool _init_widget_cb(void *data)
448 struct appdata *ad = data;
449 LOGD("[ == %s == ]", __func__);
451 return ECORE_CALLBACK_CANCEL;
453 ad->slider = _make_slider(ad->ly_main);
454 evas_object_resize(ad->slider, ad->win_w, SLIDER_RATIO_H * ad->win_h);
455 evas_object_move(ad->slider, 0, SLIDER_RATIO_Y * ad->win_h);
456 evas_object_show(ad->slider);
457 evas_object_geometry_get(
458 edje_object_part_object_get(_EDJ(ad->slider), "lock.wrapper.image.l"),
459 &ad->slider_rel1.x, &ad->slider_rel1.y, &ad->slider_rel1.w,
461 evas_object_geometry_get(
462 edje_object_part_object_get(_EDJ(ad->slider), "lock.wrapper.image.r"),
463 &ad->slider_rel2.x, &ad->slider_rel2.y, &ad->slider_rel2.w,
468 ad->info = elm_layout_add(ad->win);
469 elm_layout_file_set(ad->info, EDJEFILE, "lock-info");
470 evas_object_show(ad->info);
471 elm_object_part_content_set(ad->ly_main, "rect.info", ad->info);
474 if(_init_heynoti(ad) != EXIT_SUCCESS) {
475 LOCK_SCREEN_TRACE_DBG("heynoti ERR..!!");
478 if (vconf_notify_key_changed(VCONFKEY_PM_STATE, _pm_state_cb, ad) != 0) {
479 LOCK_SCREEN_TRACE_ERR("Fail vconf_notify_key_changed : VCONFKEY_PM_STATE");
483 vconf_get_bool(VCONFKEY_LOCKSCREEN_EVENT_NOTIFICATION_DISPLAY, &state);
488 //evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb_s, ad);
489 //evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb_s, ad);
490 //evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb_s, ad);
491 evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_DOWN, _slider_down_cb, ad);
492 evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_UP, _slider_up_cb, ad);
493 evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_MOVE, _slider_move_cb, ad);
494 if(evas_alloc_error() != EVAS_ALLOC_ERROR_NONE) {
495 LOCK_SCREEN_TRACE_ERR("evas_object_event_callback_add() failed");
496 Evas_Object *popup = NULL;
497 Evas_Object *button = NULL;
498 popup = elm_popup_add(ad->ly_main);
499 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
500 elm_object_text_set(popup, _NOT_LOCALIZED("callback add failed"));
501 button = elm_button_add(popup);
502 elm_object_text_set(button, _S("IDS_COM_SK_OK"));
503 elm_object_part_content_set(popup, "button1", button);
504 evas_object_smart_callback_add(button, "clicked", _response_cb, popup);
505 evas_object_show(popup);
506 return ECORE_CALLBACK_CANCEL;
508 LOCK_SCREEN_TRACE_DBG("evas_object_event_callback_add() success");
511 edje_object_signal_callback_add(_EDJ(ad->ly_main), "exit,app", "event", _app_exit, ad);
513 Eina_List *chain_list = NULL;
515 ad->ao_bg = _access_object_get(ad->ly_main, "tts.bg");
517 elm_access_action_cb_set(ad->ao_bg, ELM_ACCESS_ACTION_MOUSE, _mouse_cb, ad);
518 elm_object_focus_allow_set(ad->ao_bg, EINA_TRUE);
519 chain_list = eina_list_append(chain_list, ad->ao_bg);
521 Evas_Object *ao_title = _access_object_get(ad->ly_main, "tts.title");
523 elm_access_info_set(ao_title, ELM_ACCESS_INFO, "Life Magazine");
524 elm_access_info_set(ao_title, ELM_ACCESS_TYPE, "");
525 elm_object_focus_allow_set(ao_title, EINA_TRUE);
526 chain_list = eina_list_append(chain_list, ao_title);
528 Evas_Object *ao_sim = _access_object_get(ad->ly_main, "tts.sim.state");
530 const char *text_sim = elm_object_part_text_get(ad->ly_main, "sim.state");
532 elm_access_info_set(ao_sim, ELM_ACCESS_INFO, text_sim);
534 elm_access_info_set(ao_sim, ELM_ACCESS_TYPE, "");
535 elm_object_focus_allow_set(ao_sim, EINA_TRUE);
536 chain_list = eina_list_append(chain_list, ao_sim);
538 Evas_Object *ao_info = _access_object_get(ad->ly_main, "tts.info");
540 elm_access_info_cb_set(ao_info, ELM_ACCESS_INFO, _lock_info_access_activate_cb, ad);
541 elm_access_info_set(ao_info, ELM_ACCESS_TYPE, "");
542 elm_object_focus_allow_set(ao_info, EINA_TRUE);
543 chain_list = eina_list_append(chain_list, ao_info);
545 elm_object_focus_custom_chain_set(ad->ly_main, chain_list);
547 vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_LOCK);
549 return ECORE_CALLBACK_CANCEL;
552 int _app_create(struct appdata *ad)
556 LOGD("[ == %s == ]", __func__);
558 ecore_x_icccm_name_class_set(elm_win_xwindow_get(ad->win), "LOCK_SCREEN", "LOCK_SCREEN");
559 evas_object_show(ad->win);
560 _set_win_property(ad->win);
562 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
564 ad->ly_main = _make_top_layout(ad);
565 if (ad->ly_main == NULL)
567 ad->event_bg = _get_bg_image(ad->ly_main);
568 if (ad->event_bg == NULL)
570 elm_object_part_content_set(ad->ly_main, "sw.bg", ad->event_bg);
575 #define _MAKE_ATOM(a, s) \
577 a = ecore_x_atom_get(s); \
579 LOCK_SCREEN_TRACE_ERR("%s creation failed.", s); \
582 #define STR_ATOM_PANEL_SCROLLABLE_STATE "_E_MOVE_PANEL_SCROLLABLE_STATE"
584 int _app_reset(struct appdata *ad)
590 ug_destroy(ad->emgc_ug);
594 static int initted = 0;
595 if (ad->lock_type == SETTING_SCREEN_LOCK_TYPE_SIMPLE_PASSWORD) {
597 Ecore_X_Atom ATOM_PANEL_SCROLLABLE_STATE = 0;
601 _MAKE_ATOM(ATOM_PANEL_SCROLLABLE_STATE, STR_ATOM_PANEL_SCROLLABLE_STATE );
603 val[0] = 0; // always enable F
604 val[1] = 0; // quickpanel enable F
605 val[2] = 0; // apptray enable F
607 LOCK_SCREEN_TRACE_DBG("Set quickpanel disable");
608 ecore_x_window_prop_card32_set(elm_win_xwindow_get(ad->win),
609 ATOM_PANEL_SCROLLABLE_STATE,
613 simple_password_layout_create(ad);
618 ecore_idler_add(_init_widget_cb, ad);
626 int _app_resume(struct appdata *ad)
634 int _app_terminate(struct appdata *ad)
637 LOGD("[_app_terminate] Invalid argument : struct appdata is NULL\n");
641 vconf_ignore_key_changed(VCONFKEY_PM_STATE, _pm_state_cb);
645 LOGD("[%s] app termiante", __func__);
651 static void __layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
660 base = ug_get_layout(ug);
665 case UG_MODE_FULLVIEW:
666 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
667 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
668 elm_win_resize_object_add(ad->win, base);
669 evas_object_show(base);
671 case UG_MODE_FRAMEVIEW:
678 static void __result_cb(ui_gadget_h ug, service_h service, void *priv)
680 LOCK_SCREEN_TRACE_DBG("result_cb\n");
683 static void __destroy_cb(ui_gadget_h ug, void *priv)
685 struct appdata *ad = (struct appdata *)priv;
690 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
696 void launch_emgcall(struct appdata *ad)
702 service_create(&service);
703 UG_INIT_EFL(ad->win, UG_OPT_INDICATOR_ENABLE);
704 struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
706 service_destroy(service);
709 cbs->layout_cb = __layout_cb;
710 cbs->result_cb = __result_cb;
711 cbs->destroy_cb = __destroy_cb;
712 cbs->priv = (void *)ad;
714 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
717 service_destroy(service);
722 service_add_extra_data(service, "emergency_dialer", "emergency");
723 ad->emgc_ug = ug_create(NULL, "dialer-efl", UG_MODE_FULLVIEW, service, cbs);
724 service_destroy(service);
728 LOCK_SCREEN_TRACE_DBG("dialer ug failed");