+static void __msg_ui_viewer_grab_volume_key(void *data)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
+ int ret = 0;
+
+ ret = utilx_grab_key(viewer_play_data->xdisplay, elm_win_xwindow_get(viewer_play_data->main_window), KEY_VOLUMEUP, TOP_POSITION_GRAB);
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "KEY_VOLUMEUP utilx_grab_key() ret = %d", ret);
+
+ ret = utilx_grab_key(viewer_play_data->xdisplay, elm_win_xwindow_get(viewer_play_data->main_window), KEY_VOLUMEDOWN, TOP_POSITION_GRAB);
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "KEY_VOLUMEDOWN utilx_grab_key() ret = %d", ret);
+}
+
+static void __msg_ui_viewer_ungrab_volume_key(void *data)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
+ int ret = 0;
+
+ ret = utilx_ungrab_key(viewer_play_data->xdisplay, elm_win_xwindow_get(viewer_play_data->main_window), KEY_VOLUMEUP);
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "KEY_VOLUMEUP utilx_ungrab_key() ret = %d", ret);
+
+ ret = utilx_ungrab_key(viewer_play_data->xdisplay, elm_win_xwindow_get(viewer_play_data->main_window), KEY_VOLUMEDOWN);
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "KEY_VOLUMEDOWN utilx_ungrab_key() ret = %d", ret);
+}
+
+static Eina_Bool __msg_ui_viewer_up_key_long_press_cb(void *data)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RETV_IF(MSG_UI_LEVEL_DEBUG, data == NULL, EINA_FALSE);
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
+ int use_volume_key = false;
+
+ vconf_get_bool(VCONFKEY_MSG_APP_USE_VOLUME_KEY, &use_volume_key);
+
+ if (use_volume_key) {
+ msg_common_increase_font_size();
+
+ if (viewer_play_data->render_entry) {
+ SMIL_SLIDE_INFO_S *slide = msg_smil_get_current_slide_info(viewer_play_data->SmilHandle);
+ MSG_VIEWER_ENTRY_TYPE_E entry_type = (slide && slide->pageInfo && slide->pageInfo->isHelpPage) ? MSG_VIEWER_ENTRY_HELP_TEXT : MSG_VIEWER_ENTRY_NORMAL_TEXT;
+ msg_ui_viewer_set_font_size(viewer_play_data, entry_type, MSG_VIEWER_FONT_CHANGE_LOAD_SETTING);
+ }
+ } else {
+ __msg_ui_viewer_volumebar_volume_up(viewer_play_data->volume_slider);
+ }
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool __msg_ui_viewer_down_key_long_press_cb(void *data)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RETV_IF(MSG_UI_LEVEL_DEBUG, data == NULL, EINA_FALSE);
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
+ int use_volume_key = false;
+
+ vconf_get_bool(VCONFKEY_MSG_APP_USE_VOLUME_KEY, &use_volume_key);
+
+ if (use_volume_key) {
+ msg_common_decrease_font_size();
+
+ if (viewer_play_data->render_entry) {
+ SMIL_SLIDE_INFO_S *slide = msg_smil_get_current_slide_info(viewer_play_data->SmilHandle);
+ MSG_VIEWER_ENTRY_TYPE_E entry_type = (slide && slide->pageInfo && slide->pageInfo->isHelpPage) ? MSG_VIEWER_ENTRY_HELP_TEXT : MSG_VIEWER_ENTRY_NORMAL_TEXT;
+ msg_ui_viewer_set_font_size(viewer_play_data, entry_type, MSG_VIEWER_FONT_CHANGE_LOAD_SETTING);
+ }
+ } else {
+ __msg_ui_viewer_volumebar_volume_down(viewer_play_data->volume_slider);
+ }
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool __msg_ui_viewer_volume_key_release_cb(void *data, int type, void *event)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RETV_IF(MSG_UI_LEVEL_DEBUG, data == NULL, EINA_FALSE);
+ MSG_UI_RETV_IF(MSG_UI_LEVEL_DEBUG, event == NULL, EINA_FALSE);
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
+ Ecore_Event_Key *ev = event;
+ int use_volume_key = false;
+
+ vconf_get_bool(VCONFKEY_MSG_APP_USE_VOLUME_KEY, &use_volume_key);
+
+ if (!use_volume_key) {
+ if (viewer_play_data->volumebar_timer) {
+ ecore_timer_del(viewer_play_data->volumebar_timer);
+ viewer_play_data->volumebar_timer = NULL;
+ }
+ viewer_play_data->volumebar_timer = ecore_timer_add(VIEWER_VOLUMEBAR_LIFETIME, __msg_ui_viewer_volumebar_timer_cb, viewer_play_data);
+ }
+
+ if (!g_strcmp0(ev->keyname, KEY_VOLUMEUP)) { /* KEY_VOLUMEUP */
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "KEY_VOLUMEUP is released");
+
+ if (viewer_play_data->vol_up_key_longpress) {
+ ecore_timer_del(viewer_play_data->vol_up_key_longpress);
+ viewer_play_data->vol_up_key_longpress = NULL;
+ }
+ } else if (!g_strcmp0(ev->keyname, KEY_VOLUMEDOWN)) { /* KEY_VOLUMEDOWN */
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "KEY_VOLUMEDOWN is released");
+
+ if (viewer_play_data->vol_down_key_longpress) {
+ ecore_timer_del(viewer_play_data->vol_down_key_longpress);
+ viewer_play_data->vol_down_key_longpress = NULL;
+ }
+ } else {
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "key_name is not applicable!");
+ }
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool __msg_ui_viewer_volume_key_press_cb(void *data, int type, void *event)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RETV_IF(MSG_UI_LEVEL_DEBUG, data == NULL, EINA_FALSE);
+ MSG_UI_RETV_IF(MSG_UI_LEVEL_DEBUG, event == NULL, EINA_FALSE);
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
+ Ecore_Event_Key *ev = event;
+ int use_volume_key = false;
+
+ vconf_get_bool(VCONFKEY_MSG_APP_USE_VOLUME_KEY, &use_volume_key);
+
+ if (use_volume_key) {
+ if (!g_strcmp0(ev->keyname, KEY_VOLUMEUP)) { /* KEY_VOLUMEUP */
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "KEY_VOLUMEUP is pressed");
+
+ msg_common_increase_font_size();
+
+ if (viewer_play_data->render_entry) {
+ SMIL_SLIDE_INFO_S *slide = msg_smil_get_current_slide_info(viewer_play_data->SmilHandle);
+ MSG_VIEWER_ENTRY_TYPE_E entry_type = (slide && slide->pageInfo && slide->pageInfo->isHelpPage) ? MSG_VIEWER_ENTRY_HELP_TEXT : MSG_VIEWER_ENTRY_NORMAL_TEXT;
+ msg_ui_viewer_set_font_size(viewer_play_data, entry_type, MSG_VIEWER_FONT_CHANGE_LOAD_SETTING);
+ }
+
+ viewer_play_data->vol_up_key_longpress = ecore_timer_add(VIEWER_VOLUME_KEY_FONT_LONG_PRESS_TIME, (Ecore_Task_Cb) __msg_ui_viewer_up_key_long_press_cb, (void *)viewer_play_data);
+ } else if (!g_strcmp0(ev->keyname, KEY_VOLUMEDOWN)) { /* KEY_VOLUMEDOWN */
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "KEY_VOLUMEDOWN is pressed");
+
+ msg_common_decrease_font_size();
+
+ if (viewer_play_data->render_entry) {
+ SMIL_SLIDE_INFO_S *slide = msg_smil_get_current_slide_info(viewer_play_data->SmilHandle);
+ MSG_VIEWER_ENTRY_TYPE_E entry_type = (slide && slide->pageInfo && slide->pageInfo->isHelpPage) ? MSG_VIEWER_ENTRY_HELP_TEXT : MSG_VIEWER_ENTRY_NORMAL_TEXT;
+ msg_ui_viewer_set_font_size(viewer_play_data, entry_type, MSG_VIEWER_FONT_CHANGE_LOAD_SETTING);
+ }
+
+ viewer_play_data->vol_down_key_longpress = ecore_timer_add(VIEWER_VOLUME_KEY_FONT_LONG_PRESS_TIME, (Ecore_Task_Cb) __msg_ui_viewer_down_key_long_press_cb, (void *)viewer_play_data);
+ } else {
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "key_name is not applicable!");
+ }
+ } else {
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Use volume key setting is not activated. Do volume key action");
+
+ if (!viewer_play_data->volumebar || !viewer_play_data->volume_slider)
+ msg_ui_viewer_create_volume_bar(viewer_play_data);
+
+ if (!g_strcmp0(ev->keyname, KEY_VOLUMEUP)) { /* KEY_VOLUMEUP */
+ if (viewer_play_data->volumebar_timer) {
+ ecore_timer_del(viewer_play_data->volumebar_timer);
+ viewer_play_data->volumebar_timer = NULL;
+ }
+ __msg_ui_viewer_volumebar_volume_up(viewer_play_data->volume_slider);
+
+ viewer_play_data->vol_up_key_longpress = ecore_timer_add(VIEWER_VOLUME_KEY_VOLUME_LONG_PRESS_TIME, (Ecore_Task_Cb) __msg_ui_viewer_up_key_long_press_cb, (void *)viewer_play_data);
+ } else if (!g_strcmp0(ev->keyname, KEY_VOLUMEDOWN)) { /* KEY_VOLUMEDOWN */
+ if (viewer_play_data->volumebar_timer) {
+ ecore_timer_del(viewer_play_data->volumebar_timer);
+ viewer_play_data->volumebar_timer = NULL;
+ }
+ __msg_ui_viewer_volumebar_volume_down(viewer_play_data->volume_slider);
+
+ viewer_play_data->vol_down_key_longpress = ecore_timer_add(VIEWER_VOLUME_KEY_VOLUME_LONG_PRESS_TIME, (Ecore_Task_Cb) __msg_ui_viewer_down_key_long_press_cb, (void *)viewer_play_data);
+ } else {
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "key_name is not applicable!");
+ }
+ }
+
+ return EINA_TRUE;
+}
+
+void msg_ui_viewer_create_volume_bar(void *data)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
+
+ Evas_Object *layout = NULL;
+ Evas_Object *slider = NULL;
+ Evas_Object *icon_start = NULL;
+ Evas_Object *icon_end = NULL;
+
+ layout = elm_layout_add(viewer_play_data->play_layout);
+ elm_layout_file_set(layout, MSG_VIEWER_THEME, "volume_controller");
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(layout);
+
+ slider = elm_slider_add(layout);
+ elm_slider_indicator_show_set(slider, EINA_TRUE);
+ evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5);
+ elm_slider_indicator_format_set(slider, "%1.0f");
+ evas_object_show(slider);
+
+ icon_start = elm_icon_add(layout);
+ elm_image_file_set(icon_start, MSG_IMAGES_EDJ, MSG_VIEWER_VOLUME_MIN);
+ evas_object_size_hint_aspect_set(icon_start, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ icon_end = elm_icon_add(layout);
+ elm_image_file_set(icon_end, MSG_IMAGES_EDJ, MSG_VIEWER_VOLUME_MAX);
+ evas_object_size_hint_aspect_set(icon_end, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ elm_object_content_set(slider,icon_start);
+ elm_object_part_content_set(slider, "end", icon_end);
+
+ elm_slider_min_max_set(slider, 0, __msg_ui_viewer_get_max_volume());
+ elm_slider_value_set(slider, __msg_ui_viewer_get_current_volume());
+
+ elm_object_part_content_set(layout, "slider", slider);
+
+ viewer_play_data->volumebar = layout;
+ viewer_play_data->volume_slider = slider;
+ elm_object_part_content_set(viewer_play_data->play_layout, "volume_layout", viewer_play_data->volumebar);
+
+ evas_object_data_set(slider, "viewer_play_data", viewer_play_data);
+
+ __msg_ui_viewer_volumebar_event_callback_add(slider, __msg_ui_viewer_volumebar_event_cb);
+
+ evas_object_smart_callback_add(slider, "slider,drag,start", __msg_ui_viewer_volumebar_drag_start_cb, viewer_play_data);
+ evas_object_smart_callback_add(slider, "slider,drag,stop", __msg_ui_viewer_volumebar_drag_stop_cb, viewer_play_data);
+ evas_object_smart_callback_add(slider, "changed", __msg_ui_viewer_volumebar_changed_cb, viewer_play_data);
+
+ //create timer
+ if (viewer_play_data->volumebar_timer) {
+ ecore_timer_del(viewer_play_data->volumebar_timer);
+ viewer_play_data->volumebar_timer = NULL;
+ }
+ viewer_play_data->volumebar_timer = ecore_timer_add(VIEWER_VOLUMEBAR_LIFETIME, __msg_ui_viewer_volumebar_timer_cb, viewer_play_data);
+
+}
+
+void msg_ui_viewer_destroy_volume_bar(void *data)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
+
+ if (viewer_play_data->volumebar_timer) {
+ ecore_timer_del(viewer_play_data->volumebar_timer);
+ viewer_play_data->volumebar_timer = NULL;
+ }
+
+ elm_object_part_content_unset(viewer_play_data->play_layout, "volume_layout");
+ evas_object_del(viewer_play_data->volumebar);
+ viewer_play_data->volumebar = NULL;
+}
+
+static Eina_Bool __msg_ui_viewer_volumebar_timer_cb(void *data)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RETVM_IF(MSG_UI_LEVEL_ERR, data == NULL, EINA_FALSE, "data is NULL");
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
+
+ elm_object_part_content_unset(viewer_play_data->play_layout, "volume_layout");
+ evas_object_del(viewer_play_data->volumebar);
+ viewer_play_data->volumebar = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void __msg_ui_viewer_volumebar_drag_start_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, data == NULL, "data is NULL");
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
+
+ if (viewer_play_data->volumebar_event_cb)
+ viewer_play_data->volumebar_event_cb(viewer_play_data, obj, MSG_VIEWER_VOLUME_EVENT_DRAG_START);
+
+ viewer_play_data->drag_volume_slider = true;
+}
+
+static void __msg_ui_viewer_volumebar_drag_stop_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, data == NULL, "data is NULL");
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
+
+ if (viewer_play_data->volumebar_event_cb)
+ viewer_play_data->volumebar_event_cb(viewer_play_data, obj, MSG_VIEWER_VOLUME_EVENT_DRAG_STOP);
+
+ viewer_play_data->drag_volume_slider = false;
+}
+
+static void __msg_ui_viewer_volumebar_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ double val = elm_slider_value_get(obj);
+
+ if ((int)val != __msg_ui_viewer_get_current_volume())
+ __msg_ui_viewer_set_volume((int)val);
+}
+
+static void __msg_ui_viewer_volumebar_event_cb(void *user_data, Evas_Object *obj, MSG_VIEWER_VOLUME_BAR_EVENT_E event)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, user_data == NULL, "data is NULL");
+ MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)user_data;
+
+ if (event == MSG_VIEWER_VOLUME_EVENT_DRAG_START) {
+ if (viewer_play_data->volumebar_timer) {
+ ecore_timer_del(viewer_play_data->volumebar_timer);
+ viewer_play_data->volumebar_timer = NULL;
+ }
+ } else if (event == MSG_VIEWER_VOLUME_EVENT_DRAG_STOP) {
+ viewer_play_data->volumebar_timer = ecore_timer_add(VIEWER_VOLUMEBAR_LIFETIME, __msg_ui_viewer_volumebar_timer_cb, viewer_play_data);
+ }
+}
+
+static void __msg_ui_viewer_volumebar_event_callback_add(Evas_Object *obj, MSG_VIEWER_VOLUMEBAR_CB event_cb)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, obj == NULL);
+ MSG_PLAY_DATA_S *viewer_play_data = evas_object_data_get(obj, "viewer_play_data");
+
+ viewer_play_data->volumebar_event_cb = event_cb;
+}
+
+static void __msg_ui_viewer_volumebar_volume_up(Evas_Object *obj)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ double max = 0.0;
+ elm_slider_min_max_get(obj, NULL, &max);
+
+ double current = elm_slider_value_get(obj);
+
+ if (current < max)
+ elm_slider_value_set(obj, (current + 1.0));
+
+ evas_object_smart_callback_call(obj, "changed", NULL);
+}
+
+static void __msg_ui_viewer_volumebar_volume_down(Evas_Object *obj)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ double min = 0.0;
+ elm_slider_min_max_get(obj, &min, NULL);
+
+ double current = elm_slider_value_get(obj);
+
+ if (current > min)
+ elm_slider_value_set(obj, (current - 1.0));
+
+ evas_object_smart_callback_call(obj, "changed", NULL);
+}
+
+static int __msg_ui_viewer_get_max_volume(void)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ int max_vol = 0;
+
+ int ret = sound_manager_get_max_volume(SOUND_TYPE_MEDIA, &max_vol);
+ if (ret != SOUND_MANAGER_ERROR_NONE) {
+ MSG_UI_DEBUG(MSG_UI_LEVEL_ERR,"sound_manager_get_max_volume().. [0x%x]", ret);
+ return -1;
+ }
+
+ return max_vol;
+}
+
+static int __msg_ui_viewer_get_current_volume(void)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ int current = 0;
+
+ int ret = sound_manager_get_volume(SOUND_TYPE_MEDIA, ¤t);
+ if (ret != SOUND_MANAGER_ERROR_NONE) {
+ MSG_UI_DEBUG(MSG_UI_LEVEL_ERR,"sound_manager_get_max_volume().. [0x%x]", ret);
+ return -1;
+ }
+
+ return current;
+}
+
+static bool __msg_ui_viewer_set_volume(int volume)
+{
+ MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
+ int ret = sound_manager_set_volume(SOUND_TYPE_MEDIA, volume);
+ if (ret != SOUND_MANAGER_ERROR_NONE) {
+ MSG_UI_DEBUG(MSG_UI_LEVEL_ERR,"sound_manager_set_volume().. [0x%x]", ret);
+ return false;
+ }
+
+ MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG,"set volume value = %d", volume);
+
+ return true;
+}