Merge "packaging: spec cleanup" into tizen
[apps/core/preloaded/settings.git] / setting-display / src / setting-display-brightness.c
index 83401f3..7b31f24 100755 (executable)
@@ -1,25 +1,22 @@
 /*
  * setting
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
- *
- * Contact: MyoungJune Park <mj2004.park@samsung.com>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
+ * Licensed under the Flora License, Version 1.1 (the License);
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- * http://www.apache.org/licenses/LICENSE-2.0
+ *     http://floralicense.org/license/
  *
  * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
+ * distributed under the License is distributed on an AS IS BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- *
  */
 
 #include <setting-display-brightness.h>
+#define DISABLE_LOW_BATERY_CHANGE 0 //disable user to set the brightness when the Mobile is low battery.
 
 #define Left_Bright_Icon IMG_BRIGTHNESS_LEFT
 #define Right_Bright_Icon IMG_BRIGHTNESS_RIGHT
@@ -46,19 +43,36 @@ static void __toggle_automatic_chk(void* data, int chk_status);
  *basic func
  *
  ***************************************************/
-#if DISABLED_CODE
-static Eina_Bool setting_display_brightness_on_idle(void *data)
+#define LOW_BATTERY_NOTIFY "Battery is too low, you cannot change brightness"
+#define NORMAL_BATTERY_NOTIFY "Battery becomes normal, now you can change brightness.."
+
+#if DISABLE_LOW_BATERY_CHANGE
+static void
+__low_battery_on_resp_cb(void *data, Evas_Object *obj, void *event_info)
 {
        SETTING_TRACE_BEGIN;
+       setting_retm_if(NULL == data, "NULL == data");
        SettingDisplayUG *ad = (SettingDisplayUG *) data;
-       int auto_value, err;
-       setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS,
-                                &auto_value, &err);
+       evas_object_del(ad->popup);
+       ad->popup = NULL;
+}
 
-       __toggle_automatic_chk(ad, auto_value);
+static Eina_Bool __disable_on_idle(void *data)
+{
+       SETTING_TRACE_BEGIN;
+       SettingDisplayUG *ad = (SettingDisplayUG *) data;
+
+       if (ad->popup)
+       {
+               evas_object_del(ad->popup);
+               ad->popup = NULL;
+       }
+       ad->popup = setting_create_popup_without_btn(ad, ad->win_get, NULL, _(LOW_BATTERY_NOTIFY),
+                                       __low_battery_on_resp_cb, POPUP_INTERVAL, FALSE, FALSE);
+       if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
+       if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
        return FALSE;
 }
-#endif
 
 // low battery
 static void setting_display_brightness_lowbat_cb(keynode_t *key, void* data)
@@ -70,34 +84,62 @@ static void setting_display_brightness_lowbat_cb(keynode_t *key, void* data)
 
        char* vconf_key = vconf_keynode_get_name(key);
        SETTING_TRACE("the value of [ %s ] just changed", vconf_key);
-       // VCONFKEY_SYSMAN_BATTERY_STATUS_LOW
-
-       int battery_value;
-       vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &battery_value);
-       ad->low_bat = battery_value;
-
-       int automatic_val, err;
-       setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &automatic_val, &err);
-
-       if (battery_value < VCONFKEY_SYSMAN_BAT_WARNING_LOW)
+       ad->low_bat = vconf_keynode_get_int(key);
+       if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW)
        {
+               SETTING_TRACE("Battery becomes ctitical low !");
+               //popup was showed by system FW
                // disabled
-               if (ad->data_br_sli) {
-                       setting_disable_genlist_item(ad->data_br_sli->item);
-                       setting_disable_genlist_item(ad->data_br_auto->item);
-               }
+               if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
+               if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
        } else {
+               SETTING_TRACE("Battery becomes normal!");
                if (ad->data_br_sli) {
+                       int automatic_val, err;
+                       setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &automatic_val, &err);
+                       if (ad->data_br_auto) setting_enable_genlist_item(ad->data_br_auto->item);
                        if (automatic_val == SETTING_BRIGHTNESS_AUTOMATIC_OFF) // not automatic
                        {
-                               setting_enable_genlist_item(ad->data_br_auto->item);
-                               setting_enable_genlist_item(ad->data_br_sli->item);
-                       } else { // automatic
-                               setting_enable_genlist_item(ad->data_br_auto->item);
-                               //setting_enable_genlist_item(ad->data_br_sli->item);
+                               if (ad->data_br_sli) setting_enable_genlist_item(ad->data_br_sli->item);
                        }
                }
        }
+}
+#endif
+
+static void __display_int_vconf_cb(keynode_t *key, void *data)
+{
+       SettingDisplayUG *ad = data;
+       retm_if(!data, "Invalid argument: data is NULL");
+
+       int status = vconf_keynode_get_int(key);
+       char *vconf_name = vconf_keynode_get_name(key);
+       SETTING_TRACE("Enter %s(%s=%d)", __FUNCTION__, vconf_name, status);
+
+       if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_LCD_BRIGHTNESS)) {
+               if (ad->data_br_sli)
+               {
+                       elm_slider_value_set(ad->data_br_sli->eo_check, status);
+               }
+       }
+       else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT)) {
+               if (status)
+               {
+                       if (ad->data_br_auto)
+                               elm_check_state_set(ad->data_br_auto->eo_check, 1);
+
+                       if (ad->data_br_sli)
+                               setting_disable_genlist_item(ad->data_br_sli->item);
+               }
+               else
+               {
+                       if (ad->data_br_auto)
+                               elm_check_state_set(ad->data_br_auto->eo_check, 0);
+
+                       if (ad->data_br_sli)
+                               setting_enable_genlist_item(ad->data_br_sli->item);
+               }
+       }
        return;
 }
 
@@ -108,25 +150,11 @@ static int setting_display_brightness_create(void *cb)
 
        SettingDisplayUG *ad = (SettingDisplayUG *) cb;
 
-       Evas_Object *sub_layout = elm_layout_add(ad->win_main_layout);
-       elm_layout_file_set(sub_layout, SETTING_THEME_EDJ_NAME, "search_layout");
-#if SUPPORT_DISPLAY_HOMESCREEN_IMAGE
-       Evas_Object *bg_image =
-           create_bgimage_box_add(NULL, ad->win_main_layout, ad->evas,
-                                  pa_bgset,
-                                  -1, -1,      /* load the image as it's own size */
-                                  NULL,
-                                  NULL);
-       elm_layout_content_set(sub_layout, "bg_swallow", bg_image);
-       FREE(pa_bgset);
-#endif
-
        Evas_Object *genlist = elm_genlist_add(ad->win_main_layout);
        elm_object_style_set(genlist, "dialogue");
        retvm_if(genlist == NULL, SETTING_RETURN_FAIL, "Cannot set scroller object as contento of layout");
        elm_genlist_clear(genlist);     /* first to clear list */
 
-
        /* add basic layout */
        if (&setting_view_display_brightness == ad->view_to_load) {
                ad->ly_main =
@@ -137,32 +165,27 @@ static int setting_display_brightness_create(void *cb)
                                                   NULL, NULL,
                                                   setting_display_brightness_click_softkey_cancel_cb,
                                                   NULL, NULL, ad,
-                                                  sub_layout,
+                                                  genlist,
                                                   &ad->navi_bar, NULL);
        } else {
                setting_push_layout_navi_bar(_(KeyStr_Brightness),
                                             _("IDS_COM_BODY_BACK"), NULL, NULL,
                                             setting_display_brightness_click_softkey_cancel_cb,
                                             NULL,
-                                            NULL, ad, sub_layout, ad->navi_bar, NULL);;
+                                            NULL, ad, genlist, ad->navi_bar, NULL);;
        }
 
-       elm_object_part_content_set(sub_layout, "search_list2", genlist);
-
-       int auto_value;
-       int err;
-       Elm_Object_Item *item = NULL;;
 
-       item = elm_genlist_item_append(genlist, &(ad->itc_seperator), NULL, NULL,
-                                   ELM_GENLIST_ITEM_NONE, NULL, NULL);
+       Elm_Object_Item *item = elm_genlist_item_append(genlist, &(ad->itc_seperator), NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
        elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
 
        // [control] AUTOMATIC - boolean - vconf
-       setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &auto_value, &err);
+       int auto_value = SETTING_BRIGHTNESS_AUTOMATIC_ON;
+       int err;
+       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
        SETTING_TRACE("auto_value:%d", auto_value);
-
-       if(auto_value == SETTING_BRIGHTNESS_AUTOMATIC_PAUSE)
-               auto_value = SETTING_BRIGHTNESS_AUTOMATIC_ON;
+       if (0 != ret) //add error handle,due to different target env..
+               SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT);
 
        // [UI] AUTOMATIC - boolean
        ad->data_br_auto =
@@ -179,33 +202,16 @@ static int setting_display_brightness_create(void *cb)
        }
 
 
-       int battery_value;
-       vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &battery_value);
-       ad->low_bat = battery_value;
-
-       if (ad->low_bat < VCONFKEY_SYSMAN_BAT_WARNING_LOW) {
-       }
-
        /* check manual */
-       int max_brt;
-       if (DEVICE_ERROR_NONE != device_get_max_brightness(BRIGHTNESS_DISPLAY, &max_brt)) {
-               SETTING_TRACE("Fail to get the max brightness of the display.\n");
-               max_brt = 10;
-       } else {
-               SETTING_TRACE("Max brightness of the display is %d\n", max_brt);
-       }
-
-       // get initial value from vconf
-       int value = SETTING_BRIGHTNESS_LEVEL7;
-       int ret = setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &value, &err);
-       if (ret == SETTING_RETURN_FAIL) {
-               value = SETTING_BRIGHTNESS_LEVEL5;
-               SETTING_TRACE("******* value = %d ", value);
-       }
+       int value = SETTING_BRIGHTNESS_LEVEL5;
+       ret = setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &value, &err);
+       SETTING_TRACE("******* value = %d ", value);
+       if (0 != ret) //add error handle,due to different target env..
+               SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_LCD_BRIGHTNESS);
 
        // [UI] Slider control for Bightness
        ad->data_br_sli =
-           setting_create_Gendial_field_def(genlist, &(ad->itc_layout), NULL,
+           setting_create_Gendial_field_def(genlist, &(itc_1icon), NULL,
                                             NULL, SWALLOW_Type_LAYOUT_SLIDER,
                                             Left_Bright_Icon,
                                             Right_Bright_Icon, value, NULL,
@@ -217,7 +223,8 @@ static int setting_display_brightness_create(void *cb)
                ad->data_br_sli->evas = ad->evas;
                ad->data_br_sli->isIndicatorVisible = false;
                ad->data_br_sli->slider_min = 1;
-               ad->data_br_sli->slider_max = max_brt;
+
+               ad->data_br_sli->slider_max = 100;
                ad->data_br_sli->userdata = ad;
 
                if (auto_value) {
@@ -227,22 +234,27 @@ static int setting_display_brightness_create(void *cb)
        } else {
                SETTING_TRACE_ERROR("ad->data_br_sli is NULL");
        }
-
-       vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &battery_value);
-       ad->low_bat = battery_value;
-
-       if (ad->low_bat < VCONFKEY_SYSMAN_BAT_WARNING_LOW) {
-               if (ad->data_br_sli) {
-                       setting_disable_genlist_item(ad->data_br_sli->item);
-                       setting_disable_genlist_item(ad->data_br_auto->item);
-               }
+       #if DISABLE_LOW_BATERY_CHANGE
+       ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
+       vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &ad->low_bat);
+       if (0 != ret) //add error handle,due to different target env..
+               SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SYSMAN_BATTERY_STATUS_LOW);
+
+       if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) {
+               SETTING_TRACE("battery is ctitical low");
+               //have time delay to show all the item out,so user idler to disable
+               //if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
+               //if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
+               ecore_idler_add(__disable_on_idle, ad);
        }
 
        // low battery handler - registration
        vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb, ad);
+       #endif
 
+       vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __display_int_vconf_cb, ad);
+       vconf_notify_key_changed(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, __display_int_vconf_cb, ad);
        setting_view_display_brightness.is_create = 1;
-       //ecore_idler_add(setting_display_brightness_on_idle, ad);
        return SETTING_RETURN_SUCCESS;
 }
 
@@ -252,12 +264,20 @@ static int setting_display_brightness_destroy(void *cb)
 
        /* error check */
        retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
-
+#if DISABLE_LOW_BATERY_CHANGE
        /* low battery handler - registration */
        vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb);
+#endif
+       vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __display_int_vconf_cb);
+       vconf_ignore_key_changed(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, __display_int_vconf_cb);
 
        SettingDisplayUG *ad = (SettingDisplayUG *) cb;
        elm_naviframe_item_pop(ad->navi_bar);
+       if (ad->popup)
+       {
+               evas_object_del(ad->popup);
+               ad->popup = NULL;
+       }
 
        setting_view_display_brightness.is_create = 0;
        return SETTING_RETURN_SUCCESS;
@@ -311,39 +331,90 @@ setting_display_brightness_click_softkey_cancel_cb(void *data,
                            &setting_view_display_main, ad);
 }
 
+/**
+ * toggle handler for 'Automatic'
+ */
 static void __toggle_automatic_chk(void* data, int chk_status)
 {
        int err;
        SettingDisplayUG *ad = (SettingDisplayUG *) data;
+       int ret = setting_set_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, chk_status, &err);
+       if (0 != ret) //add error handle,due to different target env..
+       {
+               SETTING_TRACE("Operation failed");
+               setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
+                                       NULL, POPUP_INTERVAL, FALSE, FALSE);
+               return;
+       }
        if (chk_status) {
                // TOGGLE ON
                setting_disable_genlist_item(ad->data_br_sli->item);
 
        } else {
                // TOGGLE OFF
-               int value = SETTING_BRIGHTNESS_LEVEL7;
-               //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
-               value = elm_slider_value_get(ad->data_br_sli->eo_check);
-
-               SETTING_TRACE(" SENOSR :: %d ", value);
-
-               setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
+               #if DISABLE_LOW_BATERY_CHANGE
+               //to get value every time
+               ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
+
+               // in case of LOW BATTERY
+               ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &ad->low_bat);
+               if (0 != ret) //add error handle,due to different target env..
+               {
+                       SETTING_TRACE("Operation failed");
+                       setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
+                                               NULL, POPUP_INTERVAL, FALSE, FALSE);
+                       return;
+               }
 
-               if (ad->low_bat < VCONFKEY_SYSMAN_BAT_WARNING_LOW) {
+               // in case of CRITICAL LOW BATTERY
+               if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW)
+               {
                        setting_disable_genlist_item(ad->data_br_sli->item);
                        setting_disable_genlist_item(ad->data_br_auto->item);
-                       setting_set_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, chk_status, &err);
-                       return;
                }
+               else
+               {       // in case of NORMAL OP
+                       // 1. set vconf
+                       // 2. call brightness set API
+                       int value = SETTING_BRIGHTNESS_LEVEL5;
+                       //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
+                       if (ad->data_br_sli) {
+                               value = elm_slider_value_get(ad->data_br_sli->eo_check);
+                               SETTING_TRACE(" value of ad->data_br_sli->eo_check: %d ", value);
+                               setting_enable_genlist_item(ad->data_br_sli->item);
+                       }
 
-               ad->data_br_sli->chk_status = value;
-               setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
-               elm_slider_value_set(ad->data_br_sli->eo_check, value);
+                       ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
+                       if (0 != ret) //add error handle,due to different target env..
+                       {
+                               SETTING_TRACE("Operation failed");
+                               setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
+                                                       NULL, POPUP_INTERVAL, FALSE, FALSE);
+                               return;
+                       }
 
-               setting_enable_genlist_item(ad->data_br_sli->item);
+                       /*  call brightness API */
+                       ret = device_set_brightness_to_settings(BRIGHTNESS_DISPLAY, value);
+                       /* TODO error handling here */
+               }
+               #else
+               int value = SETTING_BRIGHTNESS_LEVEL5;
+               //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
+               if (ad->data_br_sli) {
+                       value = elm_slider_value_get(ad->data_br_sli->eo_check);
+                       SETTING_TRACE(" value of ad->data_br_sli->eo_check: %d ", value);
+                       setting_enable_genlist_item(ad->data_br_sli->item);
+               }
+               ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
+               if (0 != ret) //add error handle,due to different target env..
+               {
+                       SETTING_TRACE("Operation failed");
+                       setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
+                                               NULL, POPUP_INTERVAL, FALSE, FALSE);
+                       return;
+               }
+               #endif
        }
-
-       setting_set_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, chk_status, &err);
 }
 
 static void
@@ -397,18 +468,46 @@ static void setting_display_set_slider_value(void* data, Evas_Object *obj, doubl
 
        SettingDisplayUG *ad = data;
        int ret, err;
-
-#ifdef USE_DEVICE_SET_DISPLAY_BRT
-       ret = device_set_brightness(BRIGHTNESS_DISPLAY, value);
+       ret = device_set_brightness_to_settings(BRIGHTNESS_DISPLAY, value);
        if (ret == DEVICE_ERROR_NONE) {
                ad->data_br_sli->chk_status = value;
                ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
+               //add error handle..
+               if (0 != ret) setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
+                                               NULL, POPUP_INTERVAL, FALSE, FALSE);
        } else {
-               /* SETTING_TRACE("device_set_brightness : failed"); */
+               SETTING_TRACE("device_set_brightness_to_settings : failed[ret=%d]", ret);
+               //rollback..
+               int tmp = SETTING_BRIGHTNESS_LEVEL5;
+               setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &tmp, &err);
+               elm_slider_value_set(obj, tmp);
+               setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
+                                                               NULL, POPUP_INTERVAL, FALSE, FALSE);
        }
-#endif
 }
 
+static Eina_Bool __set_brightness_on_idle(void *data)
+{
+       SETTING_TRACE_BEGIN;
+       SettingDisplayUG *ad = (SettingDisplayUG *) data;
+       if (!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check)
+       {
+               SETTING_TRACE_ERROR("!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check");
+               if (ad) 
+                       ad->set_idler = NULL;
+               return FALSE;
+       }
+       //Get the current real value of slider
+       Evas_Object *obj = ad->data_br_sli->eo_check;
+       double val = elm_slider_value_get(obj);
+       int value = (int)(val + 0.5);
+       SETTING_TRACE("val:%f", val);
+       SETTING_TRACE("value:%d", value);
+       setting_display_set_slider_value(ad, obj, value);
+       //After return False, the idler will be deleted directly,so here set ad->set_idler as NULL directly.
+       ad->set_idler = NULL;
+       return FALSE;
+}
 
 static void
 setting_display_birghtness_bright_slider_value_change_cb(void *data,
@@ -431,12 +530,27 @@ setting_display_birghtness_bright_slider_value_change_cb(void *data,
        }
 
        double val = elm_slider_value_get(obj);
+       SETTING_TRACE("val:%f", val);
        value = (int)(val + 0.5);
        /* SETTING_TRACE("val:%f", val); */
        SETTING_TRACE("value:%d", value);
        if (value != old_val)
        {
-               setting_display_set_slider_value(ad, obj, value);
+               //setting_display_set_slider_value(ad, obj, value);
+               if(isEmulBin())
+               {
+                       SETTING_TRACE("It is in Emulator, need special process to improve the performence");
+                       if (ad->set_idler) {
+                               ecore_idler_del(ad->set_idler);
+                               ad->set_idler = NULL;
+                       }
+                       ad->set_idler = ecore_idler_add((Ecore_Task_Cb) __set_brightness_on_idle, ad);
+               }
+               else
+               {
+                       SETTING_TRACE("It is in Real Target, Set the brightness directly.");
+                       setting_display_set_slider_value(ad, obj, value);
+               }
                old_val = value;
        }
 }