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.
20 #include <vconf-keys.h>
24 #include "_util_efl.h"
25 #include "_util_log.h"
29 #include "key_event.h"
31 #include "tzsh_volume_service.h"
36 tzsh_volume_service_h volume_service;
38 Evas_Object *ly_outer;
39 Evas_Object *icon_volume;
40 Evas_Object *icon_setting;
42 Evas_Object *warning_popup;
43 Evas_Object *ao_volume;
45 Evas_Object *lockscreen_splash;
47 Evas_Object *ao_settings;
49 Eina_Bool is_registered_callback;
50 Eina_Bool is_slider_touching;
51 Eina_Bool is_warning_displayed;
52 sound_type_e pre_sound_type;
54 static struct _view_s_info view_info = {
57 .volume_service = NULL,
63 .warning_popup = NULL,
66 .lockscreen_splash = NULL,
70 .is_registered_callback = EINA_FALSE,
71 .is_slider_touching = EINA_FALSE,
72 .is_warning_displayed = EINA_FALSE,
73 .pre_sound_type = SOUND_TYPE_RINGTONE
76 static void _button_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
77 static void _button_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
78 static void _app_control_error_check(int ret);
79 static void _hide_launcher(void *data, Evas_Object *obj, const char *emission, const char *source);
80 static void _slider_stop_cb(void *data, Evas_Object *obj, void *event_info);
81 static void _slider_start_cb(void *data, Evas_Object *obj, void *event_info);
82 static void _slider_changed_cb(void *data, Evas_Object *obj, void *event_info);
83 static Evas_Object* _slider_make();
84 static Evas_Object* _volume_icon_make();
85 static Evas_Object* _setting_icon_make();
87 const char *volume_view_get_file_path(const char *relative)
90 static char buf[PATH_MAX];
92 prefix = app_get_resource_path();
95 size_t res = eina_file_path_join(buf, sizeof(buf), prefix, relative);
96 snprintf(buf, sizeof(buf), "%s%s", prefix, relative);
99 if (res > sizeof(buf)) {
100 _E("Path exceeded PATH_MAX\n");
107 Evas_Object* volume_view_win_get(void)
109 return view_info.win;
112 tzsh_h volume_view_tzsh_get(void)
114 return view_info.tzsh;
117 tzsh_volume_service_h volume_view_service_get(void)
119 return view_info.volume_service;
122 Evas_Object* volume_view_evas_get(void)
124 return view_info.evas;
127 Evas_Object* volume_view_outer_layout_get(void)
129 return view_info.ly_outer;
132 Evas_Object* volume_view_icon_volume_get(void)
134 return view_info.icon_volume;
137 Evas_Object* volume_view_icon_setting_get(void)
139 return view_info.icon_setting;
142 Evas_Object* volume_view_slider_get(void)
144 return view_info.slider;
147 Evas_Object* volume_view_warning_popup_get(void)
149 return view_info.warning_popup;
152 Eina_Bool volume_view_is_registered_callback_get(void)
154 return view_info.is_registered_callback;
157 Eina_Bool volume_view_is_slider_touching_get(void)
159 return view_info.is_slider_touching;
162 sound_type_e volume_view_pre_sound_type_get(void)
164 return view_info.pre_sound_type;
167 volume_error_e volume_view_set_default_slider()
169 Evas_Object *slider = volume_view_slider_get();
170 elm_object_style_set(slider, "default");
171 return VOLUME_ERROR_OK;
174 volume_error_e volume_view_set_warning_slider()
176 Evas_Object *slider = volume_view_slider_get();
177 elm_object_style_set(slider, "warning");
178 Edje_Message_Float_Set *msg = alloca(sizeof(Edje_Message_Float_Set) + (sizeof(double)));
181 edje_object_message_send(elm_layout_edje_get(slider), EDJE_MESSAGE_FLOAT_SET, 0, msg);
183 return VOLUME_ERROR_OK;
186 int volume_mute_toggle_set()
188 sound_type_e sound_type = volume_control_get_sound_type_at_show();
189 _D("sound type at show : %d", sound_type);
191 int sound = volume_sound_vconf_status_get(TYPE_VCONF_SOUND_STATUS);
192 _D("sound status : %d", sound);
194 int vibration = volume_sound_vconf_status_get(TYPE_VCONF_VIBRATION_STATUS);
195 _E("vibration : %d", vibration);
197 if (sound == 1 || vibration == 1) {
198 volume_sound_vconf_status_set(TYPE_VCONF_SOUND_STATUS, 0);
199 volume_sound_vconf_status_set(TYPE_VCONF_VIBRATION_STATUS, 0);
201 if (VOLUME_ERROR_OK != volume_view_slider_value_set(0))
202 _E("Failed to set slider value");
206 volume_sound_vconf_status_set(TYPE_VCONF_SOUND_STATUS, 1);
207 volume_sound_vconf_status_set(TYPE_VCONF_VIBRATION_STATUS, 0);
209 int val = volume_sound_level_get(sound_type);
210 retv_if(val == -1, 0);
213 if (VOLUME_ERROR_OK != volume_view_slider_value_set(1))
214 _E("Failed to set slider value");
215 volume_sound_level_set(sound_type, 1);
217 if (VOLUME_ERROR_OK != volume_view_slider_value_set(val))
218 _E("Failed to set slider value");
225 volume_error_e volume_view_change_slider_by_type(sound_type_e type, bool bt_opened, int earphone_connected)
227 _D("Slider change for state: %d", type);
231 if (type == SOUND_TYPE_MEDIA && (bt_opened || earphone_connected)) {
232 _D("=Change to warning slider=");
233 elm_object_style_set(view_info.slider, "warning");
235 _D("=Change to normal slider=");
236 elm_object_style_set(view_info.slider, "default");
239 ret = sound_manager_get_max_volume(type, &step);
241 _E("Failed to get max volume for sound_type: %d", type);
242 return VOLUME_ERROR_FAIL;
244 _D("Sound type: %d, max: %d", type, step);
246 elm_slider_min_max_set(view_info.slider, 0, step);
248 view_info.pre_sound_type = type;
250 return VOLUME_ERROR_OK;
253 static void _cancel_clicked_cb(void *data, Evas_Object *obj, void *event_info)
255 volume_view_destroy_warning_popup();
258 static void _ok_clicked_cb(void *data, Evas_Object *obj, void *event_info)
260 _D("Increase button is clicked");
261 volume_control_set_safety_limit(EINA_FALSE);
262 volume_control_set_time_for_safety_limit();
264 volume_view_destroy_warning_popup();
267 volume_error_e volume_view_open_warning_popup(void)
269 Evas_Object *popup = NULL;
270 Evas_Object *cancel_btn = NULL;
271 Evas_Object *ok_btn = NULL;
273 popup = elm_popup_add(view_info.win);
274 elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
275 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
276 elm_object_text_set(popup, "Listening at a high volume for a long time may damage your hearing. The volume will be increaed above safe levels.");
278 cancel_btn = elm_button_add(popup);
279 elm_object_style_set(cancel_btn, "popup");
280 elm_object_text_set(cancel_btn, "Cancel");
281 elm_object_part_content_set(popup, "button2", cancel_btn);
282 evas_object_smart_callback_add(cancel_btn, "clicked", _cancel_clicked_cb, popup);
284 ok_btn = elm_button_add(popup);
285 elm_object_style_set(ok_btn, "popup");
286 elm_object_text_set(ok_btn, "Increase");
287 elm_object_part_content_set(popup, "button1", ok_btn);
288 evas_object_smart_callback_add(ok_btn, "clicked", _ok_clicked_cb, popup);
290 view_info.warning_popup = popup;
291 evas_object_show(popup);
293 return VOLUME_ERROR_OK;
296 void volume_view_destroy_warning_popup(void)
298 _D("Destroy warning popup");
299 if (VOLUME_ERROR_OK != volume_view_send_warning_signal(EINA_FALSE))
300 _E("Failed to set warning status");
302 evas_object_del(view_info.warning_popup);
303 view_info.warning_popup = NULL;
305 if (VOLUME_ERROR_OK != volume_control_hide_view())
306 _E("Failed to close volume");
307 if (VOLUME_ERROR_OK != volume_control_cache_flush())
308 _E("Failed to flush cache");
311 volume_error_e volume_view_slider_value_set(int val)
313 _D("Slider value set : %d", val);
314 retv_if(view_info.is_slider_touching, VOLUME_ERROR_FAIL);
315 retv_if(val < 0, VOLUME_ERROR_FAIL);
317 elm_slider_value_set(view_info.slider, val);
319 return VOLUME_ERROR_OK;
322 void volume_view_volume_icon_set(sound_type_e sound_type, int sound, int vibration, bool bt_opened)
324 _D("Volume icon set");
327 if (sound == -1 || vibration == -1) {
328 img = IMG_VOLUME_ICON_MUTE;
330 elm_image_file_set(view_info.icon_volume, volume_view_get_file_path(EDJ_APP), img);
334 switch (sound_type) {
335 case SOUND_TYPE_ALARM:
336 case SOUND_TYPE_RINGTONE:
338 img = IMG_VOLUME_ICON;
340 img = IMG_VOLUME_ICON_VIB;
342 img = IMG_VOLUME_ICON_MUTE;
344 case SOUND_TYPE_MEDIA:
345 if (volume_sound_sound_manager_volume_get(sound_type) > 0)
346 img = IMG_VOLUME_ICON;
348 img = IMG_VOLUME_ICON_MUTE;
350 case SOUND_TYPE_CALL:
352 img = IMG_VOLUME_ICON_HEADPHONE;
354 img = IMG_VOLUME_ICON_CALL;
356 case SOUND_TYPE_NOTIFICATION:
358 img = IMG_VOLUME_ICON_NOTI;
360 img = IMG_VOLUME_ICON_NOTI_VIB;
362 img = IMG_VOLUME_ICON_NOTI_MUTE;
365 img = IMG_VOLUME_ICON;
370 elm_image_file_set(view_info.icon_volume, volume_view_get_file_path(EDJ_APP), img);
373 void volume_view_volume_icon_name_set_for_access(sound_type_e sound_type)
375 _D("Volume icon name set");
378 switch (sound_type) {
379 case SOUND_TYPE_RINGTONE:
380 snprintf(buf, sizeof(buf), "%s%s", _("IDS_ST_HEADER_RINGTONES"), "volume");
382 case SOUND_TYPE_MEDIA:
383 snprintf(buf, sizeof(buf), "%s", _("IDS_ACCS_BODY_MEDIA_VOLUME_TTS"));
385 case SOUND_TYPE_CALL:
386 snprintf(buf, sizeof(buf), "%s%s", _("IDS_ACCS_SK2_CALL"), "volume");
388 case SOUND_TYPE_NOTIFICATION:
389 snprintf(buf, sizeof(buf), "%s%s", _("IDS_ST_BODY_NOTIFICATION"), "volume");
392 snprintf(buf, sizeof(buf), "%s%s", _("IDS_ST_HEADER_RINGTONES"), "volume");
396 _D("volume accessible name: %s", buf);
397 elm_atspi_accessible_name_set(view_info.ao_volume, buf);
400 void volume_view_setting_icon_set(const char *file)
402 _D("Setting icon image set");
405 Evas_Object *icon_setting = view_info.icon_setting;
406 ret_if(!icon_setting);
408 if (EINA_TRUE != elm_image_file_set(icon_setting, volume_view_get_file_path(EDJ_APP), file)) {
409 _E("Failed to set image file : %s, Group", file);
413 void volume_view_setting_icon_callback_add(void)
415 _D("Setting callback add");
416 ret_if(view_info.is_registered_callback);
418 Evas_Object *icon_setting = view_info.icon_setting;
419 ret_if(!icon_setting);
421 evas_object_event_callback_add(icon_setting, EVAS_CALLBACK_MOUSE_DOWN, _button_mouse_down_cb, NULL);
422 elm_object_signal_callback_add(view_info.ly_outer, "setting_icon_touched", "launch_setting", _button_cb, NULL);
424 view_info.is_registered_callback = EINA_TRUE;
427 void volume_view_setting_icon_callback_del(void)
429 _D("Setting callback del");
430 ret_if(!view_info.is_registered_callback);
432 Evas_Object *icon_setting = view_info.icon_setting;
433 ret_if(!icon_setting);
435 elm_object_signal_callback_del(view_info.ly_outer, "setting_icon_touched", "launch_setting", _button_cb);
436 evas_object_event_callback_del(icon_setting, EVAS_CALLBACK_MOUSE_DOWN, _button_mouse_down_cb);
438 view_info.is_registered_callback = EINA_FALSE;
441 Evas_Object *add_slider(Evas_Object *parent, int min, int max, int val)
443 retv_if(!parent, NULL);
444 Evas_Object *slider = elm_slider_add(parent);
445 retvm_if(!slider, NULL, "Failed to add slider");
447 elm_slider_horizontal_set(slider, EINA_TRUE);
448 elm_slider_indicator_show_set(slider, EINA_FALSE);
449 elm_slider_indicator_format_set(slider, "%.0f");
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, min, max);
453 elm_slider_value_set(slider, val);
458 volume_error_e volume_view_send_warning_signal(Eina_Bool warning)
461 _D("Show warning popup, and hide volume popup");
462 elm_object_signal_emit(view_info.ly_outer, "show,warning", "bg");
464 int current_angle = volume_control_get_current_angle();
465 _D("Current angle: %d", current_angle);
466 switch (current_angle) {
469 _D("show,landscape");
470 elm_object_signal_emit(view_info.ly_outer, "show,landscape", "bg");
474 elm_object_signal_emit(view_info.ly_outer, "show,portrait", "bg");
478 return VOLUME_ERROR_OK;
481 volume_error_e volume_view_window_show(sound_type_e type)
483 _D("Volume view window SHOW is [%p]", view_info.win);
485 elm_win_activate(view_info.win);
487 if (type == SOUND_TYPE_CALL)
488 _D("Sound type is Call");
490 volume_view_setting_icon_callback_add();
492 return VOLUME_ERROR_OK;
495 volume_error_e volume_view_window_hide(void)
497 _D("Volume view window HIDE");
498 elm_win_iconified_set(view_info.win, EINA_TRUE);
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);
516 _E("Failed to set file[%s]\n", file);
521 evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
522 evas_object_show(eo);
527 void _connect_to_wm(Evas_Object *win)
529 _D("Make connection with window manager");
532 view_info.tzsh = tzsh_create(TZSH_TOOLKIT_TYPE_EFL);
534 _E("Failed to get connection to Tizen window manager");
536 tz_win = elm_win_window_id_get(win);
538 _E("Failed to get Tizen window manager");
541 * Tizen SDK do not support tzsh yet
542 * If you want to build with ABS you should Block this code
545 view_info.volume_service = tzsh_volume_service_create(view_info.tzsh, tz_win);
546 if (!view_info.volume_service)
547 _E("Failed to get volume service");
551 static void _down_for_hide(void *data, Evas_Object *obj, const char* emission, const char* source)
555 if (VOLUME_ERROR_OK != volume_control_hide_view())
556 _E("Failed to close volume");
559 volume_error_e volume_view_layout_create(Evas_Object *win)
563 retv_if(!win, VOLUME_ERROR_FAIL);
565 Evas_Object *ly_outer = add_layout(win, volume_view_get_file_path(EDJ_APP), "volume_layout");
566 retv_if(!ly_outer, VOLUME_ERROR_FAIL);
567 elm_win_resize_object_add(win, ly_outer);
568 elm_object_signal_callback_add(ly_outer, "hide,popup", "event", _hide_launcher, NULL);
569 view_info.ly_outer = ly_outer;
571 /* make setting icon */
572 Evas_Object *icon_setting = _setting_icon_make();
573 retv_if(!icon_setting, VOLUME_ERROR_FAIL);
574 elm_object_part_content_set(ly_outer, "ic_setting", icon_setting);
575 view_info.icon_setting = icon_setting;
577 /* make volume icon */
578 Evas_Object *icon_volume = _volume_icon_make();
579 retv_if(!icon_volume, VOLUME_ERROR_FAIL);
580 elm_object_part_content_set(ly_outer, "ic_sound", icon_volume);
581 view_info.icon_volume = icon_volume;
584 Evas_Object *slider = _slider_make();
585 retv_if(!slider, VOLUME_ERROR_FAIL);
586 view_info.slider = slider;
587 elm_object_part_content_set(ly_outer, "sw.slider", slider);
589 /* add callback for hide */
590 elm_object_signal_callback_add(ly_outer, "hide,volume", "hide", _down_for_hide, NULL);
592 return VOLUME_ERROR_OK;
595 static void _iconified_cb(void *data, Evas_Object *obj, void *event_info)
597 _D("ICONIFIED IS CALLED");
600 static void _deiconified_cb(void *data, Evas_Object *obj, void *event_info)
602 _D("ICONIFIED IS CANCELED");
605 Evas_Object *add_volume_window(const char *name)
607 Evas_Object *eo = NULL;
611 eo = elm_win_add(NULL, name, ELM_WIN_NOTIFICATION);
613 evas = evas_object_evas_get(eo);
614 retv_if(!evas, NULL);
615 view_info.evas = evas;
617 elm_win_alpha_set(eo, EINA_TRUE);
618 elm_win_title_set(eo, name);
619 elm_win_borderless_set(eo, EINA_TRUE);
620 ecore_evas_name_class_set(ecore_evas_ecore_evas_get(evas), "SYSTEM_POPUP", "SYSTEM_POPUP");
621 elm_win_prop_focus_skip_set(eo, EINA_TRUE);
622 elm_win_role_set(eo, "no-dim");
624 elm_win_screen_size_get(eo, &x, &y, &w, &h);
625 _D("volume screen size => x: %d, y: %d, w: %d, h: %d", x, y, w, h);
627 evas_object_smart_callback_add(eo, "iconified", _iconified_cb, NULL);
628 evas_object_smart_callback_add(eo, "normal", _deiconified_cb, NULL);
633 static Eina_Bool _key_grab_cb(void *data)
637 Evas_Object *win = data;
639 _D("keygrab window is [%p]", win);
640 ret_up = elm_win_keygrab_set(win, KEY_VOLUMEUP, 0, 0, 0, ELM_WIN_KEYGRAB_SHARED);
641 _D("Result of volume up keygrab set : %d", ret_up);
642 ret_down = elm_win_keygrab_set(win, KEY_VOLUMEDOWN, 0, 0, 0, ELM_WIN_KEYGRAB_SHARED);
643 _D("Result of volume down keygrab set : %d", ret_down);
648 Evas_Object *volume_view_window_create(void)
650 Evas_Object *win = add_volume_window(PACKAGE);
655 evas_object_show(win);
657 ecore_timer_add(1.0f, _key_grab_cb, win);
661 elm_win_iconified_set(win, EINA_TRUE);
666 void _lock_sound_check(void)
668 int lcdoff_source = -1;
672 if (vconf_get_int(VCONFKEY_PM_LCDOFF_SOURCE, &lcdoff_source) < 0) {
673 _E("Failed to get vconfkey : VCONFKEY_PM_LCDOFF_SOURCE");
676 _D("lcd off source : %d", lcdoff_source);
678 if (lcdoff_source != VCONFKEY_PM_LCDOFF_BY_POWERKEY) {
679 _E("Should not play lock sound");
683 if (vconf_get_bool(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, &lock_sound) < 0) {
684 _E("Failed to get vconfkey : VCONFKEY_SETAPPL_SOUND_LOCK_BOOL");
687 _D("lock sound : %d", lock_sound);
690 if (vconf_get_int(VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT, &lock_type) < 0) {
691 _E("Failed to get vconfkey : VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT");
694 _D("lock type : %d", lock_type);
696 feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_LOCK);
700 Evas_Object* show_lockscreen_splash(const char* bg_path)
704 retv_if(bg_path == NULL, NULL);
706 if (view_info.lockscreen_splash) {
707 _E("There is remain fake_bg : remove old one");
708 evas_object_del(view_info.lockscreen_splash);
709 view_info.lockscreen_splash = NULL;
712 /* Check Lock Sound */
715 /* hide volume window */
716 if (VOLUME_ERROR_OK != volume_view_window_hide())
717 _E("Failed to hide window");
719 Evas_Object *win_splash = elm_win_add(NULL, "lockscreen_splash", ELM_WIN_NOTIFICATION);
722 _E("Failed to add splash window");
726 _D("Splash window created");
728 Evas_Object *bg = elm_bg_add(win_splash);
730 _D("Failed to get background");
731 evas_object_del(win_splash);
735 elm_win_resize_object_add(win_splash, bg);
736 elm_bg_file_set(bg, bg_path, NULL);
737 evas_object_show(bg);
739 evas_object_show(win_splash);
741 _D("Splash window shown");
743 view_info.lockscreen_splash = win_splash;
748 volume_error_e hide_lockscreen_splash(void)
752 if (!view_info.lockscreen_splash) {
753 _E("No splash window found");
754 return VOLUME_ERROR_FAIL;
757 evas_object_del(view_info.lockscreen_splash);
758 view_info.lockscreen_splash = NULL;
759 _D("Splash window closed");
761 return VOLUME_ERROR_OK;
763 static void _slider_start_cb(void *data, Evas_Object *obj, void *event_info)
765 view_info.is_slider_touching = EINA_TRUE;
767 volume_timer_del(TYPE_TIMER_POPUP);
769 volume_timer_add(0.2, TYPE_TIMER_SLIDER);
772 static void _slider_changed_cb(void *data, Evas_Object *obj, void *event_info)
774 volume_timer_del(TYPE_TIMER_POPUP);
778 sound_type_e sound_type = volume_control_get_sound_type_at_show();
779 _D("sound type at show : %d", sound_type);
781 val = elm_slider_value_get(view_info.slider);
783 _D("slider value : %lf", val);
785 if (view_info.is_slider_touching)
788 volume_sound_change_set((int)val);
790 if (!volume_key_event_is_pressing_get()) {
791 volume_timer_add(3.0, TYPE_TIMER_POPUP);
795 if (!view_info.is_slider_touching) {
796 volume_timer_add(3.0, TYPE_TIMER_POPUP);
801 static void _slider_stop_cb(void *data, Evas_Object *obj, void *event_info)
803 view_info.is_slider_touching = EINA_FALSE;
805 volume_timer_del(TYPE_TIMER_SLIDER);
807 Evas_Object *slider = volume_view_slider_get();
808 ret_if(slider == NULL);
812 val = elm_slider_value_get(slider);
814 _D("slider value : %d", (int)val);
816 volume_sound_change_set((int)val);
818 volume_timer_add(3.0, TYPE_TIMER_POPUP);
821 static void _hide_launcher(void *data, Evas_Object *obj, const char *emission, const char *source)
823 evas_object_hide(view_info.win);
826 static void _button_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
828 elm_object_signal_emit(view_info.ly_outer, "pressed", "setting");
831 static void _app_control_error_check(int ret)
833 if (ret != APP_CONTROL_ERROR_NONE) {
835 case APP_CONTROL_ERROR_INVALID_PARAMETER:
836 _E("error : APP_CONTROL_ERROR_INVALID_PARAMETER");
838 case APP_CONTROL_ERROR_OUT_OF_MEMORY:
839 _E("error : APP_CONTROL_ERROR_OUT_OF_MEMORY");
841 case APP_CONTROL_ERROR_APP_NOT_FOUND:
842 _E("error : APP_CONTROL_ERROR_APP_NOT_FOUND");
844 case APP_CONTROL_ERROR_LAUNCH_REJECTED:
845 _E("error : APP_CONTROL_ERROR_LAUNCH_REJECTED");
848 _E("error : %d", ret);
854 static void _button_cb(void *data, Evas_Object *obj, const char *emssion, const char *source)
857 app_control_h app_setting;
859 if (evas_object_visible_get(view_info.win)) {
860 volume_timer_del(TYPE_TIMER_POPUP);
862 volume_sound_feedback_play(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP);
864 /* Send Launch Request to Setting */
865 ret = app_control_create(&app_setting);
866 _app_control_error_check(ret);
868 ret = app_control_set_app_id(app_setting, "org.tizen.setting.volume");
869 _app_control_error_check(ret);
871 ret = app_control_send_launch_request(app_setting, NULL, NULL);
872 _app_control_error_check(ret);
874 if (VOLUME_ERROR_OK != volume_control_pause())
875 _E("Failed to pause volume");
877 app_control_destroy(app_setting);
881 static Evas_Object* _setting_icon_make()
883 _D("Setting ICON make");
884 Evas_Object *icon_setting = elm_icon_add(view_info.ly_outer);
885 retv_if(!icon_setting, NULL);
887 evas_object_size_hint_aspect_set(icon_setting, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
888 elm_image_resizable_set(icon_setting, EINA_TRUE, EINA_TRUE);
890 view_info.icon_setting = icon_setting;
892 volume_view_setting_icon_set(IMG_VOLUME_ICON_SETTINGS);
893 evas_object_show(icon_setting);
898 static Evas_Object* _volume_icon_make()
900 Evas_Object *icon_volume = elm_icon_add(view_info.ly_outer);
901 retv_if(!icon_volume, NULL);
903 evas_object_size_hint_aspect_set(icon_volume, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
904 elm_image_resizable_set(icon_volume, EINA_TRUE, EINA_TRUE);
905 evas_object_show(icon_volume);
910 static Evas_Object* _slider_make()
912 _D("Volume Slider Make");
913 sound_type_e sound_type = volume_control_get_sound_type_at_show();
914 _D("sound type at show : %d", sound_type);
916 int sound_step = volume_sound_sound_manager_step_get(sound_type);
917 _D("sound step : %d", sound_step);
919 int sound_val = volume_sound_level_get(sound_type);
920 if (sound_val == -1) {
921 _E("Failed to get volume level");
924 _D("sound value : %d", sound_val);
926 Evas_Object *slider = add_slider(view_info.ly_outer, 0, sound_step, sound_val);
927 retv_if(!slider, NULL);
928 evas_object_smart_callback_add(slider, "slider,drag,start", _slider_start_cb, NULL);
929 evas_object_smart_callback_add(slider, "changed", _slider_changed_cb, NULL);
930 evas_object_smart_callback_add(slider, "slider,drag,stop", _slider_stop_cb, NULL);
935 static Eina_Bool _access_highlight_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
937 volume_timer_del(TYPE_TIMER_POPUP);
938 volume_timer_add(3.0, TYPE_TIMER_POPUP);
943 static Eina_Bool _access_active_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
945 _button_cb(NULL, NULL, NULL, NULL);
949 void volume_view_accessible_create(Evas_Object *win)
951 Evas_Object *ao_setting = NULL;
954 /* make volume accessible icon */
955 view_info.ao_volume = elm_access_object_register(view_info.icon_volume, view_info.icon_volume);
956 elm_atspi_accessible_reading_info_type_set(view_info.ao_volume, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
957 elm_atspi_accessible_translation_domain_set(view_info.ao_volume, PACKAGE);
958 elm_access_action_cb_set(view_info.ao_volume, ELM_ACCESS_ACTION_HIGHLIGHT, _access_highlight_cb, NULL);
960 /* make setting accessible icon */
961 ao_setting = elm_access_object_register(view_info.icon_setting, view_info.icon_setting);
962 snprintf(buf, sizeof(buf), "%s%s", _("IDS_ST_BUTTON_SETTINGS"), "button");
963 elm_atspi_accessible_name_set(ao_setting, buf);
964 elm_atspi_accessible_reading_info_type_set(ao_setting, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
965 elm_atspi_accessible_translation_domain_set(ao_setting, PACKAGE);
966 elm_access_action_cb_set(ao_setting, ELM_ACCESS_ACTION_HIGHLIGHT, _access_highlight_cb, NULL);
967 elm_access_action_cb_set(ao_setting, ELM_ACCESS_ACTION_ACTIVATE, _access_active_cb, NULL);
969 /* Make relationship */
970 elm_atspi_accessible_relationship_append(view_info.ao_volume, ELM_ATSPI_RELATION_FLOWS_TO, view_info.slider);
971 elm_atspi_accessible_relationship_append(view_info.slider, ELM_ATSPI_RELATION_FLOWS_FROM, view_info.ao_volume);
973 elm_atspi_accessible_relationship_append(view_info.slider, ELM_ATSPI_RELATION_FLOWS_TO, ao_setting);
974 elm_atspi_accessible_relationship_append(ao_setting, ELM_ATSPI_RELATION_FLOWS_FROM, view_info.slider);