4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Contact: MyoungJune Park <mj2004.park@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 #include <setting-display-brightness.h>
23 #define DISABLE_LOW_BATERY_CHANGE 0 //disable user to set the brightness when the Mobile is low battery.
25 #define Left_Bright_Icon IMG_BRIGTHNESS_LEFT
26 #define Right_Bright_Icon IMG_BRIGHTNESS_RIGHT
27 #define SUPPORT_DISPLAY_HOMESCREEN_IMAGE 0
29 static int setting_display_brightness_create(void *cb);
30 static int setting_display_brightness_destroy(void *cb);
31 static int setting_display_brightness_update(void *cb);
32 static int setting_display_brightness_cleanup(void *cb);
34 static void setting_display_set_slider_value(void* data, Evas_Object *obj, double value);
36 setting_view setting_view_display_brightness = {
37 .create = setting_display_brightness_create,
38 .destroy = setting_display_brightness_destroy,
39 .update = setting_display_brightness_update,
40 .cleanup = setting_display_brightness_cleanup,
43 static void __toggle_automatic_chk(void* data, int chk_status);
45 /* ***************************************************
49 ***************************************************/
50 #define LOW_BATTERY_NOTIFY "Battery is too low, you cannot change brightness"
51 #define NORMAL_BATTERY_NOTIFY "Battery becomes normal, now you can change brightness.."
53 #if DISABLE_LOW_BATERY_CHANGE
55 __low_battery_on_resp_cb(void *data, Evas_Object *obj, void *event_info)
58 setting_retm_if(NULL == data, "NULL == data");
59 SettingDisplayUG *ad = (SettingDisplayUG *) data;
60 evas_object_del(ad->popup);
64 static Eina_Bool __disable_on_idle(void *data)
67 SettingDisplayUG *ad = (SettingDisplayUG *) data;
71 evas_object_del(ad->popup);
74 ad->popup = setting_create_popup_without_btn(ad, ad->win_get, NULL, _(LOW_BATTERY_NOTIFY),
75 __low_battery_on_resp_cb, POPUP_INTERVAL, FALSE, FALSE);
76 if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
77 if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
82 static void setting_display_brightness_lowbat_cb(keynode_t *key, void* data)
84 // SETTING_TRACE_BEGIN;
86 SettingDisplayUG *ad = (SettingDisplayUG *) data;
89 char* vconf_key = vconf_keynode_get_name(key);
90 SETTING_TRACE("the value of [ %s ] just changed", vconf_key);
91 ad->low_bat = vconf_keynode_get_int(key);
92 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW)
94 SETTING_TRACE("Battery becomes ctitical low !");
95 //popup was showed by system FW
97 if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
98 if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
100 SETTING_TRACE("Battery becomes normal!");
101 if (ad->data_br_sli) {
102 int automatic_val, err;
103 setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &automatic_val, &err);
104 if (ad->data_br_auto) setting_enable_genlist_item(ad->data_br_auto->item);
105 if (automatic_val == SETTING_BRIGHTNESS_AUTOMATIC_OFF) // not automatic
107 if (ad->data_br_sli) setting_enable_genlist_item(ad->data_br_sli->item);
114 static void __display_int_vconf_cb(keynode_t *key, void *data)
116 SettingDisplayUG *ad = data;
117 retm_if(!data, "Invalid argument: data is NULL");
119 int status = vconf_keynode_get_int(key);
120 char *vconf_name = vconf_keynode_get_name(key);
121 SETTING_TRACE("Enter %s(%s=%d)", __FUNCTION__, vconf_name, status);
123 if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_LCD_BRIGHTNESS)) {
126 elm_slider_value_set(ad->data_br_sli->eo_check, status);
129 else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT)) {
132 if (ad->data_br_auto)
133 elm_check_state_set(ad->data_br_auto->eo_check, 1);
136 setting_disable_genlist_item(ad->data_br_sli->item);
140 if (ad->data_br_auto)
141 elm_check_state_set(ad->data_br_auto->eo_check, 0);
144 setting_enable_genlist_item(ad->data_br_sli->item);
150 static int setting_display_brightness_create(void *cb)
153 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
155 SettingDisplayUG *ad = (SettingDisplayUG *) cb;
157 Evas_Object *genlist = elm_genlist_add(ad->win_main_layout);
158 elm_object_style_set(genlist, "dialogue");
159 retvm_if(genlist == NULL, SETTING_RETURN_FAIL, "Cannot set scroller object as contento of layout");
160 elm_genlist_clear(genlist); /* first to clear list */
162 /* add basic layout */
163 if (&setting_view_display_brightness == ad->view_to_load) {
165 setting_create_layout_navi_bar(ad->win_main_layout,
167 _(KeyStr_Brightness),
168 _("IDS_COM_BODY_BACK"),
170 setting_display_brightness_click_softkey_cancel_cb,
173 &ad->navi_bar, NULL);
175 setting_push_layout_navi_bar(_(KeyStr_Brightness),
176 _("IDS_COM_BODY_BACK"), NULL, NULL,
177 setting_display_brightness_click_softkey_cancel_cb,
179 NULL, ad, genlist, ad->navi_bar, NULL);;
183 Elm_Object_Item *item = elm_genlist_item_append(genlist, &(ad->itc_seperator), NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
184 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
186 // [control] AUTOMATIC - boolean - vconf
187 int auto_value = SETTING_BRIGHTNESS_AUTOMATIC_ON;
189 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
190 SETTING_TRACE("auto_value:%d", auto_value);
191 if (0 != ret) //add error handle,due to different target env..
192 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT);
194 // [UI] AUTOMATIC - boolean
196 setting_create_Gendial_field_def(genlist, &(ad->itc_1text_1icon),
197 setting_display_brightness_mouse_up_Gendial_list_cb,
198 ad, SWALLOW_Type_1TOGGLE, NULL,
200 "IDS_COM_BODY_AUTOMATIC", NULL,
201 setting_display_brightness_chk_btn_cb);
202 if (ad->data_br_auto) {
203 ad->data_br_auto->userdata = ad;
205 SETTING_TRACE_ERROR("ad->data_br_auto is NULL");
210 int value = SETTING_BRIGHTNESS_LEVEL5;
211 ret = setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &value, &err);
212 SETTING_TRACE("******* value = %d ", value);
213 if (0 != ret) //add error handle,due to different target env..
214 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_LCD_BRIGHTNESS);
216 // [UI] Slider control for Bightness
218 setting_create_Gendial_field_def(genlist, &(itc_1icon), NULL,
219 NULL, SWALLOW_Type_LAYOUT_SLIDER,
221 Right_Bright_Icon, value, NULL,
223 setting_display_birghtness_bright_slider_value_change_cb);
225 if (ad->data_br_sli) {
226 ad->data_br_sli->win_main = ad->win_main_layout;
227 ad->data_br_sli->evas = ad->evas;
228 ad->data_br_sli->isIndicatorVisible = false;
229 ad->data_br_sli->slider_min = 1;
231 ad->data_br_sli->slider_max = 100;
232 ad->data_br_sli->userdata = ad;
235 setting_disable_genlist_item(ad->data_br_sli->item);
239 SETTING_TRACE_ERROR("ad->data_br_sli is NULL");
241 #if DISABLE_LOW_BATERY_CHANGE
242 ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
243 vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &ad->low_bat);
244 if (0 != ret) //add error handle,due to different target env..
245 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SYSMAN_BATTERY_STATUS_LOW);
247 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) {
248 SETTING_TRACE("battery is ctitical low");
249 //have time delay to show all the item out,so user idler to disable
250 //if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
251 //if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
252 ecore_idler_add(__disable_on_idle, ad);
255 // low battery handler - registration
256 vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb, ad);
259 vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __display_int_vconf_cb, ad);
260 vconf_notify_key_changed(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, __display_int_vconf_cb, ad);
261 setting_view_display_brightness.is_create = 1;
262 return SETTING_RETURN_SUCCESS;
265 static int setting_display_brightness_destroy(void *cb)
270 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
271 #if DISABLE_LOW_BATERY_CHANGE
272 /* low battery handler - registration */
273 vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb);
275 vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __display_int_vconf_cb);
276 vconf_ignore_key_changed(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, __display_int_vconf_cb);
278 SettingDisplayUG *ad = (SettingDisplayUG *) cb;
279 elm_naviframe_item_pop(ad->navi_bar);
282 evas_object_del(ad->popup);
286 setting_view_display_brightness.is_create = 0;
287 return SETTING_RETURN_SUCCESS;
290 static int setting_display_brightness_update(void *cb)
293 return SETTING_RETURN_SUCCESS;
297 static int setting_display_brightness_cleanup(void *cb)
301 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
302 setting_display_brightness_destroy(cb);
304 return SETTING_RETURN_SUCCESS;
307 /* ***************************************************
311 ***************************************************/
313 /* ***************************************************
317 ***************************************************/
320 setting_display_brightness_click_softkey_cancel_cb(void *data,
326 retm_if(data == NULL, "Data parameter is NULL");
327 SettingDisplayUG *ad = (SettingDisplayUG *) data;
328 if (&setting_view_display_brightness == ad->view_to_load) {
329 /* Send destroy request */
330 ug_destroy_me(ad->ug);
334 setting_view_change(&setting_view_display_brightness,
335 &setting_view_display_main, ad);
339 * toggle handler for 'Automatic'
341 static void __toggle_automatic_chk(void* data, int chk_status)
344 SettingDisplayUG *ad = (SettingDisplayUG *) data;
345 int ret = setting_set_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, chk_status, &err);
346 if (0 != ret) //add error handle,due to different target env..
348 SETTING_TRACE("Operation failed");
349 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
350 NULL, POPUP_INTERVAL, FALSE, FALSE);
355 setting_disable_genlist_item(ad->data_br_sli->item);
359 #if DISABLE_LOW_BATERY_CHANGE
360 //to get value every time
361 ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
363 // in case of LOW BATTERY
364 ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &ad->low_bat);
365 if (0 != ret) //add error handle,due to different target env..
367 SETTING_TRACE("Operation failed");
368 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
369 NULL, POPUP_INTERVAL, FALSE, FALSE);
373 // in case of CRITICAL LOW BATTERY
374 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW)
376 setting_disable_genlist_item(ad->data_br_sli->item);
377 setting_disable_genlist_item(ad->data_br_auto->item);
380 { // in case of NORMAL OP
382 // 2. call brightness set API
383 int value = SETTING_BRIGHTNESS_LEVEL5;
384 //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
385 if (ad->data_br_sli) {
386 value = elm_slider_value_get(ad->data_br_sli->eo_check);
387 SETTING_TRACE(" value of ad->data_br_sli->eo_check: %d ", value);
388 setting_enable_genlist_item(ad->data_br_sli->item);
391 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
392 if (0 != ret) //add error handle,due to different target env..
394 SETTING_TRACE("Operation failed");
395 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
396 NULL, POPUP_INTERVAL, FALSE, FALSE);
400 /* call brightness API */
401 ret = device_set_brightness(BRIGHTNESS_DISPLAY, value);
402 /* TODO error handling here */
405 int value = SETTING_BRIGHTNESS_LEVEL5;
406 //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
407 if (ad->data_br_sli) {
408 value = elm_slider_value_get(ad->data_br_sli->eo_check);
409 SETTING_TRACE(" value of ad->data_br_sli->eo_check: %d ", value);
410 setting_enable_genlist_item(ad->data_br_sli->item);
412 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
413 if (0 != ret) //add error handle,due to different target env..
415 SETTING_TRACE("Operation failed");
416 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
417 NULL, POPUP_INTERVAL, FALSE, FALSE);
425 setting_display_brightness_chk_btn_cb(void *data, Evas_Object *obj,
430 retm_if(data == NULL, "Data parameter is NULL");
431 Setting_GenGroupItem_Data *list_item =
432 (Setting_GenGroupItem_Data *) data;
433 SettingDisplayUG *ad = list_item->userdata;
434 list_item->chk_status = elm_check_state_get(obj); /* for genlist update status */
436 // enable /disable toggle button
437 __toggle_automatic_chk(ad, list_item->chk_status);
442 * [UI] 'Automatic' toggle
444 static void setting_display_brightness_mouse_up_Gendial_list_cb(void *data,
449 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
450 retm_if(data == NULL, "Invalid argument: data is NULL");
451 SettingDisplayUG *ad = data;
453 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
454 elm_genlist_item_selected_set(item, 0);
455 Setting_GenGroupItem_Data *list_item =
456 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
458 int old_status = elm_check_state_get(list_item->eo_check);
460 list_item->chk_status = !old_status;
461 elm_check_state_set(list_item->eo_check, list_item->chk_status);
463 // enable /disable toggle button
464 __toggle_automatic_chk(ad,list_item->chk_status);
467 static void setting_display_set_slider_value(void* data, Evas_Object *obj, double value)
471 retm_if(data == NULL, "Invalid argument: data is NULL");
473 SettingDisplayUG *ad = data;
475 ret = device_set_brightness(BRIGHTNESS_DISPLAY, value);
476 if (ret == DEVICE_ERROR_NONE) {
477 ad->data_br_sli->chk_status = value;
478 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
480 if (0 != ret) setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
481 NULL, POPUP_INTERVAL, FALSE, FALSE);
483 SETTING_TRACE("device_set_brightness : failed[ret=%d]", ret);
485 int tmp = SETTING_BRIGHTNESS_LEVEL5;
486 setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &tmp, &err);
487 elm_slider_value_set(obj, tmp);
488 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
489 NULL, POPUP_INTERVAL, FALSE, FALSE);
493 static Eina_Bool __set_brightness_on_idle(void *data)
496 SettingDisplayUG *ad = (SettingDisplayUG *) data;
497 if (!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check)
499 SETTING_TRACE_ERROR("!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check");
501 ad->set_idler = NULL;
504 //Get the current real value of slider
505 Evas_Object *obj = ad->data_br_sli->eo_check;
506 double val = elm_slider_value_get(obj);
507 int value = (int)(val + 0.5);
508 SETTING_TRACE("val:%f", val);
509 SETTING_TRACE("value:%d", value);
510 setting_display_set_slider_value(ad, obj, value);
511 //After return False, the idler will be deleted directly,so here set ad->set_idler as NULL directly.
512 ad->set_idler = NULL;
517 setting_display_birghtness_bright_slider_value_change_cb(void *data,
522 retm_if(data == NULL, "Data parameter is NULL");
524 static int old_val = -1;
525 SettingDisplayUG *ad = NULL;
526 Setting_GenGroupItem_Data *list_item =
527 (Setting_GenGroupItem_Data *) data;
528 ad = list_item->userdata;
530 value = elm_check_state_get(ad->data_br_auto->eo_check);
531 if (value == 1) { /* it is automatic setting mode, */
536 double val = elm_slider_value_get(obj);
537 SETTING_TRACE("val:%f", val);
538 value = (int)(val + 0.5);
539 /* SETTING_TRACE("val:%f", val); */
540 SETTING_TRACE("value:%d", value);
541 if (value != old_val)
543 //setting_display_set_slider_value(ad, obj, value);
546 SETTING_TRACE("It is in Emulator, need special process to improve the performence");
548 ecore_idler_del(ad->set_idler);
549 ad->set_idler = NULL;
551 ad->set_idler = ecore_idler_add((Ecore_Task_Cb) __set_brightness_on_idle, ad);
555 SETTING_TRACE("It is in Real Target, Set the brightness directly.");
556 setting_display_set_slider_value(ad, obj, value);