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.
20 #include "quickpanel-ui.h"
21 #include "quickpanel_def.h"
23 #define QP_ENABLE_SLIDING_TEXT 0
24 #define QP_ENABLE_SAT 0
25 #define QP_IDLETXT_PART "qp.noti.swallow.spn"
27 #define QP_SPN_BASE_PART "qp.base.spn.swallow"
28 #define QP_SPN_BOX_PART "qp.spn.swallow"
29 #define QP_BUTTON_PART "qp.button.swallow"
31 #define QP_IDLETXT_MAX_KEY 4
32 #define QP_IDLETXT_MAX_LEN 1024
33 #define QP_IDLETXT_SLIDE_LEN 130
35 #define QP_IDLETXT_LABEL_STRING \
36 "<font_size=36 font_weight=Medium color=#959494FF align=left>%s</>"
38 static int quickpanel_idletxt_init(void *data);
39 static int quickpanel_idletxt_fini(void *data);
40 static int quickpanel_idletxt_suspend(void *data);
41 static int quickpanel_idletxt_resume(void *data);
42 static void quickpanel_idletxt_lang_changed(void *data);
46 .init = quickpanel_idletxt_init,
47 .fini = quickpanel_idletxt_fini,
48 .suspend = quickpanel_idletxt_suspend,
49 .resume = quickpanel_idletxt_resume,
50 .lang_changed = quickpanel_idletxt_lang_changed
53 static int _quickpanel_idletxt_map_exceptional_nwname(char *txt, char *map_txt, int map_txt_len)
57 if (txt == NULL || map_txt == NULL) {
61 if (strncasecmp(txt, "No Service", strlen("No Service")) == 0) {
62 strncpy(map_txt, _S("IDS_COM_BODY_NO_SERVICE"), map_txt_len);
64 } else if (strncasecmp(txt, "EMERGENCY", strlen("EMERGENCY")) == 0) {
65 strncpy(map_txt, _("IDS_CALL_POP_CALLING_EMERG_ONLY"), map_txt_len);
67 } else if (strncasecmp(txt, "Searching", strlen("Searching")) == 0) {
68 strncpy(map_txt, _S("IDS_COM_BODY_SEARCHING"), map_txt_len);
70 } else if (strncasecmp(txt, "SIM Error", strlen("SIM Error")) == 0) {
71 strncpy(map_txt, _S("IDS_COM_BODY_INVALID_SIM_CARD"), map_txt_len);
73 } else if (strncasecmp(txt, "NO SIM", strlen("NO SIM")) == 0) {
74 strncpy(map_txt, _S("IDS_COM_BODY_NO_SIM"), map_txt_len);
81 static Evas_Object *_quickpanel_idletxt_create_label(Evas_Object * parent,
84 Evas_Object *obj = NULL;
85 char buf[QP_IDLETXT_MAX_LEN] = { 0, };
86 char localized_txt[QP_IDLETXT_MAX_LEN] = { 0, };
89 retif(parent == NULL || txt == NULL, NULL, "Invalid parameter!");
91 memset(buf, 0x00, sizeof(buf));
93 if (_quickpanel_idletxt_map_exceptional_nwname(txt, localized_txt, QP_IDLETXT_MAX_LEN) == 1) {
94 len = snprintf(buf, sizeof(buf), QP_IDLETXT_LABEL_STRING, localized_txt);
96 len = snprintf(buf, sizeof(buf), QP_IDLETXT_LABEL_STRING, txt);
99 retif(len < 0, NULL, "len < 0");
101 obj = elm_label_add(parent);
103 struct appdata *ad = quickpanel_get_app_data();
106 elm_label_wrap_width_set(obj, QP_SPN_TEXT_W * ad->scale);
108 elm_label_wrap_width_set(obj, QP_SPN_TEXT_W);
110 #if QP_ENABLE_SLIDING_TEXT
111 elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_AUTO);
112 elm_label_slide_duration_set(obj, 3);
113 elm_object_style_set(obj, "slide_bounce");
115 elm_label_ellipsis_set(obj, EINA_TRUE);
118 elm_object_text_set(obj, buf);
120 evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND,
122 evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0.5);
124 evas_object_show(obj);
130 static Evas_Object *_quickpanel_idletxt_create_box(Evas_Object * parent)
132 Evas_Object *box = NULL;
134 retif(parent == NULL, NULL, "Invalid parameter!");
136 box = elm_box_add(parent);
138 elm_box_horizontal_set(box, EINA_FALSE);
140 evas_object_show(box);
146 static int _quickpanel_idletxt_get_txt(const char *key, char *txt, int size)
152 str = vconf_get_str(key);
153 if (str == NULL || str[0] == '\0')
156 /* check ASCII code */
157 for (i = strlen(str) - 1; i >= 0; i--) {
158 if (str[i] <= 31 || str[i] >= 127)
162 len = snprintf(txt, size, "%s", str);
171 static Evas_Object *_quickpanel_idletxt_add_label(Evas_Object * box,
174 char txt[QP_IDLETXT_MAX_LEN] = { 0, };
175 char buf[QP_IDLETXT_MAX_LEN] = { 0, };
178 Evas_Object *obj = NULL;
180 retif(key == NULL || key[0] == '\0', NULL, "Invalid parameter!");
182 memset(txt, 0x00, sizeof(txt));
184 for (i = 0; key[i]; i++) {
185 memset(buf, 0x00, sizeof(buf));
187 /* get next key string */
188 if (_quickpanel_idletxt_get_txt(key[i], buf, sizeof(buf))) {
189 INFO("VCONFKEY(%s) = %s", key[i], buf);
193 snprintf(&txt[len], sizeof(txt) - len, "%s%s",
194 len ? " - " : "", buf);
201 obj = _quickpanel_idletxt_create_label(box, txt);
211 static Evas_Object *_quickpanel_idletxt_exception_add_label(Evas_Object * box)
213 int service_type = VCONFKEY_TELEPHONY_SVCTYPE_SEARCH;
215 Evas_Object *obj = NULL;
217 if (vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &service_type) != 0) {
218 DBG("fail to get VCONFKEY_TELEPHONY_SVCTYPE");
221 switch(service_type) {
222 case VCONFKEY_TELEPHONY_SVCTYPE_NOSVC:
223 text = _S("IDS_COM_BODY_NO_SERVICE");
225 case VCONFKEY_TELEPHONY_SVCTYPE_EMERGENCY:
226 text = _("IDS_CALL_POP_CALLING_EMERG_ONLY");
229 if (service_type > VCONFKEY_TELEPHONY_SVCTYPE_SEARCH) {
230 text = vconf_get_str(VCONFKEY_TELEPHONY_NWNAME);
231 } else if (service_type == VCONFKEY_TELEPHONY_SVCTYPE_SEARCH) {
232 text = _S("IDS_COM_BODY_SEARCHING");
240 obj = _quickpanel_idletxt_create_label(box, text);
250 static Evas_Object *_quickpanel_idletxt_get_spn(Evas_Object * box)
252 Evas_Object *label = NULL;
253 char *keylist[QP_IDLETXT_MAX_KEY] = { 0, };
257 int service_type = VCONFKEY_TELEPHONY_SVCTYPE_NONE;
260 if (vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &service_type) != 0) {
261 DBG("fail to get VCONFKEY_TELEPHONY_SVCTYPE");
264 ret = vconf_get_int(VCONFKEY_TELEPHONY_SPN_DISP_CONDITION, &state);
266 INFO("VCONFKEY(%s) = %d",
267 VCONFKEY_TELEPHONY_SPN_DISP_CONDITION, state);
269 if (state != VCONFKEY_TELEPHONY_DISP_INVALID
270 && service_type > VCONFKEY_TELEPHONY_SVCTYPE_SEARCH) {
271 if (i < QP_IDLETXT_MAX_KEY) {
272 if (state & VCONFKEY_TELEPHONY_DISP_SPN) {
274 strdup(VCONFKEY_TELEPHONY_SPN_NAME);
277 if (state & VCONFKEY_TELEPHONY_DISP_PLMN) {
279 strdup(VCONFKEY_TELEPHONY_NWNAME);
284 /* get string with keylist */
285 label = _quickpanel_idletxt_add_label(box, keylist);
296 label = _quickpanel_idletxt_exception_add_label(box);
303 static Evas_Object *_quickpanel_idletxt_get_sat_text(Evas_Object * box)
305 Evas_Object *label = NULL;
306 char *keylist[] = { VCONFKEY_SAT_IDLE_TEXT, 0 };
308 /* get string with keylist */
309 label = _quickpanel_idletxt_add_label(box, keylist);
314 static Eina_Bool _quickpanel_idletxt_button_clicked_timer_cb(void *data)
316 if (quickpanel_is_emul())
317 quickpanel_launch_app(QP_SETTING_PKG_SETTING_EMUL, NULL);
319 quickpanel_launch_app(QP_SETTING_PKG_SETTING, NULL);
321 quickpanel_close_quickpanel(true);
323 return ECORE_CALLBACK_CANCEL;
327 static void _quickpanel_idletxt_button_clicked(void *data, Evas_Object * obj, void *event_info)
329 struct appdata *ad = data;
331 quickpanel_play_feedback();
333 retif(obj == NULL, , "Invalid parameter!");
334 retif(ad == NULL, , "Invalid parameter!");
335 retif(ad->win == NULL, , "ad->win is NULL");
337 ecore_idler_add(_quickpanel_idletxt_button_clicked_timer_cb, NULL);
340 static void quickpanel_idletxt_update(void *data)
342 struct appdata *ad = NULL;
343 Evas_Object *label = NULL;
344 Evas_Object *idletxtbox = NULL;
345 Evas_Object *button_settings = NULL;
346 Evas_Object *spn = NULL;
348 retif(!data, , "Invalid parameter!");
351 retif(!ad->ly, , "layout is NULL!");
353 spn = elm_object_part_content_get(ad->ly, QP_SPN_BASE_PART);
354 retif(!spn, , "spn layout is NULL!");
356 idletxtbox = elm_object_part_content_get(spn, QP_SPN_BOX_PART);
357 button_settings = elm_object_part_content_get(spn, QP_BUTTON_PART);
359 if (idletxtbox == NULL) {
360 idletxtbox = _quickpanel_idletxt_create_box(spn);
361 retif(idletxtbox == NULL, , "Failed to create box!");
362 elm_object_part_content_set(spn,
363 QP_SPN_BOX_PART, idletxtbox);
366 elm_box_clear(idletxtbox);
369 label = _quickpanel_idletxt_get_spn(idletxtbox);
371 elm_box_pack_end(idletxtbox, label);
373 /* get sat idle text */
375 label = _quickpanel_idletxt_get_sat_text(idletxtbox);
377 elm_box_pack_end(idletxtbox, label);
380 if (button_settings == NULL) {
381 button_settings = elm_button_add(spn);
382 retif(button_settings == NULL, , "Failed to create clear button!");
383 elm_object_style_set(button_settings, "quickpanel_standard");
384 elm_object_part_content_set(spn,
385 QP_BUTTON_PART, button_settings);
386 evas_object_smart_callback_add(button_settings, "clicked",
387 _quickpanel_idletxt_button_clicked, ad);
390 elm_object_text_set(button_settings, _S("IDS_COM_BODY_SETTINGS"));
393 static void quickpanel_idletxt_changed_cb(keynode_t *node, void *data)
395 quickpanel_idletxt_update(data);
398 static int _quickpanel_idletxt_register_event_handler(void *data)
402 ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_SVCTYPE,
403 quickpanel_idletxt_changed_cb, data);
405 ERR("Failed to register [%s]",
406 VCONFKEY_TELEPHONY_SVCTYPE);
408 ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_SPN_DISP_CONDITION,
409 quickpanel_idletxt_changed_cb, data);
411 ERR("Failed to register [%s]",
412 VCONFKEY_TELEPHONY_SPN_DISP_CONDITION);
414 ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_SPN_NAME,
415 quickpanel_idletxt_changed_cb, data);
417 ERR("Failed to register [%s]",
418 VCONFKEY_TELEPHONY_SPN_NAME);
421 ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_NWNAME,
422 quickpanel_idletxt_changed_cb, data);
424 ERR("Failed to register [%s]",
425 VCONFKEY_TELEPHONY_NWNAME);
427 ret = vconf_notify_key_changed(VCONFKEY_SAT_IDLE_TEXT,
428 quickpanel_idletxt_changed_cb, data);
430 ERR("Failed to register [%s]",
431 VCONFKEY_SAT_IDLE_TEXT);
437 static int _quickpanel_idletxt_unregister_event_handler(void)
441 ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SVCTYPE,
442 quickpanel_idletxt_changed_cb);
444 ERR("Failed to unregister [%s]",
445 VCONFKEY_TELEPHONY_SVCTYPE);
447 ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SPN_DISP_CONDITION,
448 quickpanel_idletxt_changed_cb);
450 ERR("Failed to unregister [%s]",
451 VCONFKEY_TELEPHONY_SPN_DISP_CONDITION);
453 ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SPN_NAME,
454 quickpanel_idletxt_changed_cb);
456 ERR("Failed to unregister [%s]",
457 VCONFKEY_TELEPHONY_SPN_NAME);
460 ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_NWNAME,
461 quickpanel_idletxt_changed_cb);
463 ERR("Failed to unregister [%s]",
464 VCONFKEY_TELEPHONY_NWNAME);
466 ret = vconf_ignore_key_changed(VCONFKEY_SAT_IDLE_TEXT,
467 quickpanel_idletxt_changed_cb);
469 ERR("Failed to unregister [%s]",
470 VCONFKEY_SAT_IDLE_TEXT);
475 static Evas_Object *_idletxt_load_edj(Evas_Object * parent, const char *file,
479 Evas_Object *eo = NULL;
481 retif(parent == NULL, NULL, "Invalid parameter!");
483 eo = elm_layout_add(parent);
484 retif(eo == NULL, NULL, "Failed to add layout object!");
486 r = elm_layout_file_set(eo, file, group);
487 retif(r != EINA_TRUE, NULL, "Failed to set edje object file!");
489 evas_object_size_hint_weight_set(eo,
490 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
491 evas_object_show(eo);
496 static int quickpanel_idletxt_init(void *data)
498 struct appdata *ad = NULL;
499 Evas_Object *spn = NULL;
501 retif(!data, QP_FAIL, "Invalid parameter!");
504 spn = _idletxt_load_edj(ad->ly, DEFAULT_EDJ, "quickpanel/spn");
505 retif(!spn, QP_FAIL, "fail to load spn layout");
507 elm_object_part_content_set(ad->ly, QP_SPN_BASE_PART, spn);
509 quickpanel_idletxt_update(data);
511 _quickpanel_idletxt_register_event_handler(data);
516 static int quickpanel_idletxt_fini(void *data)
518 struct appdata *ad = (struct appdata *)data;
519 Evas_Object *spn = NULL;
520 Evas_Object *idletxtbox = NULL;
522 retif(ad == NULL, QP_FAIL, "Invalid parameter!");
524 _quickpanel_idletxt_unregister_event_handler();
526 retif(!ad->ly, QP_FAIL, "Invalid parameter!");
528 spn = elm_object_part_content_unset(ad->ly, QP_SPN_BASE_PART);
529 retif(!spn, QP_OK, "spn is NULL");
531 idletxtbox = elm_object_part_content_get(spn, QP_SPN_BOX_PART);
533 elm_object_part_content_unset(spn, QP_SPN_BOX_PART);
534 evas_object_del(idletxtbox);
537 evas_object_del(spn);
542 #if QP_ENABLE_SLIDING_TEXT
543 static Evas_Object *_quickpanel_spn_label_get(void *data)
545 Evas_Object *spn = NULL;
546 Evas_Object *label = NULL;
547 Evas_Object *idletxtbox = NULL;
548 struct appdata *ad = NULL;
549 retif(!data, NULL, "Invalid parameter!");
552 retif(!ad->ly, NULL, "layout is NULL!");
554 spn = elm_object_part_content_get(ad->ly, QP_SPN_BASE_PART);
555 retif(!spn, NULL, "spn layout is NULL!");
557 idletxtbox = elm_object_part_content_get(spn, QP_SPN_BOX_PART);
558 retif(!idletxtbox, NULL, "idletxtbox is NULL!");
560 Eina_List *list = elm_box_children_get(idletxtbox);
561 retif(!list, NULL, "list is NULL!");
563 label = eina_list_nth(list, 0);
569 static int quickpanel_idletxt_suspend(void *data)
571 #if QP_ENABLE_SLIDING_TEXT
572 Evas_Object *label = _quickpanel_spn_label_get(data);
575 elm_label_slide_mode_set(label, ELM_LABEL_SLIDE_MODE_NONE);
582 static int quickpanel_idletxt_resume(void *data)
584 #if QP_ENABLE_SLIDING_TEXT
585 Evas_Object *label = _quickpanel_spn_label_get(data);
588 elm_label_slide_mode_set(label, ELM_LABEL_SLIDE_MODE_AUTO);
595 static void quickpanel_idletxt_lang_changed(void *data)
597 retif(data == NULL, , "Invalid parameter!");
599 quickpanel_idletxt_update(data);