32d7a33578ccc4fdfeec3812b7e689ce7f699391
[apps/home/quickpanel.git] / daemon / device / brightness.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *  http://floralicense.org/license/
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <glib.h>
18 #include <string.h>
19 #include <vconf.h>
20 #include <device.h>
21 #include "common.h"
22 #include "quickpanel-ui.h"
23 #include "list_util.h"
24 #include "quickpanel_def.h"
25
26 #define BRIGHTNESS_MIN 1
27 #define BRIGHTNESS_MAX 100
28
29 #define QP_BRIGHTNESS_CONTROL_ICON_IMG ICONDIR"/Q02_Notification_brightness.png"
30
31 typedef struct _brightness_ctrl_obj {
32         int min_level;
33         int max_level;
34         Evas_Object *viewer;
35         void *data;
36 } brightness_ctrl_obj;
37
38 static int quickpanel_brightness_init(void *data);
39 static int quickpanel_brightness_fini(void *data);
40 static void quickpanel_brightness_lang_changed(void *data);
41 static void quickpanel_brightness_qp_opened(void *data);
42 static void quickpanel_brightness_qp_closed(void *data);
43 static void _brightness_view_update(void);
44 static void _brightness_register_event_cb(brightness_ctrl_obj *ctrl_obj);
45 static void _brightness_deregister_event_cb(brightness_ctrl_obj *ctrl_obj);
46
47 QP_Module brightness_ctrl = {
48         .name = "brightness_ctrl",
49         .init = quickpanel_brightness_init,
50         .fini = quickpanel_brightness_fini,
51         .suspend = NULL,
52         .resume = NULL,
53         .hib_enter = NULL,
54         .hib_leave = NULL,
55         .lang_changed = quickpanel_brightness_lang_changed,
56         .refresh = NULL,
57         .get_height = NULL,
58         .qp_opened = quickpanel_brightness_qp_opened,
59         .qp_closed = quickpanel_brightness_qp_closed,
60 };
61
62 static brightness_ctrl_obj *g_ctrl_obj;
63
64 static void _set_text_to_part(Evas_Object *obj, const char *part, const char *text) {
65         const char *old_text = NULL;
66
67         retif(obj == NULL, , "Invalid parameter!");
68         retif(part == NULL, , "Invalid parameter!");
69         retif(text == NULL, , "Invalid parameter!");
70
71         old_text = elm_object_part_text_get(obj, part);
72         if (old_text != NULL) {
73                 if (strcmp(old_text, text) == 0) {
74                         return ;
75                 }
76         }
77
78         elm_object_part_text_set(obj, part, text);
79 }
80
81 static Evas_Object *_check_duplicated_image_loading(Evas_Object *obj, const char *part, const char *file_path) {
82         Evas_Object *old_ic = NULL;
83         const char *old_ic_path = NULL;
84
85         retif(obj == NULL, NULL, "Invalid parameter!");
86         retif(part == NULL, NULL, "Invalid parameter!");
87         retif(file_path == NULL, NULL, "Invalid parameter!");
88
89         old_ic = elm_object_part_content_get(obj, part);
90         if (old_ic != NULL) {
91                 elm_image_file_get(old_ic, &old_ic_path, NULL);
92                 if (old_ic_path != NULL) {
93                         if (strcmp(old_ic_path, file_path) == 0)
94                                 return old_ic;
95                 }
96
97                 elm_object_part_content_unset(obj, part);
98                 evas_object_del(old_ic);
99         }
100
101         return NULL;
102 }
103
104 static Evas_Object *_check_duplicated_loading(Evas_Object *obj, const char *part) {
105         Evas_Object *old_content = NULL;
106
107         retif(obj == NULL, NULL, "Invalid parameter!");
108         retif(part == NULL, NULL, "Invalid parameter!");
109
110         old_content = elm_object_part_content_get(obj, part);
111         if (old_content != NULL) {
112                         return old_content;
113         }
114
115         return NULL;
116 }
117
118 static int _brightness_get_automate_level(void) {
119         int is_on = 0;
120
121         if (vconf_get_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, &is_on) == 0)
122                 return is_on;
123         else
124                 return SETTING_BRIGHTNESS_AUTOMATIC_OFF;
125 }
126
127 static void _brightness_vconf_cb(keynode_t *key, void* data) {
128         brightness_ctrl_obj *ctrl_obj = NULL;
129
130         retif(data == NULL, , "Data parameter is NULL");
131         ctrl_obj = data;
132
133         if (ctrl_obj->viewer != NULL) {
134                 _brightness_view_update();
135         }
136 }
137
138 static void quickpanel_brightness_qp_opened(void *data)
139 {
140         struct appdata *ad = NULL;
141
142         retif(data == NULL, , "Invalid parameter!");
143         ad = data;
144
145         retif(g_ctrl_obj == NULL, , "Invalid parameter!");
146
147         if (g_ctrl_obj->viewer != NULL) {
148                 _brightness_view_update();
149         }
150 }
151
152 static void quickpanel_brightness_qp_closed(void *data)
153 {
154         struct appdata *ad = NULL;
155
156         retif(data == NULL, , "Invalid parameter!");
157         ad = data;
158
159         retif(g_ctrl_obj == NULL, , "Invalid parameter!");
160
161         if (g_ctrl_obj->viewer != NULL) {
162                 _brightness_view_update();
163         }
164 }
165
166 static int _brightness_set_level(int level) {
167         int ret = DEVICE_ERROR_NONE;
168
169         ret = device_set_brightness_to_settings(0, level);
170         if (ret != DEVICE_ERROR_NONE) {
171                 ERR("failed to set brightness");
172         }
173
174         return level;
175 }
176
177 static int _brightness_get_level(void) {
178         int level = 0;
179
180         if (vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &level) == 0)
181                 return level;
182         else
183                 return SETTING_BRIGHTNESS_LEVEL5;
184 }
185
186 static int _brightness_set_automate_level(int is_on) {
187         return vconf_set_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, is_on);
188 }
189
190 static void
191 _brightness_ctrl_slider_changed_cb(void *data,
192                                                          Evas_Object *obj,
193                                                          void *event_info)
194 {
195         int value = 0;
196         static int old_val = -1;
197         brightness_ctrl_obj *ctrl_obj = NULL;
198
199         retif(data == NULL, , "Data parameter is NULL");
200         ctrl_obj = data;
201
202         double val = elm_slider_value_get(obj);
203         value = (int)(val + 0.5);
204
205         if (value != old_val)
206         {
207                 if (value >= ctrl_obj->min_level && value <= ctrl_obj->max_level) {
208                         DBG("brightness is changed to %d", value);
209                         _brightness_set_level(value);
210                 }
211         }
212 }
213
214 static void
215 _brightness_ctrl_slider_delayed_changed_cb(void *data,
216                                                          Evas_Object *obj,
217                                                          void *event_info)
218 {
219         int value = 0;
220
221         value = _brightness_get_level();
222         DBG("brightness is changed to %d", value);
223         _brightness_set_level(value);
224 }
225
226 static void
227 _brightness_ctrl_slider_drag_start_cb(void *data,
228                                                          Evas_Object *obj,
229                                                          void *event_info)
230 {
231         _brightness_deregister_event_cb(data);
232 }
233
234 static void
235 _brightness_ctrl_slider_drag_stop_cb(void *data,
236                                                          Evas_Object *obj,
237                                                          void *event_info)
238 {
239         _brightness_register_event_cb(data);
240 }
241
242 static void _brightness_ctrl_checker_toggle_cb(void *data,
243                                                                 Evas_Object * obj,
244                                                                 void *event_info)
245 {
246         quickpanel_play_feedback();
247
248         retif(obj == NULL, , "obj parameter is NULL");
249
250         int status = elm_check_state_get(obj);
251         brightness_ctrl_obj *ctrl_obj = NULL;
252
253         retif(data == NULL, , "Data parameter is NULL");
254         ctrl_obj = data;
255
256         _brightness_set_automate_level(status);
257
258         if (ctrl_obj->viewer != NULL) {
259                 _brightness_view_update();
260         }
261 }
262
263 static Evas_Object *_brightness_view_create(Evas_Object *list)
264 {
265         Eina_Bool ret = EINA_TRUE;
266         Evas_Object *view = NULL;
267
268         retif(list == NULL, NULL, "list parameter is NULL");
269
270         view = elm_layout_add(list);
271
272         if (view != NULL) {
273                 ret = elm_layout_file_set(view, DEFAULT_EDJ,
274                                 "quickpanel/brightness_controller/default");
275
276                 if (ret == EINA_FALSE) {
277                         ERR("failed to load brightness layout");
278                 }
279                 evas_object_size_hint_weight_set(view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
280                 evas_object_size_hint_align_set(view, EVAS_HINT_FILL, EVAS_HINT_FILL);
281                 evas_object_show(view);
282         }
283
284         return view;
285 }
286
287 static void _brightness_set_text(void)
288 {
289         brightness_ctrl_obj *ctrl_obj = g_ctrl_obj;
290         retif(ctrl_obj == NULL, , "Invalid parameter!");
291         retif(ctrl_obj->viewer == NULL, , "Invalid parameter!");
292
293         _set_text_to_part(ctrl_obj->viewer, "elm.check.text", _("IDS_QP_BODY_AUTO"));
294         _set_text_to_part(ctrl_obj->viewer, "elm.text.label", _S("IDS_COM_OPT_BRIGHTNESS"));
295 }
296
297 static void _brightness_set_image(void)
298 {
299         Evas_Object *ic = NULL;
300         Evas_Object *old_ic = NULL;
301         brightness_ctrl_obj *ctrl_obj = g_ctrl_obj;
302         retif(ctrl_obj == NULL, , "Invalid parameter!");
303         retif(ctrl_obj->viewer == NULL, , "Invalid parameter!");
304
305         old_ic = _check_duplicated_image_loading(ctrl_obj->viewer,
306                         "elm.swallow.thumbnail", QP_BRIGHTNESS_CONTROL_ICON_IMG);
307
308         if (old_ic == NULL) {
309                 ic = elm_image_add(ctrl_obj->viewer);
310
311                 if (ic != NULL) {
312                         elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
313                         elm_image_file_set(ic, QP_BRIGHTNESS_CONTROL_ICON_IMG, "elm.swallow.thumbnail");
314                         elm_object_part_content_set(ctrl_obj->viewer, "elm.swallow.thumbnail", ic);
315                 }
316         }
317 }
318
319 static void _brightness_set_checker(void)
320 {
321         Evas_Object *checker = NULL;
322         Evas_Object *old_obj = NULL;
323         brightness_ctrl_obj *ctrl_obj = g_ctrl_obj;
324         retif(ctrl_obj == NULL, , "Invalid parameter!");
325         retif(ctrl_obj->viewer == NULL, , "Invalid parameter!");
326
327         old_obj = _check_duplicated_loading(ctrl_obj->viewer,
328                         "elm.check.swallow");
329
330         if (old_obj == NULL) {
331                 checker = elm_check_add(ctrl_obj->viewer);
332
333                 if (checker != NULL) {
334                         elm_object_style_set(checker, "quickpanel");
335                         evas_object_smart_callback_add(checker,"changed",_brightness_ctrl_checker_toggle_cb , ctrl_obj);
336                         elm_object_part_content_set(ctrl_obj->viewer, "elm.check.swallow", checker);
337                 } else {
338                         ERR("failed to create checker");
339                         return ;
340                 }
341         } else {
342                 checker = old_obj;
343         }
344
345         elm_check_state_set(checker, _brightness_get_automate_level());
346 }
347
348 static void _brightness_set_slider(void)
349 {
350         int value = 0;
351         Evas_Object *slider = NULL;
352         Evas_Object *old_obj = NULL;
353         brightness_ctrl_obj *ctrl_obj = g_ctrl_obj;
354         retif(ctrl_obj == NULL, , "Invalid parameter!");
355         retif(ctrl_obj->viewer == NULL, , "Invalid parameter!");
356
357         old_obj = _check_duplicated_loading(ctrl_obj->viewer,
358                         "elm.swallow.slider");
359
360         if (old_obj == NULL) {
361                 slider = elm_slider_add(ctrl_obj->viewer);
362
363                 if (slider != NULL) {
364                         elm_object_style_set(slider, "quickpanel");
365
366                         evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, 0.0);
367                         evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5);
368                         elm_slider_min_max_set(slider, ctrl_obj->min_level, ctrl_obj->max_level);
369                         evas_object_smart_callback_add(slider, "changed",
370                                         _brightness_ctrl_slider_changed_cb, ctrl_obj);
371                         evas_object_smart_callback_add(slider, "delay,changed",
372                                         _brightness_ctrl_slider_delayed_changed_cb, ctrl_obj);
373                         evas_object_smart_callback_add(slider, "slider,drag,start",
374                                         _brightness_ctrl_slider_drag_start_cb, ctrl_obj);
375                         evas_object_smart_callback_add(slider, "slider,drag,stop",
376                                         _brightness_ctrl_slider_drag_stop_cb, ctrl_obj);
377                         elm_object_part_content_set(ctrl_obj->viewer, "elm.swallow.slider", slider);
378                 } else {
379                         ERR("failed to create slider");
380                         return ;
381                 }
382         } else {
383                 slider = old_obj;
384         }
385
386         value = _brightness_get_level();
387
388         elm_slider_value_set(slider, value);
389
390         if (_brightness_get_automate_level()) {
391                 elm_object_disabled_set(slider, EINA_TRUE);
392         } else {
393                 elm_object_disabled_set(slider, EINA_FALSE);
394         }
395 }
396
397 static void _brightness_view_update(void)
398 {
399         _brightness_set_text();
400         _brightness_set_image();
401         _brightness_set_checker();
402         _brightness_set_slider();
403 }
404
405 static void _brightness_add(brightness_ctrl_obj *ctrl_obj, void *data)
406 {
407         qp_item_data *qid = NULL;
408         struct appdata *ad;
409
410         ad = data;
411         retif(!ad->list, , "list is NULL");
412
413         ctrl_obj->viewer = _brightness_view_create(ad->list);
414         ctrl_obj->data = data;
415
416         if (ctrl_obj->viewer != NULL) {
417                 qid = quickpanel_list_util_item_new(QP_ITEM_TYPE_BRIGHTNESS, ctrl_obj);
418                 if (qid != NULL) {
419                         quickpanel_list_util_item_set_tag(ctrl_obj->viewer, qid);
420                         quickpanel_list_util_sort_insert(ad->list, ctrl_obj->viewer);
421                 } else {
422                         ERR("fail to alloc vit");
423                 }
424         } else {
425                 ERR("failed to create brightness view");
426         }
427 }
428
429 static void _brightness_remove(brightness_ctrl_obj *ctrl_obj, void *data)
430 {
431         struct appdata *ad = data;
432         retif(ad == NULL, , "list is NULL");
433         retif(ad->list == NULL, , "list is NULL");
434
435         if (g_ctrl_obj != NULL) {
436                 if (g_ctrl_obj->viewer != NULL) {
437                         quickpanel_list_util_item_unpack_by_object(ad->list
438                                         , g_ctrl_obj->viewer);
439                         quickpanel_list_util_item_del_tag(g_ctrl_obj->viewer);
440                         evas_object_del(g_ctrl_obj->viewer);
441                 }
442                 INFO("success to remove brightness controller");
443                 free(g_ctrl_obj);
444                 g_ctrl_obj = NULL;
445         }
446 }
447
448 static void _brightness_register_event_cb(brightness_ctrl_obj *ctrl_obj)
449 {
450         int ret = 0;
451         retif(ctrl_obj == NULL, , "Data parameter is NULL");
452
453         ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS,
454                         _brightness_vconf_cb, ctrl_obj);
455         if (ret != 0) {
456                 ERR("failed to register a cb key:%s err:%d",
457                                 "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret);
458         }
459 }
460
461 static void _brightness_deregister_event_cb(brightness_ctrl_obj *ctrl_obj)
462 {
463         int ret = 0;
464
465         ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, _brightness_vconf_cb);
466         if (ret != 0) {
467                 ERR("failed to register a cb key:%s err:%d", "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret);
468         }
469 }
470
471 static int quickpanel_brightness_init(void *data)
472 {
473         retif(data == NULL, QP_FAIL, "Invalid parameter!");
474
475         if (g_ctrl_obj == NULL) {
476                 g_ctrl_obj = (brightness_ctrl_obj *)malloc(sizeof(brightness_ctrl_obj));
477         }
478
479         if (g_ctrl_obj != NULL) {
480                 g_ctrl_obj->min_level = BRIGHTNESS_MIN;
481                 g_ctrl_obj->max_level = BRIGHTNESS_MAX;
482
483                 DBG("brightness range %d~%d\n", g_ctrl_obj->min_level, g_ctrl_obj->max_level);
484
485                 _brightness_add(g_ctrl_obj, data);
486                 _brightness_view_update();
487                 _brightness_register_event_cb(g_ctrl_obj);
488         }
489
490         return QP_OK;
491 }
492
493 static int quickpanel_brightness_fini(void *data)
494 {
495         retif(data == NULL, QP_FAIL, "Invalid parameter!");
496
497         if (g_ctrl_obj != NULL) {
498                 _brightness_deregister_event_cb(g_ctrl_obj);
499                 _brightness_remove(g_ctrl_obj, data);
500         }
501
502         g_ctrl_obj = NULL;
503         return QP_OK;
504 }
505
506 static void quickpanel_brightness_lang_changed(void *data)
507 {
508         retif(data == NULL, , "Invalid parameter!");
509
510         if (g_ctrl_obj != NULL && g_ctrl_obj->viewer != NULL) {
511                 _brightness_view_update();
512         }
513 }