2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (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>
31 #define DEFAULT_BG_PATH "/opt/share/settings/Wallpapers/Home_default.jpg"
32 #define SYSTEM_RESUME "system_wakeup"
34 static Evas_Coord pos_down_y = 0;
36 void _set_win_property(Evas_Object * win)
41 LOGD("[Error:%s] Invalid argument: win is NULL", __func__);
44 xwin = elm_win_xwindow_get(win);
46 LOGD("[Error:%s] Cannot get xwindow", __func__);
50 ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION);
52 utilx_set_system_notification_level(ecore_x_display_get(), xwin, UTILX_NOTIFICATION_LEVEL_NORMAL);
54 utilx_set_window_opaque_state(ecore_x_display_get(), xwin, UTILX_OPAQUE_STATE_ON);
57 Evas_Object *_add_layout(Evas_Object *parent, const char *file, const char *group)
65 ly = elm_layout_add(parent);
69 r = elm_layout_file_set(ly, file, group);
74 evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
81 Evas_Object *_make_top_layout(struct appdata *ad)
86 Evas_Object *eo = NULL;
87 Evas_Object *conform = NULL;
89 conform = elm_conformant_add(ad->win);
93 elm_object_style_set(conform, "indicator_overlap");
95 eo = _add_layout(conform, EDJEFILE, "lock-main");
99 evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND,
101 elm_win_resize_object_add(ad->win, conform);
102 elm_object_content_set(conform, eo);
103 evas_object_show(conform);
104 evas_object_resize(eo, ad->win_w, ad->win_h);
109 Evas_Object *_make_slider(Evas_Object *parent)
111 Evas_Object *layout = NULL;
113 if (parent == NULL) {
114 LOCK_SCREEN_TRACE_DBG("The parent of slider is null");
118 layout = _add_layout(parent, EDJEFILE, "lock-slider");
119 if (layout == NULL) {
126 Evas_Object *_get_bg_image(Evas_Object *parent)
128 Evas_Object *bg = NULL;
130 Eina_Bool ret = EINA_FALSE;
135 if ((file = vconf_get_str(VCONFKEY_IDLE_LOCK_BGSET)) == NULL) {
136 file = vconf_get_str(VCONFKEY_BGSET);
139 bg = elm_icon_add(parent);
142 elm_icon_aspect_fixed_set(bg, EINA_FALSE);
145 ret = elm_icon_file_set(bg, file, NULL);
146 if (ret == EINA_FALSE) {
147 elm_icon_file_set(bg, DEFAULT_BG_PATH, NULL);
151 elm_icon_file_set(bg, DEFAULT_BG_PATH, NULL);
156 void lockscreen_info_show(struct appdata *ad)
162 edje_object_signal_emit(_EDJ(ad->ly_main), "show,text.area", "text.area");
163 edje_object_signal_emit(_EDJ(ad->ly_main), "show,sw.noti", "sw.noti");
164 edje_object_signal_emit(_EDJ(ad->ly_main), "show,sim.state", "sim.state");
165 edje_object_signal_emit(_EDJ(ad->ly_main), "show,rect.info", "rect.info");
166 if(ad->slider != NULL) {
167 evas_object_show(ad->slider);
171 void lockscreen_info_hide(struct appdata *ad)
177 edje_object_signal_emit(_EDJ(ad->ly_main), "hide,text.area", "text.area");
178 edje_object_signal_emit(_EDJ(ad->ly_main), "hide,sw.noti", "sw.noti");
179 edje_object_signal_emit(_EDJ(ad->ly_main), "hide,sim.state", "sim.state");
180 edje_object_signal_emit(_EDJ(ad->ly_main), "hide,rect.info", "rect.info");
181 if(ad->slider != NULL) {
182 evas_object_hide(ad->slider);
186 static void _set_sim_state(void *data)
188 struct appdata *ad = data;
196 int service_type = VCONFKEY_TELEPHONY_SVCTYPE_SEARCH;
198 if(vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &service_type) != 0) {
199 LOGD("fail to get VCONFKEY_TELEPHONY_SVCTYPE");
202 ret = (vconf_get_int(VCONFKEY_TELEPHONY_SPN_DISP_CONDITION, &state));
204 LOGD("[%s:%d] VCONFKEY(%s) = %d", __func__, __LINE__, VCONFKEY_TELEPHONY_SPN_DISP_CONDITION, state);
205 if (state != VCONFKEY_TELEPHONY_DISP_INVALID
206 && service_type > VCONFKEY_TELEPHONY_SVCTYPE_SEARCH) {
207 if (state & VCONFKEY_TELEPHONY_DISP_SPN) {
208 buf = vconf_get_str(VCONFKEY_TELEPHONY_SPN_NAME);
209 edje_object_part_text_set(_EDJ(ad->ly_main), "sim.state", buf);
212 if (state & VCONFKEY_TELEPHONY_DISP_PLMN) {
213 buf = vconf_get_str(VCONFKEY_TELEPHONY_NWNAME);
214 edje_object_part_text_set(_EDJ(ad->ly_main), "sim.state", buf);
216 } else if (service_type == VCONFKEY_TELEPHONY_SVCTYPE_NOSVC) {
217 edje_object_part_text_set(_EDJ(ad->ly_main), "sim.state", _S("IDS_COM_BODY_NO_SERVICE"));
218 } else if (service_type == VCONFKEY_TELEPHONY_SVCTYPE_EMERGENCY) {
219 edje_object_part_text_set(_EDJ(ad->ly_main), "sim.state", _("IDS_LCKSCN_HEADER_EMERGENCY_CALLS_ONLY"));
221 if (service_type > VCONFKEY_TELEPHONY_SVCTYPE_SEARCH) {
222 buf = vconf_get_str(VCONFKEY_TELEPHONY_NWNAME);
223 edje_object_part_text_set(_EDJ(ad->ly_main), "sim.state", buf);
225 edje_object_part_text_set(_EDJ(ad->ly_main), "sim.state", _S("IDS_COM_BODY_SEARCHING"));
231 static void _app_exit(void *data, Evas_Object *obj, const char *emission, const char *source)
233 struct appdata *ad = data;
237 static int _init_heynoti(void *data)
239 struct appdata *ad = data;
243 int fd = -1, ret = -1;
244 LOCK_SCREEN_TRACE_DBG("[ == %s == ]", __func__);
248 LOCK_SCREEN_TRACE_DBG("Heynoti init error\n");
252 ret = heynoti_subscribe(fd, SYSTEM_RESUME, update_time, ad);
254 LOCK_SCREEN_TRACE_DBG("[Error] heynoti_subscribe : system_wakeup\n");
258 ret = heynoti_attach_handler(fd);
260 LOCK_SCREEN_TRACE_DBG("[Error] heynoti_attach_handler failed.\n");
269 static void _fini_heynoti(void *data)
271 struct appdata *ad = data;
275 LOCK_SCREEN_TRACE_DBG("[ == %s == ]", __func__);
276 heynoti_unsubscribe(ad->heynoti_fd, SYSTEM_RESUME, update_time);
277 heynoti_close(ad->heynoti_fd);
281 static void _pm_state_cb(keynode_t * node, void *data)
283 LOCK_SCREEN_TRACE_DBG("_pm_state_cb");
285 struct appdata *ad = data;
288 if (vconf_get_int(VCONFKEY_PM_STATE, &val) < 0) {
289 LOCK_SCREEN_TRACE_ERR("Cannot get VCONFKEY_PM_STATE");
293 if (val == VCONFKEY_PM_STATE_NORMAL) {
294 LOCK_SCREEN_TRACE_DBG("LCD on");
299 static Eina_Bool _init_widget_cb(void *data)
301 struct appdata *ad = data;
302 LOGD("[ == %s == ]", __func__);
304 return ECORE_CALLBACK_CANCEL;
306 ad->slider = _make_slider(ad->ly_main);
307 evas_object_resize(ad->slider, ad->win_w, SLIDER_RATIO_H * ad->win_h);
308 evas_object_move(ad->slider, 0, SLIDER_RATIO_Y * ad->win_h);
309 evas_object_show(ad->slider);
310 evas_object_geometry_get(
311 edje_object_part_object_get(_EDJ(ad->slider), "lock.wrapper.image.l"),
312 &ad->slider_rel1.x, &ad->slider_rel1.y, &ad->slider_rel1.w,
314 evas_object_geometry_get(
315 edje_object_part_object_get(_EDJ(ad->slider), "lock.wrapper.image.r"),
316 &ad->slider_rel2.x, &ad->slider_rel2.y, &ad->slider_rel2.w,
321 ad->info = elm_layout_add(ad->win);
322 elm_layout_file_set(ad->info, EDJEFILE, "lock-info");
323 evas_object_show(ad->info);
324 elm_object_part_content_set(ad->ly_main, "rect.info", ad->info);
327 if(_init_heynoti(ad) != EXIT_SUCCESS) {
328 LOCK_SCREEN_TRACE_DBG("heynoti ERR..!!");
331 if (vconf_notify_key_changed(VCONFKEY_PM_STATE, _pm_state_cb, ad) != 0) {
332 LOCK_SCREEN_TRACE_ERR("Fail vconf_notify_key_changed : VCONFKEY_PM_STATE");
336 vconf_get_bool(VCONFKEY_LOCKSCREEN_EVENT_NOTIFICATION_DISPLAY, &state);
341 evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb_s, ad);
342 evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb_s, ad);
343 evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb_s, ad);
345 evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_DOWN, _slider_down_cb, ad);
346 evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_UP, _slider_up_cb, ad);
347 evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_MOVE, _slider_move_cb, ad);
349 edje_object_signal_callback_add(_EDJ(ad->ly_main), "exit,app", "event", _app_exit, ad);
351 vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_LOCK);
353 return ECORE_CALLBACK_CANCEL;
356 int _app_create(struct appdata *ad)
360 LOGD("[ == %s == ]", __func__);
362 ecore_x_icccm_name_class_set(elm_win_xwindow_get(ad->win), "LOCK_SCREEN", "LOCK_SCREEN");
363 evas_object_show(ad->win);
364 _set_win_property(ad->win);
366 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
368 ad->ly_main = _make_top_layout(ad);
369 if (ad->ly_main == NULL)
371 ad->event_bg = _get_bg_image(ad->ly_main);
372 if (ad->event_bg == NULL)
374 elm_object_part_content_set(ad->ly_main, "sw.bg", ad->event_bg);
379 int _app_reset(struct appdata *ad)
385 ug_destroy(ad->emgc_ug);
389 static int initted = 0;
391 ecore_idler_add(_init_widget_cb, ad);
398 int _app_resume(struct appdata *ad)
406 int _app_terminate(struct appdata *ad)
408 vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK);
411 LOGD("[_app_terminate] Invalid argument : struct appdata is NULL\n");
415 vconf_ignore_key_changed(VCONFKEY_PM_STATE, _pm_state_cb);
418 LOGD("[%s] app termiante", __func__);
424 static void __layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
433 base = ug_get_layout(ug);
438 case UG_MODE_FULLVIEW:
439 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
440 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
441 elm_win_resize_object_add(ad->win, base);
442 evas_object_show(base);
444 case UG_MODE_FRAMEVIEW:
451 static void __result_cb(ui_gadget_h ug, service_h service, void *priv)
453 LOCK_SCREEN_TRACE_DBG("result_cb\n");
456 static void __destroy_cb(ui_gadget_h ug, void *priv)
458 struct appdata *ad = (struct appdata *)priv;
463 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
469 void launch_emgcall(struct appdata *ad)
475 service_create(&service);
476 UG_INIT_EFL(ad->win, UG_OPT_INDICATOR_ENABLE);
477 struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
479 service_destroy(service);
482 cbs->layout_cb = __layout_cb;
483 cbs->result_cb = __result_cb;
484 cbs->destroy_cb = __destroy_cb;
485 cbs->priv = (void *)ad;
487 LOCK_SCREEN_TRACE_DBG("[%s:%d]", __func__, __LINE__);
490 service_destroy(service);
495 service_add_extra_data(service, "emergency_dialer", "emergency");
496 ad->emgc_ug = ug_create(NULL, "dialer-efl", UG_MODE_FULLVIEW, service, cbs);
497 service_destroy(service);
501 LOCK_SCREEN_TRACE_DBG("dialer ug failed");