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 #include <dbus/dbus.h>
24 #include <dbus/dbus-glib-lowlevel.h>
26 #define SUPPORT_DISABLE_IN_AUTO_MODE 0
27 #define DISABLE_LOW_BATERY_CHANGE 0 /*disable user to set the brightness when the Mobile is low battery. */
29 #define Left_Bright_Icon IMG_BRIGTHNESS_LEFT
30 #define Right_Bright_Icon IMG_BRIGHTNESS_RIGHT
31 #define SUPPORT_DISPLAY_HOMESCREEN_IMAGE 0
33 #define AUTO_DISPLAY_ADJUSTMENT_STR _("Auto Display Adjustment")
34 #define BRIGHTNESS_MAX 100
35 #define BRIGHTNESS_MIN 1
36 #define BRIGHTNESS_AUTO_MAX_LEVEL 5
37 #define BRIGHTNESS_AUTO_MIN_LEVEL -5
41 static int setting_display_brightness_create(void *cb);
42 static int setting_display_brightness_destroy(void *cb);
43 static int setting_display_brightness_update(void *cb);
44 static int setting_display_brightness_cleanup(void *cb);
46 static void setting_display_brightness_click_softkey_cancel_cb(void *data, Evas_Object *obj, void *event_info);
47 static void setting_display_brightness_mouse_up_Gendial_list_cb(void *data, Evas_Object *obj, void *event_info);
48 static void setting_display_birghtness_bright_slider_value_change_cb(void *data, Evas_Object *obj, void *event_info);
51 static void setting_display_set_slider_value(void *data, Evas_Object *obj, double value);
53 setting_view setting_view_display_brightness = {
54 .create = setting_display_brightness_create,
55 .destroy = setting_display_brightness_destroy,
56 .update = setting_display_brightness_update,
57 .cleanup = setting_display_brightness_cleanup,
60 static void __toggle_automatic_chk(void *data, int chk_status);
62 /* ***************************************************
66 ***************************************************/
67 #define LOW_BATTERY_NOTIFY "Battery is too low, you cannot change brightness"
68 #define NORMAL_BATTERY_NOTIFY "Battery becomes normal, now you can change brightness.."
70 #define MAX_CONTENT_LEN 512
71 #define MAX_LOCAL_BUFSIZE 128
72 #define DBUS_PATH "/Org/Tizen/System/DeviceD/Process"
73 #define DBUS_SIGNAL_INTERFACE "org.tizen.system.deviced.Process"
74 #define DBUS_SIGNAL_NAME "ChangedSiop"
76 static void update_overheating_text(void *data)
78 SettingDisplayUG *ad = (SettingDisplayUG *)data;
79 int auto_brightnes = 0;
80 vconf_get_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, &auto_brightnes);
81 if (ad->data_overheating && ad->data_br_sli) {
82 if (ad->data_br_sli->slider_max < 100 && !auto_brightnes) {
83 G_FREE(ad->data_overheating->keyStr);
84 ad->data_overheating->keyStr = (char *)g_strdup(KeyStr_Brightness_Overheating);
86 G_FREE(ad->data_overheating->keyStr);
87 ad->data_overheating->keyStr = NULL;
89 elm_object_item_data_set(ad->data_overheating->item, ad->data_overheating);
90 elm_genlist_item_update(ad->data_overheating->item);
93 /*------------------------------------------------------ */
94 /* for client - bus */
95 /*------------------------------------------------------ */
96 static DBusHandlerResult setting_brightness_dbus_signal_filter(DBusConnection *conn, DBusMessage *message, void *user_data)
100 dbus_error_init(&error);
102 /*setting_main_appdata *ad = user_data; */
103 setting_retvm_if(!user_data , 0, "!user_data ");
104 SettingDisplayUG *ad = (SettingDisplayUG *)user_data;
106 int brightness_level;
108 if (dbus_message_is_signal(message, DBUS_SIGNAL_INTERFACE, DBUS_SIGNAL_NAME)) {
109 if (dbus_message_get_args(message, &error,
110 DBUS_TYPE_INT32, &brightness_level,
111 DBUS_TYPE_INVALID) == FALSE) {
112 SETTING_TRACE_ERROR("Fail to get data : %s", error.message);
113 dbus_error_free(&error);
114 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
116 /* update max brightness level*/
118 vconf_get_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, &value);
119 if (!value && ad->data_br_sli) {
120 /*ad->data_br_sli->slider_max = display_get_max_brightness(); */
121 device_display_get_max_brightness(0, (int *)&ad->data_br_sli->slider_max);
122 SETTING_TRACE("brightness_level:%d", brightness_level);
123 SETTING_TRACE("Brightness max value:%lf", ad->data_br_sli->slider_max);
124 vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &value);
125 if (value > ad->data_br_sli->slider_max) {
126 vconf_set_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, ad->data_br_sli->slider_max);
128 update_overheating_text(ad);
132 return DBUS_HANDLER_RESULT_HANDLED;
134 static int setting_brightness_dbus_handler_fini(void *user_data)
137 /*do safty checking first. */
138 setting_retvm_if(!user_data , 0, "!user_data ");
139 SettingDisplayUG *ad = (SettingDisplayUG *)user_data;
140 setting_retvm_if(!ad->bus, 0, "!ad->bus");
143 memset(&error, 0, sizeof(DBusError));
144 char rule[MAX_LOCAL_BUFSIZE + 1] = {0, };
146 dbus_error_init(&error);
149 /*ad->bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error); */
151 dbus_connection_remove_filter(ad->bus, setting_brightness_dbus_signal_filter, ad);
154 snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
155 dbus_bus_remove_match(ad->bus, rule, &error);
157 if (dbus_error_is_set(&error)) {
158 SETTING_TRACE("Fail to rule unset: %s", error.message);
159 dbus_error_free(&error);
163 dbus_connection_close(ad->bus);
164 dbus_connection_unref(ad->bus);
166 SETTING_TRACE("app signal finalized");
170 static int setting_brightness_dbus_handler_init(void *user_data)
173 setting_retvm_if(!user_data , 0, "!user_data ");
174 SettingDisplayUG *ad = (SettingDisplayUG *)user_data;
176 SETTING_TRACE("[TEST]slider_max: %lf", ad->data_br_sli->slider_max);
179 SETTING_TRACE("already get a bus, need release first.");
180 setting_brightness_dbus_handler_fini(ad);
183 dbus_threads_init_default();
185 memset(&error, 0, sizeof(DBusError));
186 char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
187 dbus_error_init(&error);
188 ad->bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
190 SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
191 dbus_error_free(&error);
194 dbus_connection_set_exit_on_disconnect(ad->bus, FALSE);
195 dbus_connection_setup_with_g_main(ad->bus, NULL);
196 snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
198 dbus_bus_add_match(ad->bus, rule, &error);
199 if (dbus_error_is_set(&error)) {
200 SETTING_TRACE("Fail to rule set; %s", error.message);
201 dbus_bus_remove_match(ad->bus, rule, &error);
202 dbus_error_free(&error);
203 dbus_connection_close(ad->bus);
208 if (dbus_connection_add_filter(ad->bus, setting_brightness_dbus_signal_filter, user_data, NULL) == FALSE) {
209 dbus_bus_remove_match(ad->bus, rule, &error);
210 dbus_error_free(&error);
211 dbus_connection_close(ad->bus);
216 SETTING_TRACE("app signal initialized");
220 static void _brightness_register_event_cb(void *data)
224 setting_retm_if(data == NULL, , "Data parameter is NULL");
225 SettingDisplayUG *ad = (SettingDisplayUG *) data;
227 SETTING_TRACE("[TEST]slider_max: %lf", ad->data_br_sli->slider_max);
229 if (ad->is_event_registered == 0) {
230 ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS,
231 __display_int_vconf_cb, ad);
233 SETTING_TRACE_ERROR("failed to register a cb key:%s err:%d",
234 "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret);
236 ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_AUTOMATIC_BRIGHTNESS,
237 __display_int_vconf_cb, ad);
239 SETTING_TRACE_ERROR("failed to register a cb key:%s err:%d",
240 "VCONFKEY_SETAPPL_LCD_AUTOMATIC_BRIGHTNESS", ret);
242 ad->is_event_registered = 1;
247 static void _brightness_deregister_event_cb(void *data)
251 setting_retm_if(data == NULL, , "Data parameter is NULL");
252 SettingDisplayUG *ad = (SettingDisplayUG *) data;
253 if (ad->is_event_registered == 1) {
254 ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __display_int_vconf_cb);
256 SETTING_TRACE_ERROR("failed to register a cb key:%s err:%d", "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret);
258 ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_AUTOMATIC_BRIGHTNESS, __display_int_vconf_cb);
260 SETTING_TRACE_ERROR("failed to register a cb key:%s err:%d", "VCONFKEY_SETAPPL_LCD_AUTOMATIC_BRIGHTNESS", ret);
262 ad->is_event_registered = 0;
267 _brightness_slider_delayed_changed_cb(void *data,
273 setting_retm_if(data == NULL, , "Data parameter is NULL");
274 SettingDisplayUG *ad = NULL;
275 Setting_GenGroupItem_Data *list_item =
276 (Setting_GenGroupItem_Data *) data;
277 ad = list_item->userdata;
278 setting_retm_if(ad == NULL, , "ad parameter is NULL");
280 value = ad->last_requested_level;
282 if (value >= list_item->slider_min && value <= list_item->slider_max) {
283 SETTING_TRACE("brightness is changed to %d", value);
284 setting_display_set_slider_value(ad, obj, value);
287 _brightness_register_event_cb(ad);
289 static void _brightness_overheat_check(void *data)
293 int max_brightness = BRIGHTNESS_MAX;
294 setting_retm_if(data == NULL, , "Data parameter is NULL");
295 SettingDisplayUG *ad = data;
297 value = ad->last_requested_level;
298 int automatic_on = 0;
299 vconf_get_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, &automatic_on);
300 if (automatic_on == 0) {
301 /*max_brightness = display_get_max_brightness(); */
302 device_display_get_max_brightness(0, (int *)&max_brightness);
303 SETTING_TRACE("[TEST]slider_max: %lf", ad->data_br_sli->slider_max);
304 if (value > max_brightness && max_brightness != BRIGHTNESS_MAX) {
305 SETTING_TRACE("max brightness is limited");
307 elm_slider_value_set(ad->data_br_sli->eo_check, (double)max_brightness);
308 ad->last_requested_level = max_brightness;
309 ad->data_br_sli->slider_max = max_brightness;
310 SETTING_TRACE("[TEST]slider_max: %lf", ad->data_br_sli->slider_max);
311 setting_display_set_slider_value(ad, ad->data_br_sli->eo_check, (double)max_brightness);
312 update_overheating_text(ad);
317 void static _brightness_slider_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
320 setting_retm_if(data == NULL, , "Data parameter is NULL");
321 SettingDisplayUG *ad = NULL;
322 Setting_GenGroupItem_Data *list_item =
323 (Setting_GenGroupItem_Data *) data;
324 ad = list_item->userdata;
325 setting_retm_if(ad == NULL, , "ad parameter is NULL");
327 _brightness_deregister_event_cb(ad);
331 static void _brightness_slider_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
334 setting_retm_if(data == NULL, , "Data parameter is NULL");
335 SettingDisplayUG *ad = NULL;
336 Setting_GenGroupItem_Data *list_item =
337 (Setting_GenGroupItem_Data *) data;
338 ad = list_item->userdata;
339 setting_retm_if(ad == NULL, , "ad parameter is NULL");
341 _brightness_overheat_check(ad);
346 #if DISABLE_LOW_BATERY_CHANGE
348 __low_battery_on_resp_cb(void *data, Evas_Object *obj, void *event_info)
351 setting_retm_if(NULL == data, "NULL == data");
352 SettingDisplayUG *ad = (SettingDisplayUG *) data;
353 evas_object_del(ad->popup);
357 static Eina_Bool __disable_on_idle(void *data)
360 SettingDisplayUG *ad = (SettingDisplayUG *) data;
363 evas_object_del(ad->popup);
366 ad->popup = setting_create_popup_without_btn(ad, ad->win_get, NULL, _(LOW_BATTERY_NOTIFY),
367 __low_battery_on_resp_cb, POPUP_INTERVAL, FALSE, FALSE);
368 if (ad->data_br_sli && ad->data_br_sli->item)
369 setting_disable_genlist_item(ad->data_br_sli->item);
370 if (ad->data_br_auto && ad->data_br_auto->item)
371 setting_disable_genlist_item(ad->data_br_auto->item);
376 static void setting_display_brightness_lowbat_cb(keynode_t *key, void *data)
378 /* SETTING_TRACE_BEGIN; */
379 ret_if(data == NULL);
380 SettingDisplayUG *ad = (SettingDisplayUG *) data;
383 char *vconf_key = vconf_keynode_get_name(key);
384 SETTING_TRACE("the value of [ %s ] just changed", vconf_key);
385 ad->low_bat = vconf_keynode_get_int(key);
386 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) {
387 SETTING_TRACE("Battery becomes ctitical low !");
388 /*popup was showed by system FW */
390 if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
391 if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
393 SETTING_TRACE("Battery becomes normal!");
394 if (ad->data_br_sli) {
395 int automatic_val, err;
396 setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &automatic_val, &err);
397 if (ad->data_br_auto) setting_enable_genlist_item(ad->data_br_auto->item);
398 if (automatic_val == SETTING_BRIGHTNESS_AUTOMATIC_OFF) { /* not automatic */
399 if (ad->data_br_sli) setting_enable_genlist_item(ad->data_br_sli->item);
407 auto brightness level:-5 ~ 5
408 convet this auto level to auto brightness value 1~ 100
409 and then store it into vconf for kernel usage
411 static int __display_auto_brightness_convert_level_to_value(int level)
416 } else if (level >= -5 && level < 0) {
417 value = (int)(10 * (5 + level) + 0.5);
418 } else if (level > 0 && level <= 5) {
419 value = (int)(50 + 10 * level + 0.5);
421 if (value > BRIGHTNESS_MAX) {
422 value = BRIGHTNESS_MAX;
424 if (value < BRIGHTNESS_MIN) {
425 value = BRIGHTNESS_MIN;
431 auto brightness value:1~ 100
432 convet this value to auto brightness level -5 ~ 5
433 and then show it to user
435 static int __display_auto_brightness_convert_value_to_level(int value)
440 } else if (value >= 1 && value < 50) {
441 level = -(int)((50 - value) * 0.1 + 0.5);
442 } else if (value > 50 && value <= 100) {
443 level = (int)((value - 50) * 0.1 + 0.5);
445 if (level > BRIGHTNESS_AUTO_MAX_LEVEL) {
446 level = BRIGHTNESS_AUTO_MAX_LEVEL;
448 if (level < BRIGHTNESS_AUTO_MIN_LEVEL) {
449 level = BRIGHTNESS_AUTO_MIN_LEVEL;
455 void __display_int_vconf_cb(keynode_t *key, void *data)
458 SettingDisplayUG *ad = data;
459 retm_if(!data, "Invalid argument: data is NULL");
461 int status = vconf_keynode_get_int(key);
462 char *vconf_name = vconf_keynode_get_name(key);
463 SETTING_TRACE("Enter %s(%s=%d)", __FUNCTION__, vconf_name, status);
465 if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_LCD_BRIGHTNESS)) {
466 if (ad->data_br_sli) {
467 elm_slider_value_set(ad->data_br_sli->eo_check, status);
469 } else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT)) {
470 setting_update_gl_item_chk_status(ad->data_br_auto, status);
472 ad->data_br->sub_desc = (char *)g_strdup(get_brightness_mode_str());
473 elm_object_item_data_set(ad->data_br->item, ad->data_br);
474 elm_genlist_item_update(ad->data_br->item);
476 if (status) { /*off->on */
477 SETTING_TRACE("off->on");
479 /*need to update adjust text*/
480 if (ad->data_adjust) {
481 G_FREE(ad->data_adjust->keyStr);
482 ad->data_adjust->keyStr = (char *)g_strdup(KeyStr_Brightness_Auto_Adjust);
483 elm_object_item_data_set(ad->data_adjust->item, ad->data_adjust);
484 elm_genlist_item_update(ad->data_adjust->item);
488 #if SUPPORT_CENTER_POINT
489 /*need to show central line when automatic is on.*/
490 if (ad->data_br_sli && ad->data_br_sli->eo_check) {
491 /*elm_object_signal_emit(ad->data_br_sli->eo_check,"elm,state,rect,visible","elm"); */
492 elm_layout_signal_emit(ad->data_br_sli->eo_check, "slider,center,point,show", "");
494 SETTING_TRACE_ERROR("ad->data_br_sli->eo_check is NULL, failed to send visible signal")
498 #if SUPPORT_DISABLE_IN_AUTO_MODE
500 setting_disable_genlist_item(ad->data_br_sli->item);
502 /*save current slider value at VCONFKEY_SETAPPL_LCD_BRIGHTNESS */
503 /* And, slider value should be changed to VCONFKEY_SETAPPL_LCD_AUTOMATIC_BRIGHTNESS,to use */
505 vconf_get_int(VCONFKEY_SETAPPL_LCD_AUTOMATIC_BRIGHTNESS, &val);
506 if (ad->data_br_sli) {
507 ad->data_br_sli->slider_min = BRIGHTNESS_MIN;
508 ad->data_br_sli->slider_max = BRIGHTNESS_MAX;
509 ad->data_br_sli->chk_status = val;
510 elm_object_item_data_set(ad->data_br_sli->item, ad->data_br_sli);
511 elm_genlist_item_update(ad->data_br_sli->item);
515 } else { /*on->off */
516 SETTING_TRACE("on->off");
518 /*need to update adjust text*/
519 if (ad->data_adjust) {
520 G_FREE(ad->data_adjust->keyStr);
521 ad->data_adjust->keyStr = (char *)g_strdup(KeyStr_Brightness_Adjust);
522 elm_object_item_data_set(ad->data_adjust->item, ad->data_adjust);
523 elm_genlist_item_update(ad->data_adjust->item);
526 #if SUPPORT_CENTER_POINT
527 /*need to hide central line when automatic is off*/
528 if (ad->data_br_sli && ad->data_br_sli->eo_check) {
529 /*elm_object_signal_emit(ad->data_br_sli->eo_check,"elm,state,rect,hidden","elm"); */
530 elm_layout_signal_emit(ad->data_br_sli->eo_check, "slider,center,point,hide", "");
532 SETTING_TRACE_ERROR("ad->data_br_sli->eo_check is NULL, failed to send hidden signal")
536 #if SUPPORT_DISABLE_IN_AUTO_MODE
538 setting_enable_genlist_item(ad->data_br_sli->item);
540 /*save current slider value at VCONFKEY_SETAPPL_LCD_AUTOMATIC_BRIGHTNESS,to backup */
541 /*And, slider value should be changed to VCONFKEY_SETAPPL_LCD_BRIGHTNESS,to use */
544 setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &val, &err);
545 if (ad->data_br_sli) {
546 ad->data_br_sli->slider_min = BRIGHTNESS_MIN;
547 /*ad->data_br_sli->slider_max = display_get_max_brightness(); */
548 device_display_get_max_brightness(0, (int *)&ad->data_br_sli->slider_max);
549 ad->data_br_sli->chk_status = val;
550 elm_object_item_data_set(ad->data_br_sli->item, ad->data_br_sli);
551 elm_genlist_item_update(ad->data_br_sli->item);
554 /*set the device side value */
555 err = device_display_set_brightness(0, val);
556 if (err != DEVICE_ERROR_NONE) {
557 SETTING_TRACE(" device_display_set_brightness : failed[ret=%d]", err);
558 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
559 NULL, POPUP_INTERVAL, FALSE, FALSE);
564 update_overheating_text(ad);
565 } else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_LCD_AUTOMATIC_BRIGHTNESS)) {
566 int auto_matic_status = 0;
567 vconf_get_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, &auto_matic_status);
568 if (auto_matic_status && ad->data_br_sli) {
569 elm_slider_value_set(ad->data_br_sli->eo_check, status);
575 const char *__display_brightness_get_vconf_need_save()
578 vconf_get_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, &state);
580 return VCONFKEY_SETAPPL_LCD_AUTOMATIC_BRIGHTNESS;
582 return VCONFKEY_SETAPPL_LCD_BRIGHTNESS;
585 static double _step_size_calculate(Evas_Object *obj, double min, double max)
591 if (steps) step = (1.0 / steps);
595 static char *_setting_display_brightness_indicator_format(double val)
598 int value = (int)(val + 0.5);
602 snprintf(buf, 15, "%d", value);
607 static void _indicator_free(char *str)
612 static Evas_Object *__setting_brightness_add_slider(void *data, Evas_Object *obj, const char *part)
615 setting_retvm_if(!data || !obj, NULL, "!data || !obj");
616 Setting_GenGroupItem_Data *item_data = (Setting_GenGroupItem_Data *) data;
617 retv_if(!data, NULL);
618 Eina_List *items = NULL;
619 if (!safeStrCmp(part, "elm.icon")) {
620 Evas_Object *slider = elm_slider_add(obj); /* "elm/slider/horizontal/default" */
621 retv_if(slider == NULL, NULL);
623 int auto_value = SETTING_BRIGHTNESS_AUTOMATIC_ON;
625 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 */
626 elm_layout_signal_emit(item_data->eo_check, "elm,state,val,hide", "");
627 SETTING_TRACE("auto_value:%d", auto_value);
629 /*add error handle,due to different target env.. */
630 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT);
634 elm_slider_indicator_show_set(slider, EINA_TRUE);
635 elm_slider_indicator_format_function_set(slider, _setting_display_brightness_indicator_format, _indicator_free);
636 elm_object_style_set(slider, "center_point");
637 elm_slider_indicator_format_set(slider, "%1.0f");
638 step = _step_size_calculate(slider, BRIGHTNESS_AUTO_MIN_LEVEL, BRIGHTNESS_AUTO_MAX_LEVEL);
639 elm_slider_step_set(slider, step);
641 elm_slider_min_max_set(slider, BRIGHTNESS_MIN, BRIGHTNESS_MAX);
642 /*elm_object_style_set(slider,"tap_to_drag"); */
643 evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, 0.0);
644 evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5);
647 if (item_data->chk_change_cb) {
648 evas_object_smart_callback_add(slider, "changed", item_data->chk_change_cb, item_data);
650 /*if (item_data->stop_change_cb) { */
651 /* evas_object_smart_callback_add(slider, "slider,drag,stop", item_data->stop_change_cb, item_data); */
653 /*if(item_data->start_change_cb) { */
654 /* evas_object_smart_callback_add(slider, "slider,drag,start", item_data->start_change_cb, item_data); */
656 /*evas_object_event_callback_add(slider, EVAS_CALLBACK_MOUSE_DOWN, _brightness_slider_mouse_down_cb, item_data); */
657 /*evas_object_event_callback_add(slider, EVAS_CALLBACK_MOUSE_UP, _brightness_slider_mouse_up_cb, item_data); */
658 /*evas_object_smart_callback_add(slider, "delay,changed", */
659 /* _brightness_slider_delayed_changed_cb, item_data); */
661 Evas_Object *icon1 = elm_icon_add(slider);
662 elm_image_file_set(icon1, item_data->l_swallow_path, NULL);
663 evas_object_size_hint_aspect_set(icon1, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
665 Evas_Object *icon2 = elm_icon_add(slider);
666 elm_image_file_set(icon2, item_data->r_swallow_path, NULL);
667 evas_object_size_hint_aspect_set(icon2, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
669 elm_object_content_set(slider, icon1);
670 elm_object_part_content_set(slider, "end", icon2);
672 elm_slider_value_set(slider, item_data->chk_status);
673 evas_object_pass_events_set(slider, 1);
674 evas_object_propagate_events_set(slider, 0);
675 item_data->eo_check = slider;
678 #if SUPPORT_CENTER_POINT
680 /*elm_object_signal_emit(item_data->eo_check,"elm,state,rect,visible","elm"); */
681 elm_layout_signal_emit(item_data->eo_check, "slider,center,point,show", "");
683 /*elm_object_signal_emit(item_data->eo_check,"elm,state,rect,hidden","elm"); */
684 elm_layout_signal_emit(item_data->eo_check, "slider,center,point,hide", "");
687 if (item_data->item) {
688 /* convey highlight to its content */
689 items = eina_list_append(items, slider);
690 elm_object_item_access_order_set(item_data->item, items);
696 char *__item_multiline_overheating_text_get(void *data, Evas_Object *obj, const char *part)
698 /*SETTING_TRACE_BEGIN; */
699 setting_retvm_if(data == NULL, NULL, "Data parameter is NULL");
700 Setting_GenGroupItem_Data *item_data = (Setting_GenGroupItem_Data *) data;
701 char *ret_str = NULL;
702 if (!safeStrCmp(part, "elm.text") || !safeStrCmp(part, "elm.text.1")) {
703 if (item_data->keyStr && item_data->sub_desc) {
704 if (!safeStrCmp(item_data->sub_desc, "overheating")) {
705 ret_str = setting_customize_text(_(item_data->keyStr), -1, "#FF0000", "middle");
712 static void _realized(void *data, Evas_Object *obj, void *event_info)
715 setting_retm_if(event_info == NULL, "invalid parameter: event_info is NULL");
716 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
718 Eina_List *items = NULL;
720 const Elm_Genlist_Item_Class *itc = elm_genlist_item_item_class_get(item);
721 if (!safeStrCmp(itc->item_style, "1icon")) {
722 SETTING_TRACE("re-register");
723 /* unregister item itself */
724 elm_object_item_access_unregister(item);
726 /* convey highlight to its content */
727 Evas_Object *content;
728 content = elm_object_item_part_content_get(item, "elm.icon");
729 items = eina_list_append(items, content);
730 elm_object_item_access_order_set(item, items);
734 static int setting_display_brightness_create(void *cb)
737 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
739 SettingDisplayUG *ad = (SettingDisplayUG *) cb;
740 setting_create_Gendial_itc("1icon", &(ad->itc_1icon));
741 ad->itc_1icon.func.content_get = __setting_brightness_add_slider;
742 Evas_Object *genlist = elm_genlist_add(ad->win_main_layout);
743 retvm_if(genlist == NULL, SETTING_RETURN_FAIL, "Cannot set scroller object as contento of layout");
744 /*elm_object_style_set(genlist, "dialogue"); */
745 elm_genlist_realization_mode_set(genlist, EINA_TRUE);
746 elm_genlist_clear(genlist); /* first to clear list */
747 ad->last_requested_level = -1;
748 /* add basic layout */
749 if (&setting_view_display_brightness == ad->view_to_load) {
751 setting_create_layout_navi_bar(ad->win_main_layout,
753 "IDS_COM_OPT_BRIGHTNESS",
754 _("IDS_COM_BODY_BACK"),
756 setting_display_brightness_click_softkey_cancel_cb,
759 &ad->navi_bar, NULL);
761 setting_push_layout_navi_bar("IDS_COM_OPT_BRIGHTNESS",
762 _("IDS_COM_BODY_BACK"), NULL, NULL,
763 setting_display_brightness_click_softkey_cancel_cb,
765 NULL, ad, genlist, ad->navi_bar, NULL);;
767 ad->genlist = genlist;
768 evas_object_smart_callback_add(ad->genlist, "realized", __gl_realized_cb, ad);
769 /*evas_object_smart_callback_add(ad->genlist, "realized", _realized, ad); */
771 Elm_Object_Item *item = elm_genlist_item_append(genlist, &itc_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
772 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
774 /*setting_create_Gendial_itc("1text", &(ad->itc_multiline_overheating)); */
775 setting_create_Gendial_itc("groupindex", &(ad->itc_multiline_overheating));
776 ad->itc_multiline_overheating.func.text_get = __item_multiline_overheating_text_get;
777 /* [control] AUTOMATIC - boolean - vconf */
778 int auto_value = SETTING_BRIGHTNESS_AUTOMATIC_ON;
780 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 */
781 SETTING_TRACE("auto_value:%d", auto_value);
783 /*add error handle,due to different target env.. */
784 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT);
787 int value = SETTING_BRIGHTNESS_LEVEL5;
788 /*ret = setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &value, &err); */
789 ret = vconf_get_int(__display_brightness_get_vconf_need_save(), &value);
790 SETTING_TRACE("******* value = %d ", value);
792 /*add error handle,due to different target env.. */
793 SETTING_TRACE_ERROR("Failed to get value of [%s]", __display_brightness_get_vconf_need_save());
796 /* [UI] Slider control for Bightness */
798 setting_create_Gendial_field_def(genlist, &(ad->itc_1icon), NULL,
799 NULL, SWALLOW_Type_LAYOUT_SLIDER,
801 Right_Bright_Icon, value, "brightness slider",
803 setting_display_birghtness_bright_slider_value_change_cb);
805 if (ad->data_br_sli) {
806 ad->data_br_sli->win_main = ad->win_main_layout;
807 ad->data_br_sli->evas = ad->evas;
809 ad->data_br_sli->isIndicatorVisible = 1;
810 ad->data_br_sli->slider_min = BRIGHTNESS_MIN;
811 ad->data_br_sli->slider_max = BRIGHTNESS_MAX;
813 ad->data_br_sli->slider_min = BRIGHTNESS_MIN;
814 /*ad->data_br_sli->slider_max = display_get_max_brightness(); */
816 /*int ret = device_display_get_max_brightness(0, &max); */
817 /*ad->data_br_sli->slider_max = max; */
819 /* Block to call device_display_get_max_brightness(), has DBUS related problem.
820 So, give max 100 directly. It will not be changed. */
821 ad->data_br_sli->slider_max = BRIGHTNESS_MAX;
822 /*SETTING_TRACE("device_display_get_max_brightness() returns %d, max %d", ret, ad->data_br_sli->slider_max); */
823 ad->data_br_sli->isIndicatorVisible = 0;
825 ad->data_br_sli->userdata = ad;
826 #if SUPPORT_DISABLE_IN_AUTO_MODE
828 setting_disable_genlist_item(ad->data_br_sli->item);
831 setting_genlist_item_groupstyle_set(ad->data_br_sli, SETTING_GROUP_STYLE_BOTTOM);
833 __BACK_POINTER_SET(ad->data_br_sli);
835 SETTING_TRACE_ERROR("ad->data_br_sli is NULL");
840 temp = (char *)g_strdup(KeyStr_Brightness_Auto_Adjust);
842 temp = (char *)g_strdup(KeyStr_Brightness_Adjust);
845 ADD_GL_HELP_NO_SEP(genlist, temp);
847 if (ad->data_adjust) {
848 ad->data_adjust->userdata = ad;
849 __BACK_POINTER_SET(ad->data_adjust);
850 /*elm_genlist_item_select_mode_set(ad->data_adjust->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); */
852 SETTING_TRACE_ERROR("ad->data_adjust is NULL");
856 char *over_heating_text = (char *)g_strdup("");
857 if (!auto_value && ad->data_br_sli && ad->data_br_sli->slider_max < 100) {
858 over_heating_text = (char *)g_strdup(KeyStr_Brightness_Overheating);
860 ad->data_overheating = setting_create_Gendial_field_def(genlist, &(ad->itc_multiline_overheating),
861 NULL, NULL, SWALLOW_Type_LAYOUT_SPECIALIZTION,
862 NULL, NULL, 0, over_heating_text, "overheating", NULL);
863 if (ad->data_overheating) {
864 ad->data_overheating->userdata = ad;
865 __BACK_POINTER_SET(ad->data_overheating);
866 elm_genlist_item_select_mode_set(ad->data_overheating->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
868 SETTING_TRACE_ERROR("ad->data_overheating is NULL");
870 G_FREE(over_heating_text);
873 /*_brightness_register_event_cb(ad); */
874 /*setting_brightness_dbus_handler_init(ad); */
876 /*key notifi for refreshing */
877 if (&setting_view_display_brightness == ad->view_to_load) {
878 vconf_notify_key_changed(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, __display_int_vconf_cb, ad);
880 SETTING_TRACE_ERROR("vconf key changed callback fail");
883 setting_view_display_brightness.is_create = 1;
884 return SETTING_RETURN_SUCCESS;
887 static int setting_display_brightness_destroy(void *cb)
892 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
893 retv_if(!(setting_view_display_brightness.is_create), SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
895 #if DISABLE_LOW_BATERY_CHANGE
896 /* low battery handler - registration */
897 vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb);
900 SettingDisplayUG *ad = (SettingDisplayUG *) cb;
901 if (&setting_view_display_brightness == ad->view_to_load) {
902 vconf_ignore_key_changed(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, __display_int_vconf_cb);
905 _brightness_deregister_event_cb(ad);
906 evas_object_smart_callback_del(ad->genlist, "realized", __gl_realized_cb);
907 setting_brightness_dbus_handler_fini(ad);
909 if (&setting_view_display_brightness == ad->view_to_load) {
910 if (ad->ly_main != NULL) {
911 evas_object_del(ad->ly_main);
914 setting_view_display_brightness.is_create = 0;
916 setting_view_display_brightness.is_create = 0;
917 elm_naviframe_item_pop(ad->navi_bar);
921 evas_object_del(ad->popup);
925 ecore_idler_del(ad->set_idler);
926 ad->set_idler = NULL;
929 return SETTING_RETURN_SUCCESS;
932 static int setting_display_brightness_update(void *cb)
935 return SETTING_RETURN_SUCCESS;
939 static int setting_display_brightness_cleanup(void *cb)
943 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
944 setting_display_brightness_destroy(cb);
946 return SETTING_RETURN_SUCCESS;
949 /* ***************************************************
953 ***************************************************/
955 /* ***************************************************
959 ***************************************************/
962 setting_display_brightness_click_softkey_cancel_cb(void *data,
968 retm_if(data == NULL, "Data parameter is NULL");
969 SettingDisplayUG *ad = (SettingDisplayUG *) data;
970 if (&setting_view_display_brightness == ad->view_to_load) {
971 /* Send destroy request */
972 ug_destroy_me(ad->ug);
976 setting_view_change(&setting_view_display_brightness,
977 &setting_view_display_main, ad);
981 * toggle handler for 'Automatic'
983 static void __toggle_automatic_chk(void *data, int chk_status)
987 SettingDisplayUG *ad = (SettingDisplayUG *) data;
988 int ret = setting_set_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, chk_status, &err);
989 if (0 != ret) { /*add error handle,due to different target env.. */
990 SETTING_TRACE("Operation failed");
991 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
992 NULL, POPUP_INTERVAL, FALSE, FALSE);
996 #if SUPPORT_DISABLE_IN_AUTO_MODE
1000 setting_disable_genlist_item(ad->data_br_sli->item);
1004 #if DISABLE_LOW_BATERY_CHANGE
1005 /*to get value every time */
1006 ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
1008 /* in case of LOW BATTERY */
1009 ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &ad->low_bat);
1010 if (0 != ret) { /*add error handle,due to different target env.. */
1011 SETTING_TRACE("Operation failed");
1012 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
1013 NULL, POPUP_INTERVAL, FALSE, FALSE);
1017 /* in case of CRITICAL LOW BATTERY */
1018 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) {
1019 setting_disable_genlist_item(ad->data_br_sli->item);
1020 setting_disable_genlist_item(ad->data_br_auto->item);
1022 /* in case of NORMAL OP */
1024 /* 2. call brightness set API */
1025 int value = SETTING_BRIGHTNESS_LEVEL5;
1026 /*device_get_brightness(BRIGHTNESS_DISPLAY, &value); */
1027 if (ad->data_br_sli)
1028 value = elm_slider_value_get(ad->data_br_sli->eo_check);
1029 SETTING_TRACE(" value of ad->data_br_sli->eo_check: %d ", value);
1030 setting_enable_genlist_item(ad->data_br_sli->item);
1032 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
1033 if (0 != ret) { /*add error handle,due to different target env.. */
1034 SETTING_TRACE("Operation failed");
1035 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
1036 NULL, POPUP_INTERVAL, FALSE, FALSE);
1040 /* call brightness API */
1041 ret = device_display_set_brightness(0, value);
1042 /* TODO error handling here */
1045 int value = SETTING_BRIGHTNESS_LEVEL5;
1046 /*device_get_brightness(BRIGHTNESS_DISPLAY, &value); */
1047 if (ad->data_br_sli && ad->data_br_sli->eo_check) {
1048 value = elm_slider_value_get(ad->data_br_sli->eo_check);
1050 SETTING_TRACE(" value of ad->data_br_sli->eo_check: %d ", value);
1052 if (ad->data_br_sli && ad->data_br_sli->item) {
1053 setting_enable_genlist_item(ad->data_br_sli->item);
1055 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
1056 if (0 != ret) { /*add error handle,due to different target env.. */
1057 SETTING_TRACE("Operation failed");
1058 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
1059 NULL, POPUP_INTERVAL, FALSE, FALSE);
1068 * [UI] 'Automatic' toggle
1071 static void setting_display_set_slider_value(void *data, Evas_Object *obj, double value)
1073 SETTING_TRACE_BEGIN;
1074 retm_if(data == NULL, "Invalid argument: data is NULL");
1076 SettingDisplayUG *ad = data;
1077 const char *vconf_str = __display_brightness_get_vconf_need_save();
1078 if (!safeStrCmp(vconf_str, VCONFKEY_SETAPPL_LCD_BRIGHTNESS)) {
1080 SETTING_TRACE("value : %d, %lf", (int)value, value);
1081 ret = device_display_set_brightness(0, (int)value);/*this API will set vconf value, so no need to set vconf in setting side*/
1082 if (ret == DEVICE_ERROR_NONE) {
1083 ad->data_br_sli->chk_status = (int)value;
1084 SETTING_TRACE("value:%d", (int)value);
1086 SETTING_TRACE(" device_display_set_brightness : failed[ret=%d]", ret);
1088 int tmp = SETTING_BRIGHTNESS_LEVEL5;
1089 setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &tmp, &err);
1090 vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &tmp);
1091 elm_slider_value_set(obj, tmp);
1092 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
1093 NULL, POPUP_INTERVAL, FALSE, FALSE);
1096 int ret = vconf_set_int(VCONFKEY_SETAPPL_LCD_AUTOMATIC_BRIGHTNESS, value);
1097 /*add error handle.. */
1099 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
1100 NULL, POPUP_INTERVAL, FALSE, FALSE);
1105 static Eina_Bool __set_brightness_on_idle(void *data)
1107 SETTING_TRACE_BEGIN;
1109 SettingDisplayUG *ad = (SettingDisplayUG *) data;
1110 if (!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check) {
1111 SETTING_TRACE_ERROR("!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check");
1113 ad->set_timer = NULL;
1117 /*Get the current real value of slider */
1118 Evas_Object *obj = ad->data_br_sli->eo_check;
1119 double val = elm_slider_value_get(obj);
1120 int value = (int)(val + 0.5);
1121 SETTING_TRACE("val:%f", val);
1122 SETTING_TRACE("value:%d", value);
1124 if (value != ad->last_requested_level) {
1125 setting_display_set_slider_value(ad, obj, value);
1126 ad->last_requested_level = value;
1129 /*After return False, the idler will be deleted directly,so here set ad->set_idler as NULL directly. */
1130 ad->set_timer = NULL;
1135 setting_display_birghtness_bright_slider_value_change_cb(void *data,
1139 SETTING_TRACE_BEGIN;
1140 retm_if(data == NULL, "Data parameter is NULL");
1143 SettingDisplayUG *ad = NULL;
1144 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
1145 ad = list_item->userdata;
1146 double time_current = 0.0;
1147 static double time_before = 0.0;
1149 time_current = ecore_loop_time_get();
1151 double val = elm_slider_value_get(obj);
1152 SETTING_TRACE("val:%f", val);
1153 value = (int)(val + 0.5);
1154 /* SETTING_TRACE("val:%f", val); */
1155 SETTING_TRACE("Keystr : %s", list_item->keyStr);
1156 SETTING_TRACE("value:%d, list_item->slider_min:%lf, list_item->slider_max:%lf", value, list_item->slider_min, list_item->slider_max);
1157 SETTING_TRACE("last_requested_level: %d", ad->last_requested_level);
1158 if (value != ad->last_requested_level) {
1159 if (value >= list_item->slider_min && value <= list_item->slider_max) {
1160 ad->last_requested_level = value;
1161 setting_display_set_slider_value(ad, obj, (double)value);
1162 time_before = time_current;
1166 if (value != old_val) {
1168 /*setting_display_set_slider_value(ad, obj, value); */
1170 SETTING_TRACE("It is in Emulator, need special process to improve the performence");
1171 if (ad->set_idler) {
1172 ecore_idler_del(ad->set_idler);
1173 ad->set_idler = NULL;
1175 ad->set_idler = ecore_idler_add((Ecore_Task_Cb) __set_brightness_on_idle, ad);
1177 SETTING_TRACE("It is in Real Target, Set the brightness directly.");
1178 setting_display_set_slider_value(ad, obj, value);
1183 SETTING_TRACE("Need special process to improve the performence");
1184 if (ad->set_timer) {
1185 ecore_idler_del(ad->set_timer);
1186 ad->ad->set_timer = NULL;
1188 /*ad->set_idler = ecore_idler_add((Ecore_Task_Cb) __set_brightness_on_idle, ad); */
1189 /*ad->set_timer = ecore_timer_add(0.1, (Ecore_Task_Cb)__set_brightness_on_idle, ad); */