Fix N_SE-8235
[apps/core/preloaded/settings.git] / setting-display / src / setting-display-brightness.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5  *
6  * Contact: MyoungJune Park <mj2004.park@samsung.com>
7  *
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
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  *
20  */
21
22 #include <setting-display-brightness.h>
23
24 #define Left_Bright_Icon IMG_BRIGTHNESS_LEFT
25 #define Right_Bright_Icon IMG_BRIGHTNESS_RIGHT
26 #define SUPPORT_DISPLAY_HOMESCREEN_IMAGE 0
27
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);
32
33 static void setting_display_set_slider_value(void* data, Evas_Object *obj, double value);
34
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,
40 };
41
42 static void __toggle_automatic_chk(void* data, int chk_status);
43
44 /* ***************************************************
45  *
46  *basic func
47  *
48  ***************************************************/
49 #if DISABLED_CODE
50 static Eina_Bool setting_display_brightness_on_idle(void *data)
51 {
52         SETTING_TRACE_BEGIN;
53         SettingDisplayUG *ad = (SettingDisplayUG *) data;
54         int auto_value, err;
55         setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS,
56                                  &auto_value, &err);
57
58         __toggle_automatic_chk(ad, auto_value);
59         return FALSE;
60 }
61 #endif
62
63 // low battery
64 static void setting_display_brightness_lowbat_cb(keynode_t *key, void* data)
65 {
66 //      SETTING_TRACE_BEGIN;
67         ret_if(data == NULL);
68         SettingDisplayUG *ad = (SettingDisplayUG *) data;
69         SETTING_TRACE_BEGIN;
70
71         char* vconf_key = vconf_keynode_get_name(key);
72         SETTING_TRACE("the value of [ %s ] just changed", vconf_key);
73         // VCONFKEY_SYSMAN_BATTERY_STATUS_LOW
74
75         int battery_value;
76         vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &battery_value);
77         ad->low_bat = battery_value;
78
79         int automatic_val, err;
80         setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &automatic_val, &err);
81
82         if (battery_value < VCONFKEY_SYSMAN_BAT_WARNING_LOW)
83         {
84                 // disabled
85                 if (ad->data_br_sli) {
86                         setting_disable_genlist_item(ad->data_br_sli->item);
87                         setting_disable_genlist_item(ad->data_br_auto->item);
88                 }
89         } else {
90                 if (ad->data_br_sli) {
91                         if (automatic_val == SETTING_BRIGHTNESS_AUTOMATIC_OFF) // not automatic
92                         {
93                                 setting_enable_genlist_item(ad->data_br_auto->item);
94                                 setting_enable_genlist_item(ad->data_br_sli->item);
95                         } else { // automatic
96                                 setting_enable_genlist_item(ad->data_br_auto->item);
97                                 //setting_enable_genlist_item(ad->data_br_sli->item);
98                         }
99                 }
100         }
101         return;
102 }
103
104 static int setting_display_brightness_create(void *cb)
105 {
106         SETTING_TRACE_BEGIN;
107         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
108
109         SettingDisplayUG *ad = (SettingDisplayUG *) cb;
110
111         Evas_Object *sub_layout = elm_layout_add(ad->win_main_layout);
112         elm_layout_file_set(sub_layout, SETTING_THEME_EDJ_NAME, "search_layout");
113 #if SUPPORT_DISPLAY_HOMESCREEN_IMAGE
114         Evas_Object *bg_image =
115             create_bgimage_box_add(NULL, ad->win_main_layout, ad->evas,
116                                    pa_bgset,
117                                    -1, -1,      /* load the image as it's own size */
118                                    NULL,
119                                    NULL);
120         elm_layout_content_set(sub_layout, "bg_swallow", bg_image);
121         FREE(pa_bgset);
122 #endif
123
124         Evas_Object *genlist = elm_genlist_add(ad->win_main_layout);
125         elm_object_style_set(genlist, "dialogue");
126         retvm_if(genlist == NULL, SETTING_RETURN_FAIL, "Cannot set scroller object as contento of layout");
127         elm_genlist_clear(genlist);     /* first to clear list */
128
129
130         /* add basic layout */
131         if (&setting_view_display_brightness == ad->view_to_load) {
132                 ad->ly_main =
133                     setting_create_layout_navi_bar(ad->win_main_layout,
134                                                    ad->win_get,
135                                                    _(KeyStr_Brightness),
136                                                    _("IDS_COM_BODY_BACK"),
137                                                    NULL, NULL,
138                                                    setting_display_brightness_click_softkey_cancel_cb,
139                                                    NULL, NULL, ad,
140                                                    sub_layout,
141                                                    &ad->navi_bar, NULL);
142         } else {
143                 setting_push_layout_navi_bar(_(KeyStr_Brightness),
144                                              _("IDS_COM_BODY_BACK"), NULL, NULL,
145                                              setting_display_brightness_click_softkey_cancel_cb,
146                                              NULL,
147                                              NULL, ad, sub_layout, ad->navi_bar, NULL);;
148         }
149
150         elm_object_part_content_set(sub_layout, "search_list2", genlist);
151
152         int auto_value;
153         int err;
154         Elm_Object_Item *item = NULL;;
155
156         item = elm_genlist_item_append(genlist, &(ad->itc_seperator), NULL, NULL,
157                                     ELM_GENLIST_ITEM_NONE, NULL, NULL);
158         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
159
160         // [control] AUTOMATIC - boolean - vconf
161         setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &auto_value, &err);
162         SETTING_TRACE("auto_value:%d", auto_value);
163
164         if(auto_value == SETTING_BRIGHTNESS_AUTOMATIC_PAUSE)
165                 auto_value = SETTING_BRIGHTNESS_AUTOMATIC_ON;
166
167         // [UI] AUTOMATIC - boolean
168         ad->data_br_auto =
169             setting_create_Gendial_field_def(genlist, &(ad->itc_1text_1icon),
170                                              setting_display_brightness_mouse_up_Gendial_list_cb,
171                                              ad, SWALLOW_Type_1TOGGLE, NULL,
172                                              NULL, auto_value,
173                                              "IDS_COM_BODY_AUTOMATIC", NULL,
174                                              setting_display_brightness_chk_btn_cb);
175         if (ad->data_br_auto) {
176                 ad->data_br_auto->userdata = ad;
177         } else {
178                 SETTING_TRACE_ERROR("ad->data_br_auto is NULL");
179         }
180
181
182         int battery_value;
183         vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &battery_value);
184         ad->low_bat = battery_value;
185
186         if (ad->low_bat < VCONFKEY_SYSMAN_BAT_WARNING_LOW) {
187         }
188
189         /* check manual */
190         int max_brt;
191         if (DEVICE_ERROR_NONE != device_get_max_brightness(BRIGHTNESS_DISPLAY, &max_brt)) {
192                 SETTING_TRACE("Fail to get the max brightness of the display.\n");
193                 max_brt = 10;
194         } else {
195                 SETTING_TRACE("Max brightness of the display is %d\n", max_brt);
196         }
197
198         // get initial value from vconf
199 #if DISABLED_CODE
200         int ret = setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &value, &err);
201         if (ret == SETTING_RETURN_FAIL) {
202                 value = SETTING_BRIGHTNESS_LEVEL5;
203                 SETTING_TRACE("******* value = %d ", value);
204         }
205 #else
206         int value = SETTING_BRIGHTNESS_LEVEL7;
207         device_get_brightness(BRIGHTNESS_DISPLAY, &value);
208         SETTING_TRACE("******* value = %d ", value);
209 #endif
210
211         // [UI] Slider control for Bightness
212         ad->data_br_sli =
213             setting_create_Gendial_field_def(genlist, &(ad->itc_layout), NULL,
214                                              NULL, SWALLOW_Type_LAYOUT_SLIDER,
215                                              Left_Bright_Icon,
216                                              Right_Bright_Icon, value, NULL,
217                                              NULL,
218                                              setting_display_birghtness_bright_slider_value_change_cb);
219
220         if (ad->data_br_sli) {
221                 ad->data_br_sli->win_main = ad->win_main_layout;
222                 ad->data_br_sli->evas = ad->evas;
223                 ad->data_br_sli->isIndicatorVisible = false;
224                 ad->data_br_sli->slider_min = 1;
225                 ad->data_br_sli->slider_max = max_brt;
226                 ad->data_br_sli->userdata = ad;
227
228                 if (auto_value) {
229                         setting_disable_genlist_item(ad->data_br_sli->item);
230                 }
231
232         } else {
233                 SETTING_TRACE_ERROR("ad->data_br_sli is NULL");
234         }
235
236         vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &battery_value);
237         ad->low_bat = battery_value;
238
239         if (ad->low_bat < VCONFKEY_SYSMAN_BAT_WARNING_LOW) {
240                 if (ad->data_br_sli) {
241                         setting_disable_genlist_item(ad->data_br_sli->item);
242                         setting_disable_genlist_item(ad->data_br_auto->item);
243                 }
244         }
245
246         // low battery handler - registration
247         vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb, ad);
248
249         setting_view_display_brightness.is_create = 1;
250         //ecore_idler_add(setting_display_brightness_on_idle, ad);
251         return SETTING_RETURN_SUCCESS;
252 }
253
254 static int setting_display_brightness_destroy(void *cb)
255 {
256         SETTING_TRACE_BEGIN;
257
258         /* error check */
259         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
260
261         /* low battery handler - registration */
262         vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb);
263
264         SettingDisplayUG *ad = (SettingDisplayUG *) cb;
265         elm_naviframe_item_pop(ad->navi_bar);
266
267         setting_view_display_brightness.is_create = 0;
268         return SETTING_RETURN_SUCCESS;
269 }
270
271 static int setting_display_brightness_update(void *cb)
272 {
273         SETTING_TRACE_BEGIN;
274         return SETTING_RETURN_SUCCESS;
275
276 }
277
278 static int setting_display_brightness_cleanup(void *cb)
279 {
280         SETTING_TRACE_BEGIN;
281         /* error check */
282         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
283         setting_display_brightness_destroy(cb);
284
285         return SETTING_RETURN_SUCCESS;
286 }
287
288 /* ***************************************************
289  *
290  *general func
291  *
292  ***************************************************/
293
294 /* ***************************************************
295  *
296  *call back func
297  *
298  ***************************************************/
299
300 static void
301 setting_display_brightness_click_softkey_cancel_cb(void *data,
302                                                    Evas_Object *obj,
303                                                    void *event_info)
304 {
305         SETTING_TRACE_BEGIN;
306         /* error check */
307         retm_if(data == NULL, "Data parameter is NULL");
308         SettingDisplayUG *ad = (SettingDisplayUG *) data;
309         if (&setting_view_display_brightness == ad->view_to_load) {
310                 /* Send destroy request */
311                 ug_destroy_me(ad->ug);
312                 return;
313         }
314
315         setting_view_change(&setting_view_display_brightness,
316                             &setting_view_display_main, ad);
317 }
318
319 static void __toggle_automatic_chk(void* data, int chk_status)
320 {
321         int err;
322         SettingDisplayUG *ad = (SettingDisplayUG *) data;
323         if (chk_status) {
324                 // TOGGLE ON
325                 setting_disable_genlist_item(ad->data_br_sli->item);
326
327         } else {
328                 // TOGGLE OFF
329                 int value = SETTING_BRIGHTNESS_LEVEL7;
330                 //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
331                 value = elm_slider_value_get(ad->data_br_sli->eo_check);
332
333                 SETTING_TRACE(" SENOSR :: %d ", value);
334
335                 setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
336
337                 if (ad->low_bat < VCONFKEY_SYSMAN_BAT_WARNING_LOW) {
338                         setting_disable_genlist_item(ad->data_br_sli->item);
339                         setting_disable_genlist_item(ad->data_br_auto->item);
340                         setting_set_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, chk_status, &err);
341                         return;
342                 }
343
344                 ad->data_br_sli->chk_status = value;
345                 setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
346                 elm_slider_value_set(ad->data_br_sli->eo_check, value);
347
348                 setting_enable_genlist_item(ad->data_br_sli->item);
349         }
350
351         setting_set_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, chk_status, &err);
352 }
353
354 static void
355 setting_display_brightness_chk_btn_cb(void *data, Evas_Object *obj,
356                                       void *event_info)
357 {
358         SETTING_TRACE_BEGIN;
359         /* error check */
360         retm_if(data == NULL, "Data parameter is NULL");
361         Setting_GenGroupItem_Data *list_item =
362             (Setting_GenGroupItem_Data *) data;
363         SettingDisplayUG *ad = list_item->userdata;
364         list_item->chk_status = elm_check_state_get(obj);       /*  for genlist update status */
365
366         // enable /disable toggle button
367         __toggle_automatic_chk(ad, list_item->chk_status);
368         return;
369 }
370
371 /**
372  * [UI] 'Automatic' toggle
373  */
374 static void setting_display_brightness_mouse_up_Gendial_list_cb(void *data,
375                                                                 Evas_Object * obj,
376                                                                 void *event_info)
377 {
378         /* error check */
379         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
380         retm_if(data == NULL, "Invalid argument: data is NULL");
381         SettingDisplayUG *ad = data;
382
383         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
384         elm_genlist_item_selected_set(item, 0);
385         Setting_GenGroupItem_Data *list_item =
386             (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
387
388         int old_status = elm_check_state_get(list_item->eo_check);
389         /* new status */
390         list_item->chk_status = !old_status;
391         elm_check_state_set(list_item->eo_check, list_item->chk_status);
392
393         // enable /disable toggle button
394         __toggle_automatic_chk(ad,list_item->chk_status);
395 }
396
397 static void setting_display_set_slider_value(void* data, Evas_Object *obj, double value)
398
399 {
400         SETTING_TRACE_BEGIN;
401         retm_if(data == NULL, "Invalid argument: data is NULL");
402
403         SettingDisplayUG *ad = data;
404         int ret, err;
405
406 #ifdef USE_DEVICE_SET_DISPLAY_BRT
407         ret = device_set_brightness(BRIGHTNESS_DISPLAY, value);
408         if (ret == DEVICE_ERROR_NONE) {
409                 ad->data_br_sli->chk_status = value;
410                 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
411         } else {
412                 /* SETTING_TRACE("device_set_brightness : failed"); */
413         }
414 #endif
415 }
416
417
418 static void
419 setting_display_birghtness_bright_slider_value_change_cb(void *data,
420                                                          Evas_Object *obj,
421                                                          void *event_info)
422 {
423         SETTING_TRACE_BEGIN;
424         retm_if(data == NULL, "Data parameter is NULL");
425         int value = 0;
426         static int old_val = -1;
427         SettingDisplayUG *ad = NULL;
428         Setting_GenGroupItem_Data *list_item =
429             (Setting_GenGroupItem_Data *) data;
430         ad = list_item->userdata;
431
432         value = elm_check_state_get(ad->data_br_auto->eo_check);
433         if (value == 1) {       /* it is automatic setting mode, */
434                 /* do nothing */
435                 return;
436         }
437
438         double val = elm_slider_value_get(obj);
439         value = (int)(val + 0.5);
440         /* SETTING_TRACE("val:%f", val); */
441         SETTING_TRACE("value:%d", value);
442         if (value != old_val)
443         {
444                 setting_display_set_slider_value(ad, obj, value);
445                 old_val = value;
446         }
447 }
448
449