Merge "fix N_SE-10126"
[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 #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.."
51
52 static void
53 __low_battery_on_resp_cb(void *data, Evas_Object *obj, void *event_info)
54 {
55         SETTING_TRACE_BEGIN;
56         setting_retm_if(NULL == data, "NULL == data");
57         SettingDisplayUG *ad = (SettingDisplayUG *) data;
58         evas_object_del(ad->popup);
59         ad->popup = NULL;
60 }
61
62 static Eina_Bool __disable_on_idle(void *data)
63 {
64         SETTING_TRACE_BEGIN;
65         SettingDisplayUG *ad = (SettingDisplayUG *) data;
66
67         if (ad->popup)
68         {
69                 evas_object_del(ad->popup);
70                 ad->popup = NULL;
71         }
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);
76         return FALSE;
77 }
78
79 // low battery
80 static void setting_display_brightness_lowbat_cb(keynode_t *key, void* data)
81 {
82 //      SETTING_TRACE_BEGIN;
83         ret_if(data == NULL);
84         SettingDisplayUG *ad = (SettingDisplayUG *) data;
85         SETTING_TRACE_BEGIN;
86
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)
91         {
92                 SETTING_TRACE("Battery becomes ctitical low !");
93                 //popup was showed by system FW
94                 // disabled
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);
97         } else {
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
104                         {
105                                 if (ad->data_br_sli) setting_enable_genlist_item(ad->data_br_sli->item);
106                         }
107                 }
108         }
109 }
110
111 static int setting_display_brightness_create(void *cb)
112 {
113         SETTING_TRACE_BEGIN;
114         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
115
116         SettingDisplayUG *ad = (SettingDisplayUG *) cb;
117
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,
123                                    pa_bgset,
124                                    -1, -1,      /* load the image as it's own size */
125                                    NULL,
126                                    NULL);
127         elm_layout_content_set(sub_layout, "bg_swallow", bg_image);
128         FREE(pa_bgset);
129 #endif
130
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 */
135
136
137         /* add basic layout */
138         if (&setting_view_display_brightness == ad->view_to_load) {
139                 ad->ly_main =
140                     setting_create_layout_navi_bar(ad->win_main_layout,
141                                                    ad->win_get,
142                                                    _(KeyStr_Brightness),
143                                                    _("IDS_COM_BODY_BACK"),
144                                                    NULL, NULL,
145                                                    setting_display_brightness_click_softkey_cancel_cb,
146                                                    NULL, NULL, ad,
147                                                    sub_layout,
148                                                    &ad->navi_bar, NULL);
149         } else {
150                 setting_push_layout_navi_bar(_(KeyStr_Brightness),
151                                              _("IDS_COM_BODY_BACK"), NULL, NULL,
152                                              setting_display_brightness_click_softkey_cancel_cb,
153                                              NULL,
154                                              NULL, ad, sub_layout, ad->navi_bar, NULL);;
155         }
156
157         elm_object_part_content_set(sub_layout, "search_list2", genlist);
158
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);
161
162         // [control] AUTOMATIC - boolean - vconf
163         int auto_value = SETTING_BRIGHTNESS_AUTOMATIC_ON;
164         int err;
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);
169
170         // [UI] AUTOMATIC - boolean
171         ad->data_br_auto =
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,
175                                              NULL, auto_value,
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;
180         } else {
181                 SETTING_TRACE_ERROR("ad->data_br_auto is NULL");
182         }
183
184
185         /* check manual */
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);
191
192         // [UI] Slider control for Bightness
193         ad->data_br_sli =
194             setting_create_Gendial_field_def(genlist, &(ad->itc_layout), NULL,
195                                              NULL, SWALLOW_Type_LAYOUT_SLIDER,
196                                              Left_Bright_Icon,
197                                              Right_Bright_Icon, value, NULL,
198                                              NULL,
199                                              setting_display_birghtness_bright_slider_value_change_cb);
200
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;
207
208                 ad->data_br_sli->userdata = ad;
209
210                 if (auto_value) {
211                         setting_disable_genlist_item(ad->data_br_sli->item);
212                 }
213
214         } else {
215                 SETTING_TRACE_ERROR("ad->data_br_sli is NULL");
216         }
217
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);
222
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);
229         }
230
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;
235 }
236
237 static int setting_display_brightness_destroy(void *cb)
238 {
239         SETTING_TRACE_BEGIN;
240
241         /* error check */
242         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
243
244         /* low battery handler - registration */
245         vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb);
246
247         SettingDisplayUG *ad = (SettingDisplayUG *) cb;
248         if (ad->set_idler) {
249                 ecore_idler_del(ad->set_idler);
250                 ad->set_idler = NULL;
251         }
252         elm_naviframe_item_pop(ad->navi_bar);
253         if (ad->popup)
254         {
255                 evas_object_del(ad->popup);
256                 ad->popup = NULL;
257         }
258
259         setting_view_display_brightness.is_create = 0;
260         return SETTING_RETURN_SUCCESS;
261 }
262
263 static int setting_display_brightness_update(void *cb)
264 {
265         SETTING_TRACE_BEGIN;
266         return SETTING_RETURN_SUCCESS;
267
268 }
269
270 static int setting_display_brightness_cleanup(void *cb)
271 {
272         SETTING_TRACE_BEGIN;
273         /* error check */
274         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
275         setting_display_brightness_destroy(cb);
276
277         return SETTING_RETURN_SUCCESS;
278 }
279
280 /* ***************************************************
281  *
282  *general func
283  *
284  ***************************************************/
285
286 /* ***************************************************
287  *
288  *call back func
289  *
290  ***************************************************/
291
292 static void
293 setting_display_brightness_click_softkey_cancel_cb(void *data,
294                                                    Evas_Object *obj,
295                                                    void *event_info)
296 {
297         SETTING_TRACE_BEGIN;
298         /* error check */
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);
304                 return;
305         }
306
307         setting_view_change(&setting_view_display_brightness,
308                             &setting_view_display_main, ad);
309 }
310
311 static void __toggle_automatic_chk(void* data, int chk_status)
312 {
313         int err;
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..
317         {
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);
321                 return;
322         }
323         if (chk_status) {
324                 // TOGGLE ON
325                 setting_disable_genlist_item(ad->data_br_sli->item);
326
327         } else {
328                 // TOGGLE OFF
329                 //to get value every time
330                 ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
331
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..
335                 {
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);
339                         return;
340                 }
341
342                 // in case of CIRITICAL LOW BATTERY
343                 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW)
344                 {
345                         setting_disable_genlist_item(ad->data_br_sli->item);
346                         setting_disable_genlist_item(ad->data_br_auto->item);
347                 }
348                 else
349                 {
350                         // in case of NORMAL OP
351                         // 1. set vconf
352                         // 2. call brightness set API
353                         int value = SETTING_BRIGHTNESS_LEVEL5;
354                         //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
355                         if (ad->data_br_sli)
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..
361                         {
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);
365                                 return;
366                         }
367
368                         /* call brightness API */
369                         ret = device_set_brightness(BRIGHTNESS_DISPLAY, value);
370                         /* TODO error handling here */
371                 }
372         }
373 }
374
375 static void
376 setting_display_brightness_chk_btn_cb(void *data, Evas_Object *obj,
377                                       void *event_info)
378 {
379         SETTING_TRACE_BEGIN;
380         /* error check */
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 */
386
387         // enable /disable toggle button
388         __toggle_automatic_chk(ad, list_item->chk_status);
389         return;
390 }
391
392 /**
393  * [UI] 'Automatic' toggle
394  */
395 static void setting_display_brightness_mouse_up_Gendial_list_cb(void *data,
396                                                                 Evas_Object * obj,
397                                                                 void *event_info)
398 {
399         /* error check */
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;
403
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);
408
409         int old_status = elm_check_state_get(list_item->eo_check);
410         /* new status */
411         list_item->chk_status = !old_status;
412         elm_check_state_set(list_item->eo_check, list_item->chk_status);
413
414         // enable /disable toggle button
415         __toggle_automatic_chk(ad,list_item->chk_status);
416 }
417
418 static void setting_display_set_slider_value(void* data, Evas_Object *obj, double value)
419
420 {
421         SETTING_TRACE_BEGIN;
422         retm_if(data == NULL, "Invalid argument: data is NULL");
423
424         SettingDisplayUG *ad = data;
425         int ret, err;
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);
430                 //add error handle..
431                 if (0 != ret) setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
432                                                 NULL, POPUP_INTERVAL, FALSE, FALSE);
433         } else {
434                 /* SETTING_TRACE("device_set_brightness : failed"); */
435                 //rollback..
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);
441         }
442 }
443
444 static Eina_Bool __set_brightness_on_idle(void *data)
445 {
446         SETTING_TRACE_BEGIN;
447         SettingDisplayUG *ad = (SettingDisplayUG *) data;
448         if (!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check)
449         {
450                 SETTING_TRACE_ERROR("!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check");
451                 ad->set_idler = NULL;
452                 return FALSE;
453         }
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;
463         return FALSE;
464 }
465
466 static void
467 setting_display_birghtness_bright_slider_value_change_cb(void *data,
468                                                          Evas_Object *obj,
469                                                          void *event_info)
470 {
471         SETTING_TRACE_BEGIN;
472         retm_if(data == NULL, "Data parameter is NULL");
473         int value = 0;
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;
479
480         value = elm_check_state_get(ad->data_br_auto->eo_check);
481         if (value == 1) {       /* it is automatic setting mode, */
482                 /* do nothing */
483                 return;
484         }
485
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)
492         {
493                 //setting_display_set_slider_value(ad, obj, value);
494                 if(isEmulBin())
495                 {
496                         SETTING_TRACE("It is in Emulator, need special process to improve the performence");
497                         if (ad->set_idler) {
498                                 ecore_idler_del(ad->set_idler);
499                                 ad->set_idler = NULL;
500                         }
501                         ad->set_idler = ecore_idler_add((Ecore_Task_Cb) __set_brightness_on_idle, ad);
502                 }
503                 else
504                 {
505                         SETTING_TRACE("It is in Real Target, Set the brightness directly.");
506                         setting_display_set_slider_value(ad, obj, value);
507                 }
508                 old_val = value;
509         }
510 }
511
512