2 * Copyright (c) 2000 - 2013 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.
20 * Created on: Oct 12, 2013
23 #include <vconf-keys.h>
28 #include "setting-battery.h"
31 Evas_Object* _create_battery_content2(void *data);
32 static void _battery_percent_cb(void *data, Evas_Object *obj, void *event_info);
33 static void _power_saving_cb(void *data, Evas_Object *obj, void *event_info);
35 static struct _battery_menu_item battery_menu_list[] = {
36 { "IDS_ST_BODY_BATTERY_STATUS", DISABLE, _battery_status_cb },
37 //{ "IDS_ST_BODY_BATTERY_PERCENTAGE_ABB", DISABLE, _battery_percent_cb },
38 { "IDS_ST_MBODY_POWER_SAVER_ABB", DISABLE, _power_saving_cb }
41 char * battery_icons[] = {
42 "b_setting_battery_01.png",
43 "b_setting_battery_02.png",
44 "b_setting_battery_03.png",
45 "b_setting_battery_04.png",
46 "b_setting_battery_05.png",
47 "b_setting_battery_06.png",
48 "b_setting_battery_07.png",
49 "b_setting_battery_08.png",
50 "b_setting_battery_09.png"
53 char * battery_charging_icons[] = {
54 "b_setting_battery_charge_01.png",
55 "b_setting_battery_charge_02.png",
56 "b_setting_battery_charge_03.png",
57 "b_setting_battery_charge_04.png",
58 "b_setting_battery_charge_05.png",
59 "b_setting_battery_charge_06.png",
60 "b_setting_battery_charge_07.png",
61 "b_setting_battery_charge_08.png",
62 "b_setting_battery_charge_09.png"
65 static char * power_saving_str[] = {
66 "IDS_ST_BODY_DISABLED_M_STATUS",
67 "IDS_EMAIL_BODY_ENABLED_M_STATUS"
70 static appdata* temp_ad = NULL;
71 static Ecore_Timer *pws_timer = NULL;
72 static Evas_Object * g_pws_check = NULL;
73 static Elm_Object_Item* pws_it = NULL;
75 static Eina_Bool _delete_timer(void * data)
79 _power_saving_terminate_app(temp_ad);
81 return ECORE_CALLBACK_CANCEL;
84 static void change_pws_key(keynode_t *key, void * data)
87 vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &mode_val);
91 DBG("change_pws_key is power saving");
94 ecore_timer_del(pws_timer);
97 pws_timer = ecore_timer_add(1.0, (Ecore_Task_Cb) _delete_timer, NULL);
102 DBG("change_pws_key is normal");
106 void _initialize_battery()
108 battery_timer = NULL;
112 prev_charging_state = false;
115 register_vconf_changing(VCONFKEY_SETAPPL_PSMODE, change_pws_key, NULL);
118 Eina_Bool _clear_battery_list_cb(void *data, Elm_Object_Item *it)
123 void _clear_battery_cb(void *data , Evas *e, Evas_Object *obj, void *event_info)
126 ecore_timer_del(battery_timer);
127 battery_timer = NULL;
131 ecore_timer_del(pws_timer);
136 prev_charging_state = false;
142 unregister_vconf_changing(VCONFKEY_SYSTEM_TIME_CHANGED, change_pws_key);
147 static int get_battery_img_index(int percent)
151 if( percent > 0 && percent < 5 )
155 else if( percent >= 5 && percent <= 10 )
159 else if( percent >= 11 && percent <= 20 )
163 else if( percent >= 21 && percent <= 34 )
167 else if( percent >= 35 && percent <= 49 )
171 else if( percent >= 50 && percent <= 64 )
175 else if( percent >= 65 && percent <= 79 )
179 else if( percent >= 80 && percent <= 94 )
183 else if( percent >= 95 && percent <= 100 )
190 static int is_updated_battery_state() {
191 int current_percent = 0;
192 bool current_charging_state = false;
195 if( device_battery_get_percent(¤t_percent) != DEVICE_ERROR_NONE )
197 DBG("Setting - Battery percent get error");
200 if( device_battery_is_charging(¤t_charging_state) != DEVICE_ERROR_NONE )
202 DBG("Setting - Battery charging do not get. error");
205 if( (current_percent != percent) || (current_charging_state != is_charging) ) {
206 percent = current_percent;
207 is_charging = current_charging_state;
209 DBG("Setting - Updated battery state !! percent: %d, charging: %d", percent, is_charging);
217 static int is_type_of_charging()
221 vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, &status);
223 if (status == VCONFKEY_SYSMAN_CHARGER_CONNECTED)
225 vconf_get_int(VCONFKEY_SYSMAN_USB_STATUS, &status);
226 if (status == VCONFKEY_SYSMAN_USB_AVAILABLE)
234 static Evas_Object * create_icon(Evas_Object * parent, char * img_path)
236 if( img_path == NULL )
239 Evas_Object * icon = elm_image_add(parent);
240 elm_image_file_set(icon, img_path, NULL);
241 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
242 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
247 static Eina_Bool _battery_timeout(void * data)
249 Evas_Object * layout = (Evas_Object*)data;
250 if( layout == NULL ) {
251 return ECORE_CALLBACK_CANCEL;
255 if( is_updated_battery_state() ) {
257 snprintf(buf, sizeof(buf)-1, "%s%c", ICU_NUM(percent), '\%');
258 char * temp_percent = strdup(buf);
259 elm_object_part_text_set(layout, "text1", temp_percent);
263 snprintf(buf, sizeof(buf)-1, "%s%s", _("IDS_COM_BODY_CHARGING_GA"), (is_type_of_charging() == CHARGING_AC) ? "(AC)" : "(USB)");
264 char * temp_charging_msg = strdup(buf);
265 elm_object_part_text_set(layout, "text2", temp_charging_msg);
266 free(temp_charging_msg);
269 elm_object_part_text_set(layout, "text2", _("IDS_ST_BODY_NOT_CHARGING_ABB"));
272 int img_index = get_battery_img_index(percent);
273 if( ( img_index != image_index ) || (prev_charging_state != is_charging) ) {
274 snprintf(buf, sizeof(buf)-1, "%s%s", IMG_DIR, (is_charging) ? battery_charging_icons[img_index] : battery_icons[img_index]);
276 Evas_Object * del_icon = elm_object_part_content_get(layout, "image");
278 evas_object_del(del_icon);
281 elm_object_part_content_set(layout, "image", create_icon(layout, buf));
284 prev_charging_state = is_charging;
286 DBG("Setting - Update Battery Layout!!");
290 DBG("Setting - check battery state!!");
292 return ECORE_CALLBACK_RENEW;
295 void _start_timer_for_update(Evas_Object * obj)
300 ecore_timer_del(battery_timer);
301 battery_timer = NULL;
303 battery_timer = ecore_timer_add(1.0, (Ecore_Task_Cb)_battery_timeout, obj);
306 void _battery_lang_changed(void *data, Evas_Object *obj, void *event_info)
308 DBG("Setting - _battery_lang_changed is called!");
313 snprintf(buf, sizeof(buf)-1, "%s%c", ICU_NUM(percent), '\%');
314 char * temp_percent = strdup(buf);
315 elm_object_part_text_set(obj, "text1", temp_percent);
320 snprintf(buf, sizeof(buf)-1, "%s%s", _("IDS_COM_BODY_CHARGING_GA"), (is_type_of_charging() == CHARGING_AC) ? "(AC)" : "(USB)");
321 char * temp_charging_msg = strdup(buf);
322 elm_object_part_text_set(obj, "text2", temp_charging_msg);
323 free(temp_charging_msg);
327 elm_object_part_text_set(obj, "text2", _("IDS_ST_BODY_NOT_CHARGING_ABB"));
332 Evas_Object* _create_battery_content2(void *data)
334 Evas_Object *layout, *icon;
337 appdata *ad = (appdata *)data;
341 layout = elm_layout_add(ad->nf);
342 elm_layout_file_set(layout, EDJE_PATH, "setting-test/battery");
343 evas_object_size_hint_weight_set (layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
344 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
345 evas_object_smart_callback_add(layout, "language,changed", _battery_lang_changed, NULL);
347 if( device_battery_get_percent(&percent) != DEVICE_ERROR_NONE )
349 DBG("Setting - Battery percent get error");
351 snprintf(buf, sizeof(buf)-1, "%s%c", ICU_NUM(percent), '\%');
353 elm_object_part_text_set(layout, "text1", buf);
355 if( device_battery_is_charging(&is_charging) != DEVICE_ERROR_NONE )
357 DBG("Setting - Battery charging do not get. error");
359 char * charging_text = NULL;
361 snprintf(buf, sizeof(buf)-1, "%s%s", _("IDS_COM_BODY_CHARGING_GA"), (is_type_of_charging() == CHARGING_AC) ? "(AC)" : "(USB)");
362 charging_text = strdup(buf);
364 elm_object_part_text_set(layout, "text2", ( is_charging ) ? charging_text : _("IDS_ST_BODY_NOT_CHARGING_ABB"));
367 prev_charging_state = is_charging;
369 image_index = get_battery_img_index(percent);
371 snprintf(buf, sizeof(buf)-1, "%s%s", IMG_DIR, ( is_charging ) ? battery_charging_icons[image_index] : battery_icons[image_index]);
373 elm_object_part_content_set(layout, "image", create_icon(layout, buf));
375 _start_timer_for_update(layout); // updating timer start!
380 Evas_Object *_battery_status_cb(void *data)
382 Evas_Object* layout = NULL;
383 Elm_Object_Item *nf_it = NULL;
388 DBG("Setting - ad is null");
392 _initialize_battery();
393 layout = _create_battery_content2(data);
396 DBG("%s", "battery cb - layout is null");
401 //nf_it = elm_naviframe_item_push(ad->nf, NULL, NULL, NULL, layout, NULL);
402 //elm_naviframe_item_pop_cb_set(nf_it, _clear_battery_cb, ad);
403 //elm_naviframe_item_title_enabled_set(nf_it, EINA_FALSE, EINA_FALSE);
406 int _get_battery_percent_value()
409 if (vconf_get_bool(VCONFKEY_SETAPPL_BATTERY_PERCENTAGE_BOOL, &value) != 0) {
410 ERR("error get vconf value!!");
415 int _set_battery_percent_value(int value)
417 if (vconf_set_bool(VCONFKEY_SETAPPL_BATTERY_PERCENTAGE_BOOL, value) != 0) {
418 ERR("error set vconf value!!");
424 void _battery_percent_cb(void *data, Evas_Object *obj, void *event_info)
426 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
428 _set_battery_percent_value(!_get_battery_percent_value());
430 elm_genlist_item_update((Elm_Object_Item *)event_info);
433 int _power_saving_runapp_info_get(const aul_app_info *ainfo, void *data)
435 DBG("_power_saving_runapp_info_get");
436 ail_appinfo_h handle;
445 if(ainfo->pkg_name == NULL)
448 /* �� PID ���͸� */
450 if(ainfo->pid == getpid()) {
454 ret = ail_get_appinfo(ainfo->pkg_name, &handle);
456 if(ret != AIL_ERROR_OK){
459 /* APP�� TASKMANAGE üũ */
460 ret = ail_appinfo_get_bool(handle, AIL_PROP_X_SLP_TASKMANAGE_BOOL, &valb);
462 ret = ail_destroy_appinfo(handle);
466 aul_terminate_pid(ainfo->pid);
468 ret = ail_destroy_appinfo(handle);
472 static Eina_Bool _pws_timer(void *data)
475 appdata *ad = (appdata *) data;
477 return ECORE_CALLBACK_CANCEL;
481 evas_object_del(ad->win_main);
485 return ECORE_CALLBACK_CANCEL;
488 int _power_saving_terminate_app(void *data)
490 int ret = AUL_R_ERROR;
491 appdata *ad = (appdata *) data;
495 evas_object_del(ad->win_main);
499 ret = aul_app_get_running_app_info(_power_saving_runapp_info_get, NULL);
500 if(ret != AUL_R_OK) {
501 DBG("aul_app_get_running_app_info() failed");
507 int _get_power_saving_status()
510 if (vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &value) != 0) {
511 ERR("error get vconf value!!");
514 battery_menu_list[BATT_MENU_POWER_SAVING].is_enable = ENABLE;
516 battery_menu_list[BATT_MENU_POWER_SAVING].is_enable = DISABLE;
520 int _set_power_saving_status(int value)
522 if (vconf_set_int(VCONFKEY_SETAPPL_PSMODE, value) != 0) {
523 ERR("error set vconf value!!");
527 battery_menu_list[BATT_MENU_POWER_SAVING].is_enable = ENABLE;
530 battery_menu_list[BATT_MENU_POWER_SAVING].is_enable = DISABLE;
534 static void _power_saving_cb(void *data, Evas_Object *obj, void *event_info)
536 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
538 int pws_status; //int , 0:normal, 3:pws on
539 pws_status = _get_power_saving_status();
543 DBG("psmode state [%d]", pws_status);
544 _set_power_saving_status(SETTING_PSMODE_NORMAL);
546 else if(!pws_status){
548 _pws_popup_cb(data, obj, event_info);
551 elm_genlist_item_update((Elm_Object_Item *)event_info);
554 char *_gl_battery_title_get(void *data, Evas_Object *obj, const char *part)
557 Item_Data *id = data;
558 int index = id->index;
559 if (!strcmp(part, "elm.text.1") || !strcmp(part, "elm.text")) {
560 snprintf(buf, sizeof(buf)-1, "%s", _(battery_menu_list[index].name));
562 else if( !strcmp(part, "elm.text.2") && index == BATT_MENU_POWER_SAVING ){
563 snprintf(buf, sizeof(buf)-1, "%s", _(power_saving_str[battery_menu_list[index].is_enable]));
569 Evas_Object *_gl_battery_check_get(void *data, Evas_Object *obj, const char *part)
571 Evas_Object *check = NULL;
573 Item_Data *id = data;
574 int index = id->index;
576 if (!strcmp(part, "elm.icon")) {
577 check = elm_check_add(obj);
578 if(index == BATT_MENU_POWER_SAVING){
579 elm_check_state_set(check, (_get_power_saving_status()) ? EINA_TRUE : EINA_FALSE);
583 elm_check_state_set(check, (_get_battery_percent_value()) ? EINA_TRUE : EINA_FALSE);
585 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
586 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
593 void _gl_battery_del(void *data, Evas_Object *obj)
595 Item_Data *id = data;
600 Evas_Object* _create_battery_list(void *data)
605 ERR("appdata is null!!");
609 Evas_Object *genlist = NULL;
610 Evas_Object *layout = NULL;
611 struct _battery_menu_item *menu_list = NULL;
616 Elm_Genlist_Item_Class *itc = NULL;
618 Elm_Genlist_Item_Class *itc_1text = elm_genlist_item_class_new();
619 itc_1text->item_style = "1text";
620 itc_1text->func.text_get = _gl_battery_title_get;
621 itc_1text->func.del = _gl_battery_del;
623 Elm_Genlist_Item_Class *itc_2text_1icon = elm_genlist_item_class_new();
624 itc_2text_1icon->item_style = "2text.1icon.1";
625 itc_2text_1icon->func.text_get = _gl_battery_title_get;
626 itc_2text_1icon->func.content_get = _gl_battery_check_get;
627 itc_2text_1icon->func.del = _gl_battery_del;
629 layout = elm_layout_add(ad->nf);
630 elm_layout_file_set(layout, EDJE_PATH, "setting/genlist/layout");
631 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
633 genlist = elm_genlist_add(layout);
634 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
636 menu_list = battery_menu_list;
638 for (idx = 0; idx < sizeof(battery_menu_list) / sizeof(struct _battery_menu_item); idx++) {
639 if (idx == BATT_MENU_POWER_SAVING) {
640 itc = itc_2text_1icon;
642 else if (idx == BATT_MENU_STATUS){
646 Item_Data *id = calloc(sizeof(Item_Data), 1);
648 id->item = elm_genlist_item_append(
649 genlist, // genlist object
653 ELM_GENLIST_ITEM_NONE,
654 menu_list[idx].func, // call back
657 if(idx == BATT_MENU_POWER_SAVING)
663 elm_genlist_item_class_free(itc_2text_1icon);
664 //elm_genlist_item_class_free(itc_1text_1icon);
665 elm_genlist_item_class_free(itc_1text);
668 elm_object_part_content_set(layout, "elm.genlist", genlist);
673 static void _pws_cancel_cb(void *data, Evas_Object *obj, void *event_info)
675 appdata *ad = (appdata *) data;
680 evas_object_del(data);
685 static void _pws_ok_cb(void *data, Evas_Object *obj, void *event_info)
691 DBG("%s", "_disable_emergency_ok_cb : appdata is null");
696 evas_object_del(data);
701 battery_menu_list[BATT_MENU_POWER_SAVING].is_enable = ENABLE;
702 elm_genlist_item_fields_update( pws_it, "elm.text.2", ELM_GENLIST_ITEM_FIELD_TEXT);
703 elm_check_state_set(g_pws_check, EINA_TRUE);
705 _set_power_saving_status(SETTING_PSMODE_WEARABLE);
708 void _pws_popup_cb(void *data, Evas_Object *obj, void *event_info)
710 Evas_Object *popup = NULL;
711 Evas_Object *btn = NULL;
712 Evas_Object *scroller = NULL;
713 Evas_Object *label = NULL;
715 appdata *ad = (appdata *) data;
719 popup = elm_popup_add(ad->nf);
720 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
721 elm_object_part_text_set(popup, "title,text", _("IDS_ST_MBODY_POWER_SAVER_ABB"));
725 scroller = elm_scroller_add(popup);
726 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
727 elm_object_style_set(scroller, "effect");
728 elm_object_content_set(popup, scroller);
729 evas_object_show(scroller);
731 label = elm_label_add(scroller);
732 elm_object_style_set(label, "popup/default");
733 elm_label_line_wrap_set(label, ELM_WRAP_MIXED);
737 char * font_size_frame = "<font_size=34>%s</font_size>";
738 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"));
740 char *txt = strdup(buf);
741 elm_object_text_set(label, txt);
743 evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
744 evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
745 elm_object_content_set(scroller, label);
746 evas_object_show(label);
748 ea_object_event_callback_add(popup, EA_CALLBACK_BACK, setting_popup_back_cb, ad);
750 btn = elm_button_add(popup);
751 elm_object_style_set(btn, "popup");
752 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
753 elm_object_text_set(btn, _("IDS_ST_BUTTON_CANCEL_ABB2"));
754 elm_object_part_content_set(popup, "button1", btn);
755 evas_object_smart_callback_add(btn, "clicked", _pws_cancel_cb, popup);
757 btn = elm_button_add(popup);
758 elm_object_style_set(btn, "popup");
759 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
760 elm_object_text_set(btn, _("IDS_WNOTI_BUTTON_OK_ABB2"));
761 elm_object_part_content_set(popup, "button2", btn);
762 evas_object_smart_callback_add(btn, "clicked", _pws_ok_cb, popup);
764 evas_object_show(popup);