2 * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
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.
23 #include <app_control.h>
26 #include <ui-gadget.h>
28 #include "lockscreen-lite.h"
29 #include "control-panel.h"
30 #include "progress_circle.h"
31 #include "sim-state.h"
32 #include "notification-item.h"
33 #include "tizen-account.h"
34 #include "control-panel-password.h"
35 #include "simple-password.h"
37 #define CONTROL_PANEL_PROPORTION 0.2
40 #define CAM_ICON_X 390
41 #define CAM_ICON_Y 710
44 #define CAM_ICOM_MAX_W CAM_ICON_W * MAX_SCALE
45 #define CAM_ICON_MAX_H CAM_ICON_H * MAX_SCALE
47 #define CAMERA_APP_ID "com.samsung.camera-app-lite"
49 #define UNLOCK_TEXT _("IDS_LCKSCN_BUTTON3_UNLOCK_VIA_TIZEN_ACCOUNT")
51 #define PLMN_LABEL_STYLE "<style=far_shadow,bottom><shadow_color=#00000033><font_size=24><align=left><color=#FFFFFF><text_class=ATO007><color_class=ATO007><wrap=none>"
56 #define PLMN_SPN_LENGTH 32
57 #define EMG_BUTTON_WIDTH 322
59 #define BUS_NAME "org.tizen.system.deviced"
60 #define DEVICED_PATH_DISPLAY "/Org/Tizen/System/DeviceD/Display"
61 #define DEVICED_INTERFACE_DISPLAY "org.tizen.system.deviced.display"
62 #define METHOD_LOCKSCREEN_BG_ON "LockScreenBgOn"
63 #define DBUS_REPLY_TIMEOUT -1
65 extern LKD_Module g_mod_control_panel;
66 static const char *bool_str[2] = {"false", "true"};
69 Evas_Object *control_panel_layout;
70 Evas_Object *camera_icon;
71 Evas_Object *unlock_circle;
72 Evas_Object *unlock_background;
73 Evas_Object *operator_name;
75 bool is_password_panel_visible;
82 } camera_icon_geometry;
91 } s_control_panel_info = {
92 .control_panel_layout = NULL,
94 .unlock_circle = NULL,
95 .unlock_background = NULL,
97 .is_password_panel_visible = false,
99 .camera_icon_geometry.x = 0,
100 .camera_icon_geometry.y = 0,
101 .camera_icon_geometry.w = 0,
102 .camera_icon_geometry.h = 0,
104 .camera_bg_geometry.x = 0,
105 .camera_bg_geometry.y = 0,
106 .camera_bg_geometry.w = 0,
107 .camera_bg_geometry.h = 0,
111 static char* _plmn_spn_get();
113 static void __emg_button_clicked_cb(void *data, Evas_Object *obj, void *event_info);
115 static void __launch_emgcall(void);
116 // static void __sim_status_print(TelSimCardStatus_t sim_status, int card_changed);
118 static void _operator_name_slide_mode_set(Evas_Object *name)
120 Evas_Object *name_edje;
125 LOCK_SCREEN_TRACE_ERR("paramter error!");
128 elm_label_slide_mode_set(name, ELM_LABEL_SLIDE_MODE_NONE);
130 name_edje = elm_layout_edje_get(name);
133 LOGE("Failed to get label edje");
137 tb = (Evas_Object*)edje_object_part_object_get(name_edje, "elm.text");
140 LOGE("Failed to get label tb");
144 evas_object_textblock_size_native_get(tb, &tb_w, NULL);
146 if((tb_w>0) && (tb_w>ELM_SCALE_SIZE(EMG_BUTTON_WIDTH)))
148 elm_label_slide_mode_set(name, ELM_LABEL_SLIDE_MODE_AUTO);
150 elm_label_slide_go(name);
152 static void _operator_sliding_label_create(Evas_Object *layout, char *text)
154 char buf[512] = {0,};
155 Evas_Object *label = elm_label_add(layout);
158 LOGE("Failed to add label");
162 char *markup_text = elm_entry_utf8_to_markup(text);
163 snprintf(buf, sizeof(buf), "%s%s</wrap></color_class></text_class></color></align></font_size></shadow_color></style>", PLMN_LABEL_STYLE, markup_text);
166 elm_object_style_set(label, "slide_short");
167 elm_label_wrap_width_set(label, 100);
168 elm_label_ellipsis_set(label, EINA_TRUE);
169 elm_label_slide_duration_set(label, 2);
170 _operator_name_slide_mode_set(label);
172 elm_object_text_set(label, buf);
174 elm_object_part_content_set(layout, "emg_call_button", label);
175 evas_object_show(label);
177 s_control_panel_info.operator_name = label;
180 Evas_Object* control_panel_create()
182 LOCK_SCREEN_TRACE_DBG("");
184 Evas_Object *main_window = NULL;
185 Evas_Object *control_panel_layout = NULL;
186 char *operator_name = NULL;
188 main_window = lockscreen_get_window();
191 LOCK_SCREEN_TRACE_DBG("Failed to get the main window");
195 control_panel_layout = elm_layout_add(main_window);
196 if(!control_panel_layout)
198 LOCK_SCREEN_TRACE_DBG("Failed to create control panel layout");
202 if(!elm_layout_file_set(control_panel_layout, EDJE_DIR"control-panel.edj", "control_panel_layout_dual_text"))
204 LOCK_SCREEN_TRACE_DBG("Failed to set file for control panel layout");
205 evas_object_del(control_panel_layout);
209 const int w = lockscreen_get_window_width();
210 const int h = lockscreen_get_window_height() * CONTROL_PANEL_PROPORTION;
212 evas_object_size_hint_min_set(control_panel_layout, w, h);
213 evas_object_size_hint_max_set(control_panel_layout, w, h);
214 evas_object_resize(control_panel_layout, w, h);
216 s_control_panel_info.control_panel_layout = control_panel_layout;
217 evas_object_show(control_panel_layout);
219 operator_name = sim_status_network_name_get();
221 if(!operator_name || !strlen(operator_name))
223 LOCK_SCREEN_TRACE_DBG("Unknown network name - setting plmn/spn");
228 operator_name = _plmn_spn_get();
233 LOCK_SCREEN_TRACE_DBG("Final network name : [%s]", operator_name);
234 _operator_sliding_label_create(control_panel_layout, operator_name);
239 LOCK_SCREEN_TRACE_DBG("Unknown plmn/spn - setting empty name");
240 _operator_sliding_label_create(control_panel_layout, "");
243 if (elm_object_text_get(s_control_panel_info.operator_name) == NULL)
245 LOCK_SCREEN_TRACE_DBG("Failed to set network info in layout");
246 evas_object_del(control_panel_layout);
247 evas_object_del(s_control_panel_info.operator_name);
248 s_control_panel_info.operator_name = NULL;
253 control_panel_operator_name_show();
255 elm_object_part_text_set(s_control_panel_info.control_panel_layout, "unlock,text", UNLOCK_TEXT);
257 // show_unlock_text();
259 return control_panel_layout;
262 void control_panel_sim_state_changed()
264 LOCK_SCREEN_TRACE_DBG("");
268 if(!s_control_panel_info.control_panel_layout)
270 LOCK_SCREEN_TRACE_ERR("invalid state of app : layout is NULL");
274 if(!s_control_panel_info.operator_name)
276 LOCK_SCREEN_TRACE_ERR("invalid state of app : operator name label is NULL");
280 if(s_control_panel_info.operator_name)
282 evas_object_del(s_control_panel_info.operator_name);
285 name = sim_status_network_name_get();
287 if (strlen(name) <= 0) {
289 name = _plmn_spn_get();
294 LOCK_SCREEN_TRACE_DBG("Final network name : [%s]", name);
296 _operator_sliding_label_create(s_control_panel_info.control_panel_layout, name);
297 control_panel_operator_name_show();
301 LOCK_SCREEN_TRACE_DBG("Unknown plmn/spn - setting empty name");
302 _operator_sliding_label_create(s_control_panel_info.control_panel_layout, "");
305 _operator_name_slide_mode_set(s_control_panel_info.operator_name);
308 void hide_emg_call_btn(void)
310 ret_if(s_control_panel_info.control_panel_layout == NULL);
312 elm_object_signal_emit(s_control_panel_info.control_panel_layout, "hide,emg,btn", "");
315 void show_emg_call_btn(void)
317 ret_if(s_control_panel_info.control_panel_layout == NULL);
320 elm_object_signal_emit(s_control_panel_info.control_panel_layout, "show,emg,btn", "");
323 void show_unlock_text(void)
325 elm_object_signal_emit(s_control_panel_info.control_panel_layout, "show,unlock,text", "");
328 void hide_unlock_text(void)
330 elm_object_signal_emit(s_control_panel_info.control_panel_layout, "hide,unlock,text", "");
333 Eina_Bool is_camera_visible(void)
335 #if DISABLE_CAMERA_SHORTCUT
339 property_get_bool(LKD_PROP_ID_CAMERA_SHORTCUT_ENABLED, &enabled);
342 property_get_int(LKD_PROP_ID_ULTRA_POWER_SAVING_ENABLED, &emergency);
344 if (enabled && 2 != emergency) {
352 void control_panel_operator_name_hide(void)
354 if(s_control_panel_info.operator_name)
356 evas_object_hide(s_control_panel_info.operator_name);
360 void control_panel_operator_name_show(void)
362 if(s_control_panel_info.operator_name)
364 evas_object_show(s_control_panel_info.operator_name);
368 void control_panel_password_panel_visible_flag_set(bool state)
370 s_control_panel_info.is_password_panel_visible = state;
373 void hide_dual_text(void)
375 // elm_layout_signal_emit(s_control_panel_info.control_panel_layout, "hide.dual.text", "default_unlock");
376 control_panel_operator_name_show();
379 void destroy_emg_button(void)
381 LOCK_SCREEN_TRACE_DBG("");
383 Evas_Object *emg_button = elm_object_part_content_get(s_control_panel_info.control_panel_layout, "emg_call_button");
386 evas_object_del(emg_button);
390 void create_emg_button(void)
392 elm_theme_extension_add(NULL, EDJE_DIR"lockscreen-button.edj");
393 Evas_Object *emg_button = elm_button_add(s_control_panel_info.control_panel_layout);
396 LOCK_SCREEN_TRACE_ERR("Failed to create emergency button");
399 elm_object_part_content_set(s_control_panel_info.control_panel_layout, "emg_call_button", emg_button);
400 if(!elm_object_part_content_get(s_control_panel_info.control_panel_layout, "emg_call_button"))
402 LOCK_SCREEN_TRACE_ERR("Failed to set emergency button in swallow part");
403 evas_object_del(emg_button);
406 elm_object_style_set(emg_button, "emg_cal_btn");
407 elm_object_text_set(emg_button, _("IDS_LCKSCN_BODY_EMERGENCY_CALL"));
408 evas_object_smart_callback_add(emg_button, "clicked", __emg_button_clicked_cb, NULL);
410 LOCK_SCREEN_TRACE_DBG("emg_button(%p)", emg_button);
413 void control_panel_create_tizen_account_button(void)
415 LOCK_SCREEN_TRACE_DBG("");
417 elm_theme_extension_add(NULL, EDJE_DIR"lockscreen-button.edj");
419 Evas_Object *tizen_account_button = elm_button_add(s_control_panel_info.control_panel_layout);
420 if(!tizen_account_button)
422 LOCK_SCREEN_TRACE_ERR("Failed to create tizen account button");
426 elm_object_part_content_set(s_control_panel_info.control_panel_layout, "tizen.account.button", tizen_account_button);
427 if(!elm_object_part_content_get(s_control_panel_info.control_panel_layout, "tizen.account.button"))
429 LOCK_SCREEN_TRACE_ERR("Failed to set emergency button in swallow part");
430 evas_object_del(tizen_account_button);
434 elm_object_style_set(tizen_account_button, "tizen_account_btn");
435 elm_object_text_set(tizen_account_button, _("IDS_LCKSCN_BUTTON3_UNLOCK_VIA_TIZEN_ACCOUNT"));
436 evas_object_smart_callback_add(tizen_account_button, "clicked", (Evas_Smart_Cb)tizen_account_launch_cb, NULL);
439 void control_panel_tizen_account_btn_show(void)
441 elm_object_signal_emit(s_control_panel_info.control_panel_layout, "show.tizen.account.button", "default_unlock");
444 void control_panel_tizen_account_btn_hide(void)
446 elm_object_signal_emit(s_control_panel_info.control_panel_layout, "hide.tizen.account.button", "default_unlock");
449 static char* _plmn_spn_get()
451 char *ret_str = NULL;
454 char plmn_buf[PLMN_LENGTH] = {0, };
455 int spn_disp_cond = VCONFKEY_TELEPHONY_DISP_INVALID;
457 if(vconf_get_int(VCONFKEY_TELEPHONY_SPN_DISP_CONDITION, &spn_disp_cond) < 0)
459 LOCK_SCREEN_TRACE_DBG("Failed to get spn display condition");
463 if(spn_disp_cond == VCONFKEY_TELEPHONY_DISP_INVALID)
465 LOCK_SCREEN_TRACE_DBG("Invalid spn display condition");
469 spn = vconf_get_str(VCONFKEY_TELEPHONY_SPN_NAME);
472 LOCK_SCREEN_TRACE_DBG("Failed to get spn vconfkey");
476 if(vconf_get_int(VCONFKEY_TELEPHONY_PLMN, &plmn) < 0)
478 LOCK_SCREEN_TRACE_DBG("Failed to get plmn vconfkey");
484 LOCK_SCREEN_TRACE_DBG("Failed to get plmn");
488 if(snprintf(plmn_buf, PLMN_LENGTH, "%d", plmn) < 0)
493 if(spn_disp_cond == VCONFKEY_TELEPHONY_DISP_SPN)
495 ret_str = strdup(spn);
498 else if(spn_disp_cond == VCONFKEY_TELEPHONY_DISP_PLMN)
500 ret_str = strdup(plmn_buf);
505 char plmn_spn_buf[PLMN_SPN_LENGTH];
506 strcpy(plmn_spn_buf, plmn_buf);
507 strncat(plmn_spn_buf, "/", 1);
508 strncat(plmn_spn_buf, spn, strlen(spn));
510 ret_str = strdup(plmn_spn_buf);
520 static void __emg_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
522 lockscreen_play_tap_feedback();
526 void emg_button_clicked_event_emit(void)
528 __emg_button_clicked_cb(NULL, NULL, NULL);
531 static void __launch_emgcall(void)
533 app_control_h service;
534 app_control_create(&service);
536 UG_INIT_EFL(lockscreen_get_window(), UG_OPT_INDICATOR_ENABLE);
540 LOCK_SCREEN_TRACE_DBG("Error creating application control handle");
544 if (app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT) != APP_CONTROL_ERROR_NONE)
546 LOCK_SCREEN_TRACE_DBG("Can not set operation for application control handle");
547 app_control_destroy(service);
551 if (app_control_set_app_id(service, "dialer-efl") != APP_CONTROL_ERROR_NONE)
553 LOCK_SCREEN_TRACE_DBG("Can not launch dialer-efl");
554 app_control_destroy(service);
558 Ecore_X_Window xwin = 0;
559 Ecore_X_Window_Type type = ECORE_X_WINDOW_TYPE_UNKNOWN;
560 Utilx_Notification_Level level = UTILX_NOTIFICATION_LEVEL_LOW;
562 xwin = elm_win_xwindow_get(lockscreen_get_window());
565 LOCK_SCREEN_TRACE_DBG("elm_win_xwindow_get() failed");
566 app_control_destroy(service);
569 if(ecore_x_netwm_window_type_get(xwin, &type) != EINA_TRUE)
571 LOCK_SCREEN_TRACE_DBG("ecore_x_netwm_window_type_get() failed");
572 app_control_destroy(service);
576 if(type != ECORE_X_WINDOW_TYPE_NOTIFICATION)
578 LOCK_SCREEN_TRACE_DBG("current window type is not NOTIFICATION");
579 app_control_add_extra_data(service, "window_property", "notification_normal");
583 level = utilx_get_system_notification_level(ecore_x_display_get(), xwin);
584 if(level == UTILX_NOTIFICATION_LEVEL_HIGH)
586 app_control_add_extra_data(service, "window_property", "notification_high");
590 app_control_add_extra_data(service, "window_property", "notification_normal");
594 app_control_add_extra_data(service, "emergency_dialer", "emergency");
596 if(app_control_send_launch_request(service, NULL, NULL) != APP_CONTROL_ERROR_NONE)
598 LOCK_SCREEN_TRACE_DBG("service_send_request() failed");
601 app_control_destroy(service);
604 static void _log_dbus_error(const char *msg, DBusError *err)
606 if (err && dbus_error_is_set(err))
608 LOCK_SCREEN_TRACE_ERR("dbus error(%s:%s)", err->name, err->message);
612 LOCK_SCREEN_TRACE_ERR("%s",msg);
616 static void _dbus_clean(DBusConnection *conn, DBusMessage *msg, DBusError *err)
620 dbus_connection_unref(conn);
625 dbus_message_unref(msg);
628 dbus_error_free(err);
631 static DBusMessage *_invoke_dbus_method_sync(const char *dest, const char *path,
632 const char *interface, const char *method, const char *param)
634 DBusConnection *conn = NULL;
635 DBusMessage *msg = NULL;
636 DBusMessage *reply = NULL;
637 dbus_bool_t is_ok = 0;
640 dbus_error_init(&err);
642 conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
645 _log_dbus_error("Failed to connect to bus deamon",NULL);
646 _dbus_clean(NULL, msg, &err);
650 msg = dbus_message_new_method_call(dest, path, interface, method);
653 _log_dbus_error("Failed to create dbus message",NULL);
654 _dbus_clean(conn, NULL, &err);
658 is_ok = dbus_message_append_args(msg, DBUS_TYPE_STRING, ¶m, DBUS_TYPE_INVALID);
661 _log_dbus_error("Failed to create dbus message parameters",NULL);
662 _dbus_clean(conn, msg, &err);
666 reply = dbus_connection_send_with_reply_and_block(conn, msg, DBUS_REPLY_TIMEOUT, &err);
668 _log_dbus_error(NULL, &err);
669 _dbus_clean(conn, msg, &err);
673 static int _lockscreen_set_bg(const char *param)
676 DBusMessage *msg = NULL;
680 dbus_error_init(&err);
682 msg = _invoke_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
683 METHOD_LOCKSCREEN_BG_ON, param);
686 _dbus_clean(NULL, NULL, &err);
690 is_ok = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &ret_val, DBUS_TYPE_INVALID);
694 _log_dbus_error(NULL,&err);
698 LOCK_SCREEN_TRACE_DBG("%s-%s : %s(%d) ", DEVICED_INTERFACE_DISPLAY, METHOD_LOCKSCREEN_BG_ON, param, ret_val);
701 _dbus_clean(NULL, msg, &err);
705 void lockscreen_set_bg_on(void)
707 _lockscreen_set_bg(bool_str[true]);
710 void lockscreen_set_bg_off(void)
712 _lockscreen_set_bg(bool_str[false]);
715 Evas_Object *control_panel_layout_get(void)
717 return s_control_panel_info.control_panel_layout;
720 void control_panel_view_init(void)
722 module_init(&g_mod_control_panel, NULL);
725 void control_panel_view_fini(void)
727 module_fini(&g_mod_control_panel);
733 static int _init(LKD_Module_Data *md)
738 static int _fini(LKD_Module_Data *md)
743 static void _language_changed(LKD_Module_Data * md)
745 control_panel_sim_state_changed();
748 static void _property_changed(LKD_Module_Data *md, int property_id)
752 static void _resume(LKD_Module_Data *md)
754 //elm_label_slide_mode_set(s_control_panel_info.operator_name, ELM_LABEL_SLIDE_MODE_AUTO);
755 //elm_label_slide_go(s_control_panel_info.operator_name);
756 _operator_name_slide_mode_set(s_control_panel_info.operator_name);
759 static void _pause(LKD_Module_Data *md)
761 elm_label_slide_mode_set(s_control_panel_info.operator_name, ELM_LABEL_SLIDE_MODE_NONE);
762 elm_label_slide_go(s_control_panel_info.operator_name);
765 LKD_Module g_mod_control_panel = {
766 .id = "control-panel",
768 .property_list = LKD_PROP_ID_CAMERA_SHORTCUT_ENABLED | LKD_PROP_ID_ULTRA_POWER_SAVING_ENABLED,
773 .language_changed = _language_changed,
774 .property_changed = _property_changed,