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.
22 #include <device/display.h>
23 #include <app_control.h>
26 #include "quickpanel-ui.h"
27 #include "list_util.h"
28 #include "quickpanel_def.h"
29 #ifdef QP_SCREENREADER_ENABLE
30 #include "accessibility.h"
32 #include "preference.h"
33 #include "setting_utils.h"
34 #ifdef QP_EMERGENCY_MODE_ENABLE
35 #include "emergency_mode.h"
37 #include "page_setting_all.h"
38 #include "settings_view_featured.h"
40 #define BRIGHTNESS_MIN 1
41 #define BRIGHTNESS_MAX 100
42 #define BRIGHTNESS_SIG_ACTIVITY "BRIGHTNESS"
43 #define PREF_BRIGHTNESS_ON "ON"
44 #define PREF_BRIGHTNESS_OFF "OFF"
46 typedef struct _brightness_ctrl_obj {
49 int is_event_registered;
50 int last_requested_level;
56 Evas_Object *brighntess_slider;
57 } brightness_ctrl_obj;
60 int slider_drag_start = -1;
61 Eina_Bool is_sliding = EINA_FALSE;
64 static int _init(void *data);
65 static int _fini(void *data);
66 static void _lang_changed(void *data);
67 static void _qp_opened(void *data);
68 static void _qp_closed(void *data);
69 static void _brightness_view_update(void);
70 static void _brightness_register_event_cb(brightness_ctrl_obj *ctrl_obj);
71 static void _brightness_deregister_event_cb(brightness_ctrl_obj *ctrl_obj);
73 static void _brightness_set_image(int level);
74 static void _refresh(void *data);
76 QP_Module brightness_ctrl = {
77 .name = "brightness_ctrl",
84 .lang_changed = _lang_changed,
87 .qp_opened = _qp_opened,
88 .qp_closed = _qp_closed,
91 static brightness_ctrl_obj *g_ctrl_obj;
92 E_DBus_Signal_Handler *g_hdl_brightness;
94 static Evas_Object *_controller_view_get(void)
96 Evas_Object *view = NULL;
98 if (g_ctrl_obj != NULL) {
99 if (g_ctrl_obj->viewer != NULL) {
100 view = elm_object_part_content_get(g_ctrl_obj->viewer, "elm.swallow.controller");
102 view = evas_object_data_get(g_ctrl_obj->viewer, "view.controller");
110 static void _controller_view_set(Evas_Object *wrapper, Evas_Object *view)
112 retif(wrapper == NULL, , "invalid data");
113 retif(view == NULL, , "invalid data");
115 elm_object_part_content_set(wrapper, "elm.swallow.controller", view);
116 evas_object_data_set(wrapper, "view.controller", view);
119 static char *_brightness_access_state_cb(void *data, Evas_Object *obj)
121 char buf[512] = {0,};
122 brightness_ctrl_obj *ctrl_obj = data;
123 retif(NULL == ctrl_obj, NULL, "invalid data");
125 snprintf(buf, sizeof(buf) - 1, _NOT_LOCALIZED("Position %1$d of %2$d"),
126 ctrl_obj->last_requested_level, ctrl_obj->max_level);
131 #ifdef QP_SCREENREADER_ENABLE
132 static void _set_slider_accessiblity_state(Evas_Object *obj)
134 Evas_Object *ao = NULL;
135 brightness_ctrl_obj *ctrl_obj = g_ctrl_obj;
136 retif(ctrl_obj == NULL, , "Invalid parameter!");
137 retif(ctrl_obj->viewer == NULL, , "Invalid parameter!");
139 ao = quickpanel_accessibility_screen_reader_object_get(obj,
140 SCREEN_READER_OBJ_TYPE_ELM_OBJECT, NULL, NULL);
142 elm_access_info_set(ao, ELM_ACCESS_INFO, _NOT_LOCALIZED("Brightness"));
143 elm_access_info_set(ao, ELM_ACCESS_TYPE, _NOT_LOCALIZED("Slider"));
144 elm_access_info_cb_set(ao, ELM_ACCESS_STATE, _brightness_access_state_cb, ctrl_obj);
149 static void _set_text_to_part(Evas_Object *obj, const char *part, const char *text)
151 const char *old_text = NULL;
152 retif(obj == NULL, , "Invalid parameter!");
153 retif(part == NULL, , "Invalid parameter!");
154 retif(text == NULL, , "Invalid parameter!");
156 old_text = elm_object_part_text_get(obj, part);
157 if (old_text != NULL) {
158 if (strcmp(old_text, text) == 0) {
163 elm_object_part_text_set(obj, part, text);
166 static Evas_Object *_check_duplicated_loading(Evas_Object *obj, const char *part)
168 Evas_Object *old_content = NULL;
169 retif(obj == NULL, NULL, "Invalid parameter!");
170 retif(part == NULL, NULL, "Invalid parameter!");
172 old_content = elm_object_part_content_get(obj, part);
173 if (old_content != NULL) {
180 static void _brightness_vconf_cb(keynode_t *key, void* data)
182 brightness_ctrl_obj *ctrl_obj = NULL;
184 retif(data == NULL, , "Data parameter is NULL");
187 if (ctrl_obj->viewer != NULL) {
188 _brightness_view_update();
192 static int _brightness_set_level(int level)
194 int ret = DEVICE_ERROR_NONE;
196 ret = device_display_set_brightness(0, level);
197 if (ret != DEVICE_ERROR_NONE) {
198 ERR("failed to set brightness");
204 static int _brightness_get_level(void) {
208 if (vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &level) == 0) {
211 return SETTING_BRIGHTNESS_LEVEL5;
215 Evas_Object *_slider_get(Evas_Object *view, brightness_ctrl_obj *ctrl_obj) {
217 retif(view == NULL, NULL, "Data parameter is NULL");
219 Evas_Object *obj = elm_object_part_content_get(view, "elm.swallow.slider");
224 return ctrl_obj->brighntess_slider;
229 static void _slider_changed_job_cb(void *data)
233 Evas_Object *obj = NULL;
234 brightness_ctrl_obj *ctrl_obj = data;
235 double time_current = 0.0;
236 static double time_before = 0.0;
238 retif(ctrl_obj == NULL, , "Data parameter is NULL");
239 obj = _slider_get(_controller_view_get(), ctrl_obj);
240 retif(obj == NULL, , "obj is NULL");
242 val = elm_slider_value_get(obj);
243 value = (int)(val + 0.5);
245 time_current = ecore_loop_time_get();
247 if (value != ctrl_obj->last_requested_level) {
248 if (value >= ctrl_obj->min_level && value <= ctrl_obj->max_level) {
249 ctrl_obj->last_requested_level = value;
250 if (time_current - time_before >= 0.045) {
251 _brightness_set_level(value);
252 time_before = time_current;
254 _brightness_set_image(value);
262 _brightness_ctrl_slider_changed_cb(void *data,
266 int pos_new = (int)event_info;
267 LOGI("SLIDER_NEW_POS: %d", pos_new);
269 _slider_changed_job_cb(data);
273 static void _brightness_ctrl_overheat_check(Evas_Object *slider, void *data, int is_display_popup)
276 int max_brightness = BRIGHTNESS_MAX;
277 brightness_ctrl_obj *ctrl_obj = data;
278 retif(slider == NULL, , "slider is NULL");
279 retif(ctrl_obj == NULL, , "Data parameter is NULL");
281 struct appdata *ad = quickpanel_get_app_data();
282 retif(ad == NULL, , "invalid data.");
284 value = ctrl_obj->last_requested_level;
286 device_display_get_max_brightness(0, &max_brightness);
287 if (value > max_brightness && max_brightness != BRIGHTNESS_MAX) {
288 DBG("max brightness is limited");
289 if (is_display_popup == 1) {
290 if (ad->popup == NULL) {
291 quickpanel_setting_create_timeout_popup(ad->win,
292 _("IDS_ST_POP_UNABLE_TO_INCREASE_BRIGHTNESS_FURTHER_BECAUSE_OF_PHONE_OVERHEATING"));
295 elm_slider_value_set(slider, (double)max_brightness);
296 ctrl_obj->last_requested_level = max_brightness;
297 _brightness_set_level(max_brightness);
298 _brightness_set_image(max_brightness);
303 static void _slider_delayed_changed_job_cb(void *data)
306 brightness_ctrl_obj *ctrl_obj = data;
307 Evas_Object *obj = NULL;
308 retif(ctrl_obj == NULL, , "Data parameter is NULL");
309 obj = _slider_get(_controller_view_get(), ctrl_obj);
310 retif(obj == NULL, , "obj is NULL");
312 value = ctrl_obj->last_requested_level;
314 if (value >= ctrl_obj->min_level && value <= ctrl_obj->max_level) {
315 _brightness_set_level(value);
316 _brightness_set_image(value);
321 _brightness_ctrl_slider_delayed_changed_cb(void *data,
326 ecore_job_add(_slider_delayed_changed_job_cb, data);
330 _brightness_slider_drag_start_cb(void *data,
334 is_sliding = EINA_TRUE;
335 slider_drag_start = _brightness_get_level();
339 _brightness_slider_drag_stop_cb(void *data,
343 brightness_ctrl_obj *ctrl_obj = data;
344 is_sliding = EINA_FALSE;
349 * workaround to avoid focus jump to other pages
351 static void _frame_focused(void *data, Evas_Object * obj, void *event_info)
353 quickpanel_page_setting_all_focus_allow_set(EINA_FALSE);
356 static void _frame_unfocused(void *data, Evas_Object * obj, void *event_info)
358 quickpanel_page_setting_all_focus_allow_set(EINA_TRUE);
362 static void _brightness_view_pos_set()
364 struct appdata *ad = quickpanel_get_app_data();
367 // Evas_Coord settings_y;
368 Evas_Coord brightness_y;
370 Eina_Bool ret = EINA_FALSE;
372 edje_object_part_geometry_get(_EDJ(ad->view_root), "qp.root.swallow", NULL, &base_y, NULL, NULL);
373 // edje_object_part_geometry_get(ad->ly, QP_SETTING_BASE_PART, NULL, &settings_y, NULL, NULL);
375 Evas_Object *settings_swallow = quickpanel_setting_layout_get(ad->ly, QP_SETTING_BASE_PART);
376 ret = edje_object_part_geometry_get(_EDJ(settings_swallow), QP_SETTING_BRIGHTNESS_PART_WVGA, NULL, &brightness_y, NULL, NULL);
377 msgif(!ret, "ret is EINA_FALSE");
379 evas_object_move(g_ctrl_obj->viewer, 0, base_y + /*settings_y */+ brightness_y);
382 static Evas_Object *_brightness_view_create(Evas_Object *list)
384 Eina_Bool ret = EINA_TRUE;
385 Evas_Object *view_wrapper = NULL;
386 Evas_Object *view = NULL;
388 retif(list == NULL, NULL, "list parameter is NULL");
390 view_wrapper = elm_layout_add(list);
391 if (view_wrapper != NULL) {
392 ret = elm_layout_file_set(view_wrapper, DEFAULT_EDJ,
393 "quickpanel/brightness_controller/wrapper");
394 if (ret == EINA_FALSE) {
395 ERR("failed to load brightness wapper layout");
397 evas_object_size_hint_weight_set(view_wrapper, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
398 evas_object_size_hint_align_set(view_wrapper, EVAS_HINT_FILL, EVAS_HINT_FILL);
400 view = elm_layout_add(view_wrapper);
402 ret = elm_layout_file_set(view, DEFAULT_EDJ,
403 "quickpanel/brightness_controller/default");
405 if (ret == EINA_FALSE) {
406 ERR("failed to load brightness layout");
408 evas_object_size_hint_weight_set(view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
409 evas_object_size_hint_align_set(view, EVAS_HINT_FILL, EVAS_HINT_FILL);
411 Evas_Object *focus = quickpanel_accessibility_ui_get_focus_object(view);
412 elm_access_info_cb_set(focus, ELM_ACCESS_TYPE, quickpanel_accessibility_info_cb_s, _NOT_LOCALIZED("Brightness"));
413 elm_object_part_content_set(view, "focus", focus);
415 evas_object_smart_callback_add(focus, "focused", _frame_focused, NULL);
416 evas_object_smart_callback_add(focus, "unfocused", _frame_unfocused, NULL);
417 evas_object_show(view);
418 _brightness_view_pos_set();
420 g_ctrl_obj->brighntess_slider = view;
421 _controller_view_set(view_wrapper, view);
422 evas_object_show(view_wrapper);
430 static void _brightness_set_image(int level)
432 int old_brightness_type = -1;
433 int mapped_level = 0;
434 char buf[128] = {0,};
435 Evas_Object *view = _controller_view_get();
436 brightness_ctrl_obj *ctrl_obj = g_ctrl_obj;
437 retif(ctrl_obj == NULL, , "Invalid parameter!");
438 retif(view == NULL, , "Invalid parameter!");
442 } else if (level >= 100) {
444 } else if (level > 1 && level <= 9){
447 mapped_level = (level / 10);
450 if (ctrl_obj->level_before != mapped_level ) {
451 snprintf(buf, sizeof(buf) - 1, "icon.state.%d", mapped_level);
452 elm_object_signal_emit(view, buf, "prog");
453 ctrl_obj->level_before = mapped_level;
457 static void _brightness_set_slider(void)
460 Evas_Object *slider = NULL;
461 Evas_Object *old_obj = NULL;
462 brightness_ctrl_obj *ctrl_obj = g_ctrl_obj;
463 Evas_Object *view = _controller_view_get();
464 retif(ctrl_obj == NULL, , "Invalid parameter!");
465 retif(view == NULL, , "Invalid parameter!");
467 old_obj = _check_duplicated_loading(view, "elm.swallow.slider");
469 if (old_obj == NULL) {
470 slider = elm_slider_add(view);
472 if (slider != NULL) {
473 evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, 0.0);
474 evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5);
475 elm_slider_min_max_set(slider, ctrl_obj->min_level, ctrl_obj->max_level);
476 evas_object_smart_callback_add(slider, "changed",
477 _brightness_ctrl_slider_changed_cb, ctrl_obj);
478 evas_object_smart_callback_add(slider, "delay,changed",
479 _brightness_ctrl_slider_delayed_changed_cb, ctrl_obj);
481 evas_object_smart_callback_add(slider, "slider,drag,start",
482 _brightness_slider_drag_start_cb, ctrl_obj);
485 evas_object_smart_callback_add(slider, "slider,drag,stop",
486 _brightness_slider_drag_stop_cb, ctrl_obj);
488 elm_object_part_content_set(view, "elm.swallow.slider", slider);
490 ERR("failed to create slider");
497 elm_object_style_set(slider, "quickpanel_style");
499 elm_slider_indicator_format_set(slider, NULL);
500 elm_slider_indicator_format_function_set(slider, NULL, NULL);
501 elm_slider_indicator_show_set(slider, EINA_FALSE);
503 #ifdef QP_SCREENREADER_ENABLE
504 _set_slider_accessiblity_state(slider);
507 value = _brightness_get_level();
508 elm_slider_value_set(slider, value);
509 _brightness_set_image(value);
512 static void _focus_pair_set()
514 brightness_ctrl_obj *ctrl_obj = g_ctrl_obj;
515 Evas_Object *focus = NULL;
516 Evas_Object *slider = NULL;
517 Evas_Object *view = _controller_view_get();
518 retif(ctrl_obj == NULL, , "Invalid parameter!");
519 retif(view == NULL, , "Invalid parameter!");
521 focus = elm_object_part_content_get(view, "focus");
522 slider = elm_object_part_content_get(view, "elm.swallow.slider");
524 if (focus != NULL && slider != NULL) {
526 elm_object_focus_next_object_set(focus, slider, ELM_FOCUS_RIGHT);
527 elm_object_focus_next_object_set(focus, slider, ELM_FOCUS_DOWN);
530 elm_object_focus_next_object_set(slider, focus, ELM_FOCUS_LEFT);
531 elm_object_focus_next_object_set(slider, focus, ELM_FOCUS_UP);
535 static void _brightness_view_update(void)
537 _brightness_set_slider();
541 static void _brightness_add(brightness_ctrl_obj *ctrl_obj, void *data)
543 struct appdata *ad = data;
544 retif(!ad, , "list is NULL");
545 retif(!ad->list, , "list is NULL");
546 retif(ctrl_obj == NULL, , "ctrl_obj is null");
547 retif(ctrl_obj->viewer != NULL, , "viewer is already created");
549 ctrl_obj->viewer = _brightness_view_create(ad->list);
550 ctrl_obj->data = data;
552 _brightness_set_image(BRIGHTNESS_MIN);
556 static void _brightness_remove(brightness_ctrl_obj *ctrl_obj, void *data)
558 struct appdata *ad = data;
559 retif(ad == NULL, , "list is NULL");
560 retif(ad->list == NULL, , "list is NULL");
562 if (g_ctrl_obj != NULL) {
563 if (g_ctrl_obj->viewer != NULL) {
564 quickpanel_list_util_item_unpack_by_object(ad->list
565 , g_ctrl_obj->viewer, 0, 0);
566 quickpanel_list_util_item_del_tag(g_ctrl_obj->viewer);
567 evas_object_del(g_ctrl_obj->viewer);
568 g_ctrl_obj->viewer = NULL;
570 DBG("brightness controller is removed");
576 static void _brightness_register_event_cb(brightness_ctrl_obj *ctrl_obj)
579 retif(ctrl_obj == NULL, , "Data parameter is NULL");
581 if (ctrl_obj->is_event_registered == 0) {
582 ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS,
583 _brightness_vconf_cb, ctrl_obj);
585 ERR("failed to register a cb key:%s err:%d",
586 "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret);
588 ctrl_obj->is_event_registered = 1;
592 static void _brightness_deregister_event_cb(brightness_ctrl_obj *ctrl_obj)
595 retif(ctrl_obj == NULL, , "Data parameter is NULL");
597 if (ctrl_obj->is_event_registered == 1) {
598 ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, _brightness_vconf_cb);
600 ERR("failed to register a cb key:%s err:%d", "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret);
602 ctrl_obj->is_event_registered = 0;
606 static void _brightness_create(void *data)
608 if (g_ctrl_obj == NULL) {
609 g_ctrl_obj = (brightness_ctrl_obj *)calloc(1, sizeof(brightness_ctrl_obj));
610 if (g_ctrl_obj != NULL) {
611 g_ctrl_obj->min_level = BRIGHTNESS_MIN;
612 g_ctrl_obj->max_level = BRIGHTNESS_MAX;
613 g_ctrl_obj->last_requested_level = _brightness_get_level();
615 _brightness_add(g_ctrl_obj, data);
616 _brightness_view_update();
617 _brightness_register_event_cb(g_ctrl_obj);
619 g_ctrl_obj->brighntess_slider = NULL;
621 DBG("brightness controller is created");
626 static void _brightness_destroy(void *data)
628 if (g_ctrl_obj != NULL) {
629 _brightness_deregister_event_cb(g_ctrl_obj);
630 _brightness_remove(g_ctrl_obj, data);
632 DBG("brightness controller is removed");
638 static void _handler_brightness(void *data, DBusMessage *msg)
644 retif(data == NULL || msg == NULL, , "Invalid parameter!");
646 dbus_error_init(&err);
647 ret = dbus_message_get_args(msg, &err,
648 DBUS_TYPE_STRING, &key,
649 DBUS_TYPE_STRING, &value,
651 retif(ret == 0, , "dbus_message_get_args error");
652 retif(key == NULL, , "Failed to get key");
653 retif(value == NULL, , "Failed to get value");
655 if (dbus_error_is_set(&err)) {
656 ERR("dbus err: %s", err.message);
657 dbus_error_free(&err);
661 if (strcmp(key, "visibility") == 0) {
662 if (strcmp(value, PREF_BRIGHTNESS_ON) == 0) {
663 _brightness_create(data);
664 quickpanel_preference_set(PREF_BRIGHTNESS, PREF_BRIGHTNESS_ON);
665 } else if (strcmp(value, PREF_BRIGHTNESS_OFF) == 0) {
666 _brightness_destroy(data);
667 quickpanel_preference_set(PREF_BRIGHTNESS, PREF_BRIGHTNESS_OFF);
672 static void _ipc_init(void *data)
674 struct appdata *ad = data;
675 retif(ad == NULL, , "Invalid parameter!");
676 retif(ad->dbus_connection == NULL, , "Invalid parameter!");
679 e_dbus_signal_handler_add(ad->dbus_connection, NULL,
682 BRIGHTNESS_SIG_ACTIVITY,
683 _handler_brightness, data);
684 msgif(g_hdl_brightness == NULL, "fail to add size signal");
687 static void _ipc_fini(void *data)
689 struct appdata *ad = data;
690 retif(ad == NULL, , "Invalid parameter!");
691 retif(ad->dbus_connection == NULL, , "Invalid parameter!");
693 if (g_hdl_brightness != NULL) {
694 e_dbus_signal_handler_del(ad->dbus_connection, g_hdl_brightness);
695 g_hdl_brightness = NULL;
699 static int _init(void *data)
701 char buf[PREF_LEN_VALUE_MAX] = {0,};
702 retif(data == NULL, QP_FAIL, "Invalid parameter!");
704 #ifdef QP_EMERGENCY_MODE_ENABLE
705 if (quickpanel_emergency_mode_is_on()) {
710 quickpanel_preference_get(PREF_BRIGHTNESS, buf);
711 _brightness_create(data);
718 static int _fini(void *data)
720 retif(data == NULL, QP_FAIL, "Invalid parameter!");
723 _brightness_destroy(data);
728 static void _lang_changed(void *data)
730 retif(data == NULL, , "Invalid parameter!");
732 if (g_ctrl_obj != NULL && g_ctrl_obj->viewer != NULL) {
733 _brightness_view_update();
737 static void _qp_opened(void *data)
739 Evas_Object *slider = NULL;
740 Evas_Object *view = _controller_view_get();
741 retif(g_ctrl_obj == NULL, , "Invalid parameter!");
742 retif(view == NULL, , "Invalid parameter!");
745 _brightness_view_update();
746 slider = elm_object_part_content_get(view, "elm.swallow.slider");
747 if (slider != NULL) {
748 DBG("quickpanel opened");
749 _brightness_ctrl_overheat_check(slider, g_ctrl_obj, 0);
754 static void _qp_closed(void *data)
756 retif(g_ctrl_obj == NULL, , "Invalid parameter!");
758 if (g_ctrl_obj->viewer != NULL) {
759 _brightness_view_update();
763 static void _refresh(void *data)
766 struct appdata *ad = data;
767 Evas_Object *view = _controller_view_get();
768 retif(ad == NULL, , "Invalid parameter!");
769 retif(g_ctrl_obj == NULL, , "Invalid parameter!");
770 retif(g_ctrl_obj->viewer == NULL, , "Invalid parameter!");
771 retif(view == NULL, , "Invalid parameter!");
773 evas_object_geometry_get(g_ctrl_obj->viewer, NULL, NULL, NULL, &h);
775 if (ad->angle == 90 || ad->angle == 270) {
776 evas_object_resize(g_ctrl_obj->viewer, ad->win_height, h);
777 evas_object_resize(view, ad->win_height, h);
778 _brightness_view_pos_set();
781 evas_object_resize(g_ctrl_obj->viewer, ad->win_width, h);
782 evas_object_resize(view, ad->win_width, h);
783 _brightness_view_pos_set();