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>
24 #define Left_Bright_Icon IMG_BRIGTHNESS_LEFT
25 #define Right_Bright_Icon IMG_BRIGHTNESS_RIGHT
26 #define SUPPORT_DISPLAY_HOMESCREEN_IMAGE 0
28 static int setting_display_brightness_create(void *cb);
29 static int setting_display_brightness_destroy(void *cb);
30 static int setting_display_brightness_update(void *cb);
31 static int setting_display_brightness_cleanup(void *cb);
33 static void setting_display_set_slider_value(void* data, Evas_Object *obj, double value);
35 setting_view setting_view_display_brightness = {
36 .create = setting_display_brightness_create,
37 .destroy = setting_display_brightness_destroy,
38 .update = setting_display_brightness_update,
39 .cleanup = setting_display_brightness_cleanup,
42 static void __toggle_automatic_chk(void* data, int chk_status);
44 /* ***************************************************
48 ***************************************************/
49 #define LOW_BATTERY_NOTIFY "Battery is too low, you cannot change brightness"
50 #define NORMAL_BATTERY_NOTIFY "Battery becomes normal, now you can change brightness.."
53 __low_battery_on_resp_cb(void *data, Evas_Object *obj, void *event_info)
56 setting_retm_if(NULL == data, "NULL == data");
57 SettingDisplayUG *ad = (SettingDisplayUG *) data;
58 evas_object_del(ad->popup);
62 static Eina_Bool __disable_on_idle(void *data)
65 SettingDisplayUG *ad = (SettingDisplayUG *) data;
69 evas_object_del(ad->popup);
72 ad->popup = setting_create_popup_without_btn(ad, ad->win_get, NULL, _(LOW_BATTERY_NOTIFY),
73 __low_battery_on_resp_cb, POPUP_INTERVAL, FALSE, FALSE);
74 if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
75 if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
80 static void setting_display_brightness_lowbat_cb(keynode_t *key, void* data)
82 // SETTING_TRACE_BEGIN;
84 SettingDisplayUG *ad = (SettingDisplayUG *) data;
87 char* vconf_key = vconf_keynode_get_name(key);
88 SETTING_TRACE("the value of [ %s ] just changed", vconf_key);
89 ad->low_bat = vconf_keynode_get_int(key);
90 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW)
92 SETTING_TRACE("Battery becomes ctitical low !");
93 //popup was showed by system FW
95 if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
96 if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
98 SETTING_TRACE("Battery becomes normal!");
99 if (ad->data_br_sli) {
100 int automatic_val, err;
101 setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &automatic_val, &err);
102 if (ad->data_br_auto) setting_enable_genlist_item(ad->data_br_auto->item);
103 if (automatic_val == SETTING_BRIGHTNESS_AUTOMATIC_OFF) // not automatic
105 if (ad->data_br_sli) setting_enable_genlist_item(ad->data_br_sli->item);
111 static int setting_display_brightness_create(void *cb)
114 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
116 SettingDisplayUG *ad = (SettingDisplayUG *) cb;
118 Evas_Object *sub_layout = elm_layout_add(ad->win_main_layout);
119 elm_layout_file_set(sub_layout, SETTING_THEME_EDJ_NAME, "search_layout");
120 #if SUPPORT_DISPLAY_HOMESCREEN_IMAGE
121 Evas_Object *bg_image =
122 create_bgimage_box_add(NULL, ad->win_main_layout, ad->evas,
124 -1, -1, /* load the image as it's own size */
127 elm_layout_content_set(sub_layout, "bg_swallow", bg_image);
131 Evas_Object *genlist = elm_genlist_add(ad->win_main_layout);
132 elm_object_style_set(genlist, "dialogue");
133 retvm_if(genlist == NULL, SETTING_RETURN_FAIL, "Cannot set scroller object as contento of layout");
134 elm_genlist_clear(genlist); /* first to clear list */
137 /* add basic layout */
138 if (&setting_view_display_brightness == ad->view_to_load) {
140 setting_create_layout_navi_bar(ad->win_main_layout,
142 _(KeyStr_Brightness),
143 _("IDS_COM_BODY_BACK"),
145 setting_display_brightness_click_softkey_cancel_cb,
148 &ad->navi_bar, NULL);
150 setting_push_layout_navi_bar(_(KeyStr_Brightness),
151 _("IDS_COM_BODY_BACK"), NULL, NULL,
152 setting_display_brightness_click_softkey_cancel_cb,
154 NULL, ad, sub_layout, ad->navi_bar, NULL);;
157 elm_object_part_content_set(sub_layout, "search_list2", genlist);
159 Elm_Object_Item *item = elm_genlist_item_append(genlist, &(ad->itc_seperator), NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
160 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
162 // [control] AUTOMATIC - boolean - vconf
163 int auto_value = SETTING_BRIGHTNESS_AUTOMATIC_ON;
165 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
166 SETTING_TRACE("auto_value:%d", auto_value);
167 if (0 != ret) //add error handle,due to different target env..
168 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT);
170 // [UI] AUTOMATIC - boolean
172 setting_create_Gendial_field_def(genlist, &(ad->itc_1text_1icon),
173 setting_display_brightness_mouse_up_Gendial_list_cb,
174 ad, SWALLOW_Type_1TOGGLE, NULL,
176 "IDS_COM_BODY_AUTOMATIC", NULL,
177 setting_display_brightness_chk_btn_cb);
178 if (ad->data_br_auto) {
179 ad->data_br_auto->userdata = ad;
181 SETTING_TRACE_ERROR("ad->data_br_auto is NULL");
186 int value = SETTING_BRIGHTNESS_LEVEL5;
187 ret = setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &value, &err);
188 SETTING_TRACE("******* value = %d ", value);
189 if (0 != ret) //add error handle,due to different target env..
190 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_LCD_BRIGHTNESS);
192 // [UI] Slider control for Bightness
194 setting_create_Gendial_field_def(genlist, &(ad->itc_layout), NULL,
195 NULL, SWALLOW_Type_LAYOUT_SLIDER,
197 Right_Bright_Icon, value, NULL,
199 setting_display_birghtness_bright_slider_value_change_cb);
201 if (ad->data_br_sli) {
202 ad->data_br_sli->win_main = ad->win_main_layout;
203 ad->data_br_sli->evas = ad->evas;
204 ad->data_br_sli->isIndicatorVisible = false;
205 ad->data_br_sli->slider_min = 1;
206 ad->data_br_sli->slider_max = 100;
208 ad->data_br_sli->userdata = ad;
211 setting_disable_genlist_item(ad->data_br_sli->item);
215 SETTING_TRACE_ERROR("ad->data_br_sli is NULL");
218 ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
219 vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &ad->low_bat);
220 if (0 != ret) //add error handle,due to different target env..
221 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SYSMAN_BATTERY_STATUS_LOW);
223 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) {
224 SETTING_TRACE("battery is ctitical low");
225 //have time delay to show all the item out,so user idler to disable
226 //if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
227 //if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
228 ecore_idler_add(__disable_on_idle, ad);
231 // low battery handler - registration
232 vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb, ad);
233 setting_view_display_brightness.is_create = 1;
234 return SETTING_RETURN_SUCCESS;
237 static int setting_display_brightness_destroy(void *cb)
242 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
244 /* low battery handler - registration */
245 vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb);
247 SettingDisplayUG *ad = (SettingDisplayUG *) cb;
249 ecore_idler_del(ad->set_idler);
250 ad->set_idler = NULL;
252 elm_naviframe_item_pop(ad->navi_bar);
255 evas_object_del(ad->popup);
259 setting_view_display_brightness.is_create = 0;
260 return SETTING_RETURN_SUCCESS;
263 static int setting_display_brightness_update(void *cb)
266 return SETTING_RETURN_SUCCESS;
270 static int setting_display_brightness_cleanup(void *cb)
274 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
275 setting_display_brightness_destroy(cb);
277 return SETTING_RETURN_SUCCESS;
280 /* ***************************************************
284 ***************************************************/
286 /* ***************************************************
290 ***************************************************/
293 setting_display_brightness_click_softkey_cancel_cb(void *data,
299 retm_if(data == NULL, "Data parameter is NULL");
300 SettingDisplayUG *ad = (SettingDisplayUG *) data;
301 if (&setting_view_display_brightness == ad->view_to_load) {
302 /* Send destroy request */
303 ug_destroy_me(ad->ug);
307 setting_view_change(&setting_view_display_brightness,
308 &setting_view_display_main, ad);
311 static void __toggle_automatic_chk(void* data, int chk_status)
314 SettingDisplayUG *ad = (SettingDisplayUG *) data;
315 int ret = setting_set_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, chk_status, &err);
316 if (0 != ret) //add error handle,due to different target env..
318 SETTING_TRACE("Operation failed");
319 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
320 NULL, POPUP_INTERVAL, FALSE, FALSE);
325 setting_disable_genlist_item(ad->data_br_sli->item);
329 //to get value every time
330 ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
332 // in case of LOW BATTERY
333 ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &ad->low_bat);
334 if (0 != ret) //add error handle,due to different target env..
336 SETTING_TRACE("Operation failed");
337 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
338 NULL, POPUP_INTERVAL, FALSE, FALSE);
342 // in case of CIRITICAL LOW BATTERY
343 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW)
345 setting_disable_genlist_item(ad->data_br_sli->item);
346 setting_disable_genlist_item(ad->data_br_auto->item);
350 // in case of NORMAL OP
352 // 2. call brightness set API
353 int value = SETTING_BRIGHTNESS_LEVEL5;
354 //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
356 value = elm_slider_value_get(ad->data_br_sli->eo_check);
357 SETTING_TRACE(" value of ad->data_br_sli->eo_check: %d ", value);
358 setting_enable_genlist_item(ad->data_br_sli->item);
359 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
360 if (0 != ret) //add error handle,due to different target env..
362 SETTING_TRACE("Operation failed");
363 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
364 NULL, POPUP_INTERVAL, FALSE, FALSE);
368 /* call brightness API */
369 ret = device_set_brightness(BRIGHTNESS_DISPLAY, value);
370 /* TODO error handling here */
376 setting_display_brightness_chk_btn_cb(void *data, Evas_Object *obj,
381 retm_if(data == NULL, "Data parameter is NULL");
382 Setting_GenGroupItem_Data *list_item =
383 (Setting_GenGroupItem_Data *) data;
384 SettingDisplayUG *ad = list_item->userdata;
385 list_item->chk_status = elm_check_state_get(obj); /* for genlist update status */
387 // enable /disable toggle button
388 __toggle_automatic_chk(ad, list_item->chk_status);
393 * [UI] 'Automatic' toggle
395 static void setting_display_brightness_mouse_up_Gendial_list_cb(void *data,
400 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
401 retm_if(data == NULL, "Invalid argument: data is NULL");
402 SettingDisplayUG *ad = data;
404 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
405 elm_genlist_item_selected_set(item, 0);
406 Setting_GenGroupItem_Data *list_item =
407 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
409 int old_status = elm_check_state_get(list_item->eo_check);
411 list_item->chk_status = !old_status;
412 elm_check_state_set(list_item->eo_check, list_item->chk_status);
414 // enable /disable toggle button
415 __toggle_automatic_chk(ad,list_item->chk_status);
418 static void setting_display_set_slider_value(void* data, Evas_Object *obj, double value)
422 retm_if(data == NULL, "Invalid argument: data is NULL");
424 SettingDisplayUG *ad = data;
426 ret = device_set_brightness(BRIGHTNESS_DISPLAY, value);
427 if (ret == DEVICE_ERROR_NONE) {
428 ad->data_br_sli->chk_status = value;
429 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
431 if (0 != ret) setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
432 NULL, POPUP_INTERVAL, FALSE, FALSE);
434 /* SETTING_TRACE("device_set_brightness : failed"); */
436 int tmp = SETTING_BRIGHTNESS_LEVEL5;
437 setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &tmp, &err);
438 elm_slider_value_set(obj, tmp);
439 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
440 NULL, POPUP_INTERVAL, FALSE, FALSE);
444 static Eina_Bool __set_brightness_on_idle(void *data)
447 SettingDisplayUG *ad = (SettingDisplayUG *) data;
448 if (!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check)
450 SETTING_TRACE_ERROR("!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check");
451 ad->set_idler = NULL;
454 //Get the current real value of slider
455 Evas_Object *obj = ad->data_br_sli->eo_check;
456 double val = elm_slider_value_get(obj);
457 int value = (int)(val + 0.5);
458 SETTING_TRACE("val:%f", val);
459 SETTING_TRACE("value:%d", value);
460 setting_display_set_slider_value(ad, obj, value);
461 //After return False, the idler will be deleted directly,so here set ad->set_idler as NULL directly.
462 ad->set_idler = NULL;
467 setting_display_birghtness_bright_slider_value_change_cb(void *data,
472 retm_if(data == NULL, "Data parameter is NULL");
474 static int old_val = -1;
475 SettingDisplayUG *ad = NULL;
476 Setting_GenGroupItem_Data *list_item =
477 (Setting_GenGroupItem_Data *) data;
478 ad = list_item->userdata;
480 value = elm_check_state_get(ad->data_br_auto->eo_check);
481 if (value == 1) { /* it is automatic setting mode, */
486 double val = elm_slider_value_get(obj);
487 SETTING_TRACE("val:%f", val);
488 value = (int)(val + 0.5);
489 /* SETTING_TRACE("val:%f", val); */
490 SETTING_TRACE("value:%d", value);
491 if (value != old_val)
493 //setting_display_set_slider_value(ad, obj, value);
496 SETTING_TRACE("It is in Emulator, need special process to improve the performence");
498 ecore_idler_del(ad->set_idler);
499 ad->set_idler = NULL;
501 ad->set_idler = ecore_idler_add((Ecore_Task_Cb) __set_brightness_on_idle, ad);
505 SETTING_TRACE("It is in Real Target, Set the brightness directly.");
506 setting_display_set_slider_value(ad, obj, value);