2 * Copyright (c) 2009-2014 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.
21 #include <vconf-keys.h>
24 #include "_util_efl.h"
25 #include "_util_log.h"
30 #include "key_event.h"
33 static struct _s_info {
35 Evas_Object *ly_outer;
36 Evas_Object *icon_volume;
37 Evas_Object *icon_setting;
40 Evas_Object *lockscreen_splash;
42 Evas_Object *ao_settings;
44 Eina_Bool is_registered_callback;
45 Eina_Bool is_slider_touching;
46 Eina_Bool is_warning_displayed;
54 .lockscreen_splash = NULL,
58 .is_registered_callback = EINA_FALSE,
59 .is_slider_touching = EINA_FALSE,
60 .is_warning_displayed = EINA_FALSE
63 static void _button_cb(void *data, Evas_Object *obj, void *event_info);
64 static void _button_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
66 Evas_Object* volume_view_win_get(void)
71 Evas_Object* volume_view_outer_layout_get(void)
73 return s_info.ly_outer;
76 Evas_Object* volume_view_icon_volume_get(void)
78 return s_info.icon_volume;
81 Evas_Object* volume_view_icon_setting_get(void)
83 return s_info.icon_setting;
86 Evas_Object* volume_view_slider_get(void)
91 Eina_Bool volume_view_is_registered_callback_get(void)
93 return s_info.is_registered_callback;
96 Eina_Bool volume_view_is_slider_touching_get(void)
98 return s_info.is_slider_touching;
101 volume_error_e volume_view_set_default_slider(){
102 Evas_Object *slider = volume_view_slider_get();
103 elm_object_style_set(slider, "default");
104 return VOLUME_ERROR_OK;
107 volume_error_e volume_view_set_warning_slider(){
108 Evas_Object *slider = volume_view_slider_get();
109 elm_object_style_set(slider, "warning");
110 Edje_Message_Float_Set *msg = alloca(sizeof(Edje_Message_Float_Set) + (sizeof(double)));
113 edje_object_message_send(elm_layout_edje_get(slider), EDJE_MESSAGE_FLOAT_SET, 0, msg);
115 return VOLUME_ERROR_OK;
118 int volume_mute_toggle_set()
120 sound_type_e sound_type = volume_control_sound_type_at_show_get();
121 _D("sound type at show : %d", sound_type);
123 int sound = volume_sound_vconf_status_get(TYPE_VCONF_SOUND_STATUS);
124 _D("sound status : %d", sound);
126 int vibration = volume_sound_vconf_status_get(TYPE_VCONF_VIBRATION_STATUS);
127 _E("vibration : %d", vibration);
129 if (sound == 1 || vibration == 1)
131 volume_sound_vconf_status_set(TYPE_VCONF_SOUND_STATUS, 0);
132 volume_sound_vconf_status_set(TYPE_VCONF_VIBRATION_STATUS, 0);
134 if(VOLUME_ERROR_OK != volume_view_slider_value_set(0))
136 _E("Failed to set slider value");
143 volume_sound_vconf_status_set(TYPE_VCONF_SOUND_STATUS, 1);
144 volume_sound_vconf_status_set(TYPE_VCONF_VIBRATION_STATUS, 0);
146 int val = volume_sound_level_get(sound_type);
147 retv_if(val == -1, 0);
151 if(VOLUME_ERROR_OK != volume_view_slider_value_set(1)) {
152 _E("Failed to set slider value");
154 volume_sound_level_set(sound_type, 1);
157 if(VOLUME_ERROR_OK != volume_view_slider_value_set(val)) {
158 _E("Failed to set slider value");
166 static void _slider_start_cb(void *data, Evas_Object *obj, void *event_info)
168 s_info.is_slider_touching = EINA_TRUE;
170 volume_timer_del(TYPE_TIMER_POPUP);
172 volume_timer_add(0.2, TYPE_TIMER_SLIDER);
175 static void _slider_changed_cb(void *data, Evas_Object *obj, void *event_info)
177 volume_timer_del(TYPE_TIMER_POPUP);
181 sound_type_e sound_type = volume_control_sound_type_at_show_get();
182 _D("sound type at show : %d", sound_type);
184 val = elm_slider_value_get(s_info.slider);
186 _D("slider value : %d", val);
188 if (s_info.is_slider_touching)
193 volume_sound_change_set((int)val);
195 if(!volume_key_event_is_pressing_get())
197 volume_timer_add(3.0, TYPE_TIMER_POPUP);
201 if(!s_info.is_slider_touching)
203 volume_timer_add(3.0, TYPE_TIMER_POPUP);
208 static void _slider_stop_cb(void *data, Evas_Object *obj, void *event_info)
210 s_info.is_slider_touching = EINA_FALSE;
212 volume_timer_del(TYPE_TIMER_SLIDER);
214 Evas_Object *slider = volume_view_slider_get();
215 ret_if(slider == NULL);
219 val = elm_slider_value_get(slider);
221 _D("slider value : %d", (int)val);
223 volume_sound_change_set((int)val);
225 volume_timer_add(3.0, TYPE_TIMER_POPUP);
228 static void _hide_launcher(void *data, Evas_Object *obj, const char *emission, const char *source)
230 evas_object_hide(s_info.win);
233 //int _set_slider_value(void *data, int val)
234 volume_error_e volume_view_slider_value_set(int val)
236 retv_if(s_info.is_slider_touching, VOLUME_ERROR_FAIL);
237 retv_if(val<0, VOLUME_ERROR_FAIL);
239 elm_slider_value_set(s_info.slider, val);
241 return VOLUME_ERROR_OK;
244 static void _button_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
246 volume_view_setting_icon_set(IMG_VOLUME_ICON_SETTINGS_PRESSED);
249 static void _app_control_error_check(int ret)
251 if(ret != APP_CONTROL_ERROR_NONE)
255 case APP_CONTROL_ERROR_INVALID_PARAMETER :
256 _E("error : APP_CONTROL_ERROR_INVALID_PARAMETER");
258 case APP_CONTROL_ERROR_OUT_OF_MEMORY :
259 _E("error : APP_CONTROL_ERROR_OUT_OF_MEMORY");
261 case APP_CONTROL_ERROR_APP_NOT_FOUND :
262 _E("error : APP_CONTROL_ERROR_APP_NOT_FOUND");
264 case APP_CONTROL_ERROR_LAUNCH_REJECTED :
265 _E("error : APP_CONTROL_ERROR_LAUNCH_REJECTED");
268 _E("error : %d", ret);
274 static void _button_cb(void *data, Evas_Object *obj, void *event_info)
276 _D("volume setting is clicked");
280 if(evas_object_visible_get(s_info.win))
282 volume_timer_del(TYPE_TIMER_POPUP);
283 if(ecore_x_e_illume_quickpanel_state_get(ecore_x_e_illume_zone_get(elm_win_xwindow_get(s_info.win))) != ECORE_X_ILLUME_QUICKPANEL_STATE_OFF)
285 _D("Quickpanel is hide");
286 ecore_x_e_illume_quickpanel_state_send(ecore_x_e_illume_zone_get(elm_win_xwindow_get(s_info.win)), ECORE_X_ILLUME_QUICKPANEL_STATE_OFF);
289 ret = app_control_create(&svc);
290 _app_control_error_check(ret);
292 ret = app_control_set_app_id(svc, "org.tizen.setting.volume");
293 _app_control_error_check(ret);
295 ret = app_control_send_launch_request(svc, NULL, NULL);
296 _app_control_error_check(ret);
298 if(VOLUME_ERROR_OK != volume_control_pause())
300 _E("Failed to pause volume");
303 app_control_destroy(svc);
307 void volume_view_volume_icon_set(sound_type_e sound_type, int sound, int vibration)
311 if(sound == -1 || vibration == -1)
313 img = IMG_VOLUME_ICON_MUTE;
315 elm_image_file_set(s_info.icon_volume, EDJ_APP, img);
321 case SOUND_TYPE_RINGTONE:
324 img = IMG_VOLUME_ICON;
328 img = IMG_VOLUME_ICON_VIB;
332 img = IMG_VOLUME_ICON_MUTE;
335 case SOUND_TYPE_MEDIA:
336 img = IMG_VOLUME_ICON_MEDIA;
338 case SOUND_TYPE_CALL:
339 img = IMG_VOLUME_ICON_CALL;
341 case SOUND_TYPE_NOTIFICATION:
344 img = IMG_VOLUME_ICON_NOTI;
348 img = IMG_VOLUME_ICON_NOTI_VIB;
352 img = IMG_VOLUME_ICON_NOTI_MUTE;
355 case SOUND_TYPE_ALARM:
356 img = IMG_VOLUME_ICON_MEDIA;
359 img = IMG_VOLUME_ICON;
363 volume_view_set_default_slider();
366 elm_image_file_set(s_info.icon_volume, EDJ_APP, img);
369 void volume_view_setting_icon_set(const char *file)
373 Evas_Object *icon_setting = s_info.icon_setting;
374 ret_if(!icon_setting);
376 elm_image_file_set(icon_setting, EDJ_APP, file);
379 void volume_view_setting_icon_callback_add(void)
381 _D("Setting callback add");
382 ret_if(s_info.is_registered_callback);
384 Evas_Object *icon_setting = s_info.icon_setting;
385 ret_if(!icon_setting);
387 evas_object_event_callback_add(icon_setting, EVAS_CALLBACK_MOUSE_DOWN, _button_mouse_down_cb, NULL);
388 evas_object_smart_callback_add(icon_setting, "clicked", _button_cb, NULL);
390 s_info.is_registered_callback = EINA_TRUE;
393 void volume_view_setting_icon_callback_del(void)
395 _D("Setting callback del");
396 ret_if(!s_info.is_registered_callback);
398 Evas_Object *icon_setting = s_info.icon_setting;
399 ret_if(!icon_setting);
401 evas_object_smart_callback_del(icon_setting, "clicked", _button_cb );
402 evas_object_event_callback_del(icon_setting, EVAS_CALLBACK_MOUSE_DOWN, _button_mouse_down_cb);
404 s_info.is_registered_callback = EINA_FALSE;
407 static Evas_Object* _setting_icon_make()
409 Evas_Object *icon_setting = elm_icon_add(s_info.ly_outer);
410 retv_if(!icon_setting, NULL);
412 evas_object_size_hint_aspect_set(icon_setting, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
413 elm_image_resizable_set(icon_setting, EINA_TRUE, EINA_TRUE);
415 s_info.icon_setting = icon_setting;
417 volume_view_setting_icon_set(IMG_VOLUME_ICON_SETTINGS);
418 evas_object_show(icon_setting);
423 static Evas_Object* _volume_icon_make()
425 Evas_Object *icon_volume = elm_icon_add(s_info.ly_outer);
426 retv_if(!icon_volume, NULL);
428 evas_object_size_hint_aspect_set(icon_volume, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
429 elm_image_resizable_set(icon_volume, EINA_TRUE, EINA_TRUE);
430 evas_object_show(icon_volume);
435 Evas_Object *add_slider(Evas_Object *parent, int min, int max, int val)
437 Evas_Object *slider = elm_slider_add(parent);
438 retvm_if(!slider, NULL, "Failed to add slider");
440 elm_slider_horizontal_set(slider, EINA_TRUE);
441 elm_slider_indicator_show_set(slider, EINA_FALSE);
442 elm_slider_indicator_format_set(slider, "%.0f");
443 evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, 0.0);
444 evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5);
445 elm_slider_min_max_set(slider, min, max);
446 elm_slider_value_set(slider, val);
451 static Evas_Object* _slider_make()
453 sound_type_e sound_type = volume_control_sound_type_at_show_get();
454 _D("sound type at show : %d", sound_type);
456 int sound_step = volume_sound_sound_manager_step_get(sound_type);
457 _D("sound step : %d", sound_step);
459 int sound_val = volume_sound_level_get(sound_type);
462 _E("Failed to get volume level");
465 _D("sound value : %d", sound_val);
467 Evas_Object *slider = add_slider(s_info.ly_outer, 0, sound_step, sound_val);
468 evas_object_smart_callback_add(slider, "slider,drag,start", _slider_start_cb, NULL);
469 evas_object_smart_callback_add(slider, "changed", _slider_changed_cb, NULL);
470 evas_object_smart_callback_add(slider, "slider,drag,stop", _slider_stop_cb, NULL);
476 static void _safety_warning_text_load()
478 elm_object_domain_translatable_part_text_set(s_info.ly_outer, "warning_rect", "org.tizen.volume", "IDS_COM_POP_TO_LOWER_YOUR_RISK_OF_HEARING_DAMAGE_DO_NOT_LISTEN_AT_HIGH_VOLUMES_FOR_LONG_PERIODS");
479 elm_object_part_text_translatable_set(s_info.ly_outer, "warning_rect", EINA_TRUE);
480 if (!elm_object_part_text_get(s_info.ly_outer, "warning_rect"))
482 _E("Failed to set warning text");
487 volume_error_e volume_view_window_show(void)
489 evas_object_show(s_info.win);
490 elm_object_signal_emit(s_info.ly_outer, "show_effect", "clipper");
491 volume_view_setting_icon_callback_add();
493 return VOLUME_ERROR_OK;
496 volume_error_e volume_view_window_hide(void)
498 elm_object_signal_emit(s_info.ly_outer, "hide_effect", "clipper");
499 volume_view_setting_icon_callback_del();
501 return VOLUME_ERROR_OK;
504 Evas_Object *add_layout(Evas_Object *parent, const char *file, const char *group)
506 retvm_if(!parent, NULL, "Invalid argument: parent is NULL\n");
507 retvm_if(!file, NULL, "Invalid argument: file is NULL\n");
508 retvm_if(!group, NULL, "Invalid argument: group is NULL\n");
510 Evas_Object *eo = elm_layout_add(parent);
511 retvm_if(!eo, NULL, "Failed to add layout\n");
514 r = elm_layout_file_set(eo, file, group);
517 _E("Failed to set file[%s]\n", file);
522 evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
523 evas_object_show(eo);
528 volume_error_e volume_view_layout_create(Evas_Object *win)
530 LOGD("Layout create");
532 retv_if(!win, VOLUME_ERROR_FAIL);
534 Evas_Object *ly_outer = add_layout(win, EDJ_APP, "volume_layout");
535 retv_if(!ly_outer, VOLUME_ERROR_FAIL);
536 elm_win_resize_object_add(win, ly_outer);
537 elm_object_signal_callback_add(ly_outer, "hide,popup", "event", _hide_launcher, NULL);
538 s_info.ly_outer = ly_outer;
540 /* make setting icon */
541 Evas_Object *icon_setting = _setting_icon_make();
542 retv_if(!icon_setting, VOLUME_ERROR_FAIL);
543 elm_object_part_content_set(ly_outer, "ic_setting", icon_setting);
544 s_info.icon_setting = icon_setting;
546 /* make volume icon */
547 Evas_Object *icon_volume = _volume_icon_make();
548 retv_if(!icon_volume, VOLUME_ERROR_FAIL);
549 elm_object_part_content_set(ly_outer, "ic_sound", icon_volume);
550 s_info.icon_volume = icon_volume;
553 Evas_Object *slider = _slider_make();
554 retv_if(!slider, VOLUME_ERROR_FAIL);
555 s_info.slider = slider;
556 elm_object_part_content_set(ly_outer, "sw.slider", slider);
558 _safety_warning_text_load();
560 return VOLUME_ERROR_OK;
563 Evas_Object *add_volume_window(const char *name)
565 Evas_Object *eo = NULL;
568 eo = elm_win_add(NULL, name, ELM_WIN_NOTIFICATION);
571 elm_win_title_set(eo, name);
572 elm_win_borderless_set(eo, EINA_TRUE);
573 elm_win_alpha_set(eo, EINA_TRUE);
574 elm_win_role_set(eo, "no-dim");
576 ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
577 if(w == -1 || h == -1)
579 _E("ecore_x_window_size_get() is failed\n");
586 Evas_Object *volume_view_window_create(void)
588 Evas_Object *win = add_volume_window(PACKAGE);
596 void _lock_sound_check(void)
598 int lcdoff_source = -1;
602 if(vconf_get_int(VCONFKEY_PM_LCDOFF_SOURCE, &lcdoff_source) < 0) {
603 _E("Failed to get vconfkey : VCONFKEY_PM_LCDOFF_SOURCE");
606 _D("lcd off source : %d", lcdoff_source);
608 if(lcdoff_source != VCONFKEY_PM_LCDOFF_BY_POWERKEY) {
609 _E("Should not play lock sound");
613 if(vconf_get_bool(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, &lock_sound) < 0) {
614 _E("Failed to get vconfkey : VCONFKEY_SETAPPL_SOUND_LOCK_BOOL");
617 _D("lock sound : %d", lock_sound);
619 if(lock_sound) { // play sound
620 if(vconf_get_int(VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT, &lock_type) < 0){
621 _E("Failed to get vconfkey : VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT");
624 _D("lock type : %d", lock_type);
626 if(lock_type == SETTING_SCREEN_LOCK_TYPE_SWIPE) {
627 feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_LOCK_SWIPE);
630 feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_LOCK);
635 Evas_Object* show_lockscreen_splash(const char* bg_path)
639 retv_if(bg_path == NULL, NULL);
641 if(s_info.lockscreen_splash)
643 _E("There is remain fake_bg : remove old one");
644 evas_object_del(s_info.lockscreen_splash);
645 s_info.lockscreen_splash = NULL;
648 /* Check Lock Sound */
651 /* hide volume window */
652 if(VOLUME_ERROR_OK != volume_view_window_hide())
654 _E("Failed to hide window");
657 Evas_Object *win_splash = elm_win_add(NULL,"lockscreen_splash", ELM_WIN_NOTIFICATION);
661 _E("Failed to add splash window");
665 _D("Splash window created");
667 Evas_Object *bg = elm_bg_add(win_splash);
670 _D("Failed to get background");
671 evas_object_del(win_splash);
675 elm_win_resize_object_add(win_splash, bg);
676 elm_bg_file_set(bg, bg_path, NULL);
677 evas_object_show(bg);
679 evas_object_show(win_splash);
681 _D("Splash window shown");
683 s_info.lockscreen_splash = win_splash;
688 volume_error_e hide_lockscreen_splash(void)
692 if (!s_info.lockscreen_splash) {
693 _E("No splash window found");
694 return VOLUME_ERROR_FAIL;
697 evas_object_del(s_info.lockscreen_splash);
698 s_info.lockscreen_splash = NULL;
699 _D("Splash window closed");
701 return VOLUME_ERROR_OK;