3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://floralicense.org/license/
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #include <setting-display-brightness.h>
19 #define DISABLE_LOW_BATERY_CHANGE 0 //disable user to set the brightness when the Mobile is low battery.
21 #define Left_Bright_Icon IMG_BRIGTHNESS_LEFT
22 #define Right_Bright_Icon IMG_BRIGHTNESS_RIGHT
23 #define SUPPORT_DISPLAY_HOMESCREEN_IMAGE 0
25 static int setting_display_brightness_create(void *cb);
26 static int setting_display_brightness_destroy(void *cb);
27 static int setting_display_brightness_update(void *cb);
28 static int setting_display_brightness_cleanup(void *cb);
30 static void setting_display_set_slider_value(void* data, Evas_Object *obj, double value);
32 setting_view setting_view_display_brightness = {
33 .create = setting_display_brightness_create,
34 .destroy = setting_display_brightness_destroy,
35 .update = setting_display_brightness_update,
36 .cleanup = setting_display_brightness_cleanup,
39 static void __toggle_automatic_chk(void* data, int chk_status);
41 /* ***************************************************
45 ***************************************************/
46 #define LOW_BATTERY_NOTIFY "Battery is too low, you cannot change brightness"
47 #define NORMAL_BATTERY_NOTIFY "Battery becomes normal, now you can change brightness.."
49 #if DISABLE_LOW_BATERY_CHANGE
51 __low_battery_on_resp_cb(void *data, Evas_Object *obj, void *event_info)
54 setting_retm_if(NULL == data, "NULL == data");
55 SettingDisplayUG *ad = (SettingDisplayUG *) data;
56 evas_object_del(ad->popup);
60 static Eina_Bool __disable_on_idle(void *data)
63 SettingDisplayUG *ad = (SettingDisplayUG *) data;
67 evas_object_del(ad->popup);
70 ad->popup = setting_create_popup_without_btn(ad, ad->win_get, NULL, _(LOW_BATTERY_NOTIFY),
71 __low_battery_on_resp_cb, POPUP_INTERVAL, FALSE, FALSE);
72 if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
73 if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
78 static void setting_display_brightness_lowbat_cb(keynode_t *key, void* data)
80 // SETTING_TRACE_BEGIN;
82 SettingDisplayUG *ad = (SettingDisplayUG *) data;
85 char* vconf_key = vconf_keynode_get_name(key);
86 SETTING_TRACE("the value of [ %s ] just changed", vconf_key);
87 ad->low_bat = vconf_keynode_get_int(key);
88 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW)
90 SETTING_TRACE("Battery becomes ctitical low !");
91 //popup was showed by system FW
93 if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
94 if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
96 SETTING_TRACE("Battery becomes normal!");
97 if (ad->data_br_sli) {
98 int automatic_val, err;
99 setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &automatic_val, &err);
100 if (ad->data_br_auto) setting_enable_genlist_item(ad->data_br_auto->item);
101 if (automatic_val == SETTING_BRIGHTNESS_AUTOMATIC_OFF) // not automatic
103 if (ad->data_br_sli) setting_enable_genlist_item(ad->data_br_sli->item);
110 static void __display_int_vconf_cb(keynode_t *key, void *data)
112 SettingDisplayUG *ad = data;
113 retm_if(!data, "Invalid argument: data is NULL");
115 int status = vconf_keynode_get_int(key);
116 char *vconf_name = vconf_keynode_get_name(key);
117 SETTING_TRACE("Enter %s(%s=%d)", __FUNCTION__, vconf_name, status);
119 if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_LCD_BRIGHTNESS)) {
122 elm_slider_value_set(ad->data_br_sli->eo_check, status);
125 else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT)) {
128 if (ad->data_br_auto)
129 elm_check_state_set(ad->data_br_auto->eo_check, 1);
132 setting_disable_genlist_item(ad->data_br_sli->item);
136 if (ad->data_br_auto)
137 elm_check_state_set(ad->data_br_auto->eo_check, 0);
140 setting_enable_genlist_item(ad->data_br_sli->item);
146 static int setting_display_brightness_create(void *cb)
149 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
151 SettingDisplayUG *ad = (SettingDisplayUG *) cb;
153 Evas_Object *genlist = elm_genlist_add(ad->win_main_layout);
154 elm_object_style_set(genlist, "dialogue");
155 retvm_if(genlist == NULL, SETTING_RETURN_FAIL, "Cannot set scroller object as contento of layout");
156 elm_genlist_clear(genlist); /* first to clear list */
158 /* add basic layout */
159 if (&setting_view_display_brightness == ad->view_to_load) {
161 setting_create_layout_navi_bar(ad->win_main_layout,
163 _(KeyStr_Brightness),
164 _("IDS_COM_BODY_BACK"),
166 setting_display_brightness_click_softkey_cancel_cb,
169 &ad->navi_bar, NULL);
171 setting_push_layout_navi_bar(_(KeyStr_Brightness),
172 _("IDS_COM_BODY_BACK"), NULL, NULL,
173 setting_display_brightness_click_softkey_cancel_cb,
175 NULL, ad, genlist, ad->navi_bar, NULL);;
179 Elm_Object_Item *item = elm_genlist_item_append(genlist, &(ad->itc_seperator), NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
180 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
182 // [control] AUTOMATIC - boolean - vconf
183 int auto_value = SETTING_BRIGHTNESS_AUTOMATIC_ON;
185 int ret = setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &auto_value, &err);//if get failed,to hold value SETTING_BRIGHTNESS_AUTOMATIC_ON
186 SETTING_TRACE("auto_value:%d", auto_value);
187 if (0 != ret) //add error handle,due to different target env..
188 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT);
190 // [UI] AUTOMATIC - boolean
192 setting_create_Gendial_field_def(genlist, &(ad->itc_1text_1icon),
193 setting_display_brightness_mouse_up_Gendial_list_cb,
194 ad, SWALLOW_Type_1TOGGLE, NULL,
196 "IDS_COM_BODY_AUTOMATIC", NULL,
197 setting_display_brightness_chk_btn_cb);
198 if (ad->data_br_auto) {
199 ad->data_br_auto->userdata = ad;
201 SETTING_TRACE_ERROR("ad->data_br_auto is NULL");
206 int value = SETTING_BRIGHTNESS_LEVEL5;
207 ret = setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &value, &err);
208 SETTING_TRACE("******* value = %d ", value);
209 if (0 != ret) //add error handle,due to different target env..
210 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_LCD_BRIGHTNESS);
212 // [UI] Slider control for Bightness
214 setting_create_Gendial_field_def(genlist, &(itc_1icon), NULL,
215 NULL, SWALLOW_Type_LAYOUT_SLIDER,
217 Right_Bright_Icon, value, NULL,
219 setting_display_birghtness_bright_slider_value_change_cb);
221 if (ad->data_br_sli) {
222 ad->data_br_sli->win_main = ad->win_main_layout;
223 ad->data_br_sli->evas = ad->evas;
224 ad->data_br_sli->isIndicatorVisible = false;
225 ad->data_br_sli->slider_min = 1;
227 ad->data_br_sli->slider_max = 100;
228 ad->data_br_sli->userdata = ad;
231 setting_disable_genlist_item(ad->data_br_sli->item);
235 SETTING_TRACE_ERROR("ad->data_br_sli is NULL");
237 #if DISABLE_LOW_BATERY_CHANGE
238 ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
239 vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &ad->low_bat);
240 if (0 != ret) //add error handle,due to different target env..
241 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SYSMAN_BATTERY_STATUS_LOW);
243 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) {
244 SETTING_TRACE("battery is ctitical low");
245 //have time delay to show all the item out,so user idler to disable
246 //if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
247 //if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
248 ecore_idler_add(__disable_on_idle, ad);
251 // low battery handler - registration
252 vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb, ad);
255 vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __display_int_vconf_cb, ad);
256 vconf_notify_key_changed(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, __display_int_vconf_cb, ad);
257 setting_view_display_brightness.is_create = 1;
258 return SETTING_RETURN_SUCCESS;
261 static int setting_display_brightness_destroy(void *cb)
266 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
267 #if DISABLE_LOW_BATERY_CHANGE
268 /* low battery handler - registration */
269 vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb);
271 vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __display_int_vconf_cb);
272 vconf_ignore_key_changed(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, __display_int_vconf_cb);
274 SettingDisplayUG *ad = (SettingDisplayUG *) cb;
275 elm_naviframe_item_pop(ad->navi_bar);
278 evas_object_del(ad->popup);
282 setting_view_display_brightness.is_create = 0;
283 return SETTING_RETURN_SUCCESS;
286 static int setting_display_brightness_update(void *cb)
289 return SETTING_RETURN_SUCCESS;
293 static int setting_display_brightness_cleanup(void *cb)
297 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
298 setting_display_brightness_destroy(cb);
300 return SETTING_RETURN_SUCCESS;
303 /* ***************************************************
307 ***************************************************/
309 /* ***************************************************
313 ***************************************************/
316 setting_display_brightness_click_softkey_cancel_cb(void *data,
322 retm_if(data == NULL, "Data parameter is NULL");
323 SettingDisplayUG *ad = (SettingDisplayUG *) data;
324 if (&setting_view_display_brightness == ad->view_to_load) {
325 /* Send destroy request */
326 ug_destroy_me(ad->ug);
330 setting_view_change(&setting_view_display_brightness,
331 &setting_view_display_main, ad);
335 * toggle handler for 'Automatic'
337 static void __toggle_automatic_chk(void* data, int chk_status)
340 SettingDisplayUG *ad = (SettingDisplayUG *) data;
341 int ret = setting_set_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, chk_status, &err);
342 if (0 != ret) //add error handle,due to different target env..
344 SETTING_TRACE("Operation failed");
345 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
346 NULL, POPUP_INTERVAL, FALSE, FALSE);
351 setting_disable_genlist_item(ad->data_br_sli->item);
355 #if DISABLE_LOW_BATERY_CHANGE
356 //to get value every time
357 ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
359 // in case of LOW BATTERY
360 ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &ad->low_bat);
361 if (0 != ret) //add error handle,due to different target env..
363 SETTING_TRACE("Operation failed");
364 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
365 NULL, POPUP_INTERVAL, FALSE, FALSE);
369 // in case of CRITICAL LOW BATTERY
370 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW)
372 setting_disable_genlist_item(ad->data_br_sli->item);
373 setting_disable_genlist_item(ad->data_br_auto->item);
376 { // in case of NORMAL OP
378 // 2. call brightness set API
379 int value = SETTING_BRIGHTNESS_LEVEL5;
380 //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
381 if (ad->data_br_sli) {
382 value = elm_slider_value_get(ad->data_br_sli->eo_check);
383 SETTING_TRACE(" value of ad->data_br_sli->eo_check: %d ", value);
384 setting_enable_genlist_item(ad->data_br_sli->item);
387 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
388 if (0 != ret) //add error handle,due to different target env..
390 SETTING_TRACE("Operation failed");
391 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
392 NULL, POPUP_INTERVAL, FALSE, FALSE);
396 /* call brightness API */
397 ret = device_set_brightness_to_settings(BRIGHTNESS_DISPLAY, value);
398 /* TODO error handling here */
401 int value = SETTING_BRIGHTNESS_LEVEL5;
402 //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
403 if (ad->data_br_sli) {
404 value = elm_slider_value_get(ad->data_br_sli->eo_check);
405 SETTING_TRACE(" value of ad->data_br_sli->eo_check: %d ", value);
406 setting_enable_genlist_item(ad->data_br_sli->item);
408 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
409 if (0 != ret) //add error handle,due to different target env..
411 SETTING_TRACE("Operation failed");
412 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
413 NULL, POPUP_INTERVAL, FALSE, FALSE);
421 setting_display_brightness_chk_btn_cb(void *data, Evas_Object *obj,
426 retm_if(data == NULL, "Data parameter is NULL");
427 Setting_GenGroupItem_Data *list_item =
428 (Setting_GenGroupItem_Data *) data;
429 SettingDisplayUG *ad = list_item->userdata;
430 list_item->chk_status = elm_check_state_get(obj); /* for genlist update status */
432 // enable /disable toggle button
433 __toggle_automatic_chk(ad, list_item->chk_status);
438 * [UI] 'Automatic' toggle
440 static void setting_display_brightness_mouse_up_Gendial_list_cb(void *data,
445 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
446 retm_if(data == NULL, "Invalid argument: data is NULL");
447 SettingDisplayUG *ad = data;
449 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
450 elm_genlist_item_selected_set(item, 0);
451 Setting_GenGroupItem_Data *list_item =
452 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
454 int old_status = elm_check_state_get(list_item->eo_check);
456 list_item->chk_status = !old_status;
457 elm_check_state_set(list_item->eo_check, list_item->chk_status);
459 // enable /disable toggle button
460 __toggle_automatic_chk(ad,list_item->chk_status);
463 static void setting_display_set_slider_value(void* data, Evas_Object *obj, double value)
467 retm_if(data == NULL, "Invalid argument: data is NULL");
469 SettingDisplayUG *ad = data;
471 ret = device_set_brightness_to_settings(BRIGHTNESS_DISPLAY, value);
472 if (ret == DEVICE_ERROR_NONE) {
473 ad->data_br_sli->chk_status = value;
474 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
476 if (0 != ret) setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
477 NULL, POPUP_INTERVAL, FALSE, FALSE);
479 SETTING_TRACE("device_set_brightness_to_settings : failed[ret=%d]", ret);
481 int tmp = SETTING_BRIGHTNESS_LEVEL5;
482 setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &tmp, &err);
483 elm_slider_value_set(obj, tmp);
484 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
485 NULL, POPUP_INTERVAL, FALSE, FALSE);
489 static Eina_Bool __set_brightness_on_idle(void *data)
492 SettingDisplayUG *ad = (SettingDisplayUG *) data;
493 if (!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check)
495 SETTING_TRACE_ERROR("!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check");
497 ad->set_idler = NULL;
500 //Get the current real value of slider
501 Evas_Object *obj = ad->data_br_sli->eo_check;
502 double val = elm_slider_value_get(obj);
503 int value = (int)(val + 0.5);
504 SETTING_TRACE("val:%f", val);
505 SETTING_TRACE("value:%d", value);
506 setting_display_set_slider_value(ad, obj, value);
507 //After return False, the idler will be deleted directly,so here set ad->set_idler as NULL directly.
508 ad->set_idler = NULL;
513 setting_display_birghtness_bright_slider_value_change_cb(void *data,
518 retm_if(data == NULL, "Data parameter is NULL");
520 static int old_val = -1;
521 SettingDisplayUG *ad = NULL;
522 Setting_GenGroupItem_Data *list_item =
523 (Setting_GenGroupItem_Data *) data;
524 ad = list_item->userdata;
526 value = elm_check_state_get(ad->data_br_auto->eo_check);
527 if (value == 1) { /* it is automatic setting mode, */
532 double val = elm_slider_value_get(obj);
533 SETTING_TRACE("val:%f", val);
534 value = (int)(val + 0.5);
535 /* SETTING_TRACE("val:%f", val); */
536 SETTING_TRACE("value:%d", value);
537 if (value != old_val)
539 //setting_display_set_slider_value(ad, obj, value);
542 SETTING_TRACE("It is in Emulator, need special process to improve the performence");
544 ecore_idler_del(ad->set_idler);
545 ad->set_idler = NULL;
547 ad->set_idler = ecore_idler_add((Ecore_Task_Cb) __set_brightness_on_idle, ad);
551 SETTING_TRACE("It is in Real Target, Set the brightness directly.");
552 setting_display_set_slider_value(ad, obj, value);