2 * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <Elementary.h>
23 #include <notification.h>
25 #include <device/display.h>
26 #include <app_control.h>
28 #include <tzsh_quickpanel_service.h>
32 #include "quickpanel-ui.h"
33 #include "list_util.h"
34 #include "quickpanel_def.h"
35 #include "settings_view_featured.h"
36 #include "preference.h"
37 #include "setting_utils.h"
38 #include "page_setting_all.h"
40 #ifdef QP_SCREENREADER_ENABLE
41 #include "accessibility.h"
44 #ifdef QP_EMERGENCY_MODE_ENABLE
45 #include "emergency_mode.h"
49 #define BRIGHTNESS_MIN 1
50 #define BRIGHTNESS_MAX 100
51 #define BRIGHTNESS_SIG_ACTIVITY "BRIGHTNESS"
52 #define PREF_BRIGHTNESS_ON "ON"
53 #define PREF_BRIGHTNESS_OFF "OFF"
55 typedef struct _brightness_ctrl_obj {
58 int is_event_registered;
59 int last_requested_level;
65 Evas_Object *brighntess_slider;
66 } brightness_ctrl_obj;
69 int slider_drag_start = -1;
70 Eina_Bool is_sliding = EINA_FALSE;
73 static int _init(void *data);
74 static int _fini(void *data);
75 static void _lang_changed(void *data);
76 static void _qp_opened(void *data);
77 static void _qp_closed(void *data);
78 static void _brightness_view_update(void);
79 static void _brightness_register_event_cb(brightness_ctrl_obj *ctrl_obj);
80 static void _brightness_deregister_event_cb(brightness_ctrl_obj *ctrl_obj);
82 static void _brightness_set_image(int level);
83 static void _refresh(void *data);
85 QP_Module brightness_ctrl = {
86 .name = "brightness_ctrl",
93 .lang_changed = _lang_changed,
96 .qp_opened = _qp_opened,
97 .qp_closed = _qp_closed,
100 static brightness_ctrl_obj *g_ctrl_obj;
101 E_DBus_Signal_Handler *g_hdl_brightness;
103 static Evas_Object *_controller_view_get(void)
105 Evas_Object *view = NULL;
107 if (g_ctrl_obj != NULL) {
108 if (g_ctrl_obj->viewer != NULL) {
109 view = elm_object_part_content_get(g_ctrl_obj->viewer, "elm.swallow.controller");
111 view = evas_object_data_get(g_ctrl_obj->viewer, "view.controller");
119 static void _controller_view_set(Evas_Object *wrapper, Evas_Object *view)
121 retif(wrapper == NULL, , "invalid data");
122 retif(view == NULL, , "invalid data");
124 elm_object_part_content_set(wrapper, "elm.swallow.controller", view);
125 evas_object_data_set(wrapper, "view.controller", view);
128 static char *_brightness_access_state_cb(void *data, Evas_Object *obj)
130 char buf[512] = {0,};
131 brightness_ctrl_obj *ctrl_obj = data;
132 retif(NULL == ctrl_obj, NULL, "invalid data");
134 snprintf(buf, sizeof(buf) - 1, _NOT_LOCALIZED("Position %1$d of %2$d"),
135 ctrl_obj->last_requested_level, ctrl_obj->max_level);
140 #ifdef QP_SCREENREADER_ENABLE
141 static void _set_slider_accessiblity_state(Evas_Object *obj)
143 Evas_Object *ao = NULL;
144 brightness_ctrl_obj *ctrl_obj = g_ctrl_obj;
145 retif(ctrl_obj == NULL, , "Invalid parameter!");
146 retif(ctrl_obj->viewer == NULL, , "Invalid parameter!");
148 ao = quickpanel_accessibility_screen_reader_object_get(obj,
149 SCREEN_READER_OBJ_TYPE_ELM_OBJECT, NULL, NULL);
151 elm_access_info_set(ao, ELM_ACCESS_INFO, _NOT_LOCALIZED("Brightness"));
152 elm_access_info_set(ao, ELM_ACCESS_TYPE, _NOT_LOCALIZED("Slider"));
153 elm_access_info_cb_set(ao, ELM_ACCESS_STATE, _brightness_access_state_cb, ctrl_obj);
158 static Evas_Object *_check_duplicated_loading(Evas_Object *obj, const char *part)
160 Evas_Object *old_content = NULL;
161 retif(obj == NULL, NULL, "Invalid parameter!");
162 retif(part == NULL, NULL, "Invalid parameter!");
164 old_content = elm_object_part_content_get(obj, part);
165 if (old_content != NULL) {
172 static void _brightness_vconf_cb(keynode_t *key, void* data)
174 brightness_ctrl_obj *ctrl_obj = NULL;
176 retif(data == NULL, , "Data parameter is NULL");
179 if (ctrl_obj->viewer != NULL) {
180 _brightness_view_update();
184 static int _brightness_set_level(int level)
186 int ret = DEVICE_ERROR_NONE;
188 ret = device_display_set_brightness(0, level);
189 if (ret != DEVICE_ERROR_NONE) {
190 ERR("failed to set brightness");
196 static int _brightness_get_level(void) {
200 if (vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &level) == 0) {
203 return SETTING_BRIGHTNESS_LEVEL5;
207 Evas_Object *_slider_get(Evas_Object *view, brightness_ctrl_obj *ctrl_obj) {
209 retif(view == NULL, NULL, "Data parameter is NULL");
211 Evas_Object *obj = elm_object_part_content_get(view, "elm.swallow.slider");
216 return ctrl_obj->brighntess_slider;
220 static void _slider_changed_job_cb(void *data)
224 Evas_Object *obj = NULL;
225 brightness_ctrl_obj *ctrl_obj = data;
226 double time_current = 0.0;
227 static double time_before = 0.0;
229 retif(ctrl_obj == NULL, , "Data parameter is NULL");
230 obj = _slider_get(_controller_view_get(), ctrl_obj);
231 retif(obj == NULL, , "obj is NULL");
233 val = elm_slider_value_get(obj);
234 value = (int)(val + 0.5);
236 time_current = ecore_loop_time_get();
238 if (value != ctrl_obj->last_requested_level) {
239 if (value >= ctrl_obj->min_level && value <= ctrl_obj->max_level) {
240 ctrl_obj->last_requested_level = value;
241 if (time_current - time_before >= 0.045) {
242 _brightness_set_level(value);
243 time_before = time_current;
245 _brightness_set_image(value);
252 static void _brightness_ctrl_slider_changed_cb(void *data, Evas_Object *obj, void *event_info)
254 int pos_new = (long)event_info;
255 LOGI("SLIDER_NEW_POS: %d", pos_new);
257 _slider_changed_job_cb(data);
260 static void _brightness_ctrl_overheat_check(Evas_Object *slider, void *data, int is_display_popup)
263 int max_brightness = BRIGHTNESS_MAX;
264 brightness_ctrl_obj *ctrl_obj = data;
265 retif(slider == NULL, , "slider is NULL");
266 retif(ctrl_obj == NULL, , "Data parameter is NULL");
268 struct appdata *ad = quickpanel_get_app_data();
269 retif(ad == NULL, , "invalid data.");
271 value = ctrl_obj->last_requested_level;
273 device_display_get_max_brightness(0, &max_brightness);
274 if (value > max_brightness && max_brightness != BRIGHTNESS_MAX) {
275 DBG("max brightness is limited");
276 if (is_display_popup == 1) {
277 if (ad->popup == NULL) {
278 quickpanel_setting_create_timeout_popup(ad->win,
279 _("IDS_ST_POP_UNABLE_TO_INCREASE_BRIGHTNESS_FURTHER_BECAUSE_OF_PHONE_OVERHEATING"));
282 elm_slider_value_set(slider, (double)max_brightness);
283 ctrl_obj->last_requested_level = max_brightness;
284 _brightness_set_level(max_brightness);
285 _brightness_set_image(max_brightness);
290 static void _slider_delayed_changed_job_cb(void *data)
293 brightness_ctrl_obj *ctrl_obj = data;
294 Evas_Object *obj = NULL;
295 retif(ctrl_obj == NULL, , "Data parameter is NULL");
296 obj = _slider_get(_controller_view_get(), ctrl_obj);
297 retif(obj == NULL, , "obj is NULL");
299 value = ctrl_obj->last_requested_level;
301 if (value >= ctrl_obj->min_level && value <= ctrl_obj->max_level) {
302 _brightness_set_level(value);
303 _brightness_set_image(value);
307 static void _brightness_ctrl_slider_delayed_changed_cb(void *data, Evas_Object *obj, void *event_info)
310 ecore_job_add(_slider_delayed_changed_job_cb, data);
313 static void _brightness_slider_drag_start_cb(void *data, Evas_Object *obj, void *event_info)
315 is_sliding = EINA_TRUE;
316 slider_drag_start = _brightness_get_level();
319 static void _brightness_slider_drag_stop_cb(void *data, Evas_Object *obj, void *event_info)
321 is_sliding = EINA_FALSE;
325 * workaround to avoid focus jump to other pages
327 static void _frame_focused(void *data, Evas_Object * obj, void *event_info)
329 quickpanel_page_setting_all_focus_allow_set(EINA_FALSE);
332 static void _frame_unfocused(void *data, Evas_Object * obj, void *event_info)
334 quickpanel_page_setting_all_focus_allow_set(EINA_TRUE);
337 static void _brightness_view_pos_set()
339 struct appdata *ad = quickpanel_get_app_data();
342 // Evas_Coord settings_y;
343 Evas_Coord brightness_y;
345 Eina_Bool ret = EINA_FALSE;
347 edje_object_part_geometry_get(_EDJ(ad->view_root), "qp.root.swallow", NULL, &base_y, NULL, NULL);
348 // edje_object_part_geometry_get(ad->ly, QP_SETTING_BASE_PART, NULL, &settings_y, NULL, NULL);
350 Evas_Object *settings_swallow = quickpanel_setting_layout_get(ad->ly, QP_SETTING_BASE_PART);
351 ret = edje_object_part_geometry_get(_EDJ(settings_swallow), QP_SETTING_BRIGHTNESS_PART_WVGA, NULL, &brightness_y, NULL, NULL);
352 msgif(!ret, "ret is EINA_FALSE");
354 evas_object_move(g_ctrl_obj->viewer, 0, base_y + /*settings_y */+ brightness_y);
357 static Evas_Object *_brightness_view_create(Evas_Object *list)
359 Eina_Bool ret = EINA_TRUE;
360 Evas_Object *view_wrapper = NULL;
361 Evas_Object *view = NULL;
363 retif(list == NULL, NULL, "list parameter is NULL");
365 view_wrapper = elm_layout_add(list);
366 if (view_wrapper != NULL) {
367 ret = elm_layout_file_set(view_wrapper, DEFAULT_EDJ,
368 "quickpanel/brightness_controller/wrapper");
369 if (ret == EINA_FALSE) {
370 ERR("failed to load brightness wapper layout");
372 evas_object_size_hint_weight_set(view_wrapper, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
373 evas_object_size_hint_align_set(view_wrapper, EVAS_HINT_FILL, EVAS_HINT_FILL);
375 view = elm_layout_add(view_wrapper);
377 ret = elm_layout_file_set(view, DEFAULT_EDJ,
378 "quickpanel/brightness_controller/default");
380 if (ret == EINA_FALSE) {
381 ERR("failed to load brightness layout");
383 evas_object_size_hint_weight_set(view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
384 evas_object_size_hint_align_set(view, EVAS_HINT_FILL, EVAS_HINT_FILL);
386 Evas_Object *focus = quickpanel_accessibility_ui_get_focus_object(view);
387 elm_access_info_cb_set(focus, ELM_ACCESS_TYPE, quickpanel_accessibility_info_cb_s, _NOT_LOCALIZED("Brightness"));
388 elm_object_part_content_set(view, "focus", focus);
390 evas_object_smart_callback_add(focus, "focused", _frame_focused, NULL);
391 evas_object_smart_callback_add(focus, "unfocused", _frame_unfocused, NULL);
392 evas_object_show(view);
393 _brightness_view_pos_set();
395 g_ctrl_obj->brighntess_slider = view;
396 _controller_view_set(view_wrapper, view);
397 evas_object_show(view_wrapper);
404 static void _brightness_set_image(int level)
409 ERR("Ctrl Obj is not defined");
415 } else if (level >= 100) {
417 } else if (level > 1 && level <= 9){
420 mapped_level = (level / 10);
423 if (g_ctrl_obj->level_before != mapped_level ) {
424 char buf[128] = {0,};
427 view = _controller_view_get();
428 snprintf(buf, sizeof(buf) - 1, "icon.state.%d", mapped_level);
429 elm_object_signal_emit(view, buf, "prog");
430 g_ctrl_obj->level_before = mapped_level;
434 static void _brightness_set_slider(void)
437 Evas_Object *slider = NULL;
438 Evas_Object *old_obj = NULL;
439 brightness_ctrl_obj *ctrl_obj = g_ctrl_obj;
440 Evas_Object *view = _controller_view_get();
441 retif(ctrl_obj == NULL, , "Invalid parameter!");
442 retif(view == NULL, , "Invalid parameter!");
444 old_obj = _check_duplicated_loading(view, "elm.swallow.slider");
446 if (old_obj == NULL) {
447 slider = elm_slider_add(view);
449 if (slider != NULL) {
450 evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, 0.0);
451 evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5);
452 elm_slider_min_max_set(slider, ctrl_obj->min_level, ctrl_obj->max_level);
453 evas_object_smart_callback_add(slider, "changed", _brightness_ctrl_slider_changed_cb, ctrl_obj);
454 evas_object_smart_callback_add(slider, "delay,changed", _brightness_ctrl_slider_delayed_changed_cb, ctrl_obj);
455 evas_object_smart_callback_add(slider, "slider,drag,start", _brightness_slider_drag_start_cb, ctrl_obj);
456 evas_object_smart_callback_add(slider, "slider,drag,stop", _brightness_slider_drag_stop_cb, ctrl_obj);
457 elm_object_part_content_set(view, "elm.swallow.slider", slider);
459 ERR("failed to create slider");
466 elm_object_style_set(slider, "quickpanel_style");
468 elm_slider_indicator_format_set(slider, NULL);
469 elm_slider_indicator_format_function_set(slider, NULL, NULL);
470 elm_slider_indicator_show_set(slider, EINA_FALSE);
472 #ifdef QP_SCREENREADER_ENABLE
473 _set_slider_accessiblity_state(slider);
476 value = _brightness_get_level();
477 elm_slider_value_set(slider, value);
478 _brightness_set_image(value);
481 static void _focus_pair_set()
483 brightness_ctrl_obj *ctrl_obj = g_ctrl_obj;
484 Evas_Object *focus = NULL;
485 Evas_Object *slider = NULL;
486 Evas_Object *view = _controller_view_get();
487 retif(ctrl_obj == NULL, , "Invalid parameter!");
488 retif(view == NULL, , "Invalid parameter!");
490 focus = elm_object_part_content_get(view, "focus");
491 slider = elm_object_part_content_get(view, "elm.swallow.slider");
493 if (focus != NULL && slider != NULL) {
495 elm_object_focus_next_object_set(focus, slider, ELM_FOCUS_RIGHT);
496 elm_object_focus_next_object_set(focus, slider, ELM_FOCUS_DOWN);
499 elm_object_focus_next_object_set(slider, focus, ELM_FOCUS_LEFT);
500 elm_object_focus_next_object_set(slider, focus, ELM_FOCUS_UP);
504 static void _brightness_view_update(void)
506 _brightness_set_slider();
510 static void _brightness_add(brightness_ctrl_obj *ctrl_obj, void *data)
512 struct appdata *ad = data;
513 retif(!ad, , "list is NULL");
514 retif(!ad->list, , "list is NULL");
515 retif(ctrl_obj == NULL, , "ctrl_obj is null");
516 retif(ctrl_obj->viewer != NULL, , "viewer is already created");
518 ctrl_obj->viewer = _brightness_view_create(ad->list);
519 ctrl_obj->data = data;
521 _brightness_set_image(BRIGHTNESS_MIN);
525 static void _brightness_remove(brightness_ctrl_obj *ctrl_obj, void *data)
527 struct appdata *ad = data;
528 retif(ad == NULL, , "list is NULL");
529 retif(ad->list == NULL, , "list is NULL");
531 if (g_ctrl_obj != NULL) {
532 if (g_ctrl_obj->viewer != NULL) {
533 quickpanel_list_util_item_unpack_by_object(ad->list
534 , g_ctrl_obj->viewer, 0, 0);
535 quickpanel_list_util_item_del_tag(g_ctrl_obj->viewer);
536 evas_object_del(g_ctrl_obj->viewer);
537 g_ctrl_obj->viewer = NULL;
539 DBG("brightness controller is removed");
545 static void _brightness_register_event_cb(brightness_ctrl_obj *ctrl_obj)
548 retif(ctrl_obj == NULL, , "Data parameter is NULL");
550 if (ctrl_obj->is_event_registered == 0) {
551 ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS,
552 _brightness_vconf_cb, ctrl_obj);
554 ERR("failed to register a cb key:%s err:%d",
555 "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret);
557 ctrl_obj->is_event_registered = 1;
561 static void _brightness_deregister_event_cb(brightness_ctrl_obj *ctrl_obj)
564 retif(ctrl_obj == NULL, , "Data parameter is NULL");
566 if (ctrl_obj->is_event_registered == 1) {
567 ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, _brightness_vconf_cb);
569 ERR("failed to register a cb key:%s err:%d", "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret);
571 ctrl_obj->is_event_registered = 0;
575 static void _brightness_create(void *data)
577 if (g_ctrl_obj == NULL) {
578 g_ctrl_obj = (brightness_ctrl_obj *)calloc(1, sizeof(brightness_ctrl_obj));
579 if (g_ctrl_obj != NULL) {
580 g_ctrl_obj->min_level = BRIGHTNESS_MIN;
581 g_ctrl_obj->max_level = BRIGHTNESS_MAX;
582 g_ctrl_obj->last_requested_level = _brightness_get_level();
584 _brightness_add(g_ctrl_obj, data);
585 _brightness_view_update();
586 _brightness_register_event_cb(g_ctrl_obj);
588 g_ctrl_obj->brighntess_slider = NULL;
590 DBG("brightness controller is created");
595 static void _brightness_destroy(void *data)
597 if (g_ctrl_obj != NULL) {
598 _brightness_deregister_event_cb(g_ctrl_obj);
599 _brightness_remove(g_ctrl_obj, data);
601 DBG("brightness controller is removed");
607 static void _handler_brightness(void *data, DBusMessage *msg)
613 retif(data == NULL || msg == NULL, , "Invalid parameter!");
615 dbus_error_init(&err);
616 ret = dbus_message_get_args(msg, &err,
617 DBUS_TYPE_STRING, &key,
618 DBUS_TYPE_STRING, &value,
620 retif(ret == 0, , "dbus_message_get_args error");
621 retif(key == NULL, , "Failed to get key");
622 retif(value == NULL, , "Failed to get value");
624 if (dbus_error_is_set(&err)) {
625 ERR("dbus err: %s", err.message);
626 dbus_error_free(&err);
630 if (strcmp(key, "visibility") == 0) {
631 if (strcmp(value, PREF_BRIGHTNESS_ON) == 0) {
632 _brightness_create(data);
633 quickpanel_preference_set(PREF_BRIGHTNESS, PREF_BRIGHTNESS_ON);
634 } else if (strcmp(value, PREF_BRIGHTNESS_OFF) == 0) {
635 _brightness_destroy(data);
636 quickpanel_preference_set(PREF_BRIGHTNESS, PREF_BRIGHTNESS_OFF);
641 static void _ipc_init(void *data)
643 struct appdata *ad = data;
644 retif(ad == NULL, , "Invalid parameter!");
645 retif(ad->dbus_connection == NULL, , "Invalid parameter!");
648 e_dbus_signal_handler_add(ad->dbus_connection, NULL,
651 BRIGHTNESS_SIG_ACTIVITY,
652 _handler_brightness, data);
653 msgif(g_hdl_brightness == NULL, "fail to add size signal");
656 static void _ipc_fini(void *data)
658 struct appdata *ad = data;
659 retif(ad == NULL, , "Invalid parameter!");
660 retif(ad->dbus_connection == NULL, , "Invalid parameter!");
662 if (g_hdl_brightness != NULL) {
663 e_dbus_signal_handler_del(ad->dbus_connection, g_hdl_brightness);
664 g_hdl_brightness = NULL;
668 static int _init(void *data)
670 retif(data == NULL, QP_FAIL, "Invalid parameter!");
672 #ifdef QP_EMERGENCY_MODE_ENABLE
673 if (quickpanel_emergency_mode_is_on()) {
678 _brightness_create(data);
685 static int _fini(void *data)
687 retif(data == NULL, QP_FAIL, "Invalid parameter!");
690 _brightness_destroy(data);
695 static void _lang_changed(void *data)
697 retif(data == NULL, , "Invalid parameter!");
699 if (g_ctrl_obj != NULL && g_ctrl_obj->viewer != NULL) {
700 _brightness_view_update();
704 static void _qp_opened(void *data)
706 Evas_Object *slider = NULL;
707 Evas_Object *view = _controller_view_get();
708 retif(g_ctrl_obj == NULL, , "Invalid parameter!");
709 retif(view == NULL, , "Invalid parameter!");
712 _brightness_view_update();
713 slider = elm_object_part_content_get(view, "elm.swallow.slider");
714 if (slider != NULL) {
715 DBG("quickpanel opened");
716 _brightness_ctrl_overheat_check(slider, g_ctrl_obj, 0);
721 static void _qp_closed(void *data)
723 retif(g_ctrl_obj == NULL, , "Invalid parameter!");
725 if (g_ctrl_obj->viewer != NULL) {
726 _brightness_view_update();
730 static void _refresh(void *data)
733 struct appdata *ad = data;
734 Evas_Object *view = _controller_view_get();
735 retif(ad == NULL, , "Invalid parameter!");
736 retif(g_ctrl_obj == NULL, , "Invalid parameter!");
737 retif(g_ctrl_obj->viewer == NULL, , "Invalid parameter!");
738 retif(view == NULL, , "Invalid parameter!");
740 evas_object_geometry_get(g_ctrl_obj->viewer, NULL, NULL, NULL, &h);
742 if (ad->angle == 90 || ad->angle == 270) {
743 evas_object_resize(g_ctrl_obj->viewer, ad->win_height, h);
744 evas_object_resize(view, ad->win_height, h);
745 _brightness_view_pos_set();
748 evas_object_resize(g_ctrl_obj->viewer, ad->win_width, h);
749 evas_object_resize(view, ad->win_width, h);
750 _brightness_view_pos_set();