2 * Copyright (c) 2010 Samsung Electronics, Inc.
5 * This software is a confidential and proprietary information
6 * of Samsung Electronics, Inc. ("Confidential Information"). You
7 * shall not disclose such Confidential Information and shall use
8 * it only in accordance with the terms of the license agreement
9 * you entered into with Samsung Electronics.
14 * Created on: Oct 12, 2013
17 #include <vconf-keys.h>
22 #include "setting-battery.h"
25 Evas_Object* _create_battery_content2(void *data);
26 static void _battery_percent_cb(void *data, Evas_Object *obj, void *event_info);
27 static void _power_saving_cb(void *data, Evas_Object *obj, void *event_info);
29 static struct _battery_menu_item battery_menu_list[] = {
30 { "IDS_ST_BODY_BATTERY_STATUS", DISABLE, _battery_status_cb },
31 //{ "IDS_ST_BODY_BATTERY_PERCENTAGE_ABB", DISABLE, _battery_percent_cb },
32 { "IDS_ST_MBODY_POWER_SAVER_ABB", DISABLE, _power_saving_cb }
35 char * battery_icons[] = {
36 "b_setting_battery_01.png",
37 "b_setting_battery_02.png",
38 "b_setting_battery_03.png",
39 "b_setting_battery_04.png",
40 "b_setting_battery_05.png",
41 "b_setting_battery_06.png",
42 "b_setting_battery_07.png",
43 "b_setting_battery_08.png",
44 "b_setting_battery_09.png"
47 char * battery_charging_icons[] = {
48 "b_setting_battery_charge_01.png",
49 "b_setting_battery_charge_02.png",
50 "b_setting_battery_charge_03.png",
51 "b_setting_battery_charge_04.png",
52 "b_setting_battery_charge_05.png",
53 "b_setting_battery_charge_06.png",
54 "b_setting_battery_charge_07.png",
55 "b_setting_battery_charge_08.png",
56 "b_setting_battery_charge_09.png"
59 static char * power_saving_str[] = {
60 "IDS_ST_BODY_DISABLED_M_STATUS",
61 "IDS_EMAIL_BODY_ENABLED_M_STATUS"
64 static appdata* temp_ad = NULL;
65 static Ecore_Timer *pws_timer = NULL;
66 static Evas_Object * g_pws_check = NULL;
67 static Elm_Object_Item* pws_it = NULL;
69 static Eina_Bool _delete_timer(void * data)
73 _power_saving_terminate_app(temp_ad);
75 return ECORE_CALLBACK_CANCEL;
78 static void change_pws_key(keynode_t *key, void * data)
81 vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &mode_val);
85 DBG("change_pws_key is power saving");
88 ecore_timer_del(pws_timer);
91 pws_timer = ecore_timer_add(1.0, (Ecore_Task_Cb) _delete_timer, NULL);
96 DBG("change_pws_key is normal");
100 void _initialize_battery()
102 battery_timer = NULL;
106 prev_charging_state = false;
109 register_vconf_changing(VCONFKEY_SETAPPL_PSMODE, change_pws_key, NULL);
112 Eina_Bool _clear_battery_list_cb(void *data, Elm_Object_Item *it)
117 void _clear_battery_cb(void *data , Evas *e, Evas_Object *obj, void *event_info)
120 ecore_timer_del(battery_timer);
121 battery_timer = NULL;
125 ecore_timer_del(pws_timer);
130 prev_charging_state = false;
136 unregister_vconf_changing(VCONFKEY_SYSTEM_TIME_CHANGED, change_pws_key);
141 static int get_battery_img_index(int percent)
145 if( percent > 0 && percent < 5 )
149 else if( percent >= 5 && percent <= 10 )
153 else if( percent >= 11 && percent <= 20 )
157 else if( percent >= 21 && percent <= 34 )
161 else if( percent >= 35 && percent <= 49 )
165 else if( percent >= 50 && percent <= 64 )
169 else if( percent >= 65 && percent <= 79 )
173 else if( percent >= 80 && percent <= 94 )
177 else if( percent >= 95 && percent <= 100 )
184 static int is_updated_battery_state() {
185 int current_percent = 0;
186 bool current_charging_state = false;
189 if( device_battery_get_percent(¤t_percent) != DEVICE_ERROR_NONE )
191 DBG("Setting - Battery percent get error");
194 if( device_battery_is_charging(¤t_charging_state) != DEVICE_ERROR_NONE )
196 DBG("Setting - Battery charging do not get. error");
199 if( (current_percent != percent) || (current_charging_state != is_charging) ) {
200 percent = current_percent;
201 is_charging = current_charging_state;
203 DBG("Setting - Updated battery state !! percent: %d, charging: %d", percent, is_charging);
211 static int is_type_of_charging()
215 vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, &status);
217 if (status == VCONFKEY_SYSMAN_CHARGER_CONNECTED)
219 vconf_get_int(VCONFKEY_SYSMAN_USB_STATUS, &status);
220 if (status == VCONFKEY_SYSMAN_USB_AVAILABLE)
228 static Evas_Object * create_icon(Evas_Object * parent, char * img_path)
230 if( img_path == NULL )
233 Evas_Object * icon = elm_image_add(parent);
234 elm_image_file_set(icon, img_path, NULL);
235 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
236 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
241 static Eina_Bool _battery_timeout(void * data)
243 Evas_Object * layout = (Evas_Object*)data;
244 if( layout == NULL ) {
245 return ECORE_CALLBACK_CANCEL;
249 if( is_updated_battery_state() ) {
251 snprintf(buf, sizeof(buf)-1, "%s%c", ICU_NUM(percent), '\%');
252 char * temp_percent = strdup(buf);
253 elm_object_part_text_set(layout, "text1", temp_percent);
257 snprintf(buf, sizeof(buf)-1, "%s%s", _("IDS_COM_BODY_CHARGING_GA"), (is_type_of_charging() == CHARGING_AC) ? "(AC)" : "(USB)");
258 char * temp_charging_msg = strdup(buf);
259 elm_object_part_text_set(layout, "text2", temp_charging_msg);
260 free(temp_charging_msg);
263 elm_object_part_text_set(layout, "text2", _("IDS_ST_BODY_NOT_CHARGING_ABB"));
266 int img_index = get_battery_img_index(percent);
267 if( ( img_index != image_index ) || (prev_charging_state != is_charging) ) {
268 snprintf(buf, sizeof(buf)-1, "%s%s", IMG_DIR, (is_charging) ? battery_charging_icons[img_index] : battery_icons[img_index]);
270 Evas_Object * del_icon = elm_object_part_content_get(layout, "image");
272 evas_object_del(del_icon);
275 elm_object_part_content_set(layout, "image", create_icon(layout, buf));
278 prev_charging_state = is_charging;
280 DBG("Setting - Update Battery Layout!!");
284 DBG("Setting - check battery state!!");
286 return ECORE_CALLBACK_RENEW;
289 void _start_timer_for_update(Evas_Object * obj)
294 ecore_timer_del(battery_timer);
295 battery_timer = NULL;
297 battery_timer = ecore_timer_add(1.0, (Ecore_Task_Cb)_battery_timeout, obj);
300 void _battery_lang_changed(void *data, Evas_Object *obj, void *event_info)
302 DBG("Setting - _battery_lang_changed is called!");
307 snprintf(buf, sizeof(buf)-1, "%s%c", ICU_NUM(percent), '\%');
308 char * temp_percent = strdup(buf);
309 elm_object_part_text_set(obj, "text1", temp_percent);
314 snprintf(buf, sizeof(buf)-1, "%s%s", _("IDS_COM_BODY_CHARGING_GA"), (is_type_of_charging() == CHARGING_AC) ? "(AC)" : "(USB)");
315 char * temp_charging_msg = strdup(buf);
316 elm_object_part_text_set(obj, "text2", temp_charging_msg);
317 free(temp_charging_msg);
321 elm_object_part_text_set(obj, "text2", _("IDS_ST_BODY_NOT_CHARGING_ABB"));
326 Evas_Object* _create_battery_content2(void *data)
328 Evas_Object *layout, *icon;
331 appdata *ad = (appdata *)data;
335 layout = elm_layout_add(ad->nf);
336 elm_layout_file_set(layout, EDJE_PATH, "setting-test/battery");
337 evas_object_size_hint_weight_set (layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
338 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
339 evas_object_smart_callback_add(layout, "language,changed", _battery_lang_changed, NULL);
341 if( device_battery_get_percent(&percent) != DEVICE_ERROR_NONE )
343 DBG("Setting - Battery percent get error");
345 snprintf(buf, sizeof(buf)-1, "%s%c", ICU_NUM(percent), '\%');
347 elm_object_part_text_set(layout, "text1", buf);
349 if( device_battery_is_charging(&is_charging) != DEVICE_ERROR_NONE )
351 DBG("Setting - Battery charging do not get. error");
353 char * charging_text = NULL;
355 snprintf(buf, sizeof(buf)-1, "%s%s", _("IDS_COM_BODY_CHARGING_GA"), (is_type_of_charging() == CHARGING_AC) ? "(AC)" : "(USB)");
356 charging_text = strdup(buf);
358 elm_object_part_text_set(layout, "text2", ( is_charging ) ? charging_text : _("IDS_ST_BODY_NOT_CHARGING_ABB"));
361 prev_charging_state = is_charging;
363 image_index = get_battery_img_index(percent);
365 snprintf(buf, sizeof(buf)-1, "%s%s", IMG_DIR, ( is_charging ) ? battery_charging_icons[image_index] : battery_icons[image_index]);
367 elm_object_part_content_set(layout, "image", create_icon(layout, buf));
369 _start_timer_for_update(layout); // updating timer start!
374 Evas_Object *_battery_status_cb(void *data)
376 Evas_Object* layout = NULL;
377 Elm_Object_Item *nf_it = NULL;
382 DBG("Setting - ad is null");
386 _initialize_battery();
387 layout = _create_battery_content2(data);
390 DBG("%s", "battery cb - layout is null");
395 //nf_it = elm_naviframe_item_push(ad->nf, NULL, NULL, NULL, layout, NULL);
396 //elm_naviframe_item_pop_cb_set(nf_it, _clear_battery_cb, ad);
397 //elm_naviframe_item_title_enabled_set(nf_it, EINA_FALSE, EINA_FALSE);
400 int _get_battery_percent_value()
403 if (vconf_get_bool(VCONFKEY_SETAPPL_BATTERY_PERCENTAGE_BOOL, &value) != 0) {
404 ERR("error get vconf value!!");
409 int _set_battery_percent_value(int value)
411 if (vconf_set_bool(VCONFKEY_SETAPPL_BATTERY_PERCENTAGE_BOOL, value) != 0) {
412 ERR("error set vconf value!!");
418 void _battery_percent_cb(void *data, Evas_Object *obj, void *event_info)
420 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
422 _set_battery_percent_value(!_get_battery_percent_value());
424 elm_genlist_item_update((Elm_Object_Item *)event_info);
427 int _power_saving_runapp_info_get(const aul_app_info *ainfo, void *data)
429 DBG("_power_saving_runapp_info_get");
430 ail_appinfo_h handle;
439 if(ainfo->pkg_name == NULL)
442 /* �� PID ���͸� */
444 if(ainfo->pid == getpid()) {
448 ret = ail_get_appinfo(ainfo->pkg_name, &handle);
450 if(ret != AIL_ERROR_OK){
453 /* APP�� TASKMANAGE üũ */
454 ret = ail_appinfo_get_bool(handle, AIL_PROP_X_SLP_TASKMANAGE_BOOL, &valb);
456 ret = ail_destroy_appinfo(handle);
460 aul_terminate_pid(ainfo->pid);
462 ret = ail_destroy_appinfo(handle);
466 static Eina_Bool _pws_timer(void *data)
469 appdata *ad = (appdata *) data;
471 return ECORE_CALLBACK_CANCEL;
475 evas_object_del(ad->win_main);
479 return ECORE_CALLBACK_CANCEL;
482 int _power_saving_terminate_app(void *data)
484 int ret = AUL_R_ERROR;
485 appdata *ad = (appdata *) data;
489 evas_object_del(ad->win_main);
493 ret = aul_app_get_running_app_info(_power_saving_runapp_info_get, NULL);
494 if(ret != AUL_R_OK) {
495 DBG("aul_app_get_running_app_info() failed");
501 int _get_power_saving_status()
504 if (vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &value) != 0) {
505 ERR("error get vconf value!!");
508 battery_menu_list[BATT_MENU_POWER_SAVING].is_enable = ENABLE;
510 battery_menu_list[BATT_MENU_POWER_SAVING].is_enable = DISABLE;
514 int _set_power_saving_status(int value)
516 if (vconf_set_int(VCONFKEY_SETAPPL_PSMODE, value) != 0) {
517 ERR("error set vconf value!!");
521 battery_menu_list[BATT_MENU_POWER_SAVING].is_enable = ENABLE;
524 battery_menu_list[BATT_MENU_POWER_SAVING].is_enable = DISABLE;
528 static void _power_saving_cb(void *data, Evas_Object *obj, void *event_info)
530 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
532 int pws_status; //int , 0:normal, 3:pws on
533 pws_status = _get_power_saving_status();
537 DBG("psmode state [%d]", pws_status);
538 _set_power_saving_status(SETTING_PSMODE_NORMAL);
540 else if(!pws_status){
542 _pws_popup_cb(data, obj, event_info);
545 elm_genlist_item_update((Elm_Object_Item *)event_info);
548 char *_gl_battery_title_get(void *data, Evas_Object *obj, const char *part)
551 Item_Data *id = data;
552 int index = id->index;
553 if (!strcmp(part, "elm.text.1") || !strcmp(part, "elm.text")) {
554 snprintf(buf, sizeof(buf)-1, "%s", _(battery_menu_list[index].name));
556 else if( !strcmp(part, "elm.text.2") && index == BATT_MENU_POWER_SAVING ){
557 snprintf(buf, sizeof(buf)-1, "%s", _(power_saving_str[battery_menu_list[index].is_enable]));
563 Evas_Object *_gl_battery_check_get(void *data, Evas_Object *obj, const char *part)
565 Evas_Object *check = NULL;
567 Item_Data *id = data;
568 int index = id->index;
570 if (!strcmp(part, "elm.icon")) {
571 check = elm_check_add(obj);
572 if(index == BATT_MENU_POWER_SAVING){
573 elm_check_state_set(check, (_get_power_saving_status()) ? EINA_TRUE : EINA_FALSE);
577 elm_check_state_set(check, (_get_battery_percent_value()) ? EINA_TRUE : EINA_FALSE);
579 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
580 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
587 void _gl_battery_del(void *data, Evas_Object *obj)
589 Item_Data *id = data;
594 Evas_Object* _create_battery_list(void *data)
599 ERR("appdata is null!!");
603 Evas_Object *genlist = NULL;
604 Evas_Object *layout = NULL;
605 struct _battery_menu_item *menu_list = NULL;
610 Elm_Genlist_Item_Class *itc = NULL;
612 Elm_Genlist_Item_Class *itc_1text = elm_genlist_item_class_new();
613 itc_1text->item_style = "1text";
614 itc_1text->func.text_get = _gl_battery_title_get;
615 itc_1text->func.del = _gl_battery_del;
617 Elm_Genlist_Item_Class *itc_2text_1icon = elm_genlist_item_class_new();
618 itc_2text_1icon->item_style = "2text.1icon.1";
619 itc_2text_1icon->func.text_get = _gl_battery_title_get;
620 itc_2text_1icon->func.content_get = _gl_battery_check_get;
621 itc_2text_1icon->func.del = _gl_battery_del;
623 layout = elm_layout_add(ad->nf);
624 elm_layout_file_set(layout, EDJE_PATH, "setting/genlist/layout");
625 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
627 genlist = elm_genlist_add(layout);
628 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
630 menu_list = battery_menu_list;
632 for (idx = 0; idx < sizeof(battery_menu_list) / sizeof(struct _battery_menu_item); idx++) {
633 if (idx == BATT_MENU_POWER_SAVING) {
634 itc = itc_2text_1icon;
636 else if (idx == BATT_MENU_STATUS){
640 Item_Data *id = calloc(sizeof(Item_Data), 1);
642 id->item = elm_genlist_item_append(
643 genlist, // genlist object
647 ELM_GENLIST_ITEM_NONE,
648 menu_list[idx].func, // call back
651 if(idx == BATT_MENU_POWER_SAVING)
657 elm_genlist_item_class_free(itc_2text_1icon);
658 //elm_genlist_item_class_free(itc_1text_1icon);
659 elm_genlist_item_class_free(itc_1text);
662 elm_object_part_content_set(layout, "elm.genlist", genlist);
667 static void _pws_cancel_cb(void *data, Evas_Object *obj, void *event_info)
669 appdata *ad = (appdata *) data;
674 evas_object_del(data);
679 static void _pws_ok_cb(void *data, Evas_Object *obj, void *event_info)
685 DBG("%s", "_disable_emergency_ok_cb : appdata is null");
690 evas_object_del(data);
695 battery_menu_list[BATT_MENU_POWER_SAVING].is_enable = ENABLE;
696 elm_genlist_item_fields_update( pws_it, "elm.text.2", ELM_GENLIST_ITEM_FIELD_TEXT);
697 elm_check_state_set(g_pws_check, EINA_TRUE);
699 _set_power_saving_status(SETTING_PSMODE_WEARABLE);
702 void _pws_popup_cb(void *data, Evas_Object *obj, void *event_info)
704 Evas_Object *popup = NULL;
705 Evas_Object *btn = NULL;
706 Evas_Object *scroller = NULL;
707 Evas_Object *label = NULL;
709 appdata *ad = (appdata *) data;
713 popup = elm_popup_add(ad->nf);
714 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
715 elm_object_part_text_set(popup, "title,text", _("IDS_ST_MBODY_POWER_SAVER_ABB"));
719 scroller = elm_scroller_add(popup);
720 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
721 elm_object_style_set(scroller, "effect");
722 elm_object_content_set(popup, scroller);
723 evas_object_show(scroller);
725 label = elm_label_add(scroller);
726 elm_object_style_set(label, "popup/default");
727 elm_label_line_wrap_set(label, ELM_WRAP_MIXED);
731 char * font_size_frame = "<font_size=34>%s</font_size>";
732 snprintf(buf, sizeof(buf)-1, font_size_frame, _("IDS_ST_POP_POWER_SAVER_WILL_BE_ENABLED_THIS_WILL_LIMIT_THE_MAXIMUM_PERFORMANCE_OF_THE_CPU_TURN_OFF_BLUETOOTH_AND_A_LOWER_SCREEN_POWER_LEVEL_WILL_BE_USED_MSG"));
734 char *txt = strdup(buf);
735 elm_object_text_set(label, txt);
737 evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
738 evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
739 elm_object_content_set(scroller, label);
740 evas_object_show(label);
742 ea_object_event_callback_add(popup, EA_CALLBACK_BACK, setting_popup_back_cb, ad);
744 btn = elm_button_add(popup);
745 elm_object_style_set(btn, "popup");
746 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
747 elm_object_text_set(btn, _("IDS_ST_BUTTON_CANCEL_ABB2"));
748 elm_object_part_content_set(popup, "button1", btn);
749 evas_object_smart_callback_add(btn, "clicked", _pws_cancel_cb, popup);
751 btn = elm_button_add(popup);
752 elm_object_style_set(btn, "popup");
753 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
754 elm_object_text_set(btn, _("IDS_WNOTI_BUTTON_OK_ABB2"));
755 elm_object_part_content_set(popup, "button2", btn);
756 evas_object_smart_callback_add(btn, "clicked", _pws_ok_cb, popup);
758 evas_object_show(popup);