From 9e67fcd0648cc4e1a0e0af1ed1b66cd95621aeae Mon Sep 17 00:00:00 2001 From: Kim Kibum Date: Fri, 8 Jun 2012 14:54:21 +0900 Subject: [PATCH] apply FSL(Flora Software License) --- CMakeLists.txt | 207 + LICENSE | 77 + NOTICE | 0 debian/changelog | 7 + debian/compat | 1 + debian/control | 19 + debian/org.tizen.video-player.install | 7 + debian/org.tizen.video-player.install.in | 7 + debian/org.tizen.video-player.postinst | 10 + debian/org.tizen.video-player.postinst.in | 10 + debian/rules | 122 + debian/substvars | 1 + include/mp-util-media-service.h | 50 + include/mp-util.h | 100 + include/mp-video-animation-ctrl.h | 34 + include/mp-video-app-ctrl.h | 32 + include/mp-video-ctrl-mgr.h | 43 + include/mp-video-display-view.h | 52 + include/mp-video-info-ctrl.h | 24 + include/mp-video-log.h | 38 + include/mp-video-player-mgr.h | 90 + include/mp-video-progressbar.h | 32 + include/mp-video-sound-path-ctrl.h | 29 + include/mp-video-streaming-ctrl.h | 33 + include/mp-video-streaming-view.h | 46 + include/mp-video-string-define.h | 70 + include/mp-video-subtitle-ctrl.h | 27 + include/mp-video-type-define.h | 174 + include/mp-video-value-define.h | 223 + include/mp-video-view-ctrl.h | 39 + include/mp-xml-parser.h | 37 + include/video-player.h | 106 + org.tizen.video-player.desktop.in | 14 + packaging/org.tizen.video-player.spec | 67 + res/edc/add_tag.edc | 363 ++ res/edc/animation.edc | 316 ++ res/edc/control.edc | 724 ++++ res/edc/detail.edc | 50 + res/edc/hidden_button_panel.edc | 290 ++ res/edc/image_res.edc | 99 + res/edc/main.edc | 308 ++ res/edc/option_button.edc | 231 ++ res/edc/panel.edc | 87 + res/edc/progress.edc | 198 + res/edc/subtitle.edc | 55 + res/edc/vp-button.edc | 1086 +++++ res/edc/vp-controlbar.edc | 772 ++++ res/edc/vp-custom-winset-style.edc | 24 + res/edc/vp-naviframe.edc | 4257 ++++++++++++++++++++ res/edc/vp_font.edc | 26 + res/images/00_Option_header_bt.png | Bin 0 -> 3040 bytes res/images/00_Option_header_bt_dim.png | Bin 0 -> 3014 bytes res/images/00_Option_header_bt_press.png | Bin 0 -> 2993 bytes res/images/00_button_01_normal.png | Bin 0 -> 3068 bytes res/images/00_button_01_normal_dim.png | Bin 0 -> 3060 bytes res/images/00_button_01_normal_press.png | Bin 0 -> 3089 bytes res/images/00_winset_btn_prev.png | Bin 0 -> 3258 bytes res/images/00_winset_btn_prev_press.png | Bin 0 -> 349 bytes res/images/00_winset_control_top_arrow.png | Bin 0 -> 3163 bytes res/images/01_controlbar_icon_delete.png | Bin 0 -> 3072 bytes res/images/01_controlbar_icon_set_as.png | Bin 0 -> 3215 bytes res/images/01_controlbar_icon_share.png | Bin 0 -> 3220 bytes res/images/01_header_icon_add.png | Bin 0 -> 2999 bytes res/images/01_header_icon_cancel.png | Bin 0 -> 2980 bytes res/images/01_header_icon_others.png | Bin 0 -> 2934 bytes res/images/12_music_player_sound_path.png | Bin 0 -> 313 bytes res/images/T01_Nocontents_multimedia.png | Bin 0 -> 9146 bytes res/images/T01_Option_header_bt.png | Bin 0 -> 2984 bytes res/images/T01_Option_header_bt_press.png | Bin 0 -> 2939 bytes res/images/T01_back.png | Bin 0 -> 3928 bytes res/images/T01_btn_prev.png | Bin 0 -> 3228 bytes res/images/T01_control_icon_detail.png | Bin 0 -> 4684 bytes res/images/T01_control_icon_fullscreen.png | Bin 0 -> 4813 bytes res/images/T01_control_icon_reduce.png | Bin 0 -> 4817 bytes res/images/T01_control_top_arrow.png | Bin 0 -> 3055 bytes res/images/T01_control_top_bg.png | Bin 0 -> 2812 bytes res/images/T01_controlbar_icon_cancel.png | Bin 0 -> 3231 bytes res/images/T01_controlbar_icon_done.png | Bin 0 -> 3322 bytes res/images/T01_controller_btn.png | Bin 0 -> 2994 bytes res/images/T01_controller_btn_press.png | Bin 0 -> 3008 bytes res/images/T01_icon_expand.png | Bin 0 -> 3156 bytes res/images/T01_icon_reduce.png | Bin 0 -> 3141 bytes res/images/T01_icon_soundPath.png | Bin 0 -> 4527 bytes res/images/T01_icon_soundPath_h.png | Bin 0 -> 4241 bytes res/images/T01_icon_soundPath_press.png | Bin 0 -> 3681 bytes res/images/T01_player_progress_bar.png | Bin 0 -> 2802 bytes res/images/T01_player_progress_bg.png | Bin 0 -> 2839 bytes res/images/T01_player_progress_point.png | Bin 0 -> 2825 bytes res/images/T01_sound_path.png | Bin 0 -> 3081 bytes res/images/T01_title_btn.png | Bin 0 -> 3129 bytes res/images/T01_title_btn_press.png | Bin 0 -> 3126 bytes res/images/T01_toolbar_bg.png | Bin 0 -> 2797 bytes res/images/T01_toolbar_press.png | Bin 0 -> 2842 bytes res/images/gallery_loading_ani_01.png | Bin 0 -> 5221 bytes res/images/gallery_loading_ani_02.png | Bin 0 -> 5234 bytes res/images/gallery_loading_ani_03.png | Bin 0 -> 5203 bytes res/images/gallery_loading_ani_04.png | Bin 0 -> 5350 bytes res/images/gallery_loading_ani_05.png | Bin 0 -> 5285 bytes res/images/gallery_loading_ani_06.png | Bin 0 -> 5333 bytes res/images/gallery_loading_ani_07.png | Bin 0 -> 5297 bytes res/images/gallery_loading_ani_08.png | Bin 0 -> 5426 bytes res/images/gallery_loading_ani_09.png | Bin 0 -> 5452 bytes res/images/gallery_loading_ani_10.png | Bin 0 -> 5389 bytes res/images/gallery_loading_ani_11.png | Bin 0 -> 5265 bytes res/images/gallery_loading_ani_12.png | Bin 0 -> 5348 bytes res/images/gallery_loading_ani_13.png | Bin 0 -> 5435 bytes res/images/gallery_loading_ani_14.png | Bin 0 -> 5482 bytes res/images/gallery_loading_ani_15.png | Bin 0 -> 5536 bytes res/images/gallery_loading_ani_16.png | Bin 0 -> 5330 bytes res/images/gallery_loading_ani_17.png | Bin 0 -> 5335 bytes res/images/gallery_loading_ani_18.png | Bin 0 -> 5247 bytes res/images/gallery_loading_ani_19.png | Bin 0 -> 5422 bytes res/images/gallery_loading_ani_20.png | Bin 0 -> 5375 bytes res/images/gallery_loading_ani_21.png | Bin 0 -> 5343 bytes res/images/gallery_loading_ani_22.png | Bin 0 -> 5374 bytes res/images/gallery_loading_ani_23.png | Bin 0 -> 5527 bytes res/images/gallery_loading_ani_24.png | Bin 0 -> 5481 bytes res/images/gallery_loading_ani_25.png | Bin 0 -> 5409 bytes res/images/gallery_loading_ani_26.png | Bin 0 -> 5311 bytes res/images/gallery_loading_ani_27.png | Bin 0 -> 5359 bytes res/images/gallery_loading_ani_28.png | Bin 0 -> 5442 bytes res/images/gallery_loading_ani_29.png | Bin 0 -> 5489 bytes res/images/gallery_loading_ani_30.png | Bin 0 -> 5600 bytes res/images/gallery_video_add_btn.png | Bin 0 -> 3444 bytes res/images/gallery_video_add_btn_press.png | Bin 0 -> 3493 bytes res/images/gallery_video_control_ff.png | Bin 0 -> 3056 bytes res/images/gallery_video_control_frame_back.png | Bin 0 -> 3143 bytes res/images/gallery_video_control_frame_forword.png | Bin 0 -> 3154 bytes res/images/gallery_video_control_next.png | Bin 0 -> 3168 bytes res/images/gallery_video_control_pause.png | Bin 0 -> 2932 bytes res/images/gallery_video_control_play.png | Bin 0 -> 3084 bytes res/images/gallery_video_control_prev.png | Bin 0 -> 3175 bytes res/images/gallery_video_control_rew.png | Bin 0 -> 477 bytes res/images/gallery_video_delete_btn.png | Bin 0 -> 3458 bytes res/images/gallery_video_delete_btn_press.png | Bin 0 -> 3411 bytes res/images/gallery_video_icon_btn.png | Bin 0 -> 3306 bytes res/images/gallery_video_icon_btn_press.png | Bin 0 -> 3239 bytes res/images/gallery_video_icon_mute.png | Bin 0 -> 3154 bytes res/images/gallery_video_icon_volume.png | Bin 0 -> 3222 bytes res/images/gallery_video_player_bg.png | Bin 0 -> 3468 bytes res/images/gallery_video_popup_mute.png | Bin 0 -> 4136 bytes res/images/navibar_item_separator_shadow.png | Bin 0 -> 160 bytes res/images/naviframe_optionheader.png | Bin 0 -> 2788 bytes res/images/naviframe_optionheader_arrow.png | Bin 0 -> 3152 bytes res/images/org.tizen.video-player.png | Bin 0 -> 18729 bytes res/images/video_sound_path_dim.png | Bin 0 -> 527 bytes res/po/CMakeLists.txt | 23 + res/po/POTFILES.in | 13 + res/po/de_DE.po | 180 + res/po/el_GR.po | 180 + res/po/en.po | 180 + res/po/es_ES.po | 180 + res/po/fr_FR.po | 180 + res/po/it_IT.po | 180 + res/po/ja_JP.po | 180 + res/po/ko_KR.po | 180 + res/po/nl_NL.po | 180 + res/po/pt_PT.po | 180 + res/po/ru_RU.po | 180 + res/po/tr_TR.po | 180 + res/po/zh_CN.po | 180 + res/po/zh_HK.po | 180 + res/po/zh_TW.po | 180 + src/mp-util-media-service.c | 657 +++ src/mp-util.c | 1466 +++++++ src/mp-video-animation-ctrl.c | 150 + src/mp-video-app-ctrl.c | 1604 ++++++++ src/mp-video-ctrl-mgr.c | 362 ++ src/mp-video-display-view.c | 1222 ++++++ src/mp-video-info-ctrl.c | 360 ++ src/mp-video-player-mgr.c | 993 +++++ src/mp-video-progressbar.c | 410 ++ src/mp-video-sound-path-ctrl.c | 415 ++ src/mp-video-streaming-ctrl.c | 640 +++ src/mp-video-streaming-view.c | 904 +++++ src/mp-video-subtitle-ctrl.c | 190 + src/mp-video-view-ctrl.c | 628 +++ src/mp-xml-parser.c | 371 ++ src/video-player.c | 296 ++ 179 files changed, 24118 insertions(+) create mode 100755 CMakeLists.txt create mode 100755 LICENSE create mode 100755 NOTICE create mode 100755 debian/changelog create mode 100755 debian/compat create mode 100755 debian/control create mode 100755 debian/org.tizen.video-player.install create mode 100755 debian/org.tizen.video-player.install.in create mode 100755 debian/org.tizen.video-player.postinst create mode 100755 debian/org.tizen.video-player.postinst.in create mode 100755 debian/rules create mode 100755 debian/substvars create mode 100755 include/mp-util-media-service.h create mode 100755 include/mp-util.h create mode 100755 include/mp-video-animation-ctrl.h create mode 100755 include/mp-video-app-ctrl.h create mode 100755 include/mp-video-ctrl-mgr.h create mode 100755 include/mp-video-display-view.h create mode 100755 include/mp-video-info-ctrl.h create mode 100755 include/mp-video-log.h create mode 100755 include/mp-video-player-mgr.h create mode 100755 include/mp-video-progressbar.h create mode 100755 include/mp-video-sound-path-ctrl.h create mode 100755 include/mp-video-streaming-ctrl.h create mode 100755 include/mp-video-streaming-view.h create mode 100755 include/mp-video-string-define.h create mode 100755 include/mp-video-subtitle-ctrl.h create mode 100755 include/mp-video-type-define.h create mode 100755 include/mp-video-value-define.h create mode 100755 include/mp-video-view-ctrl.h create mode 100755 include/mp-xml-parser.h create mode 100755 include/video-player.h create mode 100755 org.tizen.video-player.desktop.in create mode 100755 packaging/org.tizen.video-player.spec create mode 100755 res/edc/add_tag.edc create mode 100755 res/edc/animation.edc create mode 100755 res/edc/control.edc create mode 100755 res/edc/detail.edc create mode 100755 res/edc/hidden_button_panel.edc create mode 100755 res/edc/image_res.edc create mode 100755 res/edc/main.edc create mode 100755 res/edc/option_button.edc create mode 100755 res/edc/panel.edc create mode 100755 res/edc/progress.edc create mode 100755 res/edc/subtitle.edc create mode 100755 res/edc/vp-button.edc create mode 100755 res/edc/vp-controlbar.edc create mode 100755 res/edc/vp-custom-winset-style.edc create mode 100755 res/edc/vp-naviframe.edc create mode 100755 res/edc/vp_font.edc create mode 100755 res/images/00_Option_header_bt.png create mode 100755 res/images/00_Option_header_bt_dim.png create mode 100755 res/images/00_Option_header_bt_press.png create mode 100755 res/images/00_button_01_normal.png create mode 100755 res/images/00_button_01_normal_dim.png create mode 100755 res/images/00_button_01_normal_press.png create mode 100755 res/images/00_winset_btn_prev.png create mode 100755 res/images/00_winset_btn_prev_press.png create mode 100755 res/images/00_winset_control_top_arrow.png create mode 100755 res/images/01_controlbar_icon_delete.png create mode 100755 res/images/01_controlbar_icon_set_as.png create mode 100755 res/images/01_controlbar_icon_share.png create mode 100755 res/images/01_header_icon_add.png create mode 100755 res/images/01_header_icon_cancel.png create mode 100755 res/images/01_header_icon_others.png create mode 100755 res/images/12_music_player_sound_path.png create mode 100755 res/images/T01_Nocontents_multimedia.png create mode 100755 res/images/T01_Option_header_bt.png create mode 100755 res/images/T01_Option_header_bt_press.png create mode 100755 res/images/T01_back.png create mode 100755 res/images/T01_btn_prev.png create mode 100755 res/images/T01_control_icon_detail.png create mode 100755 res/images/T01_control_icon_fullscreen.png create mode 100755 res/images/T01_control_icon_reduce.png create mode 100755 res/images/T01_control_top_arrow.png create mode 100755 res/images/T01_control_top_bg.png create mode 100755 res/images/T01_controlbar_icon_cancel.png create mode 100755 res/images/T01_controlbar_icon_done.png create mode 100755 res/images/T01_controller_btn.png create mode 100755 res/images/T01_controller_btn_press.png create mode 100755 res/images/T01_icon_expand.png create mode 100755 res/images/T01_icon_reduce.png create mode 100755 res/images/T01_icon_soundPath.png create mode 100755 res/images/T01_icon_soundPath_h.png create mode 100755 res/images/T01_icon_soundPath_press.png create mode 100755 res/images/T01_player_progress_bar.png create mode 100755 res/images/T01_player_progress_bg.png create mode 100755 res/images/T01_player_progress_point.png create mode 100755 res/images/T01_sound_path.png create mode 100755 res/images/T01_title_btn.png create mode 100755 res/images/T01_title_btn_press.png create mode 100755 res/images/T01_toolbar_bg.png create mode 100755 res/images/T01_toolbar_press.png create mode 100755 res/images/gallery_loading_ani_01.png create mode 100755 res/images/gallery_loading_ani_02.png create mode 100755 res/images/gallery_loading_ani_03.png create mode 100755 res/images/gallery_loading_ani_04.png create mode 100755 res/images/gallery_loading_ani_05.png create mode 100755 res/images/gallery_loading_ani_06.png create mode 100755 res/images/gallery_loading_ani_07.png create mode 100755 res/images/gallery_loading_ani_08.png create mode 100755 res/images/gallery_loading_ani_09.png create mode 100755 res/images/gallery_loading_ani_10.png create mode 100755 res/images/gallery_loading_ani_11.png create mode 100755 res/images/gallery_loading_ani_12.png create mode 100755 res/images/gallery_loading_ani_13.png create mode 100755 res/images/gallery_loading_ani_14.png create mode 100755 res/images/gallery_loading_ani_15.png create mode 100755 res/images/gallery_loading_ani_16.png create mode 100755 res/images/gallery_loading_ani_17.png create mode 100755 res/images/gallery_loading_ani_18.png create mode 100755 res/images/gallery_loading_ani_19.png create mode 100755 res/images/gallery_loading_ani_20.png create mode 100755 res/images/gallery_loading_ani_21.png create mode 100755 res/images/gallery_loading_ani_22.png create mode 100755 res/images/gallery_loading_ani_23.png create mode 100755 res/images/gallery_loading_ani_24.png create mode 100755 res/images/gallery_loading_ani_25.png create mode 100755 res/images/gallery_loading_ani_26.png create mode 100755 res/images/gallery_loading_ani_27.png create mode 100755 res/images/gallery_loading_ani_28.png create mode 100755 res/images/gallery_loading_ani_29.png create mode 100755 res/images/gallery_loading_ani_30.png create mode 100755 res/images/gallery_video_add_btn.png create mode 100755 res/images/gallery_video_add_btn_press.png create mode 100755 res/images/gallery_video_control_ff.png create mode 100755 res/images/gallery_video_control_frame_back.png create mode 100755 res/images/gallery_video_control_frame_forword.png create mode 100755 res/images/gallery_video_control_next.png create mode 100755 res/images/gallery_video_control_pause.png create mode 100755 res/images/gallery_video_control_play.png create mode 100755 res/images/gallery_video_control_prev.png create mode 100755 res/images/gallery_video_control_rew.png create mode 100755 res/images/gallery_video_delete_btn.png create mode 100755 res/images/gallery_video_delete_btn_press.png create mode 100755 res/images/gallery_video_icon_btn.png create mode 100755 res/images/gallery_video_icon_btn_press.png create mode 100755 res/images/gallery_video_icon_mute.png create mode 100755 res/images/gallery_video_icon_volume.png create mode 100755 res/images/gallery_video_player_bg.png create mode 100755 res/images/gallery_video_popup_mute.png create mode 100755 res/images/navibar_item_separator_shadow.png create mode 100755 res/images/naviframe_optionheader.png create mode 100755 res/images/naviframe_optionheader_arrow.png create mode 100755 res/images/org.tizen.video-player.png create mode 100755 res/images/video_sound_path_dim.png create mode 100755 res/po/CMakeLists.txt create mode 100755 res/po/POTFILES.in create mode 100755 res/po/de_DE.po create mode 100755 res/po/el_GR.po create mode 100755 res/po/en.po create mode 100755 res/po/es_ES.po create mode 100755 res/po/fr_FR.po create mode 100755 res/po/it_IT.po create mode 100755 res/po/ja_JP.po create mode 100755 res/po/ko_KR.po create mode 100755 res/po/nl_NL.po create mode 100755 res/po/pt_PT.po create mode 100755 res/po/ru_RU.po create mode 100755 res/po/tr_TR.po create mode 100755 res/po/zh_CN.po create mode 100755 res/po/zh_HK.po create mode 100755 res/po/zh_TW.po create mode 100755 src/mp-util-media-service.c create mode 100755 src/mp-util.c create mode 100755 src/mp-video-animation-ctrl.c create mode 100755 src/mp-video-app-ctrl.c create mode 100755 src/mp-video-ctrl-mgr.c create mode 100755 src/mp-video-display-view.c create mode 100755 src/mp-video-info-ctrl.c create mode 100755 src/mp-video-player-mgr.c create mode 100755 src/mp-video-progressbar.c create mode 100755 src/mp-video-sound-path-ctrl.c create mode 100755 src/mp-video-streaming-ctrl.c create mode 100755 src/mp-video-streaming-view.c create mode 100755 src/mp-video-subtitle-ctrl.c create mode 100755 src/mp-video-view-ctrl.c create mode 100755 src/mp-xml-parser.c create mode 100755 src/video-player.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..c9a9894 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,207 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.4) +PROJECT(video-player C) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +SET(SRCS +src/video-player.c +src/mp-util.c +src/mp-video-app-ctrl.c +src/mp-xml-parser.c +src/mp-video-view-ctrl.c +src/mp-video-display-view.c +src/mp-video-progressbar.c +src/mp-util-media-service.c +src/mp-video-sound-path-ctrl.c +src/mp-video-streaming-view.c +src/mp-video-ctrl-mgr.c +src/mp-video-player-mgr.c +src/mp-video-animation-ctrl.c +src/mp-video-streaming-ctrl.c +src/mp-video-subtitle-ctrl.c +src/mp-video-info-ctrl.c +) + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs REQUIRED elementary +appcore-efl +ui-gadget +utilX +mm-common +mm-player +mm-sound +dlog +pmapi +mm-session +vconf +mm-ta +mm-fileinfo +appcore-common +libmedia-service +libxml-2.0 +syspopup-caller +ecore +ecore-file +ecore-imf +ecore-x +ecore-input +ecore-evas +eina +evas +edje +appsvc +ail +efreet-mime +icu-i18n +icu-io +icu-le +icu-lx +icu-uc) + + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + + +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") +ADD_DEFINITIONS("-DRESDIR=\"${RESDIR}\"") +ADD_DEFINITIONS("-DDATADIR=\"${DATADIR}\"") +ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"") +ADD_DEFINITIONS("-DICONDIR=\"${ICONDIR}\"") +ADD_DEFINITIONS("-DEDJDIR=\"${EDJDIR}\"") + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(BINDIR "${PREFIX}/bin") +SET(RESDIR "${PREFIX}/res") +SET(DATADIR "/opt/apps/org.tizen.video-player/data") +SET(LOCALEDIR "${RESDIR}/locale") +SET(ICONDIR "${RESDIR}/icons/default/small") +SET(EDJDIR "${RESDIR}/edje") +SET(SLP_LD_PATH_FLAGS -L${CMAKE_CURRENT_SOURCE_DIR}/src/ext) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + + +CONFIGURE_FILE(org.tizen.video-player.desktop.in org.tizen.video-player.desktop) + +FIND_PROGRAM(UNAME NAMES uname) +EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") +IF("${ARCH}" STREQUAL "arm") + ADD_DEFINITIONS("-DTARGET") + MESSAGE("add -DTARGET") +ENDIF("${ARCH}" STREQUAL "arm") + + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} ${gles_pkg_LDFLAGS} -lmmffile -lmmfsound -ldl) + +ADD_CUSTOM_TARGET(main.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/main.edc +${CMAKE_BINARY_DIR}/res/edc/main.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/main.edc) + +ADD_CUSTOM_TARGET(vp_font.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/vp_font.edc +${CMAKE_BINARY_DIR}/res/edc/vp_font.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/vp_font.edc) + +ADD_CUSTOM_TARGET(image_res.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/image_res.edc +${CMAKE_BINARY_DIR}/res/edc/image_res.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/image_res.edc) + +ADD_CUSTOM_TARGET(panel.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/panel.edc +${CMAKE_BINARY_DIR}/res/edc/panel.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/panel.edc) + +ADD_CUSTOM_TARGET(progress.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/progress.edc +${CMAKE_BINARY_DIR}/res/edc/progress.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/progress.edc) + + +ADD_CUSTOM_TARGET(control.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/control.edc +${CMAKE_BINARY_DIR}/res/edc/control.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/control.edc) + +ADD_CUSTOM_TARGET(add_tag.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/add_tag.edc +${CMAKE_BINARY_DIR}/res/edc/add_tag.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/add_tag.edc) + +ADD_CUSTOM_TARGET(animation.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/animation.edc +${CMAKE_BINARY_DIR}/res/edc/animation.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/animation.edc) + +ADD_CUSTOM_TARGET(detail.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/detail.edc +${CMAKE_BINARY_DIR}/res/edc/detail.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/detail.edc) + +ADD_CUSTOM_TARGET(subtitle.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/subtitle.edc +${CMAKE_BINARY_DIR}/res/edc/subtitle.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/subtitle.edc) + +ADD_CUSTOM_TARGET(vp-custom-winset-style.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/vp-custom-winset-style.edc +${CMAKE_BINARY_DIR}/res/edc/vp-custom-winset-style.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/vp-custom-winset-style.edc) + +ADD_CUSTOM_TARGET(hidden_button_panel.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/hidden_button_panel.edc +${CMAKE_BINARY_DIR}/res/edc/hidden_button_panel.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/hidden_button_panel.edc) + +ADD_CUSTOM_TARGET(option_button.edj COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/res/images +${CMAKE_SOURCE_DIR}/res/edc/option_button.edc +${CMAKE_BINARY_DIR}/res/edc/option_button.edj DEPENDS +${CMAKE_SOURCE_DIR}/res/edc/option_button.edc) + +ADD_DEPENDENCIES(${PROJECT_NAME} main.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} vp_font.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} image_res.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} panel.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} progress.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} control.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} add_tag.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} animation.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} detail.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} subtitle.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} vp-custom-winset-style.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} hidden_button_panel.edj) +ADD_DEPENDENCIES(${PROJECT_NAME} option_button.edj) + + +###################################### +# install desktop file & icon, edje # +###################################### + +INSTALL(DIRECTORY DESTINATION ${DATADIR}) +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/main.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/vp_font.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/image_res.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/panel.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/progress.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/control.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/add_tag.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/animation.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/detail.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/subtitle.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/vp-custom-winset-style.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/hidden_button_panel.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/res/edc/option_button.edj DESTINATION ${EDJDIR}) + +INSTALL(FILES ${CMAKE_SOURCE_DIR}/org.tizen.video-player.desktop DESTINATION /opt/share/applications) + +INSTALL(FILES ${CMAKE_SOURCE_DIR}/res/images/org.tizen.video-player.png DESTINATION /opt/apps/org.tizen.video-player/res/icons/default/small) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res/images/ DESTINATION ${RESDIR}/images) + +ADD_SUBDIRECTORY(res/po) diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..bbc9fc3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,77 @@ +Flora License + +Version 1.0, May, 2012 + +http://www.tizenopensource.org/license + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies with the standards set forth in the Compatibility Definition Document and passes the Compatibility Test Suite as defined from time to time by the Tizen Technical Steering Group and certified by the Tizen Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work solely as incorporated into a Tizen Certified Platform, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work solely as incorporated into a Tizen Certified Platform to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof pursuant to the copyright license above, in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and + + 2. You must cause any modified files to carry prominent notices stating that You changed the files; and + + 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + 4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Flora License, Version 1.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.tizenopensource.org/license + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + diff --git a/NOTICE b/NOTICE new file mode 100755 index 0000000..e69de29 diff --git a/debian/changelog b/debian/changelog new file mode 100755 index 0000000..9aa8b91 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,7 @@ +video-player (0.1.5) unstable; urgency=low + + * Initial release. + * Git: pkgs/v/video-player + * Tag : video-player_0.1.5 + + -- jongdong.lee Tue, 06 Dec 2011 16:49:05 -0800 diff --git a/debian/compat b/debian/compat new file mode 100755 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100755 index 0000000..f312da5 --- /dev/null +++ b/debian/control @@ -0,0 +1,19 @@ +Source: video-player +Section: video +Priority: optional +Maintainer: JongDong Lee , ChangSun Lee , JuBong Lee +Uploaders: JongDong Lee , ChangSun Lee , JuBong Lee +Build-Depends: debhelper (>= 5),libelm-dev, libappcore-efl-dev, libui-gadget-dev, libslp-utilx-dev, libmm-common-dev, libmm-player-dev, libmm-sound-dev, dlog-dev, libslp-pm-dev, libmm-session-dev, libmm-ta-dev, libmm-fileinfo-dev, libappcore-common-dev, libmedia-service-dev, libxml2-0, syspopup-caller-dev, libecore, libecore-file, libecore-imf, libecore-x, libecore-input, libecore-evas, libeina, libevas, libedje, libappsvc-dev, libail-0-dev, libefreet-dev, libicu-dev, execstack +Standards-Version: 3.7.2 + +Package: org.tizen.video-player +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, libappcore-efl-0, libslp-utilx-0, libslp-sensor-0, libmm-common, libmm-player, libmm-log, libmm-ta, libmm-sound-0, libmm-fileinfo, libdlog-0, libmm-session-0, libslp-setting-0, libappcore-efl-0, libui-gadget-0, libmm-utility, libxml2-0, libmedia-service, libpng12-0, libappsvc-0, libail-0, libmedia-utils +Description: Video & streaming player + +Package: org.tizen.video-player-dbg +Section: debug +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, org.tizen.video-player (= ${Source-Version}) +Description: Video & streaming player (unstripped) + diff --git a/debian/org.tizen.video-player.install b/debian/org.tizen.video-player.install new file mode 100755 index 0000000..eb020fa --- /dev/null +++ b/debian/org.tizen.video-player.install @@ -0,0 +1,7 @@ +/opt/apps/org.tizen.video-player/bin/* +/opt/apps/org.tizen.video-player/res/locale/* +/opt/apps/org.tizen.video-player/res/icons/default/small/* +/opt/apps/org.tizen.video-player/res/edje/* +/opt/apps/org.tizen.video-player/res/images/* +/opt/apps/org.tizen.video-player/data +/opt/share/applications/* diff --git a/debian/org.tizen.video-player.install.in b/debian/org.tizen.video-player.install.in new file mode 100755 index 0000000..0ac9b2d --- /dev/null +++ b/debian/org.tizen.video-player.install.in @@ -0,0 +1,7 @@ +@PREFIX@/bin/* +@PREFIX@/res/locale/* +@PREFIX@/res/icons/default/small/* +@PREFIX@/res/edje/* +@PREFIX@/res/images/* +@PREFIX@/data +/opt/share/applications/* diff --git a/debian/org.tizen.video-player.postinst b/debian/org.tizen.video-player.postinst new file mode 100755 index 0000000..1c1810e --- /dev/null +++ b/debian/org.tizen.video-player.postinst @@ -0,0 +1,10 @@ +#!/bin/sh +# Create a directory to store video-player bookmark pictures and stuffs. +# mkdir -p /opt/data/video-player + +if [ ${USER} == "root" ] +then + #chown 5000:5000 /opt/data/video-player + chown -R 5000:5000 /opt/apps/org.tizen.video-player/data + +fi diff --git a/debian/org.tizen.video-player.postinst.in b/debian/org.tizen.video-player.postinst.in new file mode 100755 index 0000000..1c1810e --- /dev/null +++ b/debian/org.tizen.video-player.postinst.in @@ -0,0 +1,10 @@ +#!/bin/sh +# Create a directory to store video-player bookmark pictures and stuffs. +# mkdir -p /opt/data/video-player + +if [ ${USER} == "root" ] +then + #chown 5000:5000 /opt/data/video-player + chown -R 5000:5000 /opt/apps/org.tizen.video-player/data + +fi diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..5097cee --- /dev/null +++ b/debian/rules @@ -0,0 +1,122 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + +CFLAGS += -Wall -g +LDFLAGS ?= +PREFIX ?= /opt/apps/org.tizen.video-player +RESDIR ?= /opt/apps/org.tizen.video-player/res +DATADIR ?= /opt/apps/org.tizen.video-player/data + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +CFLAGS += -fpie +LDFLAGS += -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed -pie + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" cmake . -DCMAKE_INSTALL_PREFIX=$(PREFIX) + + touch configure-stamp + + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + + # Add here commands to compile the package. + $(MAKE) + #docbook-to-man debian/video-player.sgml > video-player.1 + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + cat $$f > $${f%.in}; \ + sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \ + sed -i -e "s#@RESDIR@#$(RESDIR)#g" $${f%.in}; \ + sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \ + done + + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + + # Add here commands to clean up after the build process. + -$(MAKE) clean + + find ./ -depth -type d -name "CMakeFiles" -exec rm {} -rf \; + find ./ -name "Makefile" -exec rm {} -f \; + find ./ -name "cmake_install.cmake" -exec rm {} -f \; + rm -rf CMakeCache.txt + rm -rf install_manifest.txt + rm -rf *.pc + rm -rf *.so + rm -rf org.tizen.video-player.desktop + rm -rf res/edc/*.edj + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/video-player. + $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + execstack -c $(CURDIR)/debian/tmp/opt/apps/org.tizen.video-player/bin/video-player + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples + dh_install --sourcedir=debian/tmp +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link +# dh_strip + dh_strip --dbg-package=org.tizen.video-player-dbg + dh_compress + dh_fixperms +# dh_perl +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/debian/substvars b/debian/substvars new file mode 100755 index 0000000..5c38c57 --- /dev/null +++ b/debian/substvars @@ -0,0 +1 @@ +shlibs:Depends=libdbus-1-0 (>= 1.1.1), libeet1, libeina-svn-04 (>= 0.0.2.062+svn20090910), libelm-svn-01, libembryo0, libglib2.0-0, libgstreamer-plugins-base0.10-0, libgstreamer0.10-0, libimlib2, zlib1g diff --git a/include/mp-util-media-service.h b/include/mp-util-media-service.h new file mode 100755 index 0000000..31b7105 --- /dev/null +++ b/include/mp-util-media-service.h @@ -0,0 +1,50 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _MP_UTIL_DATABASE_ +#define _MP_UTIL_DATABASE_ + + +#include "video-player.h" +#include + +void MpUtilMediaSvcInitSession(void); +void MpUtilMediaSvcFinishSession(void); + +void MpUtilMediaSvcDestoryVideoList(void); +bool MpUtilMediaSvcDestroyItem(char* szFilePath); + +bool MpUtilMediaSvcGetVideoFileListFromFolder(char* szFilePath, int nSortType); +bool MpUtilMediaSvcGetVideoFileListFromAllFolderOfGallery(int nSortType); +bool MpUtilMediaSvcGetVideoFileListByTagName(char* szTagName); +bool MpUtilMediaSvcGetVideoFileListFromFavorite(int nSortType); + +void MpUtilMediaSvcMtagIterateDestroyTagList(void); +int MpUtilMediaSvcMtagGetAllTagList(char* pTagList[]); + +bool MpUtilMediaSvcMtagAddItemToTag(const char* szTagName, char* szMediaUri); +bool MpUtilMediaSvcMtagGetItemToFavorite(char* szMediaUri); +bool MpUtilMediaSvcMtagAddItemToFavorite(char* szMediaUri,bool bFavorite); +char* MpUtilMediaSvcMitemGetThumbnailUrl(char* szMediaUri); +bool MpUtilMediaSvcGetPreNextVideoUrl(char* szCurrMediaUri, char* szPreMediaUri, char* szNextMediaUri); + +void MpUtilMediaSvcGetVideoID(const char *szPath, char *szVideoID); +void MpUtilMediaSvcSaveLastPlayedTime(char* szMediaUri, unsigned int nLastPlayedTime); + + + +#endif // _MP_UTIL_DATABASE_ diff --git a/include/mp-util.h b/include/mp-util.h new file mode 100755 index 0000000..831e0ee --- /dev/null +++ b/include/mp-util.h @@ -0,0 +1,100 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef _MP_UTIL_ +#define _MP_UTIL_ + + +#include "video-player.h" + + +typedef enum +{ + NORMAL_POPUP_RETURN_TYPE_UNKNOW = 0, + NORMAL_POPUP_RETURN_TYPE_YES, + NORMAL_POPUP_RETURN_TYPE_NO, + NORMAL_POPUP_RETURN_TYPE_ERR, +}NormalPopUpRetType; + + +void MpUtilResetForRelaunching(void); +void* MpUtilCreateMainWindow(const char *pStrName); +void* MpUtilCreateWindow(const char *pStrName); +int MpUtilSetKeyGrab(const char* szKeyName, int nGrabMode); +int MpUtilSetKeyUngrab(const char* szKeyName); +bool MpUtilCheckRTSPType(char *szUriPath); +int MpUtilCheckPlayerType(char *szUriPath); + +bool MpUtilGetURIFromBundle(bundle* pBundleData, VideoAppData* pAppData); +bool MpUtilGetCookieFromBundle(bundle* pBundleData, VideoAppData* pAppData); +bool MpUtilGetURIFromAUL(bundle * pBundleData, VideoAppData *pAppData); + +bool MpUtilCheckLocalFileExist(char *uri); +bool MpUtilCheckVideoURI(VideoAppData* pAppData); + bool MpUtilCheckBatteryStatus(void); + +int MpUtilBatteryStatusNoti(VideoAppData* pAppData); +int MpUtilBatteryStatusNotiIgnore(void); +int MpUtilMMCstatusNoti(VideoAppData* pAppData); +int MpUtilMMCstatusNotiIgnore(void); + +void MpUtilLanguageInit(VideoAppData* pAppData); +int MpUtilCheckStartPositionTime(void* pBundle, char* szBundleKey); +bool MpUtilCheckLaunchingByMime(void* pBundle, char* szMediaUri); +int MpUtilCheckLaunchingByOtherApp(void* pBundle, char* szBundleKey); +int MpUtilCheckSortType(void* pBundle, char* szBundleKey); +int MpUtilCheckListType(void* pBundle, char* szBundleKey); +bool MpUtilGetTagNameOfGallery(void* pBundle, char* szBundleKey, char* szTagName); +int MpUtilCheckDlnaSortType(void* pBundle, char* szBundleKey); +int MpUtilCheckDlnaMediaID(void* pBundle, char* szBundleKey); + +void MpUtilInitXML(); +void MpUtilDestroyXML(); +char* MpUtilGetXMLQualityURL(void); +bool MpUtilIsXMLUrl(char* szMediaUri); +bool MpUtilParsingXML(char* szMediaUri, VideoAppData* pAppData); +int MpUtilGetXMLItemCount(void); + +bool MpUtilGetTitleFromFilepath(char* szFilepath, char* szTitle); +void MpUtilInitSession(void); +void MpUtilFinishSession(void); +void MpUtilVolumeTypeSet(void); +void MpUtilVolumeTypeUnset(void); +void MpUtilDeletePopupHandle(void); +bool MpUtilNotifyPopUp(VideoAppData* pAppData, char* szContents, void* PopupButtonCallbackFunc); +bool MpUtilWarinigPopUp(VideoAppData *pAppData, char *szContents,void *PopupButtonCallbackFunc); +bool MpUtilYesNoPopUp(VideoAppData *pAppData, char *szTitle, char *szContents, void *PopupYesButtonCallbackFunc, void *PopupNoButtonCallbackFunc); +bool MpUtilDetailPopup(VideoAppData *pAppData, char *szTitle, void *PopupButtonCallbackFunc); +bool MpUtilProgressPopUp(VideoAppData* pAppData, char* szLabel); +void* MpUtilCreateButtonIcon(void *pParent, const char *szIconPath, bool bX, bool bY, void *pUserData, char* szButtonStyle, void *func); +int MpUtilSendFileViaBluetooth(char *szFilepath); +void* MpUtilLoadEdjFile(Evas* pEvas, char* szEdjName, char* szGroupName); +bool MpUtilCheckCallStatus(void); +bool MpUtilIsConnectEarjack(void); +bool MpUtilRegisteEarjackCbFunc(void* pEarjackCb, void* pUserData); +int* MpUtilGetMainWindowXID(void); +void MpUtilGetUserAgent(VideoAppData* pAppData); +double MpUtilGetSysTime(void); +void MpUtilLcdNormalPowerLockForResume(void); +void MpUtilLcdNormalPowerUnlockForPause(void); +void MpUtilLcdOffForPowerButton(void); +void MpUtilMultimediaKeyGrab(void); +void MpUtilMultimediaKeyUngrab(void); + +#endif // _MP_UTIL_ diff --git a/include/mp-video-animation-ctrl.h b/include/mp-video-animation-ctrl.h new file mode 100755 index 0000000..6202492 --- /dev/null +++ b/include/mp-video-animation-ctrl.h @@ -0,0 +1,34 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef _VIDEO_LOADING_ANIMATION_CTRL_ +#define _VIDEO_LOADING_ANIMATION_CTRL_ + + +void* MpVideoAnimationCtrlInit(void* pUserData); +void MpVideoAnimationCtrlDestroy(void); +void MpVideoAnimationCtrlSetPercent(int nPercent); +void MpVideoAnimationCtrlPlay(void); +void MpVideoAnimationCtrlStop(void); +void MpVideoAnimationCtrlShow(void); +void MpVideoAnimationCtrlHide(void); +bool MpVideoAnimationCtrlGetActiveState(void); + + +#endif /* _VIDEO_LOADING_ANIMATION_CTRL_ */ + diff --git a/include/mp-video-app-ctrl.h b/include/mp-video-app-ctrl.h new file mode 100755 index 0000000..7909e85 --- /dev/null +++ b/include/mp-video-app-ctrl.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef _VIDEO_APP_CTRL_ +#define _VIDEO_APP_CTRL_ + + +#include "video-player.h" + + +bool MpVideoAppCtrlInit(VideoAppData* pAppData); +bool MpVideoAppCtrlResetForRelaunching(VideoAppData* pAppData); +bool MpVideoAppCtrlIsTopView(void* pUserData); +bool MpVideoAppCtrlIsExistPlayerHandle(void); + + +#endif /* _VIDEO_APP_CTRL_ */ diff --git a/include/mp-video-ctrl-mgr.h b/include/mp-video-ctrl-mgr.h new file mode 100755 index 0000000..ac83a7a --- /dev/null +++ b/include/mp-video-ctrl-mgr.h @@ -0,0 +1,43 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef _MP_VIDEO_CTRL_MGR_H_ +#define _MP_VIDEO_CTRL_MGR_H_ + + +bool MpVideoCtrlMgrMediaCreate(char *szMediaURI, void *pMmfPlayerCallback, void *pOverlayXid, char* szSubtitleUri, void *pUserData); +void MpVideoCtrlMgrMediaDestroy(void* pUserData); +bool MpVideoCtrlMgrMediaPlay(void* pUserData); +void MpVideoCtrlMgrMediaStop(void* pUserData); +void MpVideoCtrlMgrMediaPause(void* pUserData); +void MpVideoCtrlMgrMediaResume(void* pUserData); +void MpVideoCtrlMgrSetOverlayXid(void* pXid); +void MpVideoCtrlMgrSetPosition(int nSetPosition); +int MpVideoCtrlMgrGetPosition(void); +int MpVideoCtrlMgrGetDuration(void); +void MpVideoCtrlMgrSetROI(void* pUserData, int nOverlayX, int nOverlayY, int nOverlayWidth, int nOverlayHeight); +int MpVideoCtrlMgrGetVideoWidthResolution(void); +int MpVideoCtrlMgrGetVideoHeightResolution(void); +void MpVideoCtrlMgrSetRatioVideoScreen(void* pUserData, int nRatioScreenSize); +void MpVideoCtrlMgrSetVerticalOverlayPos(int nOverlayY); +void MpVideoCtrlMgrSetMute(bool bMuteEnable); +bool MpVideoCtrlMgrGetMuteState(void); +int MpVideoCtrlMgrGetBufferingPosition(void); +bool MpVideoCtrlMgrIsExistPlayerHandle(void); + +#endif diff --git a/include/mp-video-display-view.h b/include/mp-video-display-view.h new file mode 100755 index 0000000..47c9de2 --- /dev/null +++ b/include/mp-video-display-view.h @@ -0,0 +1,52 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#ifndef _VIDEO_DISPLAY_VIEW_ +#define _VIDEO_DISPLAY_VIEW_ + + +typedef enum +{ + MP_DISPLAY_VIEW_STATE_ACTIVATE = 0, + MP_DISPLAY_VIEW_STATE_UNACTIVATE, + MP_DISPLAY_VIEW_STATE_MAX, +}VideoDisplayViewState; + + +void MpVideoDisplayViewPush(void* pNaviFrame, void* pShowInfoViewCb, int nLaunchingAppType, void* pUserData); +void MpVideoDisplayViewPop(void* pNaviFrame, void* pUserData); +void MpVideoDisplayViewDestroy(void* pUserData); + +void MpVideoDisplayViewInitAfterBeginOfStream(void* pUserData); +void MpVideoDisplayViewUpdatePauseKey(void); +void MpVideoDisplayViewUpdateResumeKey(void); +void MpVideoDisplayViewShowControlPanel(void* pUserData); +void MpVideoDisplayViewHideControlPanel(void* pUserData); +void MpVideoDisplayViewActivate(void); +void MpVideoDisplayViewUnactivate(void); +void MpVideoDisplayViewHideSoundpath(void); +void MpVideoDisplayViewChangeNaviFrameTitle(void *pUserData); +void MpVideoDisplayViewUpdateSubtitle(double nDuration, char* szSubtitleString); +bool MpVideoDisplayViewIsTopView(void); +void MpVideoDisplayViewShowNocontentImage(void); +void MpVideoDisplayViewHideNocontentImage(void); +void MpVideoDisplayViewResetProgressBar(void *pUserData); + +#endif diff --git a/include/mp-video-info-ctrl.h b/include/mp-video-info-ctrl.h new file mode 100755 index 0000000..d076fb9 --- /dev/null +++ b/include/mp-video-info-ctrl.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VIDEO_INFO_CTRL_ +#define _VIDEO_INFO_CTRL_ + +bool MpVideoInfoCtrlGetGPS(char *szUriPath, double *nLongtitude, double *nLatitude); +bool MpVideoInfoCtrlGetResolution(char *szWidthResolution, char *szHeightResolution, void *pUserData); +bool MpVideoInfoCtrlGetFileInfo(char *szUriPath, char *szFileDate, int nFileDateSize, char *szFileExtension, int nFileExtensionSize, char *szFileSize, int nFilesizeSize); +#endif diff --git a/include/mp-video-log.h b/include/mp-video-log.h new file mode 100755 index 0000000..7f8cd90 --- /dev/null +++ b/include/mp-video-log.h @@ -0,0 +1,38 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _VIDEO_LOG_H_ +#define _VIDEO_LOG_H_ + +#include +#include +#include + + +#ifdef LOG_TAG +#undef LOG_TAG +#endif + + +#define LOG_TAG "video-player" + +#define VideoLogInfoWithTid(fmt,arg...) LOGI( "[VP][TID:%d][%s][%d]" fmt "\n", syscall(__NR_gettid), __FUNCTION__, __LINE__, ##arg) +#define VideoLogInfo(fmt,arg...) LOGI( "[VP][%s][%d]" fmt "\n", __FUNCTION__,__LINE__, ##arg) +#define VideoLogDebug(fmt,arg...) LOGD( "[%s %s : %d] " fmt "\n",__FILE__, __FUNCTION__,__LINE__, ##arg) +#define VideoLogWarning(fmt,arg...) LOGD( "[%s %s : %d] " fmt "\n",__FILE__, __FUNCTION__,__LINE__, ##arg) +#define VideoLogError( fmt,arg...) LOGD( "[%s %s : %d] " fmt "\n", __FILE__,__FUNCTION__,__LINE__, ##arg) + + #endif /*_MPVIDEO_LOG_H_*/ diff --git a/include/mp-video-player-mgr.h b/include/mp-video-player-mgr.h new file mode 100755 index 0000000..c422d95 --- /dev/null +++ b/include/mp-video-player-mgr.h @@ -0,0 +1,90 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _MP_VIDEO_PLAYER_MGR_H_ +#define _MP_VIDEO_PLAYER_MGR_H_ + +#include +#include + + +typedef enum +{ + DISPLAY_METHOD_LETTER_BOX = 0, + DISPLAY_METHOD_ORIGIN_SIZE, + DISPLAY_METHOD_FULL_SCREEN, + DISPLAY_METHOD_CROPPED_FULL, + DISPLAY_METHOD_CUSTOM_ROI, +}MpPlayerMgrDisplayMethod; + + +bool MpPlayerMgrIsActive(void); + +bool MpPlayerMgrGetAttrs(MMHandleType* Attrs, MMPlayerAttrsType Type); +void MpPlayerMgrSetAttrs(MMHandleType Attrs, MMPlayerAttrsType Type); + +void MpPlayerMgrSetMessageCallback(MMMessageCallback Callback, void* pUserData); +bool MpPlayerMgrSetAudioCallback(mm_player_audio_stream_callback CallBack, void* pUserData); + +bool MpPlayerMgrCreate (const char* szPath); +bool MpPlayerMgrDestroy (void); + +bool MpPlayerMgrRealize (void); +bool MpPlayerMgrUnrealize(void); + +bool MpPlayerMgrPlay (void); +bool MpPlayerMgrStop (void); +bool MpPlayerMgrResume (void); +bool MpPlayerMgrPause (void); + +int MpPlayerMgrGetPosition(void); +void MpPlayerMgrSetPosition(unsigned int nPos); + +bool MpPlayerMgrGetVisible(void); +void MpPlayerMgrSetVisible(bool bEnabled); + +void MpPlayerMgrSetMute(bool bMuteEnable); +bool MpPlayerMgrGetMute(void); +bool MpPlayerMgrSetBtHeadset(bool bEnable, char* szAddress); + +int MpPlayerMgrGetStreamingType(void); +void MpPlayerMgrSetProgressiveDownload(int nFileSize); +void MpPlayerMgrSetDownloadComplete(void); +void MpPlayerMgrSetProgressTimerInterval(int nInterval); +int MpPlayerMgrGetPdduration(void); +int MpPlayerMgrGetDuration(char* szFilePath); +bool MpPlayerMgrSetRatioVideoScreenSize(MpPlayerMgrDisplayMethod ScreenSize); +bool MpPlayerMgrSetOverlayXid(void* pOverlayXid); +bool MpPlayerMgrSetSoundPriority(void); +int MpPlayerMgrGetVideoWidthResolution(void); +int MpPlayerMgrGetVideoHeightResolution(void); +bool MpPlayerMgrSetSubtitleSilent(bool bSilent); +bool MpPlayerMgrSetSubtitle(const char* szSubtitlePath); +int MpPlayerMgrSetBluetoothHeadset(char* szBlutoothAddress, int nMode); + +int MpPlayerMgrSetDisplayArea(int nX, int nY, int nWidth, int nHeight); +int MpPlayerMgrSetVerticalOverlayPos(int nY); + +bool MpPlayerMgrSetUseragentForStreaming(const char* szUserAgent); +bool MpPlayerMgrSetProxAddressForStreaming(const char* szProxyAddress); +bool MpPlayerMgrSetCookieForStreaming(const char* szCookie); + + +int MpPlayerMgrGetBufferingPosition(void); + + +#endif diff --git a/include/mp-video-progressbar.h b/include/mp-video-progressbar.h new file mode 100755 index 0000000..f8a8046 --- /dev/null +++ b/include/mp-video-progressbar.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VIDEO_PROGRESS_BAR_CTRL_ +#define _VIDEO_PROGRESS_BAR_CTRL_ + + +void* MpVideoProgressbarGetEdjHandle(void); +void* MpVideoProgressbarInit(void* pUserData); +void MpVideoProgressbarDestroy(void); +void MpVideoProgressbarCreateTimer(void* pUserData); +void MpVideoProgressbarDeleteTimer(void); +void MpVideoProgressbarUpdateDurationTime(char* szDurationTime); +void MpVideoProgressbarBeginOfStream(void* pUserData); +void MpVideoProgressbarReset(void *pUserData); +void MpVideoProgressbarSetSkipEvent(bool bSkip); + +#endif /* _VIDEO_PROGRESS_BAR_CTRL_ */ diff --git a/include/mp-video-sound-path-ctrl.h b/include/mp-video-sound-path-ctrl.h new file mode 100755 index 0000000..96dc40e --- /dev/null +++ b/include/mp-video-sound-path-ctrl.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef _MP_VIDEO_SOUND_PATH_ +#define _MP_VIDEO_SOUND_PATH_ + + +bool MpVideoSoundpathShow(void* pUserData); +void MpVideoSoundpathHide(void); + +bool MpVideoSoundpathIsConnectOtherSoundpath(void); +int MpVideoSoundpathGetCurrConnectedSoundpath(void); + +#endif // _MP_UTIL_ diff --git a/include/mp-video-streaming-ctrl.h b/include/mp-video-streaming-ctrl.h new file mode 100755 index 0000000..8703c45 --- /dev/null +++ b/include/mp-video-streaming-ctrl.h @@ -0,0 +1,33 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef _STREAMING_PLAYER_H_ +#define _STREAMING_PLAYER_H_ + + +bool MpVideoStreamingCtrlGetIpAddress(char* szRetIpAddress); +bool MpVideoStreamingCtrlGetProxy(char* szRetProxy); +bool MpVideoStreamingCtrlIsNetworkOn(void); +int MpVideoStreamingCtrlGetNetworkStatus(void); +int MpVideoStreamingCtrlGetWifiState(); +int MpVideoStreamingCtrlGetCellularState(); +bool MpVideoStreamingCtrlInit(void *pUserData); +void MpVideoStreamingCtrlDestroy(void *pUserData); + + +#endif /* _STREAMING_PLAYER_H_ */ diff --git a/include/mp-video-streaming-view.h b/include/mp-video-streaming-view.h new file mode 100755 index 0000000..594da07 --- /dev/null +++ b/include/mp-video-streaming-view.h @@ -0,0 +1,46 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef _VIDEO_STREAMING_VIEW_ +#define _VIDEO_STREAMING_VIEW_ + + +typedef enum +{ + MP_STREAMING_VIEW_STATE_ACTIVATE = 0, + MP_STREAMING_VIEW_STATE_UNACTIVATE, + MP_STREAMING_VIEW_STATE_MAX, +}VideoStreamingViewState; + + +void MpVideoStreamingViewPush(void* pNaviFrame,void* pShowInfoViewCb, void* pUserData); +void MpVideoStreamingViewPop(void* pNaviFrame, void* pUserData); +void MpVideoStreamingViewDestroy(void* pUserData); + +void MpVideoStreamingViewInitAfterBeginOfStream(void* pUserData); +void MpVideoStreamingViewUpdatePauseKey(void); +void MpVideoStreamingViewUpdateResumeKey(void); +void MpVideoStreamingViewShowControlPanel(void* pUserData); +void MpVideoStreamingViewHideControlPanel(void* pUserData); +void MpVideoStreamingViewActivate(void); +void MpVideoStreamingViewUnactivate(void); +void MpVideoStreamingViewSetBufferingRate(int nSetBufferingRate); +bool MpVideoStreamingViewGetBufferingState(void); +bool MpVideoStreamingViewIsTopView(void); +#endif diff --git a/include/mp-video-string-define.h b/include/mp-video-string-define.h new file mode 100755 index 0000000..07b5f65 --- /dev/null +++ b/include/mp-video-string-define.h @@ -0,0 +1,70 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VIDEO_STRING_DEFINE_ +#define _VIDEO_STRING_DEFINE_ + + +#define MP_STREAMING_PLAYER_STR "Streaming player" +#define MP_SYS_STRING "sys_string" + +#define MP_VIDEO_PATH_KEY "path" +#define MP_VIDEO_COOKIE_KEY "cookie" +#define MP_VIDEO_SORT_TYPE_KEY "order_type" +#define MP_VIDEO_LIST_TYPE_KEY "video_list_type" +#define MP_VIDEO_TAG_NAME_KEY "tag_name" +#define MP_VIDEO_SPLIT_VIEW_KEY "split_screen" +#define MP_VIDEO_START_POS_TIME_KEY "start_pos_time" +#define MP_VIDEO_LAUNCHING_BY_APP_KEY "launching_application" +#define MP_VIDEO_EDIT_MODE_KEY "edit_mode" + +#define MP_VPL_GPS_LATITUDE "Latitude" +#define MP_VPL_GPS_LONGITUTD "Longitude" + + +// SMTP video player string +#define MP_VPL_CONNECTION_FAIL (dgettext("sys_string", "IDS_COM_POP_CONNECTION_ERROR")) +#define MP_VPL_UNABLE_TO_PLAY_VIDEO "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +#define MP_VPL_HEADER_SHARE_VIDEO_ABB "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +#define MP_VPL_OPT_SET_AS "IDS_VPL_OPT_SET_AS" +#define MP_VPL_POP_INVALID_STREAMING_DATA "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +#define MP_VPL_POP_UNSUPPORTED_AUDIO_FORMAT "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +#define MP_VPL_POP_UNSUPPORTED_VIDEO_FORMAT "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +#define MP_VPL_POP_UNSUPPORTED_FILE_TYPE "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +#define MP_VIDEO_POPUP_SHARE "IDS_COM_SK4_SHARE" +#define MP_VIDEO_SOUND_PATH "Sound Path" + +// Default system string +#define MP_COM_POP_ERROR "IDS_COM_POP_ERROR" +#define MP_COM_BODY_LOW_BATTERY "IDS_COM_BODY_LOW_BATTERY" +#define MP_COM_BODY_DELETE "IDS_COM_BODY_DELETE" +#define MP_COM_BODY_BACK "IDS_COM_BODY_BACK" +#define MP_COM_SK_BACK "IDS_COM_SK_BACK" +#define MP_COM_SK_YES "IDS_COM_SK_YES" +#define MP_COM_SK_NO "IDS_COM_SK_NO" +#define MP_COM_BODY_SIZE "IDS_COM_BODY_SIZE" +#define MP_COM_BODY_DETAILS_TITLE "IDS_COM_BODY_DETAILS_TITLE" +#define MP_COM_BODY_FORMAT "IDS_COM_BODY_FORMAT" +#define MP_COM_POP_DATE "IDS_COM_POP_DATE" +#define MP_IDLE_BODY_RESOLUTION "IDS_IDLE_BODY_RESOLUTION" +#define MP_COM_BODY_DETAILS "IDS_COM_BODY_DETAILS" +#define MP_COM_BUTTON_CANCEL "IDS_IDLE_BUTTON_CANCEL" +#define MP_COM_BUTTON_SHARE "IDS_COM_BUTTON_SHARE" +#define MP_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" + + +#endif //_VIDEO_STRING_DEFINE_ diff --git a/include/mp-video-subtitle-ctrl.h b/include/mp-video-subtitle-ctrl.h new file mode 100755 index 0000000..3c37da3 --- /dev/null +++ b/include/mp-video-subtitle-ctrl.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef _MP_VIDEO_SUBTITLE_CTRL_ +#define _MP_VIDEO_SUBTITLE_CTRL_ + +bool MpVideoSubtitleCtrlInit(void *pUserData); +void MpVideoSubtitleCtrlDestroy(void); +bool MpVideoSubtitleCtrlIsExistSubtitle(void); +bool MpVideoSubtitleCtrlGetSubtitleUri(char *szSubtitleUriPath); + +#endif // _MP_VIDEO_SUBTITLE_CTRL_ diff --git a/include/mp-video-type-define.h b/include/mp-video-type-define.h new file mode 100755 index 0000000..6e1ae81 --- /dev/null +++ b/include/mp-video-type-define.h @@ -0,0 +1,174 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VIDEO_TYPE_DEFINE_ +#define _VIDEO_TYPE_DEFINE_ + + +typedef enum +{ + MP_LAUNCH_APP_DEFAULT = 0, // For launching by my-file. + MP_LAUNCH_APP_GALLERY, + MP_LAUNCH_APP_IMAGE_VIEWER, + MP_LAUNCH_APP_SIMPLE_VIEW, + MP_LAUNCH_APP_MAX, +}MpLaunchingAppType; + + +typedef enum +{ + MP_MEDIA_SORT_BY_NONE = 0, + MP_MEDIA_SORT_BY_NAME_DESC, + MP_MEDIA_SORT_BY_NAME_ASC, + MP_MEDIA_SORT_BY_DATE_DESC, + MP_MEDIA_SORT_BY_DATE_ASC, + MP_MEDIA_SORT_BY_MAX, +}MpMediaSortType; + + +typedef enum +{ + MP_VIDEO_LIST_TYPE_FOLDER = 0, + MP_VIDEO_LIST_TYPE_ALL_FOLDER_GALLERY, + MP_VIDEO_LIST_TYPE_TAG_GALLERY, + MP_VIDEO_LIST_TYPE_FAVORITE, + MP_VIDEO_LIST_TYPE_MAX, +}MpVideoListType; + + +typedef enum +{ + MP_STREAMING_PLAYER = 0, + MP_VIDEO_PLAYER, +}VideoPlayerType; + + +typedef enum +{ + MP_HTTP_STREAMING = 0, + MP_RTSP_STREAMING, +}MpProtocolType; + + +typedef enum +{ + MP_DISPLAY_METHOD_LETTER_BOX = 0, + MP_DISPLAY_METHOD_ORIGIN_SIZE, + MP_DISPLAY_METHOD_FULL_SCREEN, + MP_DISPLAY_METHOD_CROPPED_FULL, + MP_DISPLAY_METHOD_CUSTOM_ROI, +}MpDisplayMethod; + + +typedef enum +{ + MP_ORDER_BY_NAME = 0, + MP_ORDER_BY_DATE, + MP_ORDER_BY_ASCENDING, + MP_ORDER_BY_DESENDING, + MP_ORDER_BY_MAX, +}MpFileSortOrder; + + +typedef enum +{ + MP_SOUND_PATH_SPEAKER = 0, + MP_SOUND_PATH_EARJACK, + MP_SOUND_PATH_BLUETOOTH, + MP_SOUND_PATH_MAX, +}MpSoundPathType; + + +typedef struct +{ + char szURL [STR_LEN_MAX]; + int id; + int streaming_type; +}MpXMLItemInfo; + + +typedef enum +{ + MP_PLAYER_STATE_WAIT_FOR_RESUME = -3, + MP_PLAYER_STATE_WAIT_FOR_PLAY = -2, + MP_PLAYER_STATE_WAIT_FOR_RESPONSE = -1, + MP_PLAYER_STATE_CLEAR = 0, + MP_PLAYER_STATE_PLAY, + MP_PLAYER_STATE_PAUSE, + MP_PLAYER_STATE_RESUME, + MP_PLAYER_STATE_STOP, + MP_PLAYER_STATE_PAUSE_BEFORE_PLAY, + MP_PLAYER_STATE_MAX +}MpPlayerState; + +typedef enum +{ + MP_PLAYING_SPEED_NORMAL = 0, + MP_PLAYING_SPEED_2X, + MP_PLAYING_SPEED_3X, + MP_PLAYING_SPEED_4X, + MP_PLAYING_SPEED_5X, + MP_PLAYING_SPEED_MAX = MP_PLAYING_SPEED_5X, +}MpVideoPlayingSpeedType; + +typedef enum +{ + MP_SUBTITLE_TYPE_SUB = 0, + MP_SUBTITLE_TYPE_SRT, + MP_SUBTITLE_TYPE_SMI, + MP_SUBTITLE_TYPE_MAX, +}MpSubTitleType; + + +typedef enum +{ + MP_NETWORK_CLOSE = 0, + MP_NETWORK_ON, + MP_NETWORK_MAX, +}MpNetworkConfig; + + +typedef enum +{ + MP_NETWORK_TYPE_OFF = 0, + MP_NETWORK_TYPE_CELLULAR, + MP_NETWORK_TYPE_WIFI, + MP_NETWORK_TYPE_MAX, +}MpNetworkType; + + +typedef enum +{ + MP_NETWORK_WIFI_OFF = 0, + MP_NETWORK_WIFI_NOT_CONNECTED, + MP_NETWORK_WIFI_CONNECTED, + MP_NETWORK_WIFI_MAX, +}MpNetworkWifiState; + + +typedef enum +{ + MP_NETWORK_CELLULAR_ON = 0, + MP_NETWORK_CELLULAR_3G_OPTION_OFF, + MP_NETWORK_CELLULAR_ROAMING_OFF, + MP_NETWORK_CELLULAR_FLIGHT_MODE, + MP_NETWORK_CELLULAR_NO_SERVICE, + MP_NETWORK_CELLULAR_MAX, +}MpNetworkCellularState; + + +#endif //_VIDEO_TYPE_DEFINE_ diff --git a/include/mp-video-value-define.h b/include/mp-video-value-define.h new file mode 100755 index 0000000..0112dbc --- /dev/null +++ b/include/mp-video-value-define.h @@ -0,0 +1,223 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VIDEO_VALUE_DEFINE_ +#define _VIDEO_VALUE_DEFINE_ + +#include + + +//PLAY_TIME_FORMAT +#define PLAY_TIME_FORMAT "02u:%02u:%02u" + + +//PLAY_TIME_ARGS +#define PLAY_TIME_ARGS(t) \ + (t) / (60 * 60), \ + ((t) / 60) % 60, \ + (t) % 60 + +#define PLAY_TIME_LENGTH 9 + + +#define _EDJ(x) elm_layout_edje_get(x) + + +#ifdef PREFIX +#undef PREFIX +#endif + +#ifdef LOCALEDIR +#undef LOCALEDIR +#endif + +#define PREFIX "/opt/apps/org.tizen.video-player" +#define EDJ_PATH "/opt/apps/org.tizen.video-player/res/edje" +#define LOCALEDIR "/opt/apps/org.tizen.video-player/res/locale" + +#define VIDEO_HEAD_ICON_ADD PREFIX"/res/images/01_header_icon_add.png" +#define VIDEO_HEAD_ICON_DEL PREFIX"/res/images/01_header_icon_cancel.png" +#define VIDEO_HEAD_ICON_OTHERS PREFIX"/res/images/01_header_icon_others.png" + +#define VIDEO_HEAD_ICON_SOUNDPATH PREFIX"/res/images/T01_icon_soundPath_h.png" + +#define VIDEO_PLAYER_MAIN_EDJ EDJ_PATH"/main.edj" +#define VIDEO_PLAYER_CONTROL_EDJ EDJ_PATH"/control.edj" +#define VIDEO_PLAYER_PANEL_EDJ EDJ_PATH"/panel.edj" +#define VIDEO_PLAYER_PROGRESS_EDJ EDJ_PATH"/progress.edj" +#define VIDEO_PLAYER_ADD_TAG EDJ_PATH"/add_tag.edj" +#define VIDEO_PLAYER_ANIMATION_EDJ EDJ_PATH"/animation.edj" +#define VIDEO_PLAYER_DETAIL_EDJ EDJ_PATH"/detail.edj" +#define VIDEO_PLAYER_SUBTITLE_EDJ EDJ_PATH"/subtitle.edj" +#define VIDEO_CUSTOM_THEME EDJ_PATH"/vp-custom-winset-style.edj" +#define VIDEO_PLAYER_HIDDEN_PANEL_EDJ EDJ_PATH"/hidden_button_panel.edj" +#define VIDEO_PLAYER_OPTION_BUTTON_EDJ EDJ_PATH"/option_button.edj" + +#define MAIN_EDJ_GROUP "main" +#define CONTROL_EDJ_GROUP "control" +#define PROGRESS_EDJ_GROUP "progress" +#define PANEL_EDJ_GROUP "panel" +#define FAVORITE_EDJ_GROUP "favorite" +#define ANIMATION_EDJ_GROUP "animation" +#define DETAIL_EDJ_GROUP "detail" +#define SUBTITLE_EDJ_GROUP "subtitle" +#define HIDDEN_PANEL_EDJ_GROUP "hidden_panel" +#define OPTION_EDJ_GROUP "option" + +#define SWALLOW_MAIN_CONTROL "main.panel" +#define SWALLOW_MAIN_ANIMATION "main.animation" +#define SWALLOW_MAIN_HIDDEN_BUTTON "main.hidden.button" +#define SWALLOW_MAIN_OPTION_BUTTON "main.option.button" + + +#define SWALLOW_PANEL_CONTROL "panel.control" +#define SWALLOW_PANEL_PROGRESS_BAR "panel.progress" + +#define SWALLOW_DETAIL_LIST "detail.list" +#define SUBTITLE_TEXT "subtitle.txt" +#define PART_BUTTON_ICON "icon" + + +#define SIGNAL_CONTROL_PART_PLAY_BUTTON "control.play.button" +#define SIGNAL_CONTROL_PART_BACK_BUTTON "control.back.button" +#define SIGNAL_CONTROL_PART_VOL_BUTTON "control.volume.button" +#define SIGNAL_CONTROL_PART_SOUNDPATH_BUTTON "control.soundpath.button" +#define SIGNAL_CONTROL_PART_SCREENSIZE_BUTTON "control.screensize.button" +#define SIGNAL_CONTROL_PART_FF_BUTTON "control.normal.ff.button" +#define SIGNAL_CONTROL_PART_REW_BUTTON "control.normal.rew.button" +#define SIGNAL_CONTROL_PART_HQ_BUTTON "control.streaming.hq.button" +#define SIGNAL_HIDDEN_BUTTON_PANEL_SOUNDPATH "hidden.button.panel.soundpath" + +#define SIGNAL_CONTROL_MODE_NORMAL "signal.control.mode.normal" +#define SIGNAL_CONTROL_MODE_STREAMING "signal.control.mode.streaming" +#define SIGNAL_CONTROL_MODE_VISIBLE_OFF "signal.control.mode.visible.off" +#define SIGNAL_CONTROL_BACK_BUTTON_DOWN "signal.control.back.button.down" + +#define SIGNAL_CONTROL_FF_MODE_NORMAL "signal.control.ff.normal" +#define SIGNAL_CONTROL_FF_MODE_EXTEND "signal.control.ff.extend" + +#define SIGNAL_CONTROL_REW_MODE_NORMAL "signal.control.rew.normal" +#define SIGNAL_CONTROL_REW_MODE_EXTEND "signal.control.rew.extend" + +#define SIGNAL_CONTROL_VOL_BUTTON_DOWN "signal.control.volume.button.down" +#define SIGNAL_CONTROL_VOL_BUTTON_UP "signal.control.volume.button.up" +#define SIGNAL_CONTROL_SOUNDPATH_BUTTON_DOWN "signal.control.soundpath.button.down" +#define SIGNAL_CONTROL_SOUNDPATH_BUTTON_UP "signal.control.soundpath.button.up" +#define SIGNAL_CONTROL_SCREENSIZE_NORMAL "signal.control.screensize.normal" +#define SIGNAL_CONTROL_SCREENSIZE_EXPAND "signal.control.screensize.expand" +#define SIGNAL_CONTROL_NORMAL_FF_BUTTON_DOWN "signal.control.normal.ff.button.down" +#define SIGNAL_CONTROL_NORMAL_FF_BUTTON_UP "signal.control.normal.ff.button.up" +#define SIGNAL_CONTROL_NORMAL_REW_BUTTON_DOWN "signal.control.normal.rew.button.down" +#define SIGNAL_CONTROL_NORMAL_REW_BUTTON_UP "signal.control.normal.rew.button.up" +#define SIGNAL_CONTROL_HQ_BUTTON_DOWN "signal.control.streaming.hq.button.down" +#define SIGNAL_CONTROL_HQ_BUTTON_UP "signal.control.streaming.hq.button.up" +#define SIGNAL_HIDDEN_PANEL_SOUNDPATH_DOWN "signal.hidden.button.panel.soundpath.down" +#define SIGNAL_HIDDEN_PANEL_SOUNDPATH_UP "signal.hidden.button.panel.soundpath.up" + +#define SIGNAL_CONTROL_VOL_BUTTON_MUTE "signal.control.volume.button.mute" +#define SIGNAL_CONTROL_VOL_BUTTON_UNMUTE "signal.control.volume.button.unmute" +#define SIGNAL_CONTROL_SOUNDPATH_BUTTON_ACTIVE "signal.control.soundpath.button.active" +#define SIGNAL_CONTROL_SOUNDPATH_BUTTON_UNACTIVE "signal.control.soundpath.button.unactive" +#define SIGNAL_CONTROL_STREAMING_QUALITY_HIGH "signal.control.streaming.quality.high" +#define SIGNAL_CONTROL_STREAMING_QUALITY_NORMAL "signal.control.streaming.quality.normal" +#define SIGNAL_CONTROL_STREAMING_QUALITY_HIDE "signal.control.streaming.quality.hide" + + +#define SIGNAL_OPTION_PART_SCREEN_SIZE "option.screensize" +#define SIGNAL_OPTION_PART_DETAIL "option.detail" + +#define SIGNAL_OPTION_SCREEN_SIZE_DOWN "signal.option.screensize.down" +#define SIGNAL_OPTION_DETAIL_DOWN "signal.option.detail.down" + +#define SIGNAL_OPTION_SCREEN_SIZE_NORMAL "signal.option.screensize.normal" +#define SIGNAL_OPTION_SCREEN_SIZE_EXPAND "signal.option.screensize.expand" + +// Callback signals. +#define SIGNAL_CONTROL_PLAY_BUTTON_DOWN "signal.control.play.button.down" +#define SIGNAL_CONTROL_PLAY_BUTTON_UP "signal.control.play.button.up" +#define SIGNAL_CONTROL_PLAY_PAUSE_PRESS "signal.control.play.pause.press" +#define SIGNAL_CONTROL_PLAY_RESUME_PRESS "signal.control.play.resume.press" + +// Emit signals. +#define SIGNAL_CONTROL_PLAY_RESUME "signal.control.play.resume" +#define SIGNAL_CONTROL_PLAY_PAUSE "signal.control.play.pause" + +#define SIGNAL_CONTROL_SCREENSIZE_BUTTON_NORMAL "signal.control.screensize.button.normal" +#define SIGNAL_CONTROL_SCREENSIZE_BUTTON_EXPAND "signal.control.screensize.button.expand" + +#define SIGNAL_OPTION_MODE_STREAMING "signal.option.mode.streaming" + + +#define SIGNAL_MAIN_MUTE_SHOW "signal.main.mute.show" +#define SIGNAL_MAIN_MUTE_HIDE "signal.main.mute.hide" + +#define SIGNAL_MAIN_NOCONTENTS_SHOW "signal.main.nocontents.show" +#define SIGNAL_MAIN_NOCONTENTS_HIDE "signal.main.nocontents.hide" + +#define SIGNAL_MAIN_SCREEN_TOUCH_PRESS "signal.main.screen.touch.press" +#define SIGNAL_MAIN_SCREEN_TOUCH_TOGGLE "main.screen.touch.toggle" +#define SIGNAL_MAIN_ANIMATION_SHOW "signal.main.animation.show" +#define SIGNAL_MAIN_ANIMATION_HIDE "signal.main.animation.hide" + +#define SIGNAL_MAIN_OPTION_BUTTON_BG_HIDE "signal.main.option.button.bg.hide" + +#define SIGNAL_ANIMATION_IMAGE_LOADING "signal.loading.image.step" + +#define SIGNAL_HIDDEN_BUTTON_PANEL_SOUNDPATH_SHOW "signal.hidden.button.panel.soundpath.show" +#define SIGNAL_HIDDEN_BUTTON_PANEL_SOUNDPATH_HIDE "signal.hidden.button.panel.soundpath.hide" + +#define TAG_FAVOURITES "Favourites" +#define PACKAGE "video-player" +#define PAUSE_KEY "XF86AudioPause" +#define PLAY_KEY "XF86AudioPlay" +#define STOP_KEY "XF86AudioStop" +#define NEXT_KEY "XF86AudioNext" +#define PREV_KEY "XF86AudioPrev" +#define FORWARD_KEY "XF86AudioForward" +#define REWIND_KEY "XF86AudioRewind" +#define END_KEY KEY_END +#define HOME_KEY KEY_SELECT +#define KEY_CANCLE KEY_CANCEL +#define POWER_KEY "XF86PowerOff" +#define VOLUME_DOWN_KEY KEY_VOLUMEDOWN +#define VOLUME_MUTE 0 +#define KEY_GRAB_SHARED SHARED_GRAB +#define KEY_GRAB_EXCLUSIVE EXCLUSIVE_GRAB +#define KEY_GRAB_TOP_POSITION TOP_POSITION_GRAB +#define KEY_GRAB_OR_EXCLUSIVE OR_EXCLUSIVE_GRAB +#define STR_LEN_MAX 4096 * 3 + +#define XML_ITEM_NUM 6 +#define _WIFI_MODE_ 1 +#define _3G_MODE_ 2 +#define USE_STREAMING_ANI 1 +#define LONG_PRESS_INTERVAL 0.5 + +#define SCREEN_TOUCH_TOGGLE_AREA_Y_START 0.065 +#define SCREEN_TOUCH_TOGGLE_AREA_Y_END 0.78 + +#define TAG_LIST_SIZE 256 + +#define ANIMATION_TIMER_INTERVAL 0.05 +#define ANIMATION_MAX_COUNT 30 + +#define BOOSTER_STEP_DISTANCE 30 +#define SIGNAL_TEXT_MAX_LEN 64 +#define CAPTION_TEXT_MAX_LEN 16 +#define STR_UUID_LEN_MAX 37 + +#endif //_VIDEO_VALUE_DEFINE_ diff --git a/include/mp-video-view-ctrl.h b/include/mp-video-view-ctrl.h new file mode 100755 index 0000000..039d299 --- /dev/null +++ b/include/mp-video-view-ctrl.h @@ -0,0 +1,39 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VIDEO_VIEW_CTRL_ +#define _VIDEO_VIEW_CTRL_ + + + +bool MpVideoViewCtrlInit(VideoAppData* pAppData); +void MpVideoViewCtrlDestroy(void* pUserData); +void MpVideoViewCtrlInitAfterBeginOfStream(void*); +void MpVideoViewCtrlPause(void* pUserData); +void MpVideoViewCtrlResume(void* pUserData); +void MpVideoViewShowLayout(void* pUserData); +void MpVideoViewHideLayout(void* pUserData); +void MpVideoViewSetBufferingRateForStreamingView(int nSetBufferingRate, void* pUserData); +void MpVideoViewHideSoundpath(void* pUserData); +void MpVideoViewCtrlChangeTitle(void *pUserData); +void MpVideoViewCtrlUpdateSubtitle(double nDuration, char* szSubtitleString); +bool MpVideoViewCtrlIsTopView(void *pUserData); +void MpVideoViewCtrlShowNocontentImage(void); +void MpVideoViewCtrlHideNocontentImage(void); +void MpVideoViewCtrlResetProgressBar(void *pUserData); + +#endif //_VIDEO_VIEW_CTRL_ diff --git a/include/mp-xml-parser.h b/include/mp-xml-parser.h new file mode 100755 index 0000000..d78e51c --- /dev/null +++ b/include/mp-xml-parser.h @@ -0,0 +1,37 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef _MP_XML_PARSER_H_ +#define _MP_XML_PARSER_H_ + + +#include +#include + + + +void mp_xml_init(); +void mp_xml_destroy(); + +unsigned int mp_read_xml_file(const char *file_name, char **data); + bool mp_get_url_from_xml(const char *content, int length, char **streamer_url, int mode); +char *mp_get_title_from_xml(const char *file_name); +int mp_get_xmlitem(const char *content, int length, MpXMLItemInfo *item,int *nHttpCount, int *nRtspCount); + +#endif diff --git a/include/video-player.h b/include/video-player.h new file mode 100755 index 0000000..f7f1c45 --- /dev/null +++ b/include/video-player.h @@ -0,0 +1,106 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __VIDEO_PLAYER__ +#define __VIDEO_PLAYER__ + +#include +#include +#include +#include +#include + +#include "mp-video-value-define.h" +#include "mp-video-type-define.h" + + +typedef struct _VideoAppData VideoAppData; + + +typedef struct +{ + void (*VideoAppCtrlStart) (VideoAppData* pAppData); + void (*VideoAppCtrlStop) (VideoAppData* pAppData); + void (*VideoAppCtrlPause) (VideoAppData* pAppData); + void (*VideoAppCtrlResume) (VideoAppData* pAppData); + void (*VideoAppCtrlStopByAppPause) (VideoAppData* pAppData); + void (*VideoAppCtrlStartByAppResume) (VideoAppData* pAppData); + void (*VideoAppCtrlFFDown) (VideoAppData* pAppData); + void (*VideoAppCtrlRewDown) (VideoAppData* pAppData); + void (*VideoAppCtrlFFUp) (VideoAppData* pAppData); + void (*VideoAppCtrlRewUp) (VideoAppData* pAppData); + void (*VideoAppCtrlSetMute) (VideoAppData* pAppData); + void (*VideoAppCtrlSetScreenType) (VideoAppData* pAppData); + void (*VideoAppCtrlSetScreenSize) (VideoAppData* pAppData, int nScreenSize); + void (*VideoAppCtrlGetPosition) (VideoAppData* pAppData); + void (*VideoAppCtrlSetPosition) (VideoAppData* pAppData); + void (*VideoAppCtrlHideLayout) (VideoAppData* pAppData); + void (*VideoAppCtrlShowLayout) (VideoAppData* pAppData); + void (*VideoAppCtrlGetVideoResolution) (VideoAppData* pAppData); + void (*VideoAppCtrlReqDurationTime) (VideoAppData* pAppData); + void (*VideoAppCtrlChangeResolution) (VideoAppData* pAppData); + void (*VideoAppCtrlBeginOfStream) (VideoAppData* pAppData); + void (*VideoAppCtrlEndOfStream) (VideoAppData* pAppData); + void (*VideoAppCtrlExit) (VideoAppData* pAppData); + void (*VideoAppCtrlStartStreaming) (VideoAppData* pAppData); + void (*VideoAppCtrlReLaunching) (VideoAppData* pAppData); + void (*VideoAppCtrlPlayPreMedia) (VideoAppData* pAppData); + void (*VideoAppCtrlPlayNextMedia) (VideoAppData* pAppData); + void (*VideoAppCtrlGetBufferingPosition)(VideoAppData* pAppData); +}VideoAppCtrlFunc; + + +struct _VideoAppData +{ + bool bIsMute; + + int nDuration; + int nSetPosition; + int nCurPosition; + int nSubtitleDuration; + int nBufferingPosition; + + int nVideoWidthResolution; + int nVideoHeightResolution; + + char szSubtitle[STR_LEN_MAX]; + char szVideoTitle[STR_LEN_MAX]; + + char szMediaUri[STR_LEN_MAX]; + char szPreMediaUri[STR_LEN_MAX]; + char szNextMediaUri[STR_LEN_MAX]; + char szTagNameForVideoList[STR_LEN_MAX]; + + Evas_Object* pMainWindow; + + MpPlayerState nPrePlayerState; + MpPlayerState nCurPlayerState; + MpLaunchingAppType nLaunchingAppType; + MpMediaSortType nVideoSortType; + MpVideoListType nVideoListType; + VideoPlayerType nCurPlayerType; + VideoAppCtrlFunc VideoAppCtrlCallbackFunc; + + char szProxyAddress[STR_LEN_MAX]; + char szUserAgent[STR_LEN_MAX]; + char szCookie[STR_LEN_MAX]; + + int nDlnaMediaID; + int nDlnaSortType; +}; + +#endif //__VIDEO_PLAYER__ diff --git a/org.tizen.video-player.desktop.in b/org.tizen.video-player.desktop.in new file mode 100755 index 0000000..aa65757 --- /dev/null +++ b/org.tizen.video-player.desktop.in @@ -0,0 +1,14 @@ +Name=Video player +Name[en_US]=Video player +Name[ko_KR]=비디오 플레이어 +Type=Application +Exec=/opt/apps/org.tizen.video-player/bin/video-player +nodisplay=True +removable=false +Comment=video-player +Version=0.1 +Icon=org.tizen.video-player.png +MimeType=video/mp4; video/3gp; video/x-msvideo; video/x-ms-wmv; video/x-ms-asf; video/3gpp; video/x-matroska; video/vnd.ms-playready.media.pyv; application/vnd.apple.mpegurl; application/x-mpegurl; audio/x-mpegurl; video/x-mpegurl; video/x-flv; video/ogg +x-tizen-taskManage=true +x-tizen-multiple=false +x-tizen-svc=http://tizen.org/appsvc/operation/view|NULL|video/*; http://tizen.org/appsvc/operation/view|http|video/*; diff --git a/packaging/org.tizen.video-player.spec b/packaging/org.tizen.video-player.spec new file mode 100755 index 0000000..631228a --- /dev/null +++ b/packaging/org.tizen.video-player.spec @@ -0,0 +1,67 @@ +Name: org.tizen.video-player +Summary: Video & streaming player +Version: 0.1.5 +Release: 1 +Group: TO_BE/FILLED_IN +License: Flora Software License +Source0: %{name}-%{version}.tar.gz +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(appcore-efl) +BuildRequires: pkgconfig(ui-gadget) +BuildRequires: pkgconfig(utilX) +BuildRequires: pkgconfig(mm-common) +BuildRequires: pkgconfig(mm-player) +BuildRequires: pkgconfig(mm-sound) +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(pmapi) +BuildRequires: pkgconfig(mm-session) +BuildRequires: pkgconfig(vconf) +BuildRequires: pkgconfig(mm-ta) +BuildRequires: pkgconfig(mm-fileinfo) +BuildRequires: pkgconfig(appcore-common) +BuildRequires: pkgconfig(libmedia-service) +BuildRequires: pkgconfig(libxml-2.0) +BuildRequires: pkgconfig(syspopup-caller) +BuildRequires: pkgconfig(ecore) +BuildRequires: pkgconfig(eina) +BuildRequires: pkgconfig(evas) +BuildRequires: pkgconfig(edje) +BuildRequires: pkgconfig(appsvc) +BuildRequires: pkgconfig(ail) +BuildRequires: pkgconfig(efreet-mime) + + +BuildRequires: cmake +BuildRequires: gettext-tools +BuildRequires: edje-tools +BuildRequires: prelink +BuildRequires: libicu-devel + +%description +Video & streaming player + + +%prep +%setup -q + + +%build +cmake . -DCMAKE_INSTALL_PREFIX=/opt/apps/org.tizen.video-player +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} + +%make_install +execstack -c %{buildroot}/opt/apps/org.tizen.video-player/bin/video-player + +%post +chown -R 5000:5000 %dir /opt/apps/org.tizen.video-player/data + +%files -n org.tizen.video-player +/opt/apps/org.tizen.video-player/bin/* +/opt/apps/org.tizen.video-player/res/locale/* +/opt/apps/org.tizen.video-player/res/icons/default/small/* +/opt/apps/org.tizen.video-player/res/edje/* +/opt/apps/org.tizen.video-player/res/images/* +/opt/share/applications/* diff --git a/res/edc/add_tag.edc b/res/edc/add_tag.edc new file mode 100755 index 0000000..160c0d0 --- /dev/null +++ b/res/edc/add_tag.edc @@ -0,0 +1,363 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +collections { + group { + name: "favorite"; + parts { + part { + name: "background"; + type, RECT; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; offset: 0 0; } + rel2 { relative: 1.0 1.0; offset: -1 -1; } + color, 0 0 0 255 ; + } + } + + part { + name: "selectall_bg"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 0 80; + fixed: 0 1; + align: 0.5 0.0; + rel1 { relative: 0.0 0.0; to: "background"; } + rel2 { relative: 1.0 0.0; to: "background"; } + visible : 0; + color: 37 37 37 153; + visible : 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { + name: "selectall_check_leftpadding"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 15 0; + fixed: 1 0; + align: 0.0 0.0; + + color: 0 0 0 255; + visible: 0; + rel1 { relative: 0.0 0.0; to: "selectall_bg"; } + rel2 { relative: 0.0 1.0; to: "selectall_bg"; } + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + } + } + + part { + name: "selectall_check"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.5; + fixed: 1 1; + min: 44 44; + rel1 { relative: 1.0 0.0; to: "selectall_check_leftpadding"; } + rel2 { relative: 1.0 1.0; to: "selectall_check_leftpadding"; } + visible : 0; + + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { + name: "selectall_check_rightpadding"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 15 0; + fixed: 1 0; + align: 0.0 0.0; + color: 0 0 0 0; + rel1 { relative: 1.0 0.0; to: "selectall_check"; } + rel2 { relative: 1.0 1.0; to: "selectall_check"; } + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { + name: "selectall_text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.5; + rel1 { relative: 1.0 0.0; to: "selectall_check_rightpadding"; } + rel2 { relative: 1.0 1.0; to: "selectall_bg"; } + color: 255 255 255 255; + text { + font: "SLP"; + size: 32; + text: "Select all"; + align: 0.0 0.5; + } + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { + name: "selectall_inner"; + type: RECT; + mouse_events: 0; + scale: 1; + + description { + state: "defalut" 0.0; + min: 0 1; + fixed: 0 1; + align: 0.5 0.0; + rel1 { relative: 0.0 1.0; to: "selectall_bg"; } + rel2 { relative: 1.0 1.0; to: "selectall_bg"; } + color: 90 90 90 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + } + } + + + // tab style container + part { + name: "elm.swallow.tabbar"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + } + } + + // tool style container. + part { + name: "elm.swallow.toolbar_bg"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + min: 0 50; + fixed: 1 1; + align: 0.5 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; offset: 0 50;} + + } + } + + // tool style container. + part { + name: "elm.swallow.toolbar"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + //min: 0 76; + min: 0 86; + fixed: 1 1; + align: 0.5 1.0; + rel1 { relative: 0.0 1.0;} + rel2 { relative: 1.0 1.0;} + + } + description { + state: "moveup" 0.0; + //min: 0 86; + min: 0 50; + fixed: 1 1; + //align: 0.5 1.0; + align: 0.5 0.0; + rel1 { relative: 0.0 0.0; offset: 5 0;} + rel2 { relative: 1.0 0.0; offset: -5 50;} + + } + description { + state: "moveup_progressbar" 0.0; + min: 0 62; + fixed: 1 1; + align: 0.5 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 0.0; offset: 0 62;} + + } + } + + // view container. This is used, when tool items is added. + part { + name: "elm.swallow.view"; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 0.0; to: "elm.swallow.toolbar";} + + } + description { + state: "edit_default" 0.0; + rel1 { relative: 0.0 1.0; to: "selectall_inner"; } + rel2 { relative: 1.0 0.0; to: "elm.swallow.toolbar";} + + } + description { + state: "moveup_toolbar" 0.0; + rel1 { relative: 0.0 1.0; offset: 0 0; to: "elm.swallow.toolbar_bg";} + rel2 { relative: 1.0 1.0; } + } + description { + state: "moveup_toolbar_progressbar" 0.0; + rel1 { relative: 0.0 1.0; to: "elm.swallow.toolbar";} + rel2 { relative: 1.0 1.0; } + } + } + + part { + name: "view_bg"; + type: SWALLOW; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; offset: 0 0; to: "elm.swallow.view";} + rel2 { relative: 1.0 1.0; offset: 0 0; to: "elm.swallow.view";} + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + }//GROUP + + programs { + program { + name: "swallow_view_default"; + signal: "elm,swallow_view,state,default"; + source: "elm"; + script { + set_state(PART:"elm.swallow.view", "default", 0.0); + set_state(PART:"elm.swallow.toolbar", "default", 0.0);//restore toolbar position + } + } + program { + name: "swallow_view_edit_default"; + signal: "elm,swallow_view,state,edit_default"; + source: "elm"; + script { + set_state(PART:"elm.swallow.view", "edit_default", 0.0); + set_state(PART:"elm.swallow.toolbar", "default", 0.0);//restore toolbar position + } + } + program { + name: "swallow_view_moveup_toolbar"; + signal: "elm,swallow_view,state,moveup_toolbar"; + source: "elm"; + script { + set_state(PART:"elm.swallow.toolbar", "moveup", 0.0); //move toolbar up + set_state(PART:"elm.swallow.view", "moveup_toolbar", 0.0); + } + } + program { + name: "swallow_view_moveup_toolbar_progressbar"; + signal: "elm,swallow_view,state,moveup_toolbar_progressbar"; + source: "elm"; + script { + set_state(PART:"elm.swallow.toolbar", "moveup_progressbar", 0.0); //move toolbar+progressbar up + set_state(PART:"elm.swallow.view", "moveup_toolbar_progressbar", 0.0); + } + } + program { + name: "view_bg_default"; + signal: "elm,view,bg,state,default"; + source: "elm"; + script { + set_state(PART:"view_bg", "default", 0.0); + } + } + program { + name: "view_bg_disable"; + signal: "elm,view,bg,state,disabled"; + source: "elm"; + script { + set_state(PART:"view_bg", "disabled", 0.0); + } + } + program { + name: "selectall_show"; + signal: "selectall_show"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "selectall_bg"; + target: "selectall_check_leftpadding"; + target: "selectall_check"; + target: "selectall_check_rightpadding"; + target: "selectall_text"; + target: "selectall_inner"; + } + program { + name: "selectall_hide"; + signal: "selectall_hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "selectall_bg"; + target: "selectall_check_leftpadding"; + target: "selectall_check"; + target: "selectall_check_rightpadding"; + target: "selectall_text"; + target: "selectall_inner"; + } + }//PROGRAMS +} /* collections */ diff --git a/res/edc/animation.edc b/res/edc/animation.edc new file mode 100755 index 0000000..b82b3ab --- /dev/null +++ b/res/edc/animation.edc @@ -0,0 +1,316 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "image_res.edc" +#include "vp_font.edc" + +#define CONTROL_BUTTON_STEP(_item_name_, _val_) \ +program { \ + signal: "signal."_item_name_".step."_val_; \ + source: "*"; \ + action: STATE_SET "step_"_val_ 0.0; \ + target: _item_name_; \ +} /* CONTROL_BUTTON_STEP */ + + +collections { + group { + name: "animation"; + + parts { + + part { + name: "loading.back"; + type: RECT; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + color: 255 0 0 255; + } + } + + part { + name: "loading.txt"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 288 54; + fixed: 0 1; + align: 0.5 0.0; + rel1 { relative: 0.0 1.0; } + rel2 { relative: 1.0 1.0; } + color: FONT_COLOR; + text { + font: FONT_NANE; + size: 32; + text: ""; + align: 0.5 0.5; + } + } + + } + part { + name: "loading.image"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + min: 138 138; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: 0.5 0.5;} + rel2 { relative: 0.5 0.5;} + image { normal: "gallery_loading_ani_01.png"; } + color: 255 255 255 255; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_01.png"; } + } + description { + state: "step_1" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_01.png"; } + } + description { + state: "step_2" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_02.png"; } + } + description { + state: "step_3" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_03.png"; } + } + description { + state: "step_4" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_04.png"; } + } + description { + state: "step_5" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_05.png"; } + } + description { + state: "step_6" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_06.png"; } + } + description { + state: "step_7" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_07.png"; } + } + description { + state: "step_8" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_08.png"; } + } + description { + state: "step_9" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_09.png"; } + } + description { + state: "step_10" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_10.png"; } + } + description { + state: "step_11" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_11.png"; } + } + description { + state: "step_12" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_12.png"; } + } + description { + state: "step_13" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_13.png"; } + } + description { + state: "step_14" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_14.png"; } + }description { + state: "step_15" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_15.png"; } + } + description { + state: "step_16" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_16.png"; } + } + description { + state: "step_17" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_17.png"; } + } + description { + state: "step_18" 0.0; + inherit: "show" 0.0; + image { normal: "gallery_loading_ani_18.png"; } + } + description { + state: "step_19" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_19.png"; } + } + description { + state: "step_20" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_20.png"; } + } + description { + state: "step_21" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_21.png"; } + } + description { + state: "step_22" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_22.png"; } + } + description { + state: "step_23" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_23.png"; } + } + description { + state: "step_24" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_24.png"; } + } + description { + state: "step_25" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_25.png"; } + } + description { + state: "step_26" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_26.png"; } + } + description { + state: "step_27" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_27.png"; } + } + description { + state: "step_28" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_28.png"; } + } + description { + state: "step_29" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_29.png"; } + } + description { + state: "step_30" 0.0; + inherit: "show" 0.0; + visible: 1; + image { normal: "gallery_loading_ani_30.png"; } + } + + description { + state: "step_0" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } /* parts */ + programs { + CONTROL_BUTTON_STEP( "loading.image", 0); + CONTROL_BUTTON_STEP( "loading.image", 1); + CONTROL_BUTTON_STEP( "loading.image", 2); + CONTROL_BUTTON_STEP( "loading.image", 3); + CONTROL_BUTTON_STEP( "loading.image", 4); + CONTROL_BUTTON_STEP( "loading.image", 5); + CONTROL_BUTTON_STEP( "loading.image", 6); + CONTROL_BUTTON_STEP( "loading.image", 7); + CONTROL_BUTTON_STEP( "loading.image", 8); + CONTROL_BUTTON_STEP( "loading.image", 9); + CONTROL_BUTTON_STEP( "loading.image", 10); + CONTROL_BUTTON_STEP( "loading.image", 11); + CONTROL_BUTTON_STEP( "loading.image", 12); + CONTROL_BUTTON_STEP( "loading.image", 13); + CONTROL_BUTTON_STEP( "loading.image", 14); + CONTROL_BUTTON_STEP( "loading.image", 15); + CONTROL_BUTTON_STEP( "loading.image", 16); + CONTROL_BUTTON_STEP( "loading.image", 17); + CONTROL_BUTTON_STEP( "loading.image", 18); + CONTROL_BUTTON_STEP( "loading.image", 19); + CONTROL_BUTTON_STEP( "loading.image", 20); + CONTROL_BUTTON_STEP( "loading.image", 21); + CONTROL_BUTTON_STEP( "loading.image", 22); + CONTROL_BUTTON_STEP( "loading.image", 23); + CONTROL_BUTTON_STEP( "loading.image", 24); + CONTROL_BUTTON_STEP( "loading.image", 25); + CONTROL_BUTTON_STEP( "loading.image", 26); + CONTROL_BUTTON_STEP( "loading.image", 27); + CONTROL_BUTTON_STEP( "loading.image", 28); + CONTROL_BUTTON_STEP( "loading.image", 29); + CONTROL_BUTTON_STEP( "loading.image", 30); + + } /* programs */ + } /* group */ +} /* collections */ diff --git a/res/edc/control.edc b/res/edc/control.edc new file mode 100755 index 0000000..2cbdcd7 --- /dev/null +++ b/res/edc/control.edc @@ -0,0 +1,724 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#define BUTTON_PRESS_COLOR 240 123 20 255 + +#include "image_res.edc" +#include "vp_font.edc" + +/* part macro */ + +#define CONTROL_BUTTON_PRESS_PART(_name_ , _w_ , _h_ , _align_x_ , _align_y_ , _rel_x1_ , _rel_x2_ , _rel_y1_, _rel_y2_ , _img_def_ , _img_press_ ) \ +part { \ + name: _name_; \ + type: IMAGE; \ + scale: 1; \ + mouse_events: 1; \ + description { \ + state: "default" 0.0; \ + min: _w_ _h_; \ + fixed: 1 1; \ + align: _align_x_ _align_y_; \ + rel1 { relative: _rel_x1_ _rel_y1_; } \ + rel2 { relative: _rel_x2_ _rel_y2_; } \ + image { normal: _img_def_; border: 4 4 0 0;} \ + color: 255 255 255 255; \ + } \ + description { \ + state: "pressed" 0.0; \ + min: _w_ _h_; \ + fixed: 1 1; \ + align: _align_x_ _align_y_; \ + rel1 { relative: _rel_x1_ _rel_y1_; } \ + rel2 { relative: _rel_x2_ _rel_y2_; } \ + image { normal: _img_press_; border: 4 4 0 0;} \ + color: 255 255 255 255; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ +} /* CONTROL_BUTTON_PRESS_PART */ + + + +/* program macro */ + +#define CONTROL_BUTTON_PROG(_item_name_) \ +program { \ + name: _item_name_".pressed"; \ + source: _item_name_; \ + signal: "mouse,down,1"; \ + action: STATE_SET "pressed" 0.0; \ + target: _item_name_; \ + after: "send."_item_name_".down.signal"; \ +} \ +program { \ + name: _item_name_".clicked"; \ + source: _item_name_; \ + signal: "mouse,up,1"; \ + action: STATE_SET "default" 0.0; \ + target: _item_name_; \ + after: "send."_item_name_".up.signal"; \ +} \ +program { \ + name: "send."_item_name_".down.signal"; \ + action: SIGNAL_EMIT "signal."_item_name_".down" _item_name_; \ +} \ +program { \ + name: "send."_item_name_".up.signal"; \ + action: SIGNAL_EMIT "signal."_item_name_".up" _item_name_; \ +} /* CONTROL_BUTTON_PROG */ + + + + + +collections { + group { + name: "control"; + + script { + public val_volume_check = 0; /* 0: unmute, 1: mute */ + public val_play_status = 0; /* 0: pause , 1: resume */ + public val_display_mode = 0; /* 0: normal, 1: streaming */ + public val_ff_mode = 0; /* 0: normal, 1: extend */ + public val_rew_mode = 0; /* 0: normal, 1: extend */ + + public change_display_mode() { + + run_program(PROGRAM:"set.visible.off"); + + if(get_int(val_display_mode ) == 0) { /* normal mode */ + run_program(PROGRAM:"set.mode.normal"); + } + if(get_int(val_display_mode ) == 1) { /* streaming mode */ + run_program(PROGRAM:"set.mode.streaming"); + } + } /* change_display_mode */ + + + public set_volume_check() { + if(get_int(val_volume_check ) == 0) { + run_program(PROGRAM:"set.volume.unmute"); + } + else { + run_program(PROGRAM:"set.volume.mute"); + } + } /* set_volume_check */ + + public send_play_value() { + if(get_int(val_play_status ) == 0) { + run_program(PROGRAM:"send.play.resume"); + } + else { + run_program(PROGRAM:"send.play.pause"); + } + } /* send_play_value */ + + + public set_play_status() { + if(get_int(val_play_status ) == 0) { + run_program(PROGRAM:"set.play.default"); + } + else { + run_program(PROGRAM:"set.play.pause"); + } + } /* set_play_status */ + + + public set_play_button_press() { + if(get_int(val_play_status ) == 0) { + run_program(PROGRAM:"press.resume.button"); + } + else { + run_program(PROGRAM:"press.pause.button"); + } + } /* set_play_button_press */ + + public change_ff_mode() { + if(get_int(val_ff_mode ) == 0) { + run_program(PROGRAM:"set.ff.normal.mode"); + } + else { + run_program(PROGRAM:"set.ff.extend.mode"); + } + + } /* change_ff_mode */ + + public change_rew_mode() { + if(get_int(val_rew_mode ) == 0) { + run_program(PROGRAM:"set.rew.normal.mode"); + } + else { + run_program(PROGRAM:"set.rew.extend.mode"); + } + } /* change_rew_mode */ + + public check_ff_press() { + if(get_int(val_ff_mode ) == 0) { + run_program(PROGRAM:"set.ff.normal.press"); + } + else { + run_program(PROGRAM:"set.ff.extend.press"); + } + + } /* check_ff_press */ + + public check_rew_press() { + if(get_int(val_rew_mode ) == 0) { + run_program(PROGRAM:"set.rew.normal.press"); + } + else { + run_program(PROGRAM:"set.rew.extend.press"); + } + } /* check_rew_press */ + } /* script */ + + parts { + part { + name: "control.rect"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + align: 0.0 0.5; + visible : 0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + color: 255 0 0 0; + } + } + + CONTROL_BUTTON_PRESS_PART("control.back.button.bg", 74 ,74, 1.0, 0.0, 1.0, 1.0, 0.15625, 0.15625, "T01_controller_btn.png" , "T01_controller_btn_press.png"); + part { + name: "control.back.button"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 74 74; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: 0.5 0.5; to: "control.back.button.bg"; } + rel2 { relative: 0.5 0.5; to: "control.back.button.bg"; } + image { normal: "T01_back.png"; } + color: 255 255 255 255; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + CONTROL_BUTTON_PRESS_PART("control.volume.button.bg", 74 ,74, 0.0, 0.0, 0.0, 0.0, 0.15625, 0.15625, "T01_controller_btn.png" , "T01_controller_btn_press.png"); + part { + name: "control.volume.button"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 74 74; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: 0.5 0.5; to: "control.volume.button.bg"; } + rel2 { relative: 0.5 0.5; to: "control.volume.button.bg"; } + image { normal: "gallery_video_icon_volume.png"; } + color: 255 255 255 255; + } + description { + state: "mute" 0.0; + visible: 1; + min: 74 74; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: 0.5 0.5; to: "control.volume.button.bg"; } + rel2 { relative: 0.5 0.5; to: "control.volume.button.bg"; } + image { normal: "gallery_video_icon_mute.png"; } + color: 255 255 255 255; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "control.play.button"; + type: IMAGE; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + min: 80 80; + fixed: 1 1; + align: 0.5 0.0; + rel1 { relative: 0.5 0.2205; } + rel2 { relative: 0.5 0.2205; } + image { normal: "gallery_video_control_play.png"; } + color: 255 255 255 255; + } + description { + state: "pause" 0.0; + inherit: "default" 0.0; + image { normal: "gallery_video_control_pause.png"; } + color: 255 255 255 255; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "press_resume" 0.0; + inherit: "default" 0.0; + image { normal: "gallery_video_control_play.png"; } + color: BUTTON_PRESS_COLOR; + } + description { + state: "press_pause" 0.0; + inherit: "default" 0.0; + image { normal: "gallery_video_control_pause.png"; } + color: BUTTON_PRESS_COLOR; + } + } + + + /* normal mode control part */ + part { + name: "control.normal.rew.button"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 80 80; + fixed: 1 1; + align: 0.5 0.0; + rel1 { relative: 0.3 0.2205; } + rel2 { relative: 0.3 0.2205; } + image { normal: "gallery_video_control_rew.png"; } + color: 255 255 255 255; + } + description { + state: "extend" 0.0; + inherit: "default" 0.0; + image { normal: "gallery_video_control_prev.png"; } + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + color: BUTTON_PRESS_COLOR; + } + description { + state: "pressed.extend" 0.0; + inherit: "extend" 0.0; + color: BUTTON_PRESS_COLOR; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "control.normal.ff.button"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 80 80; + fixed: 1 1; + align: 0.5 0.0; + rel1 { relative: 0.7 0.2205; } + rel2 { relative: 0.7 0.2205; } + image { normal: "gallery_video_control_ff.png"; } + color: 255 255 255 255; + } + description { + state: "extend" 0.0; + inherit: "default" 0.0; + image { normal: "gallery_video_control_next.png"; } + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + color: BUTTON_PRESS_COLOR; + } + description { + state: "pressed.extend" 0.0; + inherit: "extend" 0.0; + color: BUTTON_PRESS_COLOR; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + /* <-- normal mode control part */ + + } /* parts */ + + + programs { + program { + signal: "signal.control.mode.normal"; + source: "*"; + script { + set_int(val_display_mode, 0); + change_display_mode(); + set_play_status(); + } + } + + program { + signal: "signal.control.mode.streaming"; + source: "*"; + script { + set_int(val_display_mode, 1); + change_display_mode(); + set_play_status(); + } + } + + program { + signal: "signal.control.mode.visible.off"; + source: "*"; + after: "set.visible.off"; + } + + program { + name: "set.visible.off"; + source: "*"; + action: STATE_SET "hide" 0.0; + + target: "control.play.button"; + target: "control.back.button"; + target: "control.back.button.bg"; + target: "control.volume.button"; + target: "control.volume.button.bg"; + target: "control.normal.rew.button"; + target: "control.normal.ff.button"; + } + + program { + name: "set.mode.normal"; + source: "*"; + action: STATE_SET "default" 0.0; + + target: "control.play.button"; + target: "control.back.button"; + target: "control.back.button.bg"; + target: "control.volume.button"; + target: "control.volume.button.bg"; + target: "control.normal.rew.button"; + target: "control.normal.ff.button"; + } + + program { + name: "set.mode.streaming"; + source: "*"; + action: STATE_SET "default" 0.0; + + target: "control.play.button"; + target: "control.back.button"; + target: "control.back.button.bg"; + target: "control.volume.button"; + target: "control.volume.button.bg"; + } + + program { + signal: "signal.control.back.button.down"; + source: "control.back.button"; + script: { set_state(PART:"control.back.button.bg", "pressed", 0.0); } + } + + program { + signal: "signal.control.back.button.up"; + source: "control.back.button"; + script: { set_state(PART:"control.back.button.bg", "default", 0.0); } + } + + program { + name: "control.volume.button.bg.press"; + source: "control.volume.button"; + signal: "signal.control.volume.button.down"; + script: { + set_state(PART:"control.volume.button.bg", "pressed", 0.0); + set_volume_check(); + } + } + + program { + name: "control.volume.button.bg.up"; + source: "control.volume.button"; + signal: "signal.control.volume.button.up"; + script: { + set_state(PART:"control.volume.button.bg", "default", 0.0); + set_volume_check(); + } + } + + program { + name: "control.normal.rew.button.press"; + source: "control.normal.rew.button"; + signal: "signal.control.normal.rew.button.down"; + script: { + check_rew_press(); + } + } + + program { + name: "control.normal.ff.button.press"; + source: "control.normal.ff.button"; + signal: "signal.control.normal.ff.button.down"; + script: { + check_ff_press(); + } + } + + program { + name: "control.normal.rew.button.up"; + source: "control.normal.rew.button"; + signal: "signal.control.normal.rew.button.up"; + script: { + change_rew_mode(); + } + } + + program { + name: "control.normal.ff.button.up"; + source: "control.normal.ff.button"; + signal: "signal.control.normal.ff.button.up"; + script: { + change_ff_mode(); + } + } + + + /* --> mute/unmute check prog*/ + program { + signal: "signal.control.volume.button.mute"; + source: "*"; + script { + set_int(val_volume_check, 1); + set_volume_check(); + } + } + + program { + signal: "signal.control.volume.button.unmute"; + source: "*"; + script { + set_int(val_volume_check, 0); + set_volume_check(); + } + } + + program { + name: "set.volume.unmute"; + action: STATE_SET "default" 0.0; + target: "control.volume.button"; + } + program { + name: "set.volume.mute"; + action: STATE_SET "mute" 0.0; + target: "control.volume.button"; + } + /* --> mute/unmute check prog*/ + + /* --> play status part */ + program { + name: "press.resume.button"; + action: STATE_SET "press_resume" 0.0; + target: "control.play.button"; + } + program { + name: "press.pause.button"; + action: STATE_SET "press_pause" 0.0; + target: "control.play.button"; + } + + program { + name: "control.play.button.down"; + source: "control.play.button"; + signal: "signal.control.play.button.down"; + script: {set_play_button_press(); } + } + + program { + name: "control.play.button.up"; + source: "control.play.button"; + signal: "signal.control.play.button.up"; + script: { send_play_value(); } + } + + + program { + name: "set.ff.normal.mode"; + action: STATE_SET "default" 0.0; + target: "control.normal.ff.button"; + } + + program { + name: "set.rew.normal.mode"; + action: STATE_SET "default" 0.0; + target: "control.normal.rew.button"; + } + + program { + name: "set.ff.extend.mode"; + action: STATE_SET "extend" 0.0; + target: "control.normal.ff.button"; + } + + program { + name: "set.rew.extend.mode"; + action: STATE_SET "extend" 0.0; + target: "control.normal.rew.button"; + } + + program { + name: "set.ff.normal.press"; + action: STATE_SET "pressed" 0.0; + target: "control.normal.ff.button"; + } + + program { + name: "set.rew.normal.press"; + action: STATE_SET "pressed" 0.0; + target: "control.normal.rew.button"; + } + + program { + name: "set.ff.extend.press"; + action: STATE_SET "pressed.extend" 0.0; + target: "control.normal.ff.button"; + } + + program { + name: "set.rew.extend.press"; + action: STATE_SET "pressed.extend" 0.0; + target: "control.normal.rew.button"; + } + + program { + signal: "signal.control.play.resume"; + source: "*"; + script { + set_int(val_play_status, 1); + set_play_status(); + } + } + + program { + signal: "signal.control.play.pause"; + source: "*"; + script { + set_int(val_play_status, 0); + set_play_status(); + } + } + + program { + signal: "signal.control.ff.normal"; + source: "*"; + script { + set_int(val_ff_mode, 0); + change_ff_mode(); + } + } + + program { + signal: "signal.control.ff.extend"; + source: "*"; + script { + set_int(val_ff_mode, 1); + change_ff_mode(); + } + } + + program { + signal: "signal.control.rew.normal"; + source: "*"; + script { + set_int(val_rew_mode, 0); + change_rew_mode(); + } + } + + program { + signal: "signal.control.rew.extend"; + source: "*"; + script { + set_int(val_rew_mode, 1); + change_rew_mode(); + } + } + + program { + name: "set.play.default"; + source: "control.play.button"; + action: STATE_SET "default" 0.0; + target: "control.play.button"; + } + program { + name: "set.play.pause"; + source: "control.play.button"; + action: STATE_SET "pause" 0.0; + target: "control.play.button"; + } + + program { + name: "send.play.pause"; + action: SIGNAL_EMIT "signal.control.play.pause.press" "control.play.button"; + } + + program { + name: "send.play.resume"; + action: SIGNAL_EMIT "signal.control.play.resume.press" "control.play.button"; + } + /* <-- play status part */ + + /* -->common control prog */ + CONTROL_BUTTON_PROG("control.play.button"); + CONTROL_BUTTON_PROG("control.back.button"); + CONTROL_BUTTON_PROG("control.volume.button"); + /* <-- common control prog */ + + /* -->normal mode prog */ + CONTROL_BUTTON_PROG("control.normal.ff.button"); + CONTROL_BUTTON_PROG("control.normal.rew.button"); + + /* <-- normal mode prog */ + } /*programs */ + } /* group */ +} /* collections */ + diff --git a/res/edc/detail.edc b/res/edc/detail.edc new file mode 100755 index 0000000..9972153 --- /dev/null +++ b/res/edc/detail.edc @@ -0,0 +1,50 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "image_res.edc" +#include "vp_font.edc" + +collections { + group { + name: "detail"; + + parts { + part { + name: "detail.background"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + color: 0 0 0 255; + } + } + part { + name: "detail.list"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + } + } + } /* parts */ + } /* group */ +} /* collections */ diff --git a/res/edc/hidden_button_panel.edc b/res/edc/hidden_button_panel.edc new file mode 100755 index 0000000..67ee7e6 --- /dev/null +++ b/res/edc/hidden_button_panel.edc @@ -0,0 +1,290 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "image_res.edc" +#include "vp_font.edc" +/* program macro */ + +#define CONTROL_BUTTON_PROG(_item_name_) \ +program { \ + name: _item_name_".pressed"; \ + source: _item_name_; \ + signal: "mouse,down,1"; \ + action: STATE_SET "pressed" 0.0; \ + target: _item_name_; \ + after: "send."_item_name_".down.signal"; \ +} \ +program { \ + name: _item_name_".clicked"; \ + source: _item_name_; \ + signal: "mouse,up,1"; \ + action: STATE_SET "default" 0.0; \ + target: _item_name_; \ + after: "send."_item_name_".up.signal"; \ +} \ +program { \ + name: "send."_item_name_".down.signal"; \ + action: SIGNAL_EMIT "signal."_item_name_".down" _item_name_; \ +} \ +program { \ + name: "send."_item_name_".up.signal"; \ + action: SIGNAL_EMIT "signal."_item_name_".up" _item_name_; \ +} /* CONTROL_BUTTON_PROG */ + +collections { + group { + name: "hidden_panel"; + + script { + public val_quality_select = 1; /* 0: normal, 1: high */ + public set_quality_check() { + if(get_int(val_quality_select ) == 0) { + run_program(PROGRAM:"set.streaming.quality.normal"); + } + if(get_int(val_quality_select ) == 1) { + run_program(PROGRAM:"set.streaming.quality.high"); + } + if(get_int(val_quality_select ) == 2) { + run_program(PROGRAM:"set.streaming.quality.hide"); + } + } + } /* scrpit */ + + parts { + part { + name: "hidden.button.panel.soundpath"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 72 72; + fixed: 1 1; + align: 0.0 0.5; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 0.0 0.0;} + color: 255 255 255 255; + image { normal: "T01_icon_soundPath.png"; } + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + image { normal: "T01_icon_soundPath_press.png"; } + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "control.streaming.hq.button.bg"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 72 72; + fixed: 1 1; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; } + rel2 { relative: 1.0 0.0; } + image { normal: "T01_controller_btn_press.png"; border: 4 4 0 0;} + color: 255 255 255 255; + } + description { + state: "normal" 0.0; + visible: 1; + min: 72 72; + fixed: 1 1; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; } + rel2 { relative: 1.0 0.0; } + image { normal: "T01_controller_btn.png"; border: 4 4 0 0;} + color: 255 255 255 255; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + + part { + name: "control.streaming.hq.txt"; + type: TEXT; + scale: 1; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + color: 255 255 255 255; + visible: 1; + min: 72 72; + fixed: 1 1; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; } + rel2 { relative: 1.0 0.0; } + text { + font: FONT_NANE; + size: 26; + text: "HQ"; + align: 0.5 0.5; + } + } + description { + state: "normal" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "control.streaming.hq.button"; + type: RECT; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 48 48; + fixed: 1 1; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0;} + rel2 { relative: 1.0 0.0;} + color: 255 255 255 0; + } + description { + state: "normal" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } /* parts */ + + programs { + program { + name: "hidden.button.panel.soundpath.pressed"; + source: "hidden.button.panel.soundpath"; + signal: "mouse,down,1"; + action: STATE_SET "pressed" 0.0; + target: "hidden.button.panel.soundpath"; + after: "send.hidden.button.panel.soundpath.down.signal"; + } + + program { + name: "send.hidden.button.panel.soundpath.down.signal"; + action: SIGNAL_EMIT "signal.hidden.button.panel.soundpath.down" "hidden.button.panel.soundpath"; + } + + program { + name: "hidden.button.panel.soundpath.clicked"; + source: "hidden.button.panel.soundpath"; + signal: "mouse,up,1"; + action: STATE_SET "default" 0.0; + target: "hidden.button.panel.soundpath"; + after: "send.hidden.button.panel.soundpath.up.signal"; + } + + program { + name: "send.hidden.button.panel.soundpath.up.signal"; + action: SIGNAL_EMIT "signal.hidden.button.panel.soundpath.up" "hidden.button.panel.soundpath"; + } + + program { + signal: "signal.hidden.button.panel.soundpath.show"; + source: "*"; + action: STATE_SET "default" 0.0; + target: "hidden.button.panel.soundpath"; + } + + program { + signal: "signal.hidden.button.panel.soundpath.hide"; + source: "*"; + action: STATE_SET "hide" 0.0; + target: "hidden.button.panel.soundpath"; + } + + program { + signal: "signal.control.streaming.quality.high"; + source: "*"; + script { + set_int(val_quality_select, 1); + set_quality_check(); + } + } + + program { + signal: "signal.control.streaming.quality.normal"; + source: "*"; + script { + set_int(val_quality_select, 0); + set_quality_check(); + } + } + + program { + signal: "signal.control.streaming.quality.hide"; + source: "*"; + script { + set_int(val_quality_select, 2); + set_quality_check(); + } + } + + program { + name: "set.streaming.quality.high"; + action: STATE_SET "default" 0.0; + target: "control.streaming.hq.button.bg"; + target: "control.streaming.hq.txt"; + target: "control.streaming.hq.button"; + } + + program { + name: "set.streaming.quality.normal"; + action: STATE_SET "normal" 0.0; + target: "control.streaming.hq.button.bg"; + target: "control.streaming.hq.txt"; + target: "control.streaming.hq.button"; + } + + program { + name: "set.streaming.quality.hide"; + action: STATE_SET "hide" 0.0; + target: "control.streaming.hq.button.bg"; + target: "control.streaming.hq.txt"; + target: "control.streaming.hq.button"; + } + + CONTROL_BUTTON_PROG("control.streaming.hq.button"); + } /* programs */ + } /* group */ +} /* collections */ diff --git a/res/edc/image_res.edc b/res/edc/image_res.edc new file mode 100755 index 0000000..725e931 --- /dev/null +++ b/res/edc/image_res.edc @@ -0,0 +1,99 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +images { + image: "gallery_video_player_bg.png" COMP; + image: "gallery_video_popup_mute.png" COMP; + image: "gallery_video_control_pause.png" COMP; + image: "gallery_video_control_play.png" COMP; + image: "gallery_video_control_next.png" COMP; + image: "gallery_video_control_prev.png" COMP; + image: "gallery_video_control_rew.png" COMP; + image: "gallery_video_control_ff.png" COMP; + image: "gallery_video_icon_volume.png" COMP; + image: "gallery_video_icon_mute.png" COMP; + image: "gallery_video_icon_btn.png" COMP; + image: "gallery_video_icon_btn_press.png" COMP; + image: "gallery_video_control_frame_back.png" COMP; + image: "gallery_video_control_frame_forword.png" COMP; + image: "gallery_video_add_btn.png" COMP; + image: "gallery_video_add_btn_press.png" COMP; + image: "gallery_video_delete_btn.png" COMP; + image: "gallery_video_delete_btn_press.png" COMP; + image: "T01_sound_path.png" COMP; + image: "video_sound_path_dim.png" COMP; + image: "T01_player_progress_point.png" COMP; + image: "T01_player_progress_bar.png" COMP; + image: "T01_player_progress_bg.png" COMP; + image: "gallery_loading_ani_01.png" COMP; + image: "gallery_loading_ani_02.png" COMP; + image: "gallery_loading_ani_03.png" COMP; + image: "gallery_loading_ani_04.png" COMP; + image: "gallery_loading_ani_05.png" COMP; + image: "gallery_loading_ani_06.png" COMP; + image: "gallery_loading_ani_07.png" COMP; + image: "gallery_loading_ani_08.png" COMP; + image: "gallery_loading_ani_09.png" COMP; + image: "gallery_loading_ani_10.png" COMP; + image: "gallery_loading_ani_11.png" COMP; + image: "gallery_loading_ani_12.png" COMP; + image: "gallery_loading_ani_13.png" COMP; + image: "gallery_loading_ani_14.png" COMP; + image: "gallery_loading_ani_15.png" COMP; + image: "gallery_loading_ani_16.png" COMP; + image: "gallery_loading_ani_17.png" COMP; + image: "gallery_loading_ani_18.png" COMP; + image: "gallery_loading_ani_19.png" COMP; + image: "gallery_loading_ani_20.png" COMP; + image: "gallery_loading_ani_21.png" COMP; + image: "gallery_loading_ani_22.png" COMP; + image: "gallery_loading_ani_23.png" COMP; + image: "gallery_loading_ani_24.png" COMP; + image: "gallery_loading_ani_25.png" COMP; + image: "gallery_loading_ani_26.png" COMP; + image: "gallery_loading_ani_27.png" COMP; + image: "gallery_loading_ani_28.png" COMP; + image: "gallery_loading_ani_29.png" COMP; + image: "gallery_loading_ani_30.png" COMP; + image: "navibar_item_separator_shadow.png" COMP; + image: "T01_control_top_arrow.png" COMP; + image: "T01_control_top_bg.png" COMP; + image: "T01_Option_header_bt_press.png" COMP; + image: "T01_Option_header_bt.png" COMP; + image: "T01_toolbar_bg.png" COMP; + image: "T01_toolbar_press.png" COMP; + image: "T01_icon_reduce.png" COMP; + image: "T01_icon_expand.png" COMP; + image: "T01_icon_soundPath.png" COMP; + image: "T01_icon_soundPath_press.png" COMP; + image: "T01_controller_btn.png" COMP; + image: "T01_controller_btn_press.png" COMP; + image: "00_winset_control_top_arrow.png" COMP; + image: "naviframe_optionheader.png" COMP; + image: "naviframe_optionheader_arrow.png" COMP; + image: "T01_btn_prev.png" COMP; + image: "00_button_01_normal.png" COMP; + image: "00_button_01_normal_press.png" COMP; + image: "00_button_01_normal_dim.png" COMP; + image: "T01_control_icon_fullscreen.png" COMP; + image: "T01_control_icon_detail.png" COMP; + image: "T01_controlbar_icon_cancel.png" COMP; + image: "T01_control_icon_reduce.png" COMP; + image: "T01_Nocontents_multimedia.png" COMP; + image: "T01_back.png" COMP; +} + diff --git a/res/edc/main.edc b/res/edc/main.edc new file mode 100755 index 0000000..d1be528 --- /dev/null +++ b/res/edc/main.edc @@ -0,0 +1,308 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#define GRAY_RECT_COLOR 128 128 128 128 + + +#include "image_res.edc" +#include "vp_font.edc" + +collections { + group { + name: "main"; + + parts { + part { + name: "main.background"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + color: 255 255 255 0; + } + } + part { + name: "main.screen.touch"; + type: RECT; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.065; } + rel2 { relative: 1.0 0.78; } + color: 255 255 255 0; + } + } + + part { + name: "main.mute.bg"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + min: 399 399; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: 0.5 0.4;} + rel2 { relative: 0.5 0.4;} + image { normal: "gallery_video_player_bg.png"; border: 7 7 0 0; } + color: GRAY_RECT_COLOR; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { + name: "main.mute.image"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + min: 144 144; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: 0.5 0.4;} + rel2 { relative: 0.5 0.4;} + image { normal: "gallery_video_popup_mute.png"; } + color: 255 255 255 255; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { + name: "main.nocontents.bg"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + min: 399 399; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: 0.5 0.4;} + rel2 { relative: 0.5 0.4;} + image { normal: "gallery_video_player_bg.png"; border: 7 7 0 0; } + color: GRAY_RECT_COLOR; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { + name: "main.nocontents.image"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + min: 144 144; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: 0.5 0.4;} + rel2 { relative: 0.5 0.4;} + image { normal: "T01_Nocontents_multimedia.png"; } + color: 255 255 255 255; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { + name: "main.option.button.bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 0 96; + fixed: 0 1; + align: 0.5 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + color: 37 37 37 64; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "main.option.button"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + min: 0 96; + fixed: 0 1; + align: 0.5 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "main.hidden.button"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + min: 0 112; + fixed: 0 1; + align: 0.5 1.0; + rel1 { relative: 0.0277 0.0; to_y: "main.panel";} + rel2 { relative: 0.9723 0.0; to_y: "main.panel";} + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "main.panel"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + min: 0 266; + fixed: 0 1; + align: 0.5 1.0; + rel1 { relative: 0.0 1.0; } + rel2 { relative: 1.0 1.0; } + } + } + + + + part { name: "main.animation"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 0; + min: 288 195; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: 0.5 0.4;} + rel2 { relative: 0.5 0.4;} + color: 255 0 0 255; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } /* parts */ + + programs { + program { + name: "signal.main.screen.touch"; + source: "main.screen.touch"; + signal: "mouse,up,1"; + action: SIGNAL_EMIT "signal.main.screen.touch.press" "main.screen.touch.toggle"; + } + + program { + signal: "signal.main.mute.show"; + source: "*"; + action: STATE_SET "show" 0.0; + target: "main.mute.image"; + target: "main.mute.bg"; + } + + program { + signal: "signal.main.mute.hide"; + source: "*"; + action: STATE_SET "default" 0.0; + target: "main.mute.image"; + target: "main.mute.bg"; + } + + program { + signal: "signal.main.nocontents.show"; + source: "*"; + action: STATE_SET "show" 0.0; + target: "main.nocontents.image"; + target: "main.nocontents.bg"; + } + + program { + signal: "signal.main.nocontents.hide"; + source: "*"; + action: STATE_SET "default" 0.0; + target: "main.nocontents.image"; + target: "main.nocontents.bg"; + } + + program { + signal: "signal.main.animation.show"; + source: "*"; + action: STATE_SET "show" 0.0; + target: "main.animation"; + } + program { + signal: "signal.main.animation.hide"; + source: "*"; + action: STATE_SET "default" 0.0; + target: "main.animation"; + } + program { + signal: "signal.main.option.button.bg.hide"; + source: "*"; + action: STATE_SET "hide" 0.0; + target: "main.option.button.bg"; + } + } /* programs */ + } /* group */ +} /* collections */ diff --git a/res/edc/option_button.edc b/res/edc/option_button.edc new file mode 100755 index 0000000..464f0e6 --- /dev/null +++ b/res/edc/option_button.edc @@ -0,0 +1,231 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "image_res.edc" +#include "vp_font.edc" + +#define CONTROL_BUTTON_PRESS_PART(_name_ , _w_ , _h_ , _align_x_ , _align_y_ , _rel_x1_ , _rel_x2_ , _rel_y1_, _rel_y2_ , _img_def_ , _img_press_ ) \ +part { \ + name: _name_; \ + type: IMAGE; \ + scale: 1; \ + mouse_events: 1; \ + description { \ + state: "default" 0.0; \ + min: _w_ _h_; \ + fixed: 1 1; \ + visible: 0; \ + align: _align_x_ _align_y_; \ + rel1 { relative: _rel_x1_ _rel_y1_; } \ + rel2 { relative: _rel_x2_ _rel_y2_; } \ + image { normal: _img_def_; border: 4 4 0 0;} \ + color: 255 255 255 255; \ + } \ + description { \ + state: "pressed" 0.0; \ + visible: 1; \ + min: _w_ _h_; \ + fixed: 1 1; \ + align: _align_x_ _align_y_; \ + rel1 { relative: _rel_x1_ _rel_y1_; } \ + rel2 { relative: _rel_x2_ _rel_y2_; } \ + image { normal: _img_press_; border: 4 4 0 0;} \ + color: 255 255 255 255; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ +} /* CONTROL_BUTTON_PRESS_PART */ + + +#define CONTROL_BUTTON_PROG(_item_name_) \ +program { \ + name: _item_name_".pressed"; \ + source: _item_name_; \ + signal: "mouse,down,1"; \ + action: STATE_SET "pressed" 0.0; \ + target: _item_name_; \ + after: "send."_item_name_".down.signal"; \ +} \ +program { \ + name: _item_name_".clicked"; \ + source: _item_name_; \ + signal: "mouse,up,1"; \ + action: STATE_SET "default" 0.0; \ + target: _item_name_; \ + after: "send."_item_name_".up.signal"; \ +} \ +program { \ + name: "send."_item_name_".down.signal"; \ + action: SIGNAL_EMIT "signal."_item_name_".down" _item_name_; \ +} \ +program { \ + name: "send."_item_name_".up.signal"; \ + action: SIGNAL_EMIT "signal."_item_name_".up" _item_name_; \ +} /* CONTROL_BUTTON_PROG */ + + +collections { + group { + name: "option"; + + script { + public val_screensize_check = 0; /* 0: reduce, 1: full */ + + public change_screensize() { + if(get_int(val_screensize_check) == 0) { + set_int(val_screensize_check, 1); + set_state(PART:"option.screensize", "reduce", 0.0); + run_program(PROGRAM:"send.screensize.expand"); + } else { + set_int(val_screensize_check, 0); + set_state(PART:"option.screensize", "default", 0.0); + run_program(PROGRAM:"send.screensize.normal"); + } + } + + } + + parts { + part { + name: "option.rect"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + color: 255 255 255 0; + } + } + + CONTROL_BUTTON_PRESS_PART("option.screensize.button.bg", 74 ,74, 0.0, 0.0, 0.05, 0.05, 0.114, 0.114, "T01_controller_btn.png" , "T01_controller_btn_press.png"); + part { + name: "option.screensize"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 74 74; + fixed: 1 1; + align: 0.0 0.0; + rel1 { relative: 0.05 0.114; } + rel2 { relative: 0.05 0.114; } + image { normal: "T01_control_icon_fullscreen.png"; } + color: 255 255 255 255; + } + description { + state: "reduce" 0.0; + inherit: "default" 0.0; + visible: 1; + image { normal: "T01_control_icon_reduce.png"; } + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + CONTROL_BUTTON_PRESS_PART("option.detail.button.bg", 74 ,74, 1.0, 0.0, 0.95, 0.95, 0.114, 0.114, "T01_controller_btn.png" , "T01_controller_btn_press.png"); + part { + name: "option.detail"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 74 74; + fixed: 1 1; + align: 1.0 0.0; + rel1 { relative: 0.95 0.114; } + rel2 { relative: 0.95 0.114; } + image { normal: "T01_control_icon_detail.png"; } + color: 255 255 255 255; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + programs { + CONTROL_BUTTON_PROG("option.screensize"); + CONTROL_BUTTON_PROG("option.detail"); + + program { + signal: "signal.option.screensize.down"; + source: "*"; + action: STATE_SET "pressed" 0.0; + target: "option.screensize.button.bg"; + } + + program { + signal: "signal.option.screensize.up"; + source: "*"; + action: STATE_SET "hide" 0.0; + target: "option.screensize.button.bg"; + after: "option.screensize.change"; + } + + program { + name: "option.screensize.change"; + script: { change_screensize(); } + } + + program { + name: "send.screensize.normal"; + action: SIGNAL_EMIT "signal.option.screensize.normal" "option.screensize"; + } + + program { + name: "send.screensize.expand"; + action: SIGNAL_EMIT "signal.option.screensize.expand" "option.screensize"; + } + + program { + signal: "signal.option.detail.down"; + source: "*"; + action: STATE_SET "pressed" 0.0; + target: "option.detail.button.bg"; + } + + program { + signal: "signal.option.detail.up"; + source: "*"; + action: STATE_SET "hide" 0.0; + target: "option.detail.button.bg"; + } + + program { + signal: "signal.option.mode.streaming"; + source: "*"; + action: STATE_SET "hide" 0.0; + target: "option.detail"; + target: "option.detail.button.bg"; + } + } //programs + } //parts + } //group +} //collections diff --git a/res/edc/panel.edc b/res/edc/panel.edc new file mode 100755 index 0000000..a1a05ee --- /dev/null +++ b/res/edc/panel.edc @@ -0,0 +1,87 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "image_res.edc" +#include "vp_font.edc" + +#define LINE_RECT_COLOR 73 73 73 255 + +collections { + group { + name: "panel"; + + parts { + part { + name: "panel.rect"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + color: 0 0 0 0; + } + } + + part { + name: "panel.progress"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + min: 0 129; + fixed: 0 1; + align: 0.5 0.0; + color: 255 0 0 255; + rel1 { relative: 0.05 0.0;} + rel2 { relative: 0.95 0.0;} + } + } + part { + name: "panel.line"; + type: RECT; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 0 3; + fixed: 0 1; + align: 0.5 1.0; + rel1 { relative: 0.05 0.0; to_y: "panel.control";} + rel2 { relative: 0.95 0.0; to_y: "panel.control";} + color: LINE_RECT_COLOR; + } + } + part { + name: "panel.control"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + min: 0 136; + fixed: 0 1; + align: 0.5 1.0; + rel1 { relative: 0.03 1.0;} + rel2 { relative: 0.97 1.0;} + } + } + } /* parts */ + } /* group */ +} /* collections */ diff --git a/res/edc/progress.edc b/res/edc/progress.edc new file mode 100755 index 0000000..d201c70 --- /dev/null +++ b/res/edc/progress.edc @@ -0,0 +1,198 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "image_res.edc" +#include "vp_font.edc" + +collections { + group { + name: "progress"; + parts { + part { + name: "progress.rect"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + color: 0 0 0 0; + } + } + + part { + name: "progress.bg"; + type: IMAGE; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + min: 0 16; + fixed: 0 1; + align: 0.0 0.0; + rel1 { relative: 0.0 0.4174;} + rel2 { relative: 1.0 0.4174;} + color: 255 255 255 255; + image { normal: "T01_player_progress_bg.png"; } + } + } + part { + name: "progress.buffer.bar"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 0 16; + fixed: 0 1; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0; to_x: progress.playing ; to_y: progress.bg; } + rel2 { relative: 1.0 1.0; to_x: progress.buffering; to_y: progress.bg; } + color: 128 128 128 255; + } + } + + part { + name: "progress.middle"; + type: IMAGE; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + min: 0 16; + fixed: 0 1; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0; to: progress.bg; } + rel2 { relative: 0.5 1.0; to_x: progress.circle; to_y: progress.bg; } + color: 255 255 255 255; + image { normal: "T01_player_progress_bar.png";} + } + } + part { name: "progress.buffering"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + min: 18 16; + fixed: 1 1; + align: 0.0 0.5; + rel1 { relative: 0.0 0.5; to: progress.bg; } + rel2 { relative: 1.0 1.0; to: progress.bg; } + color: 255 255 255 0; + } + dragable { + confine: "progress.confine.rect"; + x: 1 1 1; + } + } + + part { name: "progress.confine.rect"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; to: progress.bg; } + rel2 { relative: 1.0 1.0; to: progress.bg; } + color: 255 255 255 0; + } + } + + part { + name: "progress.circle"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 18 16; + fixed: 1 1; + align: 0.5 0.0; + rel1 { relative: 0.5 0.0; to_x: progress.playing; to_y: progress.bg; } + rel2 { relative: 0.5 1.0; to_x: progress.playing; to_y: progress.bg; } + color: 255 255 255 255; + image { normal: "T01_player_progress_point.png";} + } + } + + part { name: "progress.playing"; + type: RECT; + mouse_events: 1; + scale: 1; + description { + visible: 1; + state: "default" 0.0; + color: 255 255 255 0; + min: 18 16; + fixed: 1 1; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0; to_y: progress.rect; } + rel2 { relative: 0.0 0.0; to_y: progress.rect; } + } + dragable { + confine: "progress.confine.rect"; + x: 1 1 1; + } + } + + part { name: "progress.txt.played"; + type: TEXT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + min: 180 65; + fixed: 1 1; + align: 0.0 1.0; + rel1 { relative: 0.0 0.7985; } + rel2 { relative: 1.0 0.7985; } + color: FONT_START_COLOR; + text { font: FONT_NANE; + size: 25; + text: "00:00:00"; + align: 0.0 1.0; + } + } + } + + part { name: "progress.txt.total"; + type: TEXT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + min: 180 65; + fixed: 1 1; + align: 1.0 1.0; + rel1 { relative: 0.0 0.7985; } + rel2 { relative: 1.0 0.7985; } + color: FONT_END_COLOR; + text { font: FONT_NANE; + size: 25; + text: "--:--:--"; + align: 1.0 1.0; + } + } + } + } /* parts */ + } /* group */ +} /* collections */ + diff --git a/res/edc/subtitle.edc b/res/edc/subtitle.edc new file mode 100755 index 0000000..5b19912 --- /dev/null +++ b/res/edc/subtitle.edc @@ -0,0 +1,55 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "vp_font.edc" +#define SUBTITLE_W 400 +#define SUBTITLE_H 100 + + + +collections { + group { + name: "subtitle"; + + parts { + part { + name: "subtitle.txt"; + type: TEXT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 1; + min: SUBTITLE_W SUBTITLE_H; + color: FONT_COLOR; + color3: 0 0 0 255; + fixed: 0 1; + align: 0.0 0.0; + rel1 { relative: 0.0 0.5; offset: 0 0; } + rel2 { relative: 1.0 0.7; offset: 0 0; } + text { + text_class: "list_line1"; + font: FONT_NANE; + size: TITLE_FONT_SIZE; + text: ""; + align: 0.5 0.5; + } + } + } + } /* parts */ + } /* group */ +} /* collections */ diff --git a/res/edc/vp-button.edc b/res/edc/vp-button.edc new file mode 100755 index 0000000..4eabcfb --- /dev/null +++ b/res/edc/vp-button.edc @@ -0,0 +1,1086 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#define BUTTON_STATE_ENABLED 0 +#define BUTTON_STATE_DISABLED 1 + +#define BUTTON_NAVIBAR_FUNCTION_BUTTON_TEXT_NORMAL_COLOR_INC 146 124 98 255 +#define BUTTON_NAVIBAR_FUNCTION_BUTTON_TEXT_PRESSED_COLOR_INC 217 147 26 255 +#define BUTTON_NAVIBAR_FUNCTION_BUTTON_TEXT_FOCUSED_COLOR_INC 217 147 26 255 +#define BUTTON_NAVIBAR_FUNCTION_BUTTON_TEXT_DISABLED_COLOR_INC 160 151 145 255 + +#define BUTTON_NAVIBAR_CENTER_BG_NORMAL_MIN_W_INC 36 +#define BUTTON_NAVIBAR_CENTER_BG_NORMAL_MIN_H_INC 74 +#define BUTTON_NAVIBAR_CENTER_BG_NORMAL_BORDER_INC 4 4 4 4 +#define BUTTON_NAVIBAR_CENTER_PADDING_MIN_MAX_INC 16 2 +#define BUTTON_NAVIBAR_CENTER_ICON_RECT_VISIBLE_MIN_SIZE 36 36 +#define BUTTON_NAVIBAR_CENTER_PADDING_AFTER_ICON_VISIBLE_MIN_INC 6 0 +#define BUTTON_NAVIBAR_CENTER_PADDING_BEFORE_TEXT_DEFAULT_MIN_INC 6 0 +#define BUTTON_NAVIBAR_CENTER_SWALLOW_VISIBLE_MIN_MAX_INC 36 36 +#define BUTTON_NAVIBAR_CENTER_SWALLOW_ICONONLY_MIN_MAX_INC 38 38 +#define BUTTON_NAVIBAR_CENTER_TEXT_FONT_SIZE_INC 32 +#define BUTTON_NAVIBAR_MULTILINE_TEXT_FONT_SIZE_INC 24 + +#define BUTTON_NAVIBAR_BACK_BUTTON_BUTTON_IMAGE_MIN_INC 106 40 +#define BUTTON_NAVIBAR_BACK_BUTTON_BG_MIN_MAX_INC 36 32 + +#define NAVIBAR_TITLE_LEFT_SEPARATOR_COLOR_INC 3 3 3 255 +#define NAVIBAR_TITLE_RIGHT_SEPARATOR_COLOR_INC 52 52 52 255 + +#define BUTTON_TEXT_STYLE1_BG_MIN_INC 100 74 +#define BUTTON_TEXT_STYLE1_VISIBLE_BG_MIN_INC 148 74 +#define BUTTON_TEXT_STYLE1_ICONONLY_BG_MIN_INC 74 74 +#define BUTTON_TEXT_STYLE1_BG_BORDER_INC 5 5 5 5 +#define BUTTON_TEXT_STYLE1_PADDING_MIN_INC 5 5 +#define BUTTON_TEXT_STYLE1_VISIBLE_ICON_RECT_MIN_MAX_INC 38 38 +#define BUTTON_TEXT_STYLE1_VISIBLE_PADDING_ICON_TEXT_MIN_INC 10 0 +#define BUTTON_TEXT_STYLE1_VISIBLE_ICON_MIN_MAX_INC 38 38 +#define BUTTON_TEXT_STYLE1_ICONONLY_ICON_MIN_MAX_INC 38 38 +#define BUTTON_TEXT_STYLE1_FONT_SIZE_INC 32 + +#define BUTTON_TEXT_STYLE1_NORMAL_COLOR_INC 108 108 108 255 +#define BUTTON_TEXT_STYLE1_PRESSED_COLOR_INC 249 249 249 255 +#define BUTTON_TEXT_STYLE1_FOCUSED_COLOR_INC 108 108 108 255 +#define BUTTON_TEXT_STYLE1_DISABLED_COLOR_INC 108 115 118 255 + +/////////////////////////////////////////////////////////////////////////////////////// + group { name: "elm/button/base/video/style1"; + alias: "elm/button/base/video/text_only/style1"; + alias: "elm/button/base/video/center"; + alias: "elm/button/base/video/icon_and_text/center"; + alias: "elm/button/base/video/nocontents/search_button"; + alias: "elm/button/base/video/naviframe/title/default"; + images { + image: "T01_title_btn.png" COMP; + image: "T01_title_btn_press.png" COMP; + } + script { + public button_state = BUTTON_STATE_ENABLED; + } + parts { + part { name: "button_image"; + scale: 1; + description { state: "default" 0.0; + image { + normal: "T01_title_btn.png"; + border: BUTTON_TEXT_STYLE1_BG_BORDER_INC; + border_scale: 1; + } + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image { + normal: "T01_title_btn_press.png"; + } + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + image { + normal: "T01_title_btn.png"; + } + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + image { + normal: "T01_title_btn_press.png"; + } + } + } + part { name: "padding_left_top"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel2 { + relative: 0.0 0.0; + } + min: BUTTON_TEXT_STYLE1_PADDING_MIN_INC; + fixed: 1 1; + visible: 0; + } + } + part { name: "bg"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + min: BUTTON_TEXT_STYLE1_BG_MIN_INC; + visible: 0; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + min: BUTTON_TEXT_STYLE1_VISIBLE_BG_MIN_INC; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + min: BUTTON_TEXT_STYLE1_ICONONLY_BG_MIN_INC; + } + } + part { name: "padding_right_bottom"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 1.0; + rel1 { + relative: 1.0 1.0; + } + min: BUTTON_TEXT_STYLE1_PADDING_MIN_INC; + fixed: 1 1; + visible: 0; + } + } + part { name: "icon_rect"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + min: 0 0; + fixed: 1 0; + rel1 { + relative: 1.0 1.0; + to: "padding_left_top"; + } + rel2 { + relative: 1.0 0.0; + to_x: "padding_left_top"; + to_y: "padding_right_bottom"; + } + align: 0.0 0.5; + } + description { state: "visible" 0.0; + visible: 0; + min: BUTTON_TEXT_STYLE1_VISIBLE_ICON_RECT_MIN_MAX_INC; + max: BUTTON_TEXT_STYLE1_VISIBLE_ICON_RECT_MIN_MAX_INC; + fixed: 1 0; + rel1 { + relative: 1.0 1.0; + to: "padding_left_top"; + } + rel2 { + relative: 1.0 0.0; + to_x: "padding_left_top"; + to_y: "padding_right_bottom"; + } + align: 0.0 0.5; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { name: "padding_after_icon"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; //when only icon or no icon is there + align: 0.0 0.0; + rel1 { + relative: 1.0 0.0; + to: "icon_rect"; + } + rel2 { + to: "icon_rect"; + } + fixed: 1 0; + min: 0 0; + visible: 0; + } + description { state: "visible" 0.0; + visible: 0; + align: 0.0 0.0; + rel1 { + relative: 1.0 0.0; + to: "icon_rect"; + } + rel2 { + to: "icon_rect"; + } + fixed: 1 0; + min: BUTTON_TEXT_STYLE1_VISIBLE_PADDING_ICON_TEXT_MIN_INC; + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; //when only icon or no icon is there + align: 1.0 0.5; + rel1 { + relative: 0.0 1.0; + to_x: "elm.text"; + to_y: "padding_left_top"; + } + rel2 { + relative: 0.0 0.0; + to_x: "elm.text"; + to_y: "padding_right_bottom"; + } + fixed: 1 0; + min: BUTTON_TEXT_STYLE1_VISIBLE_PADDING_ICON_TEXT_MIN_INC; + visible: 0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + clip_to: "clipper"; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1 { + relative: 1.0 1.0; + to: "padding_left_top"; + } + rel2 { + relative: 1.0 0.0; + to_x: "padding_left_top"; + to_y: "padding_right_bottom"; + } + fixed: 1 0; + } + description { state: "visible" 0.0; + fixed: 1 0; + min: BUTTON_TEXT_STYLE1_VISIBLE_ICON_MIN_MAX_INC; + max: BUTTON_TEXT_STYLE1_VISIBLE_ICON_MIN_MAX_INC; + align: 1.0 0.5; + rel1 { + relative: 0.0 1.0; + to_x: "padding_before_text"; + to_y: "padding_left_top"; + } + rel2 { + relative: 0.0 0.0; + to_x: "padding_before_text"; + to_y: "padding_right_bottom"; + } + } + description { state: "icononly" 0.0; + min: BUTTON_TEXT_STYLE1_ICONONLY_ICON_MIN_MAX_INC; + max: BUTTON_TEXT_STYLE1_ICONONLY_ICON_MIN_MAX_INC; + align: 0.5 0.5; + } + } + part { name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + clip_to: "clipper"; + description { state: "default" 0.0; + visible: 0; + rel1 { + relative: 1.0 1.0; + to_x: "padding_after_icon"; + to_y: "padding_left_top"; + } + rel2 { + relative: 0.0 0.0; + to: "padding_right_bottom"; + } + color: BUTTON_TEXT_STYLE1_NORMAL_COLOR_INC; + text { + font: "SLP:style=Medium"; + size: BUTTON_TEXT_STYLE1_FONT_SIZE_INC; + min: 0 0; + max: 1 0; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + color: BUTTON_TEXT_STYLE1_PRESSED_COLOR_INC; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 0 0 0 128; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + color: BUTTON_TEXT_STYLE1_DISABLED_COLOR_INC; + visible: 1; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + color: BUTTON_TEXT_STYLE1_FOCUSED_COLOR_INC; + } + } + part { name: "over2"; + type: RECT; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over3"; + type: RECT; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "clipper"; + type: RECT; + description { state: "default" 0.0; + color: 255 255 255 255; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + after: "text_clicked"; + } + program { name: "text_clicked"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "clicked", 0.0); + } + } + program { name: "button_unpress"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over3"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (strcmp(st, "icononly")) + { + emit("elm,action,default,text,set", ""); + set_state(PART:"elm.text", "visible", 0.0); + } + if (get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"button_image", "default", 0.0); + } + after: button_unpress; + } + program { name: "button_unclick3"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + set_state(PART:"bg", "visible", 0.0); + } + if (get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "disabled_visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + set_state(PART:"bg", "icononly", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"icon_rect", "visible", 0.0); + set_state(PART:"padding_after_icon", "visible", 0.0); + set_state(PART:"bg", "visible", 0.0); + } + else + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"icon_rect", "icononly", 0.0); + set_state(PART:"padding_after_icon", "icononly", 0.0); + set_state(PART:"bg", "icononly", 0.0); + } + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + target: "padding_after_icon"; + target: "icon_rect"; + target: "bg"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "disabled_visible", 0.0); + else + set_state(PART:"elm.text", "disabled", 0.0); + set_int(button_state, BUTTON_STATE_DISABLED); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "disabled_visible")) + set_state(PART:"elm.text", "visible", 0.0); + else + set_state(PART:"elm.text", "default", 0.0); + set_int(button_state, BUTTON_STATE_ENABLED); + } + } + program { name: "focused"; + //signal: "elm,action,focus"; + //source: "elm"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + //signal: "elm,action,unfocus"; + //source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + after: "unfocus_text"; + } + program { name: "unfocus_text"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } + +/////////////////////////////////////////////////////////////////////////////////////// + group { name: "elm/button/base/video/naviframe/back_btn/default"; + alias: "elm/button/base/video/naviframe/prev_btn/default"; + alias: "elm/button/base/video/naviframe/end_btn/default"; + //TODO: Remove this alias later + alias: "elm/button/base/video/navigationbar_prev_btn/default"; + alias: "elm/button/base/video/navigationbar_backbutton/default"; + alias: "elm/button/base/video/navigationbar_end_btn/default"; + images { + image: "T01_btn_prev.png" COMP; + + } + parts { + part { name: "button_image"; + type: RECT; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: BUTTON_NAVIBAR_BACK_BUTTON_BUTTON_IMAGE_MIN_INC; + color: 0 0 0 0; + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part {name: "padding_right"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + align: 1 0; + min: 1 0; + rel1 { relative: 1 0.2; } + rel2 { relative: 1 0.8; } + fixed: 1 0; + color: NAVIBAR_TITLE_RIGHT_SEPARATOR_COLOR_INC; + } + } + part {name: "padding_before_right"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + align: 1 0; + min: 1 0; + rel1 { relative: 0 0; to: "padding_right"; } + rel2 { relative: 0 1; to: "padding_right"; } + fixed: 1 0; + color: NAVIBAR_TITLE_LEFT_SEPARATOR_COLOR_INC; + } + } + part { name: "button_center_part"; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: BUTTON_NAVIBAR_BACK_BUTTON_BG_MIN_MAX_INC; + max: BUTTON_NAVIBAR_BACK_BUTTON_BG_MIN_MAX_INC; + align: 0.5 0.5; + rel2 { relative: 0 1; to_x: "padding_before_right"; } + image { + normal: "T01_btn_prev.png"; + } + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "T01_btn_prev.png"; + } + } + part { name: "over1"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over1"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + target: "button_center_part"; + } + program { name: "button_unclick"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "button_center_part"; + } + program { name: "button_unclick2"; + signal: "mouse,clicked,1"; + source: "over1"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "disabler"; + target: "button_image"; + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "disabler"; + target: "button_image"; + } + } + } + +/////////////////////////////////////////////////////////////////////////////////////// + group { name: "elm/button/base/naviframe_control/multiline"; + alias: "elm/button/base/video/navigationbar_control/multiline"; + script { + public button_state = BUTTON_STATE_ENABLED; + } + images.image: "T01_title_btn.png" COMP; + images.image: "T01_title_btn_press.png" COMP; + styles{ + style { name: "btn_multiline_navigationbar_controlbar_style"; + base: "font=SLP:style=Medium font_size="BUTTON_NAVIBAR_MULTILINE_TEXT_FONT_SIZE_INC" align=center color=#ffffff wrap=mixed"; + tag: "br" "\n"; + tag: "ps" "ps"; + tag: "tab" "\t"; + } + } + parts { + part { name: "button_image"; + type: IMAGE; + mouse_events: 1; + scale: 1; + description { state: "default" 0.0; + min: BUTTON_NAVIBAR_CENTER_BG_NORMAL_MIN_W_INC BUTTON_NAVIBAR_CENTER_BG_NORMAL_MIN_H_INC; + rel1.offset: 0 0; + rel2.offset: -1 -1; + image.normal: "T01_title_btn.png"; + image.border: BUTTON_NAVIBAR_CENTER_BG_NORMAL_BORDER_INC; + color: 255 255 255 255; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + image.normal: "T01_title_btn.png"; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + image.normal: "T01_title_btn_press.png"; + } + } + part { + name: "padding_left_top"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 0.0 0.0; + } + min: BUTTON_NAVIBAR_CENTER_PADDING_MIN_MAX_INC; + fixed: 1 1; + visible: 0; + } + } + part { + name: "padding_right_bottom"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 1.0; + rel1.relative: 1.0 1.0; + rel2.relative: 1.0 1.0; + min: BUTTON_NAVIBAR_CENTER_PADDING_MIN_MAX_INC; + fixed: 1 1; + visible: 0; + } + } + part { + name: "icon_rect"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + min: 0 0; + fixed: 1 0; + rel1 { + relative: 0.0 1.0; + to_x: "elm.swallow.content"; + to_y: "padding_left_top"; + } + rel2 { + relative: 1.0 0.0; + to_x: "elm.swallow.content"; + to_y: "padding_right_bottom"; + } + align: 0.0 0.5; + } + } + part { + name: "padding_icon_text"; + type: RECT; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; //when only icon or no icon is there + visible: 0; + align: 0.0 0.0; + rel1 { + relative: 1.0 0.0; + to: "icon_rect"; + } + rel2 { + relative: 1.0 1.0; + to: "icon_rect"; + } + fixed: 1 0; + min: 0 0; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + min: BUTTON_NAVIBAR_CENTER_PADDING_AFTER_ICON_VISIBLE_MIN_INC; + rel1 { + relative: 1.0 0.0; + to: "icon_rect"; + } + rel2 { + relative: 1.0 1.0; + to: "icon_rect"; + } + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + clip_to: "clipper"; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1 { + relative: 1.0 1.0; + to: "padding_left_top"; + } + rel2 { + relative: 1.0 0.0; + to_x: "padding_left_top"; + to_y: "padding_right_bottom"; + } + fixed: 1 0; + } + description { state: "visible" 0.0; + fixed: 1 0; + visible: 1; + min: BUTTON_NAVIBAR_CENTER_SWALLOW_VISIBLE_MIN_MAX_INC; + max: BUTTON_NAVIBAR_CENTER_SWALLOW_VISIBLE_MIN_MAX_INC; + align: 0.0 0.5; + rel1 { + relative: 1.0 1.0; + to: "padding_left_top"; + } + rel2 { + relative: 0.0 0.0; + to_x: "padding_left_top"; + to_y: "padding_right_bottom"; + } + } + description { state: "icononly" 0.0; + visible: 1; + min: BUTTON_NAVIBAR_CENTER_SWALLOW_ICONONLY_MIN_MAX_INC; + max: BUTTON_NAVIBAR_CENTER_SWALLOW_ICONONLY_MIN_MAX_INC; + rel1 { + relative: 1.0 1.0; + to: "padding_left_top"; + } + rel2 { + relative: 0.0 0.0; + to: "padding_right_bottom"; + } + align: 0.5 0.5; + } + } + part { name: "elm.text"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + clip_to: "clipper"; + description { state: "default" 0.0; + visible: 0; + rel1 { + relative: 1.0 1.0; + to_x: "padding_icon_text"; + to_y: "padding_left_top"; + } + rel2 { + relative: 0.0 0.0; + to: "padding_right_bottom"; + } + align: 0.5 0.5; + color: 255 255 255 255; + text { + style: "btn_multiline_navigationbar_controlbar_style"; + min: 0 0; + max: 0 1; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 80 0; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + min: 0 0; + color: 255 255 255 255; + } + } + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "clipper"; + type: RECT; + description { state: "default" 0.0; + color: 255 255 255 255; + } + description { state: "disabled" 0.0; + color: 255 255 255 127; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { name: "button_click_anim"; + action: STATE_SET "clicked" 0.0; + target: "button_image"; + after: "text_clicked"; + } + program { name: "text_clicked"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + set_state(PART:"elm.text", "clicked", 0.0); + } + } + program { name: "button_unpress"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over3"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (strcmp(st, "icononly")) + { + emit("elm,action,default,text,set", ""); + set_state(PART:"elm.text", "visible", 0.0); + } + if(get_int(button_state) != BUTTON_STATE_DISABLED) + set_state(PART:"button_image", "default", 0.0); + } + after: button_unpress; + } + program { name: "button_unclick3"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "text_show"; + signal: "elm,state,text,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "icononly")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"padding_icon_text", "visible", 0.0); + } + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "text_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.swallow.content", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"padding_icon_text", "icononly", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + } + } + program { name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "visible")) + { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"padding_icon_text", "visible", 0.0); + } + else + { + set_state(PART:"elm.swallow.content", "icononly", 0.0); + set_state(PART:"padding_icon_text", "icononly", 0.0); + } + } + } + program { name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + target: "padding_icon_text"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "button_image"; + target: "clipper"; + target: "disabler"; + after: "disable_text"; + } + program { name: "disable_text"; + script { + set_int(button_state, BUTTON_STATE_DISABLED); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "clipper"; + target: "disabler"; + after: "enable_text"; + } + program { name: "enable_text"; + script { + set_int(button_state, BUTTON_STATE_ENABLED); + set_state(PART:"elm.text", "visible", 0.0); + } + } + program { name: "focused"; + action: STATE_SET "focused" 0.0; + target: "button_image"; + target: "elm.text"; + } + program { name: "unfocused"; + action: STATE_SET "default" 0.0; + target: "button_image"; + after: "unfocus_text"; + } + program { name: "unfocus_text"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + } + } diff --git a/res/edc/vp-controlbar.edc b/res/edc/vp-controlbar.edc new file mode 100755 index 0000000..6b5c8e1 --- /dev/null +++ b/res/edc/vp-controlbar.edc @@ -0,0 +1,772 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define CONTROLBAR_LARGE_H 78 +#define CONTROLBAR_LARGE_LANDSCAPE_H 62 +#define CONTROLBAR_SMALL_H 65 +#define CONTROLBAR_SMALL_LANDSCAPE_H 50 +#define CONTROLBAR_W 78 + +#define CONTROLBAR_SEPARATEBAR_BRIGHT_COLOR_INC 22 22 22 255 +#define CONTROLBAR_SEPARATEBAR_DARK_COLOR_INC 63 63 63 255 + + + group{ + name: "elm/controlbar/base/video/default"; + parts{ + part{ + name: "bg_rect"; + type: RECT; + scale: 1; + mouse_events:0; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + color: 0 0 0 0; + } + } + part{ + name: "bg_image"; + type: SWALLOW; + scale: 1; + mouse_events:0; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + } + description{ + state: "large" 0.0; + min: 0 CONTROLBAR_LARGE_H; + fixed: 0 1; + align: 0.5 1.0; + rel1 {relative: 0.0 1.0; offset: 0 -1;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + } + description{ + state: "small" 0.0; + min: 0 CONTROLBAR_SMALL_H; + fixed: 0 1; + align: 0.5 1.0; + rel1 {relative: 0.0 1.0; offset: 0 -1;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + } + description{ + state: "left" 0.0; + min: CONTROLBAR_W 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 0.0 1.0; offset: 0 -1;} + } + description{ + state: "right" 0.0; + min: CONTROLBAR_W 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 {relative: 1.0 0.0; offset: -1 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + } + } + part{ + name: "elm.swallow.items"; + type: SWALLOW; + scale: 1; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; to: "bg_image";} + rel2 {relative: 1.0 1.0; to: "bg_image";} + } + } + } + programs{ + program{ + name: "default"; + signal: "elm,state,default"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg_image"; + } + program{ + name: "large"; + signal: "elm,state,large"; + source: "elm"; + action: STATE_SET "large" 0.0; + target: "bg_image"; + } + program{ + name: "small"; + signal: "elm,state,small"; + source: "elm"; + action: STATE_SET "small" 0.0; + target: "bg_image"; + } + program{ + name: "left"; + signal: "elm,state,left"; + source: "elm"; + action: STATE_SET "left" 0.0; + target: "bg_image"; + } + program{ + name: "right"; + signal: "elm,state,right"; + source: "elm"; + action: STATE_SET "right" 0.0; + target: "bg_image"; + } + } + } + + group{ + name: "elm/controlbar/background/video/default"; + images{ + image: "T01_toolbar_bg.png" COMP; + } + parts{ + part{ + name: "bg_image"; + type: IMAGE; + scale: 1; + mouse_events:0; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + image.normal: "T01_toolbar_bg.png"; + color: 255 255 255 255; + } + } + programs { + program { + name: "tabbar_bg"; + signal: "elm,state,tabbar"; + source: "elm"; + action: STATE_SET "tabbar" 0.0; + target: "bg_image"; + } + } + } + } + + group{ + name: "elm/controlbar/view/video/default"; + parts{ + part{ + name: "bg_rect"; + type: RECT; + mouse_events:1; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + color: 0 0 0 0; + } + } + part{ + name: "elm.swallow.view"; + type: SWALLOW; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; to: "bg_rect";} + rel2 {relative: 1.0 1.0; to: "bg_rect";} + } + } + } + } + + group{ + name: "elm/controlbar/item_bg/video/default"; + images{ + image: "T01_toolbar_press.png" COMP; + } + parts{ + part{ + name: "bg_rect"; + type: RECT; + scale: 1; + mouse_events: 1; + description{ + state: "default" 0.0; + min: 0 CONTROLBAR_SMALL_H; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + color: 0 0 0 0; + } + } + part{ + name: "bg_img"; + type: IMAGE; + scale: 1; + mouse_events: 0; + description{ + state: "default" 0.0; + visible: 0; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + } + description{ + state: "toolbar_pressed" 0.0; + inherit: "default" 0.0; + rel1 {relative: 0.0 0.07; offset: 3 0;} + rel2 {relative: 1.0 0.93; offset: -3 0;} + image.normal: "T01_toolbar_press.png"; + image.border: 2 2 2 2; + visible: 1; + } + } + part{ + name: "left_line"; + type: RECT; + scale: 1; + mouse_events: 0; + description{ + state: "default" 0.0; + visible: 0; + rel1 {relative: 0.0 0.0; offset: 0 5;} + rel2 {relative: 0.0 1.0; offset: 1 -3;} + color: CONTROLBAR_SEPARATEBAR_BRIGHT_COLOR_INC; + } + description{ + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part{ + name: "right_line"; + type: RECT; + scale: 1; + mouse_events: 0; + description{ + state: "default" 0.0; + visible: 0; + rel1 {relative: 1.0 0.0; offset: -1 5;} + rel2 {relative: 1.0 1.0; offset: 0 -3;} + color: CONTROLBAR_SEPARATEBAR_DARK_COLOR_INC; + } + description{ + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part{ + name: "top_line"; + type: RECT; + scale: 1; + mouse_events: 0; + description{ + state: "default" 0.0; + visible: 0; + rel1 {relative: 0.0 0.0; offset: 5 0;} + rel2 {relative: 1.0 0.0; offset: -5 1;} + color: CONTROLBAR_SEPARATEBAR_BRIGHT_COLOR_INC; + } + description{ + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part{ + name: "bottom_line"; + type: RECT; + scale: 1; + mouse_events: 0; + description{ + state: "default" 0.0; + visible: 0; + rel1 {relative: 0.0 1.0; offset: 5 -1;} + rel2 {relative: 1.0 1.0; offset: -5 0;} + color: CONTROLBAR_SEPARATEBAR_DARK_COLOR_INC; + } + description{ + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part{ + name: "item"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description{ + state: "default" 0.0; + rel1 {to: "bg_rect";} + rel2 {to: "bg_rect";} + } + } + } + programs { + program { + name: "toolbar_pressed"; + signal: "elm,state,toolbar_pressed"; + source: "elm"; + action: STATE_SET "toolbar_pressed" 0.0; + target: "bg_img"; + } + program { + name: "unselected"; + signal: "elm,state,unselected"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg_img"; + } + program { + name: "unpressed"; + signal: "elm,state,unpressed"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg_img"; + } + program { + name: "left_line_show"; + signal: "elm,state,left_line_show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "left_line"; + } + program { + name: "left_line_hide"; + signal: "elm,state,left_line_hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "left_line"; + } + program { + name: "right_line_show"; + signal: "elm,state,right_line_show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "right_line"; + } + program { + name: "right_line_hide"; + signal: "elm,state,right_line_hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "right_line"; + } + program { + name: "top_line_show"; + signal: "elm,state,top_line_show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "top_line"; + } + program { + name: "top_line_hide"; + signal: "elm,state,top_line_hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "top_line"; + } + program { + name: "bottom_line_show"; + signal: "elm,state,bottom_line_show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "bottom_line"; + } + program { + name: "bottom_line_hide"; + signal: "elm,state,bottom_line_hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bottom_line"; + } + } + } + + + group{ + name: "elm/controlbar/base/video/landscape/default"; + + parts{ + part{ + name: "bg_rect"; + type: RECT; + scale: 1; + mouse_events:0; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + color: 0 0 0 0; + } + } + part{ + name: "bg_image"; + type: SWALLOW; + scale: 1; + mouse_events:0; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + } + description{ + state: "large" 0.0; + min: 0 CONTROLBAR_LARGE_LANDSCAPE_H; + fixed: 0 1; + align: 0.5 1.0; + rel1 {relative: 0.0 1.0; offset: 0 -1;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + } + description{ + state: "small" 0.0; + min: 0 CONTROLBAR_SMALL_LANDSCAPE_H; + fixed: 0 1; + align: 0.5 1.0; + rel1 {relative: 0.0 1.0; offset: 0 -1;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + } + description{ + state: "left" 0.0; + min: CONTROLBAR_W 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 0.0 1.0; offset: 0 -1;} + } + description{ + state: "right" 0.0; + min: CONTROLBAR_W 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 {relative: 1.0 0.0; offset: -1 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + } + } + part{ + name: "elm.swallow.items"; + type: SWALLOW; + scale: 1; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; to: "bg_image";} + rel2 {relative: 1.0 1.0; to: "bg_image";} + } + } + } + programs{ + program{ + name: "default"; + signal: "elm,state,default"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg_image"; + } + program{ + name: "large"; + signal: "elm,state,large"; + source: "elm"; + action: STATE_SET "large" 0.0; + target: "bg_image"; + } + program{ + name: "small"; + signal: "elm,state,small"; + source: "elm"; + action: STATE_SET "small" 0.0; + target: "bg_image"; + } + program{ + name: "left"; + signal: "elm,state,left"; + source: "elm"; + action: STATE_SET "left" 0.0; + target: "bg_image"; + } + program{ + name: "right"; + signal: "elm,state,right"; + source: "elm"; + action: STATE_SET "right" 0.0; + target: "bg_image"; + } + } + } + + group{ + name: "elm/controlbar/background/video/landscape/default"; + + images{ + image: "T01_toolbar_bg.png" COMP; + } + + parts{ + part{ + name: "bg_image"; + type: IMAGE; + scale: 1; + mouse_events:0; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + image.normal: "T01_toolbar_bg.png"; + color: 255 255 255 255; + } + } + programs { + program { + name: "tabbar_bg"; + signal: "elm,state,tabbar"; + source: "elm"; + action: STATE_SET "tabbar" 0.0; + target: "bg_image"; + } + } + } + } + + group{ + name: "elm/controlbar/view/video/landscape/default"; + + parts{ + part{ + name: "bg_rect"; + type: RECT; + mouse_events:1; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + color: 0 0 0 0; + } + } + part{ + name: "elm.swallow.view"; + type: SWALLOW; + description{ + state: "default" 0.0; + rel1 {relative: 0.0 0.0; to: "bg_rect";} + rel2 {relative: 1.0 1.0; to: "bg_rect";} + } + } + } + } + + group{ + name: "elm/controlbar/item_bg/video/landscape/default"; + images{ + image: "T01_toolbar_press.png" COMP; + } + + parts{ + part{ + name: "bg_rect"; + type: RECT; + scale: 1; + mouse_events: 1; + description{ + state: "default" 0.0; + min: 0 CONTROLBAR_SMALL_LANDSCAPE_H; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + color: 0 0 0 0; + } + } + part{ + name: "bg_img"; + type: IMAGE; + scale: 1; + mouse_events: 0; + description{ + state: "default" 0.0; + visible: 0; + rel1 {relative: 0.0 0.0; offset: 0 0;} + rel2 {relative: 1.0 1.0; offset: -1 -1;} + } + description{ + state: "toolbar_pressed" 0.0; + inherit: "default" 0.0; + rel1 {relative: 0.0 0.07; offset: 3 0;} + rel2 {relative: 1.0 0.93; offset: -3 0;} + image.normal: "T01_toolbar_press.png"; + image.border: 2 2 2 2; + visible: 1; + } + } + part{ + name: "left_line"; + type: RECT; + scale: 1; + mouse_events: 0; + description{ + state: "default" 0.0; + visible: 0; + rel1 {relative: 0.0 0.0; offset: 0 5;} + rel2 {relative: 0.0 1.0; offset: 1 -3;} + color: CONTROLBAR_SEPARATEBAR_BRIGHT_COLOR_INC; + } + description{ + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part{ + name: "right_line"; + type: RECT; + scale: 1; + mouse_events: 0; + description{ + state: "default" 0.0; + visible: 0; + rel1 {relative: 1.0 0.0; offset: -1 5;} + rel2 {relative: 1.0 1.0; offset: 0 -3;} + color: CONTROLBAR_SEPARATEBAR_DARK_COLOR_INC; + } + description{ + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part{ + name: "top_line"; + type: RECT; + scale: 1; + mouse_events: 0; + description{ + state: "default" 0.0; + visible: 0; + rel1 {relative: 0.0 0.0; offset: 5 0;} + rel2 {relative: 1.0 0.0; offset: -5 1;} + color: CONTROLBAR_SEPARATEBAR_BRIGHT_COLOR_INC; + } + description{ + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part{ + name: "bottom_line"; + type: RECT; + scale: 1; + mouse_events: 0; + description{ + state: "default" 0.0; + visible: 0; + rel1 {relative: 0.0 1.0; offset: 5 -1;} + rel2 {relative: 1.0 1.0; offset: -5 0;} + color: CONTROLBAR_SEPARATEBAR_DARK_COLOR_INC; + } + description{ + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part{ + name: "item"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description{ + state: "default" 0.0; + rel1 {to: "bg_rect";} + rel2 {to: "bg_rect";} + } + } + } + programs { + program { + name: "toolbar_pressed"; + signal: "elm,state,toolbar_pressed"; + source: "elm"; + action: STATE_SET "toolbar_pressed" 0.0; + target: "bg_img"; + } + program { + name: "unselected"; + signal: "elm,state,unselected"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg_img"; + } + program { + name: "unpressed"; + signal: "elm,state,unpressed"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg_img"; + } + program { + name: "left_line_show"; + signal: "elm,state,left_line_show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "left_line"; + } + program { + name: "left_line_hide"; + signal: "elm,state,left_line_hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "left_line"; + } + program { + name: "right_line_show"; + signal: "elm,state,right_line_show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "right_line"; + } + program { + name: "right_line_hide"; + signal: "elm,state,right_line_hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "right_line"; + } + program { + name: "top_line_show"; + signal: "elm,state,top_line_show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "top_line"; + } + program { + name: "top_line_hide"; + signal: "elm,state,top_line_hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "top_line"; + } + program { + name: "bottom_line_show"; + signal: "elm,state,bottom_line_show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "bottom_line"; + } + program { + name: "bottom_line_hide"; + signal: "elm,state,bottom_line_hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bottom_line"; + } + } + } + diff --git a/res/edc/vp-custom-winset-style.edc b/res/edc/vp-custom-winset-style.edc new file mode 100755 index 0000000..b6d5a22 --- /dev/null +++ b/res/edc/vp-custom-winset-style.edc @@ -0,0 +1,24 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "image_res.edc" + +collections { + #include "vp-button.edc" + #include "vp-controlbar.edc" + #include "vp-naviframe.edc" +} diff --git a/res/edc/vp-naviframe.edc b/res/edc/vp-naviframe.edc new file mode 100755 index 0000000..626b1d9 --- /dev/null +++ b/res/edc/vp-naviframe.edc @@ -0,0 +1,4257 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#define NAVIFRAME_TITLE_H_INC 100 +#define NAVIFRAME_SEGMENT_TITLE_H_INC 136 +#define NAVIFRAME_OH_OPENED_H_INC 106 +#define NAVIFRAME_OH_CONTENT_H_INC 74 +#define NAVIFRAME_OH_PADDING_INC 16 +#define NAVIFRAME_OH_ARROW_SIZE_INC 19 12 +#define NAVIFRAME_OH_OPENED_DOUBLE_H_INC 196 +#define NAVIFRAME_PREV_BTN_W_INC 124 +#define NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 10 +#define NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC 124 80 +#define NAVIFRAME_TITLE_SEGMENT_H_INC 74 +#define NAVIFRAME_TITLE_SEGMENT_FONT_SIZE_INC 28 +#define NAVIFRAME_TITLE_SEGMENT_TEXT_H_INC 50 +#define NAVIFRAME_TITLE_FONT_SIZE_INC 36 +#define NAVIFRAME_ICON_SIZE_INC 32 32 +#define NAVIFRAME_ICON_PADDING_INC 16 0 +#define NAVIFRAME_CONTROLBAR_PADDING_INC 5 +#define NAVIFRAME_CONTROLBAR_BG_COLOR_INC 31 31 31 255 +#define NAVIFRAME_TITLE_TEXT_COLOR_INC 235 236 237 255 //#define NAVIFRAME_TITLE_TEXT_COLOR_INC 255 255 255 255 +#define NAVIFRAME_TITLE_BG_COLOR_INC 92 92 92 255 //#define NAVIFRAME_TITLE_BG_COLOR_INC 0 0 0 255 + +#define CONTROLBAR_LARGE_HEIGHT_INC 122 +#define CONTROLBAR_SMALL_HEIGHT_INC 102 +#define CONTROLBAR_WIDTH_INC 122 + +#define NAVIFRAME_TEXT_PADDING_INC 144 +#define NAVIFRAME_TEXT_PADDING_MORE_BUTTON_INC 278 +#define NAVIFRAME_TEXT_PADDING_ICON_VISIBLE_INC 186 + +#define NAVIFRAME_VIEW_TRANS_TIME 0.3 + +#define CONTROLBAR_SMALL_HEIGHT_INC 102 + + group { name:"elm/naviframe/base/video/default"; + parts { + part { name: "base"; + description { state: "default" 0.0; + } + } + } + } + group { name:"elm/naviframe/item/video/basic/default"; + alias:"elm/naviframe/item/video/1line/default"; + images { + image: "naviframe_optionheader.png" COMP; + image: "naviframe_optionheader_arrow.png" COMP; + } + script { + public oh_show = 0; //optionheader show/hide + public oh_close = 0; //optionheader close/open + public cbar_bg = 0; //Controlbar BG Show call count + } + parts { + part { name: "title_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 NAVIFRAME_TITLE_H_INC; + align: 0.0 0.0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "optionheader_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 0; + align: 0.5 0; + fixed: 0 1; + rel1.to_x: "elm.swallow.content"; + rel1.to_y: "title_clip"; + rel1.relative: 0 1; + rel2.to_x: "elm.swallow.content"; + rel2.to_y: "title_clip"; + visible: 0; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 1 NAVIFRAME_OH_OPENED_H_INC; + visible: 1; + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "optionheader_bg"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + rel1 { to: "optionheader_clip"; } + rel2 { to: "optionheader_clip"; } + image { normal: "naviframe_optionheader.png"; + border: 0 0 4 0; + } + } + } + part { name: "optionheader_top_padding"; + type: RECT; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 0.0; to: "optionheader_bg"; } + rel2 { relative: 1.0 0.0; to: "optionheader_bg"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "elm.swallow.optionheader"; + type: SWALLOW; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_CONTENT_H_INC; + rel1 { relative: 0.0 1.0; to: "optionheader_top_padding"; } + rel2 { relative: 1.0 1.0; to: "optionheader_top_padding"; } + fixed: 0 1; + align: 0.0 0.0; + } + } + part { name: "optionheader_bottom_padding"; + type: RECT; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 1.0; to: "elm.swallow.optionheader"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "content_clip"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + rel1.to_y: "optionheader_bg"; + rel1.relative: 0 1; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + repeat_events: 0; + clip_to: "content_clip"; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 1.0; + rel1.to_y: "optionheader_bg"; + rel2.relative: 1.0 0.0; + rel2.to_y: "controlbar_clip"; + } + description { state: "left" 0.0; + inherit: "default" 0.0; + rel1.relative: -1.0 1.0; + rel2.relative: 0.0 0.0; + } + description { state: "right" 0.0; + inherit: "default" 0.0; + rel1.relative: 1.0 1.0; + rel2.relative: 2.0 0.0; + } + } + part { name: "title_base"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "title_clip"; } + rel2 { to: "title_clip"; } + color: NAVIFRAME_TITLE_BG_COLOR_INC; + } + } + part { name: "padding_before_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_after_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 1.0 0.0; to: "elm.swallow.left_btn"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.left_btn"; } + visible: 0; + } + } + part { name: "padding_after_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "title_base"; } + rel2 { relative: 1.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_before_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.right_btn"; } + rel2 { relative: 0.0 1.0; to: "elm.swallow.right_btn"; } + visible: 0; + } + description { state: "more_button" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + } + } + part { name: "padding_before_more_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.more_btn"; } + rel2 { relative: 0.0 1.0; to: "elm.swallow.more_btn"; } + visible: 0; + } + } + part { name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "title_clip"; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to_x: "elm.text.title"; to_y: "title_base"; } + rel2 { relative: 0.0 1.0; to_x: "elm.text.title"; to_y: "title_base"; } + fixed: 1 0; + min: NAVIFRAME_ICON_PADDING_INC; + visible: 0; + } + } + part { name: "padding_center_text1"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_INC 0; + fixed: 1 0; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + visible: 0; + } + description { state: "icon_visible" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_ICON_VISIBLE_INC 0; + } + } + part { name: "padding_center_text2"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "title_base"; } + rel2 { relative: 1.0 1.0; to: "title_base"; } + visible: 0; + } + description { state: "more_button" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_MORE_BUTTON_INC 0; + } + } + part { name: "elm.text.title"; + type: TEXT; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + text { font: "SLP:style=Medium"; + size: NAVIFRAME_TITLE_FONT_SIZE_INC; + min: 0 0; + max: 1 0; + align: 0.5 0.5; + } + color: NAVIFRAME_TITLE_TEXT_COLOR_INC; + align: 0.5 0.5; + rel1.to: "padding_center_text1"; + rel1.relative: 1 0; + rel2.to: "padding_center_text2"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.icon"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + max: NAVIFRAME_ICON_SIZE_INC; + rel1 { relative: 0.0 0.0; to: "padding_before_text"; } + rel2 { relative: 0.0 1.0; to: "padding_before_text"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + align: 1.0 0.5; + } + } + part { name: "click_event_area"; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + rel1 { to: "title_base"; } + rel2 { to: "title_base"; } + } + } + part { name: "elm.swallow.left_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "padding_before_left_btn"; + rel1.relative: 1 0; + rel2.to: "padding_before_left_btn"; + rel2.relative: 1 1; + } + } + part { name: "elm.swallow.right_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 1.0 0.5; + rel1.to: "padding_after_right_btn"; + rel1.relative: 0 0; + rel2.to: "padding_after_right_btn"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.more_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 1.0 0.5; + rel1.to: "padding_before_right_btn"; + rel1.relative: 0 0; + rel2.to: "padding_before_right_btn"; + rel2.relative: 0 1; + } + } + part { name: "optionheader_arrow"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + min: NAVIFRAME_OH_ARROW_SIZE_INC; + max: NAVIFRAME_OH_ARROW_SIZE_INC; + fixed: 1 1; + align: 0.5 0; + rel1.to: "elm.swallow.more_btn"; + rel1.relative: 0 1; + rel2.to: "elm.swallow.more_btn"; + rel2.relative: 1 1; + image { + normal: "naviframe_optionheader_arrow.png"; + } + visible: 0; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "controlbar_clip"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 0 0; + max: 999999 0; + fixed: 0 1; + align: 0.5 1; + visible: 0; + rel1.to_x: "elm.swallow.content"; + rel2.to_x: "elm.swallow.content"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 0 CONTROLBAR_SMALL_HEIGHT_INC; + max: 999999 CONTROLBAR_SMALL_HEIGHT_INC; + visible: 1; + } + } + part { name: "controlbar_bg"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "controlbar_clip"; } + rel2 { to: "controlbar_clip"; } + color: NAVIFRAME_CONTROLBAR_BG_COLOR_INC; + } + } + part { name: "elm.swallow.prev_btn"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "controlbar_bg"; + rel1.relative: 0 0; + rel2.to: "controlbar_bg"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.controlbar"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + rel1.to: "elm.swallow.prev_btn"; + rel1.relative: 1 0; + rel2.to: "padding_after_controlbar"; + rel2.relative: 0 1; + } + } + part { name: "padding_after_controlbar"; + type: RECT; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + max: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + align: 1 1; + rel1.to: "controlbar_bg"; + rel2.to: "controlbar_bg"; + visible: 0; + } + } + } + programs { + program { name: "content_new_pushed"; + signal: "elm,state,new,pushed,internal"; + source: ""; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "show_finished"; + } + program { name: "content_cur_pushed"; + signal: "elm,state,cur,pushed,internal"; + source: ""; + action: STATE_SET "left" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "pushed_finished"; + } + program { name: "content_prev_popped"; + signal: "elm,state,prev,popped,internal"; + source: ""; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "show_finished"; + } + program { name: "content_cur_popped"; + signal: "elm,state,cur,popped,internal"; + source: ""; + action: STATE_SET "right" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "popped_finished"; + } + program { name: "cur_pushed"; + signal: "elm,state,cur,pushed"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "default", 0.0); + emit("elm,state,cur,pushed,internal", ""); + } + } + program { name: "new_pushed"; + signal: "elm,state,new,pushed"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "right", 0.0); + emit("elm,state,new,pushed,internal", ""); + } + } + program { name: "prev_popped"; + signal: "elm,state,prev,popped"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "left", 0.0); + emit("elm,state,prev,popped,internal", ""); + } + } + program { name: "cur_popped"; + signal: "elm,state,cur,popped"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "default", 0.0); + emit("elm,state,cur,popped,internal", ""); + } + } + program { name: "visible"; + signal: "elm,state,visible"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "title_show"; + signal: "elm,state,title,show"; + source: "elm"; + script { + set_state(PART:"title_clip", "default", 0.0); + if (get_int(oh_show) == 1) { + if (get_int(oh_close) == 1) { + emit("elm,state,optionheader,instant_close", ""); + }else { + emit("elm,state,optionheader,instant_open", ""); + } + } + else + set_state(PART:"optionheader_clip", "default", 0.0); + } + } + program { name: "title_hide"; + signal: "elm,state,title,hide"; + source: "elm"; + action: STATE_SET "hide" 0.0; + target: "title_clip"; + target: "optionheader_clip"; + } + program { name: "prev_btn_show"; + signal: "elm,state,prev_btn,show"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "prev_btn_hide"; + signal: "elm,state,prev_btn,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "more_btn_show"; + signal: "elm,state,elm.swallow.more_btn,show"; + source: "elm"; + action: STATE_SET "more_button" 0.0; + target: "padding_center_text2"; + target: "padding_before_right_btn"; + } + program { name: "more_btn_hide"; + signal: "elm,state,elm.swallow.more_btn,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "padding_center_text2"; + target: "padding_before_right_btn"; + } + program { name: "icon_show"; + signal: "elm,state,elm.swallow.icon,show"; + source: "elm"; + action: STATE_SET "icon_visible" 0.0; + target: "padding_center_text1"; + } + program { name: "icon_hide"; + signal: "elm,state,elm.swallow.icon,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "padding_center_text1"; + } + program { name: "controlbar_show"; + signal: "elm,state,elm.swallow.controlbar,show"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "controlbar_hide"; + signal: "elm,state,elm.swallow.controlbar,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "controlbar_clip_show"; + signal: "elm,state,controlbar_clip,show"; + source: "elm"; + script { + set_state(PART:"controlbar_clip", "show", 0.0); + set_int(cbar_bg, get_int(cbar_bg) + 1); + } + } + program { name: "controlbar_clip_hide"; + signal: "elm,state,controlbar_clip,hide"; + source: "elm"; + script { + set_int(cbar_bg, get_int(cbar_bg) - 1); + if (get_int(cbar_bg) <= 0) + set_state(PART:"controlbar_clip", "default", 0.0); + } + } + program { name: "optionheader_show"; + signal: "elm,state,elm.swallow.optionheader,show"; + source: "elm"; + script { + set_state(PART:"optionheader_clip", "show", 0.0); + set_state(PART:"optionheader_arrow", "show", 0.0); + set_int(oh_show, 1); + } + } + program { name: "optionheader_hide"; + signal: "elm,state,elm.swallow.optionheader,hide"; + source: "elm"; + script { + set_state(PART:"optionheader_clip", "default", 0.0); + set_state(PART:"optionheader_arrow", "default", 0.0); + set_int(oh_show, 0); + } + } + program { name: "optionheader_open"; + signal: "elm,state,optionheader,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + transition: LINEAR 0.2; + after: "optionheader_open_set"; + } + program { name: "optionheader_close"; + signal: "elm,state,optionheader,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + transition: LINEAR 0.2; + after: "optionheader_close_set"; + } + program { name: "optionheader_instant_open"; + signal: "elm,state,optionheader,instant_open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + after: "optionheader_open_set"; + } + program { name: "optionheader_instant_close"; + signal: "elm,state,optionheader,instant_close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + after: "optionheader_close_set"; + } + program { name: "optionheader_close_set"; + signal: "elm,state,optionheader,close_set"; + source: ""; + script { + set_int(oh_close, 1); + } + } + program { name: "optionheader_open_set"; + signal: "elm,state,optionheader,open_set"; + source: ""; + script { + set_int(oh_close, 0); + } + } + program { name: "controlbar_open"; + signal: "elm,state,controlbar,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_close"; + signal: "elm,state,controlbar,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_instant_open"; + signal: "elm,state,controlbar,instant_open"; + source: ""; + script { + emit("elm,state,prev_btn,show", "elm"); + emit("elm,state,elm.swallow.controlbar,show", "elm"); + } + } + program { name: "controlbar_instant_close"; + signal: "elm,state,controlbar,instant_close"; + source: ""; + script { + emit("elm,state,prev_btn,hide", "elm"); + emit("elm,state,elm.swallow.controlbar,hide", "elm"); + } + } + program { name: "show_finished"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + } + program { name: "pushed_finished"; + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; + } + program { name: "popped_finished"; + action: SIGNAL_EMIT "elm,action,popped,finished" ""; + } + program { + name: "title_clicked"; + signal: "mouse,clicked,1"; + source: "click_event_area"; + action: SIGNAL_EMIT "elm,action,title,clicked" ""; + } + } + } + group { name:"elm/naviframe/item/video/basic2/default"; + alias:"elm/naviframe/item/video/2line/default"; + images { + image: "naviframe_optionheader.png" COMP; + image: "naviframe_optionheader_arrow.png" COMP; + } + script { + public oh_show = 0; //optionheader show/hide + public oh_close = 0; //optionheader close/open + public cbar_bg = 0; //Controlbar BG Show call count + } + parts { + part { name: "title_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 NAVIFRAME_TITLE_H_INC; + align: 0.0 0.0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "optionheader_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 0; + align: 0.5 0; + fixed: 0 1; + rel1.to_x: "elm.swallow.content"; + rel1.to_y: "title_clip"; + rel1.relative: 0 1; + rel2.to_x: "elm.swallow.content"; + rel2.to_y: "title_clip"; + visible: 0; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 1 NAVIFRAME_OH_OPENED_DOUBLE_H_INC; + visible: 1; + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "optionheader_bg"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + rel1 { to: "optionheader_clip"; } + rel2 { to: "optionheader_clip"; } + image { normal: "naviframe_optionheader.png"; + border: 0 0 4 0; + } + } + } + part { name: "optionheader_top_padding"; + type: RECT; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 0.0; to: "optionheader_bg"; } + rel2 { relative: 1.0 0.0; to: "optionheader_bg"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "elm.swallow.optionheader"; + type: SWALLOW; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_CONTENT_H_INC; + rel1 { relative: 0.0 1.0; to: "optionheader_top_padding"; } + rel2 { relative: 1.0 1.0; to: "optionheader_top_padding"; } + fixed: 0 1; + align: 0.0 0.0; + } + } + part { name: "elm.swallow.optionheader.mid.padding"; + type: RECT; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 1.0; to: "elm.swallow.optionheader"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.optionheader"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "elm.swallow.optionheader2"; + type: SWALLOW; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_CONTENT_H_INC; + rel1 { relative: 0.0 1.0; to: "elm.swallow.optionheader.mid.padding";} + rel2 { relative: 1.0 1.0; to: "elm.swallow.optionheader.mid.padding";} + fixed: 0 1; + align: 0.0 0.0; + } + } + part { name: "elm.swallow.optionheader.bottom.padding"; + type: RECT; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 1.0; to: "elm.swallow.optionheader2"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "content_clip"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + rel1.to_y: "optionheader_bg"; + rel1.relative: 0 1; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + repeat_events: 0; + clip_to: "content_clip"; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 1.0; + rel1.to_y: "optionheader_bg"; + rel2.relative: 1.0 0.0; + rel2.to_y: "controlbar_clip"; + } + description { state: "left" 0.0; + inherit: "default" 0.0; + rel1.relative: -1.0 1.0; + rel2.relative: 0.0 0.0; + } + description { state: "right" 0.0; + inherit: "default" 0.0; + rel1.relative: 1.0 1.0; + rel2.relative: 2.0 0.0; + } + } + part { name: "title_base"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "title_clip"; } + rel2 { to: "title_clip"; } + color: NAVIFRAME_TITLE_BG_COLOR_INC; + } + } + part { name: "padding_before_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_after_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 1.0 0.0; to: "elm.swallow.left_btn"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.left_btn"; } + visible: 0; + } + } + part { name: "padding_after_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "title_base"; } + rel2 { relative: 1.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_before_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.right_btn"; } + rel2 { relative: 0.0 1.0; to: "elm.swallow.right_btn"; } + visible: 0; + } + description { state: "more_btn" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + } + } + part { name: "padding_before_more_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.more_btn"; } + rel2 { relative: 0.0 1.0; to: "elm.swallow.more_btn"; } + visible: 0; + } + } + part { name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "title_clip"; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to_x: "elm.text.title"; to_y: "title_base"; } + rel2 { relative: 0.0 1.0; to_x: "elm.text.title"; to_y: "title_base"; } + fixed: 1 0; + min: NAVIFRAME_ICON_PADDING_INC; + visible: 0; + } + } + part { name: "padding_center_text1"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_INC 0; + fixed: 1 0; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + visible: 0; + } + description { state: "icon_visible" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_ICON_VISIBLE_INC 0; + } + } + part { name: "padding_center_text2"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "title_base"; } + rel2 { relative: 1.0 1.0; to: "title_base"; } + visible: 0; + } + description { state: "more_button" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_MORE_BUTTON_INC 0; + } + } + part { name: "elm.text.title"; + type: TEXT; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + text { font: "SLP:style=Medium"; + size: NAVIFRAME_TITLE_FONT_SIZE_INC; + min: 0 0; + max: 1 0; + align: 0.5 0.5; + } + color: NAVIFRAME_TITLE_TEXT_COLOR_INC; + align: 0.5 0.5; + rel1.to: "padding_center_text1"; + rel1.relative: 1 0; + rel2.to: "padding_center_text2"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.icon"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + max: NAVIFRAME_ICON_SIZE_INC; + rel1 { relative: 0.0 0.0; to: "padding_before_text"; } + rel2 { relative: 0.0 1.0; to: "padding_before_text"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + align: 1.0 0.5; + } + } + part { name: "click_event_area"; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + rel1 { to: "title_base"; } + rel2 { to: "title_base"; } + } + } + part { name: "elm.swallow.left_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "padding_before_left_btn"; + rel1.relative: 1 0; + rel2.to: "padding_before_left_btn"; + rel2.relative: 1 1; + } + } + part { name: "elm.swallow.right_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 1.0 0.5; + rel1.to: "padding_after_right_btn"; + rel1.relative: 0 0; + rel2.to: "padding_after_right_btn"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.more_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 1.0 0.5; + rel1.to: "padding_before_right_btn"; + rel1.relative: 0 0; + rel2.to: "padding_before_right_btn"; + rel2.relative: 0 1; + } + } + part { name: "optionheader_arrow"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + min: NAVIFRAME_OH_ARROW_SIZE_INC; + max: NAVIFRAME_OH_ARROW_SIZE_INC; + fixed: 1 1; + align: 0.5 0; + rel1.to: "elm.swallow.more_btn"; + rel1.relative: 0 1; + rel2.to: "elm.swallow.more_btn"; + rel2.relative: 1 1; + image { + normal: "naviframe_optionheader_arrow.png"; + } + color: 255 255 255 0 ; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { name: "controlbar_clip"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 0 0; + max: 999999 0; + fixed: 0 1; + align: 0.5 1; + visible: 0; + rel1.to_x: "elm.swallow.content"; + rel2.to_x: "elm.swallow.content"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 0 CONTROLBAR_SMALL_HEIGHT_INC; + max: 999999 CONTROLBAR_SMALL_HEIGHT_INC; + visible: 1; + } + } + part { name: "controlbar_bg"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "controlbar_clip"; } + rel2 { to: "controlbar_clip"; } + color: NAVIFRAME_CONTROLBAR_BG_COLOR_INC; + } + } + part { name: "elm.swallow.prev_btn"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "controlbar_bg"; + rel1.relative: 0 0; + rel2.to: "controlbar_bg"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.controlbar"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + rel1.to: "elm.swallow.prev_btn"; + rel1.relative: 1 0; + rel2.to: "padding_after_controlbar"; + rel2.relative: 0 1; + } + } + part { name: "padding_after_controlbar"; + type: RECT; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + max: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + align: 1 1; + rel1.to: "controlbar_bg"; + rel2.to: "controlbar_bg"; + visible: 0; + } + } + } + programs { + program { name: "content_new_pushed"; + signal: "elm,state,new,pushed,internal"; + source: ""; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "show_finished"; + } + program { name: "content_cur_pushed"; + signal: "elm,state,cur,pushed,internal"; + source: ""; + action: STATE_SET "left" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "pushed_finished"; + } + program { name: "content_prev_popped"; + signal: "elm,state,prev,popped,internal"; + source: ""; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "show_finished"; + } + program { name: "content_cur_popped"; + signal: "elm,state,cur,popped,internal"; + source: ""; + action: STATE_SET "right" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "popped_finished"; + } + program { name: "cur_pushed"; + signal: "elm,state,cur,pushed"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "default", 0.0); + emit("elm,state,cur,pushed,internal", ""); + } + } + program { name: "new_pushed"; + signal: "elm,state,new,pushed"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "right", 0.0); + emit("elm,state,new,pushed,internal", ""); + } + } + program { name: "prev_popped"; + signal: "elm,state,prev,popped"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "left", 0.0); + emit("elm,state,prev,popped,internal", ""); + } + } + program { name: "cur_popped"; + signal: "elm,state,cur,popped"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "default", 0.0); + emit("elm,state,cur,popped,internal", ""); + } + } + program { name: "visible"; + signal: "elm,state,visible"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "title_show"; + signal: "elm,state,title,show"; + source: "elm"; + script { + set_state(PART:"title_clip", "default", 0.0); + if (get_int(oh_show) == 1) { + if (get_int(oh_close) == 1) { + emit("elm,state,optionheader,instant_close", ""); + }else { + emit("elm,state,optionheader,instant_open", ""); + } + } + else + set_state(PART:"optionheader_clip", "default", 0.0); + } + } + program { name: "title_hide"; + signal: "elm,state,title,hide"; + source: "elm"; + action: STATE_SET "hide" 0.0; + target: "title_clip"; + target: "optionheader_clip"; + } + program { name: "prev_btn_show"; + signal: "elm,state,prev_btn,show"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "prev_btn_hide"; + signal: "elm,state,prev_btn,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "more_btn_show"; + signal: "elm,state,elm.swallow.more_btn,show"; + source: "elm"; + action: STATE_SET "more_button" 0.0; + target: "padding_center_text2"; + target: "padding_before_right_btn"; + } + program { name: "more_btn_hide"; + signal: "elm,state,elm.swallow.more_btn,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.more_btn"; + target: "padding_before_right_btn"; + } + program { name: "icon_show"; + signal: "elm,state,elm.swallow.icon,show"; + source: "elm"; + action: STATE_SET "icon_visible" 0.0; + target: "padding_center_text1"; + } + program { name: "icon_hide"; + signal: "elm,state,elm.swallow.icon,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "padding_center_text1"; + } + program { name: "controlbar_show"; + signal: "elm,state,elm.swallow.controlbar,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "controlbar_hide"; + signal: "elm,state,elm.swallow.controlbar,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "controlbar_clip_show"; + signal: "elm,state,controlbar_clip,show"; + source: "elm"; + script { + set_state(PART:"controlbar_clip", "show", 0.0); + set_int(cbar_bg, get_int(cbar_bg) + 1); + } + } + program { name: "controlbar_clip_hide"; + signal: "elm,state,controlbar_clip,hide"; + source: "elm"; + script { + set_int(cbar_bg, get_int(cbar_bg) - 1); + if (get_int(cbar_bg) <= 0) + set_state(PART:"controlbar_clip", "default", 0.0); + } + } + program { name: "optionheader_show"; + signal: "elm,state,elm.swallow.optionheader,show"; + source: "elm"; + script { + set_state(PART:"optionheader_clip", "show", 0.0); + set_state(PART:"optionheader_arrow", "show", 0.0); + set_int(oh_show, 1); + } + } + program { name: "optionheader_hide"; + signal: "elm,state,elm.swallow.optionheader,hide"; + source: "elm"; + script { + set_state(PART:"optionheader_clip", "default", 0.0); + set_state(PART:"optionheader_arrow", "default", 0.0); + set_int(oh_show, 0); + } + } + program { name: "optionheader_open"; + signal: "elm,state,optionheader,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + transition: LINEAR 0.2; + after: "optionheader_open_set"; + } + program { name: "optionheader_close"; + signal: "elm,state,optionheader,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + transition: LINEAR 0.2; + after: "optionheader_close_set"; + } + program { name: "optionheader_instant_open"; + signal: "elm,state,optionheader,instant_open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + after: "optionheader_open_set"; + } + program { name: "optionheader_instant_close"; + signal: "elm,state,optionheader,instant_close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + after: "optionheader_close_set"; + } + program { name: "optionheader_close_set"; + signal: "elm,state,optionheader,close_set"; + source: ""; + script { + set_int(oh_close, 1); + } + } + program { name: "optionheader_open_set"; + signal: "elm,state,optionheader,open_set"; + source: ""; + script { + set_int(oh_close, 0); + } + } + program { name: "controlbar_open"; + signal: "elm,state,controlbar,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_close"; + signal: "elm,state,controlbar,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_instant_open"; + signal: "elm,state,controlbar,instant_open"; + source: ""; + script { + emit("elm,state,prev_btn,show", "elm"); + emit("elm,state,elm.swallow.controlbar,show", "elm"); + } + } + program { name: "controlbar_instant_close"; + signal: "elm,state,controlbar,instant_close"; + source: ""; + script { + emit("elm,state,prev_btn,hide", "elm"); + emit("elm,state,elm.swallow.controlbar,hide", "elm"); + } + } + program { name: "show_finished"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + } + program { name: "pushed_finished"; + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; + } + program { name: "popped_finished"; + action: SIGNAL_EMIT "elm,action,popped,finished" ""; + } + program { + name: "title_clicked"; + signal: "mouse,clicked,1"; + source: "click_event_area"; + action: SIGNAL_EMIT "elm,action,title,clicked" ""; + } + } + } + group { name: "elm/naviframe/item/video/segment/default"; + script { + public cbar_bg = 0; //Controlbar BG Show call count + } + parts { + part { name: "title_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 NAVIFRAME_SEGMENT_TITLE_H_INC; + align: 0.0 0.0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "content_clip"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + rel1.to_y: "title_clip"; + rel1.relative: 0 1; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + repeat_events: 0; + clip_to: "content_clip"; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 1.0; + rel1.to_y: "title_clip"; + rel2.relative: 1.0 0.0; + rel2.to_y: "controlbar_clip"; + } + description { state: "left" 0.0; + inherit: "default" 0.0; + rel1.relative: -1.0 1.0; + rel2.relative: 0.0 0.0; + } + description { state: "right" 0.0; + inherit: "default" 0.0; + rel1.relative: 1.0 1.0; + rel2.relative: 2.0 0.0; + } + } + part { name: "title_base"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "title_clip"; } + rel2 { to: "title_clip"; } + color: NAVIFRAME_TITLE_BG_COLOR_INC; + } + } + part { name: "padding_before_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_after_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 1.0 0.0; to: "elm.swallow.left_btn"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.left_btn"; } + visible: 0; + } + } + part { name: "padding_after_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "title_base"; } + rel2 { relative: 1.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_before_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.right_btn"; } + rel2 { relative: 0.0 1.0; to: "elm.swallow.right_btn"; } + visible: 0; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + } + } + part { name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "title_clip"; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to_x: "elm.text.title"; to_y: "title_base"; } + rel2 { relative: 0.0 1.0; to_x: "elm.text.title"; to_y: "title_base"; } + fixed: 1 0; + min: NAVIFRAME_ICON_PADDING_INC; + visible: 0; + } + } + part { name: "elm.text.title"; + type: TEXT; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + text { font: "SLP:style=Medium"; + size: NAVIFRAME_TITLE_SEGMENT_FONT_SIZE_INC; + min: 0 0; + max: 1 0; + align: 0.5 0.5; + } + min: 0 NAVIFRAME_TITLE_SEGMENT_TEXT_H_INC; + max: 999999 NAVIFRAME_TITLE_SEGMENT_TEXT_H_INC; + fixed: 0 1; + color: NAVIFRAME_TITLE_TEXT_COLOR_INC; + align: 0.5 0; + rel1.to: "padding_before_left_btn"; + rel1.relative: 1 0; + rel2.to: "padding_after_right_btn"; + rel2.relative: 0 1; + } + } + part { name: "click_event_area"; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + rel1 { to: "title_base"; } + rel2 { to: "title_base"; } + } + } + part { name: "elm.swallow.left_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 0 0; + rel1.relative: 1.0 1.0; + rel1.to_x: "padding_before_left_btn"; + rel1.to_y: "elm.text.title"; + rel2.relative: 1.0 1.0; + rel2.to_x: "padding_before_left_btn"; + rel2.to_y: "elm.text.title"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + } + } + part { name: "elm.swallow.right_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 0; + align: 1 0; + fixed: 1 0; + rel1.relative: 0.0 1.0; + rel1.to_x: "padding_after_right_btn"; + rel1.to_y: "elm.text.title"; + rel2.relative: 0.0 1.0; + rel2.to_x: "padding_after_right_btn"; + rel2.to_y: "elm.text.title"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + } + } + part { name: "elm.swallow.segment2"; + type: "SWALLOW"; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 NAVIFRAME_TITLE_SEGMENT_H_INC; + max: 999999 NAVIFRAME_TITLE_SEGMENT_H_INC; + fixed: 0 1; + align: 0.5 0; + rel1.to_y: "elm.text.title"; + rel1.relative: 0.28 1; + rel2.to_y: "elm.text.title"; + rel2.relative: 0.72 1; + } + } + part { name: "elm.swallow.segment3"; + type: "SWALLOW"; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 NAVIFRAME_TITLE_SEGMENT_H_INC; + max: 999999 NAVIFRAME_TITLE_SEGMENT_H_INC; + fixed: 0 1; + align: 0.5 0; + rel1.to_y: "elm.text.title"; + rel1.relative: 0.2 1; + rel2.to_y: "elm.text.title"; + rel2.relative: 0.8 1; + } + } + part { name: "controlbar_clip"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 0 0; + max: 999999 0; + fixed: 0 1; + align: 0.5 1; + visible: 0; + rel1.to_x: "elm.swallow.content"; + rel2.to_x: "elm.swallow.content"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 0 CONTROLBAR_SMALL_HEIGHT_INC; + max: 999999 CONTROLBAR_SMALL_HEIGHT_INC; + visible: 1; + } + } + part { name: "controlbar_bg"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "controlbar_clip"; } + rel2 { to: "controlbar_clip"; } + color: NAVIFRAME_CONTROLBAR_BG_COLOR_INC; + } + } + part { name: "elm.swallow.prev_btn"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "controlbar_bg"; + rel1.relative: 0 0; + rel2.to: "controlbar_bg"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.controlbar"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + rel1.to: "elm.swallow.prev_btn"; + rel1.relative: 1 0; + rel2.to: "padding_after_controlbar"; + rel2.relative: 0 1; + } + } + part { name: "padding_after_controlbar"; + type: RECT; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + max: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + align: 1 1; + rel1.to: "controlbar_bg"; + rel2.to: "controlbar_bg"; + visible: 0; + } + } + } + programs { + program { name: "content_new_pushed"; + signal: "elm,state,new,pushed,internal"; + source: ""; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "show_finished"; + } + program { name: "content_cur_pushed"; + signal: "elm,state,cur,pushed,internal"; + source: ""; + action: STATE_SET "left" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "pushed_finished"; + } + program { name: "content_prev_popped"; + signal: "elm,state,prev,popped,internal"; + source: ""; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "show_finished"; + } + program { name: "content_cur_popped"; + signal: "elm,state,cur,popped,internal"; + source: ""; + action: STATE_SET "right" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "popped_finished"; + } + program { name: "cur_pushed"; + signal: "elm,state,cur,pushed"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "default", 0.0); + emit("elm,state,cur,pushed,internal", ""); + } + } + program { name: "new_pushed"; + signal: "elm,state,new,pushed"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "right", 0.0); + emit("elm,state,new,pushed,internal", ""); + } + } + program { name: "prev_popped"; + signal: "elm,state,prev,popped"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "left", 0.0); + emit("elm,state,prev,popped,internal", ""); + } + } + program { name: "cur_popped"; + signal: "elm,state,cur,popped"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "default", 0.0); + emit("elm,state,cur,popped,internal", ""); + } + } + program { name: "visible"; + signal: "elm,state,visible"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "title_show"; + signal: "elm,state,title,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "title_clip"; + } + program { name: "title_hide"; + signal: "elm,state,title,hide"; + source: "elm"; + action: STATE_SET "hide" 0.0; + target: "title_clip"; + } + program { name: "prev_btn_show"; + signal: "elm,state,prev_btn,show"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "prev_btn_hide"; + signal: "elm,state,prev_btn,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "left_btn_show"; + signal: "elm,state,elm.swallow.left_btn,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "elm.swallow.left_btn"; + } + program { name: "left_btn_hide"; + signal: "elm,state,elm.swallow.left_btn,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.left_btn"; + } + program { name: "right_btn_show"; + signal: "elm,state,elm.swallow.right_btn,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "elm.swallow.right_btn"; + } + program { name: "right_btn_hide"; + signal: "elm,state,elm.swallow.right_btn,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.right_btn"; + } + program { name: "controlbar_show"; + signal: "elm,state,elm.swallow.controlbar,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "controlbar_hide"; + signal: "elm,state,elm.swallow.controlbar,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "controlbar_clip_show"; + signal: "elm,state,controlbar_clip,show"; + source: "elm"; + script { + set_state(PART:"controlbar_clip", "show", 0.0); + set_int(cbar_bg, get_int(cbar_bg) + 1); + } + } + program { name: "controlbar_clip_hide"; + signal: "elm,state,controlbar_clip,hide"; + source: "elm"; + script { + set_int(cbar_bg, get_int(cbar_bg) - 1); + if (get_int(cbar_bg) <= 0) + set_state(PART:"controlbar_clip", "default", 0.0); + } + } + program { name: "controlbar_open"; + signal: "elm,state,controlbar,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_close"; + signal: "elm,state,controlbar,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_instant_open"; + signal: "elm,state,controlbar,instant_open"; + source: ""; + script { + emit("elm,state,prev_btn,show", "elm"); + emit("elm,state,elm.swallow.controlbar,show", "elm"); + } + } + program { name: "controlbar_instant_close"; + signal: "elm,state,controlbar,instant_close"; + source: ""; + script { + emit("elm,state,prev_btn,hide", "elm"); + emit("elm,state,elm.swallow.controlbar,hide", "elm"); + } + } + program { name: "show_finished"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + } + program { name: "pushed_finished"; + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; + } + program { name: "popped_finished"; + action: SIGNAL_EMIT "elm,action,popped,finished" ""; + } + program { + name: "title_clicked"; + signal: "mouse,clicked,1"; + source: "click_event_area"; + action: SIGNAL_EMIT "elm,action,title,clicked" ""; + } + } + } + group { name: "elm/naviframe/item/tabbar/default"; + script { + public cbar_bg = 0; //Controlbar BG Show call count + } + parts { + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + repeat_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel2.relative: 1.0 0.0; + rel2.to_y: "controlbar_clip"; + } + description { state: "left" 0.0; + inherit: "default" 0.0; + rel1.relative: -1.0 0.0; + rel2.relative: 0.0 0.0; + } + description { state: "right" 0.0; + inherit: "default" 0.0; + rel1.relative: 1.0 0.0; + rel2.relative: 2.0 0.0; + } + } + part { name: "controlbar_clip"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 0 0; + max: 999999 0; + fixed: 0 1; + align: 0.5 1; + visible: 0; + rel1.to_x: "elm.swallow.content"; + rel2.to_x: "elm.swallow.content"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 0 CONTROLBAR_SMALL_HEIGHT_INC; + max: 999999 CONTROLBAR_SMALL_HEIGHT_INC; + visible: 1; + } + } + part { name: "controlbar_bg"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "controlbar_clip"; } + rel2 { to: "controlbar_clip"; } + color: NAVIFRAME_CONTROLBAR_BG_COLOR_INC; + } + } + part { name: "elm.swallow.prev_btn"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "controlbar_bg"; + rel1.relative: 0 0; + rel2.to: "controlbar_bg"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.controlbar"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + rel1.to: "elm.swallow.prev_btn"; + rel1.relative: 1 0; + rel2.to: "padding_after_controlbar"; + rel2.relative: 0 1; + } + } + part { name: "padding_after_controlbar"; + type: RECT; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + max: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + align: 1 1; + rel1.to: "controlbar_bg"; + rel2.to: "controlbar_bg"; + visible: 0; + } + } + } + programs { + program { name: "content_new_pushed"; + signal: "elm,state,new,pushed,internal"; + source: ""; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "show_finished"; + } + program { name: "content_cur_pushed"; + signal: "elm,state,cur,pushed,internal"; + source: ""; + action: STATE_SET "left" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "pushed_finished"; + } + program { name: "content_prev_popped"; + signal: "elm,state,prev,popped,internal"; + source: ""; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "show_finished"; + } + program { name: "content_cur_popped"; + signal: "elm,state,cur,popped,internal"; + source: ""; + action: STATE_SET "right" 0.0; + target: "elm.swallow.content"; + transition: DECELERATE NAVIFRAME_VIEW_TRANS_TIME; + after: "popped_finished"; + } + program { name: "cur_pushed"; + signal: "elm,state,cur,pushed"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "default", 0.0); + emit("elm,state,cur,pushed,internal", ""); + } + } + program { name: "new_pushed"; + signal: "elm,state,new,pushed"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "right", 0.0); + emit("elm,state,new,pushed,internal", ""); + } + } + program { name: "prev_popped"; + signal: "elm,state,prev,popped"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "left", 0.0); + emit("elm,state,prev,popped,internal", ""); + } + } + program { name: "cur_popped"; + signal: "elm,state,cur,popped"; + source: "elm"; + script { + set_state(PART:"elm.swallow.content", "default", 0.0); + emit("elm,state,cur,popped,internal", ""); + } + } + program { name: "visible"; + signal: "elm,state,visible"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { name: "prev_btn_show"; + signal: "elm,state,prev_btn,show"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "prev_btn_hide"; + signal: "elm,state,prev_btn,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "controlbar_show"; + signal: "elm,state,elm.swallow.controlbar,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "controlbar_hide"; + signal: "elm,state,elm.swallow.controlbar,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "controlbar_clip_show"; + signal: "elm,state,controlbar_clip,show"; + source: "elm"; + script { + set_state(PART:"controlbar_clip", "show", 0.0); + set_int(cbar_bg, get_int(cbar_bg) + 1); + } + } + program { name: "controlbar_clip_hide"; + signal: "elm,state,controlbar_clip,hide"; + source: "elm"; + script { + set_int(cbar_bg, get_int(cbar_bg) - 1); + if (get_int(cbar_bg) <= 0) + set_state(PART:"controlbar_clip", "default", 0.0); + } + } + program { name: "controlbar_open"; + signal: "elm,state,controlbar,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_close"; + signal: "elm,state,controlbar,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_instant_open"; + signal: "elm,state,controlbar,instant_open"; + source: ""; + script { + emit("elm,state,prev_btn,show", "elm"); + emit("elm,state,elm.swallow.controlbar,show", "elm"); + } + } + program { name: "controlbar_instant_close"; + signal: "elm,state,controlbar,instant_close"; + source: ""; + script { + emit("elm,state,prev_btn,hide", "elm"); + emit("elm,state,elm.swallow.controlbar,hide", "elm"); + } + } + program { name: "show_finished"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + } + program { name: "pushed_finished"; + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; + } + program { name: "popped_finished"; + action: SIGNAL_EMIT "elm,action,popped,finished" ""; + } + program { + name: "title_clicked"; + signal: "mouse,clicked,1"; + source: "click_event_area"; + action: SIGNAL_EMIT "elm,action,title,clicked" ""; + } + } + } + group { name:"elm/naviframe/item/video/basic/instant/default"; + alias:"elm/naviframe/item/video/1line/instant/default"; + alias:"elm/naviframe/item/video/instant/default"; + images { + image: "naviframe_optionheader.png" COMP; + image: "naviframe_optionheader_arrow.png" COMP; + } + script { + public oh_show = 0; //optionheader show/hide + public oh_close = 0; //optionheader close/open + public cbar_bg = 0; //Controlbar BG Show call count + } + parts { + part { name: "title_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 NAVIFRAME_TITLE_H_INC; + align: 0.0 0.0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "optionheader_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 0; + align: 0.5 0; + fixed: 0 1; + rel1.to_x: "elm.swallow.content"; + rel1.to_y: "title_clip"; + rel1.relative: 0 1; + rel2.to_x: "elm.swallow.content"; + rel2.to_y: "title_clip"; + visible: 0; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 1 NAVIFRAME_OH_OPENED_H_INC; + visible: 1; + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "optionheader_bg"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + rel1 { to: "optionheader_clip"; } + rel2 { to: "optionheader_clip"; } + image { normal: "naviframe_optionheader.png"; + border: 0 0 4 0; + } + } + } + part { name: "optionheader_top_padding"; + type: RECT; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 0.0; to: "optionheader_bg"; } + rel2 { relative: 1.0 0.0; to: "optionheader_bg"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "elm.swallow.optionheader"; + type: SWALLOW; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_CONTENT_H_INC; + rel1 { relative: 0.0 1.0; to: "optionheader_top_padding"; } + rel2 { relative: 1.0 1.0; to: "optionheader_top_padding"; } + fixed: 0 1; + align: 0.0 0.0; + } + } + part { name: "optionheader_bottom_padding"; + type: RECT; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 1.0; to: "elm.swallow.optionheader"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "content_clip"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + rel1.to_y: "optionheader_bg"; + rel1.relative: 0 1; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + repeat_events: 0; + clip_to: "content_clip"; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 1.0; + rel1.to_y: "optionheader_bg"; + rel2.relative: 1.0 0.0; + rel2.to_y: "controlbar_clip"; + } + } + part { name: "title_base"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "title_clip"; } + rel2 { to: "title_clip"; } + color: NAVIFRAME_TITLE_BG_COLOR_INC; + } + } + part { name: "padding_before_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_after_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 1.0 0.0; to: "elm.swallow.left_btn"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.left_btn"; } + visible: 0; + } + } + part { name: "padding_after_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "title_base"; } + rel2 { relative: 1.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_before_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.right_btn"; } + rel2 { relative: 0.0 1.0; to: "elm.swallow.right_btn"; } + visible: 0; + } + description { state: "more_button" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + } + } + part { name: "padding_before_more_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.more_btn"; } + rel2 { relative: 0.0 1.0; to: "elm.swallow.more_btn"; } + visible: 0; + } + } + part { name: "padding_center_text1"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_INC 0; + fixed: 1 0; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + visible: 0; + } + description { state: "icon_visible" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_ICON_VISIBLE_INC 0; + } + } + part { name: "padding_center_text2"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "title_base"; } + rel2 { relative: 1.0 1.0; to: "title_base"; } + visible: 0; + } + description { state: "more_button" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_MORE_BUTTON_INC 0; + } + } + part { name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "title_clip"; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to_x: "elm.text.title"; to_y: "title_base"; } + rel2 { relative: 0.0 1.0; to_x: "elm.text.title"; to_y: "title_base"; } + fixed: 1 0; + min: NAVIFRAME_ICON_PADDING_INC; + visible: 0; + } + } + part { name: "elm.text.title"; + type: TEXT; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + text { font: "SLP:style=Medium"; + size: NAVIFRAME_TITLE_FONT_SIZE_INC; + min: 0 0; + max: 1 0; + align: 0.5 0.5; + } + color: NAVIFRAME_TITLE_TEXT_COLOR_INC; + align: 0.5 0.5; + rel1.to: "padding_center_text1"; + rel1.relative: 1 0; + rel2.to: "padding_center_text2"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.icon"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + max: NAVIFRAME_ICON_SIZE_INC; + rel1 { relative: 0.0 0.0; to: "padding_before_text"; } + rel2 { relative: 0.0 1.0; to: "padding_before_text"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + align: 1.0 0.5; + } + } + part { name: "click_event_area"; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + rel1 { to: "title_base"; } + rel2 { to: "title_base"; } + } + } + part { name: "elm.swallow.left_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "padding_before_left_btn"; + rel1.relative: 1 0; + rel2.to: "padding_before_left_btn"; + rel2.relative: 1 1; + } + } + part { name: "elm.swallow.right_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 1.0 0.5; + rel1.to: "padding_after_right_btn"; + rel1.relative: 0 0; + rel2.to: "padding_after_right_btn"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.more_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 1.0 0.5; + rel1.to: "padding_before_right_btn"; + rel1.relative: 0 0; + rel2.to: "padding_before_right_btn"; + rel2.relative: 0 1; + } + } + part { name: "optionheader_arrow"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + min: NAVIFRAME_OH_ARROW_SIZE_INC; + max: NAVIFRAME_OH_ARROW_SIZE_INC; + fixed: 1 1; + align: 0.5 0; + rel1.to: "elm.swallow.more_btn"; + rel1.relative: 0 1; + rel2.to: "elm.swallow.more_btn"; + rel2.relative: 1 1; + image { + normal: "naviframe_optionheader_arrow.png"; + } + color: 255 255 255 0 ; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { name: "controlbar_clip"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 0 0; + max: 999999 0; + fixed: 0 1; + align: 0.5 1; + visible: 0; + rel1.to_x: "elm.swallow.content"; + rel2.to_x: "elm.swallow.content"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 0 CONTROLBAR_SMALL_HEIGHT_INC; + max: 999999 CONTROLBAR_SMALL_HEIGHT_INC; + visible: 1; + } + } + part { name: "controlbar_bg"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "controlbar_clip"; } + rel2 { to: "controlbar_clip"; } + color: NAVIFRAME_CONTROLBAR_BG_COLOR_INC; + } + } + part { name: "elm.swallow.prev_btn"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "controlbar_bg"; + rel1.relative: 0 0; + rel2.to: "controlbar_bg"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.controlbar"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + rel1.to: "elm.swallow.prev_btn"; + rel1.relative: 1 0; + rel2.to: "padding_after_controlbar"; + rel2.relative: 0 1; + } + } + part { name: "padding_after_controlbar"; + type: RECT; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + max: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + align: 1 1; + rel1.to: "controlbar_bg"; + rel2.to: "controlbar_bg"; + visible: 0; + } + } + } + programs { + program { name: "cur_pushed"; + signal: "elm,state,cur,pushed"; + source: "elm"; + after: "pushed_finished"; + } + program { name: "new_pushed"; + signal: "elm,state,new,pushed"; + source: "elm"; + after: "show_finished"; + } + program { name: "prev_popped"; + signal: "elm,state,prev,popped"; + source: "elm"; + after: "show_finished"; + } + program { name: "cur_popped"; + signal: "elm,state,cur,popped"; + source: "elm"; + after: "popped_finished"; + } + program { name: "title_show"; + signal: "elm,state,title,show"; + source: "elm"; + script { + set_state(PART:"title_clip", "default", 0.0); + if (get_int(oh_show) == 1) { + if (get_int(oh_close) == 1) { + emit("elm,state,optionheader,instant_close", ""); + }else { + emit("elm,state,optionheader,instant_open", ""); + } + } + else + set_state(PART:"optionheader_clip", "default", 0.0); + } + } + program { name: "title_hide"; + signal: "elm,state,title,hide"; + source: "elm"; + action: STATE_SET "hide" 0.0; + target: "title_clip"; + target: "optionheader_clip"; + } + program { name: "prev_btn_show"; + signal: "elm,state,prev_btn,show"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "prev_btn_hide"; + signal: "elm,state,prev_btn,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "more_btn_show"; + signal: "elm,state,elm.swallow.more_btn,show"; + source: "elm"; + action: STATE_SET "more_button" 0.0; + target: "padding_center_text2"; + target: "padding_before_right_btn"; + } + program { name: "more_btn_hide"; + signal: "elm,state,elm.swallow.more_btn,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "padding_center_text2"; + target: "padding_before_right_btn"; + } + program { name: "icon_show"; + signal: "elm,state,elm.swallow.icon,show"; + source: "elm"; + action: STATE_SET "icon_visible" 0.0; + target: "padding_center_text1"; + } + program { name: "icon_hide"; + signal: "elm,state,elm.swallow.icon,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "padding_center_text1"; + } + program { name: "controlbar_show"; + signal: "elm,state,elm.swallow.controlbar,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "controlbar_hide"; + signal: "elm,state,elm.swallow.controlbar,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "controlbar_clip_show"; + signal: "elm,state,controlbar_clip,show"; + source: "elm"; + script { + set_state(PART:"controlbar_clip", "show", 0.0); + set_int(cbar_bg, get_int(cbar_bg) + 1); + } + } + program { name: "controlbar_clip_hide"; + signal: "elm,state,controlbar_clip,hide"; + source: "elm"; + script { + set_int(cbar_bg, get_int(cbar_bg) - 1); + if (get_int(cbar_bg) <= 0) + set_state(PART:"controlbar_clip", "default", 0.0); + } + } + program { name: "optionheader_show"; + signal: "elm,state,elm.swallow.optionheader,show"; + source: "elm"; + script { + set_state(PART:"optionheader_clip", "show", 0.0); + set_state(PART:"optionheader_arrow", "show", 0.0); + set_int(oh_show, 1); + } + } + program { name: "optionheader_hide"; + signal: "elm,state,elm.swallow.optionheader,hide"; + source: "elm"; + script { + set_state(PART:"optionheader_clip", "default", 0.0); + set_state(PART:"optionheader_arrow", "default", 0.0); + set_int(oh_show, 0); + } + } + program { name: "optionheader_open"; + signal: "elm,state,optionheader,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + transition: LINEAR 0.2; + after: "optionheader_open_set"; + } + program { name: "optionheader_close"; + signal: "elm,state,optionheader,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + transition: LINEAR 0.2; + after: "optionheader_close_set"; + } + program { name: "optionheader_instant_open"; + signal: "elm,state,optionheader,instant_open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + after: "optionheader_open_set"; + } + program { name: "optionheader_instant_close"; + signal: "elm,state,optionheader,instant_close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + after: "optionheader_close_set"; + } + program { name: "optionheader_close_set"; + signal: "elm,state,optionheader,close_set"; + source: ""; + script { + set_int(oh_close, 1); + } + } + program { name: "optionheader_open_set"; + signal: "elm,state,optionheader,open_set"; + source: ""; + script { + set_int(oh_close, 0); + } + } + program { name: "controlbar_open"; + signal: "elm,state,controlbar,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_close"; + signal: "elm,state,controlbar,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_instant_open"; + signal: "elm,state,controlbar,instant_open"; + source: ""; + script { + emit("elm,state,prev_btn,show", "elm"); + emit("elm,state,elm.swallow.controlbar,show", "elm"); + } + } + program { name: "controlbar_instant_close"; + signal: "elm,state,controlbar,instant_close"; + source: ""; + script { + emit("elm,state,prev_btn,hide", "elm"); + emit("elm,state,elm.swallow.controlbar,hide", "elm"); + } + } + program { name: "show_finished"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + } + program { name: "pushed_finished"; + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; + } + program { name: "popped_finished"; + action: SIGNAL_EMIT "elm,action,popped,finished" ""; + } + program { + name: "title_clicked"; + signal: "mouse,clicked,1"; + source: "click_event_area"; + action: SIGNAL_EMIT "elm,action,title,clicked" ""; + } + } + } + group { name:"elm/naviframe/item/video/basic2/instant/default"; + alias:"elm/naviframe/item/video/2line/instant/default"; + alias:"elm/naviframe/item/video/instant2/default"; + images { + image: "naviframe_optionheader.png" COMP; + image: "naviframe_optionheader_arrow.png" COMP; + } + script { + public oh_show = 0; //optionheader show/hide + public oh_close = 0; //optionheader close/open + public cbar_bg = 0; //Controlbar BG Show call count + } + parts { + part { name: "title_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 NAVIFRAME_TITLE_H_INC; + align: 0.0 0.0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "optionheader_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 0; + align: 0.5 0; + fixed: 0 1; + rel1.to_x: "elm.swallow.content"; + rel1.to_y: "title_clip"; + rel1.relative: 0 1; + rel2.to_x: "elm.swallow.content"; + rel2.to_y: "title_clip"; + visible: 0; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 1 NAVIFRAME_OH_OPENED_DOUBLE_H_INC; + visible: 1; + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "optionheader_bg"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + rel1 { to: "optionheader_clip"; } + rel2 { to: "optionheader_clip"; } + image { normal: "naviframe_optionheader.png"; + border: 0 0 4 0; + } + } + } + part { name: "optionheader_top_padding"; + type: RECT; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 0.0; to: "optionheader_bg"; } + rel2 { relative: 1.0 0.0; to: "optionheader_bg"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "elm.swallow.optionheader"; + type: SWALLOW; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_CONTENT_H_INC; + rel1 { relative: 0.0 1.0; to: "optionheader_top_padding"; } + rel2 { relative: 1.0 1.0; to: "optionheader_top_padding"; } + fixed: 0 1; + align: 0.0 0.0; + } + } + part { name: "elm.swallow.optionheader.mid.padding"; + type: RECT; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 1.0; to: "elm.swallow.optionheader"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.optionheader"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "elm.swallow.optionheader2"; + type: SWALLOW; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_CONTENT_H_INC; + rel1 { relative: 0.0 1.0; to: "elm.swallow.optionheader.mid.padding";} + rel2 { relative: 1.0 1.0; to: "elm.swallow.optionheader.mid.padding";} + fixed: 0 1; + align: 0.0 0.0; + } + } + part { name: "elm.swallow.optionheader.bottom.padding"; + type: RECT; + scale: 1; + clip_to: "optionheader_clip"; + description { state: "default" 0.0; + min: 1 NAVIFRAME_OH_PADDING_INC; + rel1 { relative: 0.0 1.0; to: "elm.swallow.optionheader2"; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { name: "content_clip"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + rel1.to_y: "optionheader_bg"; + rel1.relative: 0 1; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + repeat_events: 0; + clip_to: "content_clip"; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 1.0; + rel1.to_y: "optionheader_bg"; + rel2.relative: 1.0 0.0; + rel2.to_y: "controlbar_clip"; + } + } + part { name: "title_base"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "title_clip"; } + rel2 { to: "title_clip"; } + color: NAVIFRAME_TITLE_BG_COLOR_INC; + } + } + part { name: "padding_before_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_after_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 1.0 0.0; to: "elm.swallow.left_btn"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.left_btn"; } + visible: 0; + } + } + part { name: "padding_after_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "title_base"; } + rel2 { relative: 1.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_before_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.right_btn"; } + rel2 { relative: 0.0 1.0; to: "elm.swallow.right_btn"; } + visible: 0; + } + description { state: "more_button" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + } + } + part { name: "padding_before_more_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.more_btn"; } + rel2 { relative: 0.0 1.0; to: "elm.swallow.more_btn"; } + visible: 0; + } + } + part { name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "title_clip"; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to_x: "elm.text.title"; to_y: "title_base"; } + rel2 { relative: 0.0 1.0; to_x: "elm.text.title"; to_y: "title_base"; } + fixed: 1 0; + min: NAVIFRAME_ICON_PADDING_INC; + visible: 0; + } + } + part { name: "padding_center_text1"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_INC 0; + fixed: 1 0; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + visible: 0; + } + description { state: "icon_visible" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_ICON_VISIBLE_INC 0; + } + } + part { name: "padding_center_text2"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "title_base"; } + rel2 { relative: 1.0 1.0; to: "title_base"; } + visible: 0; + } + description { state: "more_button" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TEXT_PADDING_MORE_BUTTON_INC 0; + } + } + part { name: "elm.text.title"; + type: TEXT; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + text { font: "SLP:style=Medium"; + size: NAVIFRAME_TITLE_FONT_SIZE_INC; + min: 0 0; + max: 1 0; + align: 0.5 0.5; + } + color: NAVIFRAME_TITLE_TEXT_COLOR_INC; + align: 0.5 0.5; + rel1.to: "padding_center_text1"; + rel1.relative: 1 0; + rel2.to: "padding_center_text2"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.icon"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + max: NAVIFRAME_ICON_SIZE_INC; + rel1 { relative: 0.0 0.0; to: "padding_before_text"; } + rel2 { relative: 0.0 1.0; to: "padding_before_text"; } + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + align: 1.0 0.5; + } + } + part { name: "click_event_area"; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + rel1 { to: "title_base"; } + rel2 { to: "title_base"; } + } + } + part { name: "elm.swallow.left_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "padding_before_left_btn"; + rel1.relative: 1 0; + rel2.to: "padding_before_left_btn"; + rel2.relative: 1 1; + } + } + part { name: "elm.swallow.right_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 1.0 0.5; + rel1.to: "padding_after_right_btn"; + rel1.relative: 0 0; + rel2.to: "padding_after_right_btn"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.more_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + align: 1.0 0.5; + rel1.to: "padding_before_right_btn"; + rel1.relative: 0 0; + rel2.to: "padding_before_right_btn"; + rel2.relative: 0 1; + } + } + part { name: "optionheader_arrow"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + min: NAVIFRAME_OH_ARROW_SIZE_INC; + max: NAVIFRAME_OH_ARROW_SIZE_INC; + fixed: 1 1; + align: 0.5 0; + rel1.to: "elm.swallow.more_btn"; + rel1.relative: 0 1; + rel2.to: "elm.swallow.more_btn"; + rel2.relative: 1 1; + image { + normal: "naviframe_optionheader_arrow.png"; + } + color: 255 255 255 0 ; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { name: "controlbar_clip"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 0 0; + max: 999999 0; + fixed: 0 1; + align: 0.5 1; + visible: 0; + rel1.to_x: "elm.swallow.content"; + rel2.to_x: "elm.swallow.content"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 0 CONTROLBAR_SMALL_HEIGHT_INC; + max: 999999 CONTROLBAR_SMALL_HEIGHT_INC; + visible: 1; + } + } + part { name: "controlbar_bg"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "controlbar_clip"; } + rel2 { to: "controlbar_clip"; } + color: NAVIFRAME_CONTROLBAR_BG_COLOR_INC; + } + } + part { name: "elm.swallow.prev_btn"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "controlbar_bg"; + rel1.relative: 0 0; + rel2.to: "controlbar_bg"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.controlbar"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + rel1.to: "elm.swallow.prev_btn"; + rel1.relative: 1 0; + rel2.to: "padding_after_controlbar"; + rel2.relative: 0 1; + } + } + part { name: "padding_after_controlbar"; + type: RECT; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + max: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + align: 1 1; + rel1.to: "controlbar_bg"; + rel2.to: "controlbar_bg"; + visible: 0; + } + } + } + programs { + program { name: "cur_pushed"; + signal: "elm,state,cur,pushed"; + source: "elm"; + after: "pushed_finished"; + } + program { name: "new_pushed"; + signal: "elm,state,new,pushed"; + source: "elm"; + after: "show_finished"; + } + program { name: "prev_popped"; + signal: "elm,state,prev,popped"; + source: "elm"; + after: "show_finished"; + } + program { name: "cur_popped"; + signal: "elm,state,cur,popped"; + source: "elm"; + after: "popped_finished"; + } + program { name: "title_show"; + signal: "elm,state,title,show"; + source: "elm"; + script { + set_state(PART:"title_clip", "default", 0.0); + if (get_int(oh_show) == 1) { + if (get_int(oh_close) == 1) { + emit("elm,state,optionheader,instant_close", ""); + }else { + emit("elm,state,optionheader,instant_open", ""); + } + } + else + set_state(PART:"optionheader_clip", "default", 0.0); + } + } + program { name: "title_hide"; + signal: "elm,state,title,hide"; + source: "elm"; + action: STATE_SET "hide" 0.0; + target: "title_clip"; + target: "optionheader_clip"; + } + program { name: "prev_btn_show"; + signal: "elm,state,prev_btn,show"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "prev_btn_hide"; + signal: "elm,state,prev_btn,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "more_btn_show"; + signal: "elm,state,elm.swallow.more_btn,show"; + source: "elm"; + action: STATE_SET "more_button" 0.0; + target: "padding_center_text2"; + target: "padding_before_right_btn"; + } + program { name: "more_btn_hide"; + signal: "elm,state,elm.swallow.more_btn,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "padding_center_text2"; + target: "padding_before_right_btn"; + } + program { name: "icon_show"; + signal: "elm,state,elm.swallow.icon,show"; + source: "elm"; + action: STATE_SET "icon_visible" 0.0; + target: "padding_center_text1"; + } + program { name: "icon_hide"; + signal: "elm,state,elm.swallow.icon,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "padding_center_text1"; + } + program { name: "controlbar_show"; + signal: "elm,state,elm.swallow.controlbar,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "controlbar_hide"; + signal: "elm,state,elm.swallow.controlbar,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "controlbar_clip_show"; + signal: "elm,state,controlbar_clip,show"; + source: "elm"; + script { + set_state(PART:"controlbar_clip", "show", 0.0); + set_int(cbar_bg, get_int(cbar_bg) + 1); + } + } + program { name: "controlbar_clip_hide"; + signal: "elm,state,controlbar_clip,hide"; + source: "elm"; + script { + set_int(cbar_bg, get_int(cbar_bg) - 1); + if (get_int(cbar_bg) <= 0) + set_state(PART:"controlbar_clip", "default", 0.0); + } + } + program { name: "optionheader_show"; + signal: "elm,state,elm.swallow.optionheader,show"; + source: "elm"; + script { + set_state(PART:"optionheader_clip", "show", 0.0); + set_state(PART:"optionheader_arrow", "show", 0.0); + set_int(oh_show, 1); + } + } + program { name: "optionheader_hide"; + signal: "elm,state,elm.swallow.optionheader,hide"; + source: "elm"; + script { + set_state(PART:"optionheader_clip", "default", 0.0); + set_state(PART:"optionheader_arrow", "default", 0.0); + set_int(oh_show, 0); + } + } + program { name: "optionheader_open"; + signal: "elm,state,optionheader,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + transition: LINEAR 0.2; + after: "optionheader_open_set"; + } + program { name: "optionheader_close"; + signal: "elm,state,optionheader,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + transition: LINEAR 0.2; + after: "optionheader_close_set"; + } + program { name: "optionheader_instant_open"; + signal: "elm,state,optionheader,instant_open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + after: "optionheader_open_set"; + } + program { name: "optionheader_instant_close"; + signal: "elm,state,optionheader,instant_close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "optionheader_clip"; + target: "optionheader_arrow"; + after: "optionheader_close_set"; + } + program { name: "optionheader_close_set"; + signal: "elm,state,optionheader,close_set"; + source: ""; + script { + set_int(oh_close, 1); + } + } + program { name: "optionheader_open_set"; + signal: "elm,state,optionheader,open_set"; + source: ""; + script { + set_int(oh_close, 0); + } + } + program { name: "controlbar_open"; + signal: "elm,state,controlbar,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_close"; + signal: "elm,state,controlbar,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_instant_open"; + signal: "elm,state,controlbar,instant_open"; + source: ""; + script { + emit("elm,state,prev_btn,show", "elm"); + emit("elm,state,elm.swallow.controlbar,show", "elm"); + } + } + program { name: "controlbar_instant_close"; + signal: "elm,state,controlbar,instant_close"; + source: ""; + script { + emit("elm,state,prev_btn,hide", "elm"); + emit("elm,state,elm.swallow.controlbar,hide", "elm"); + } + } + program { name: "show_finished"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + } + program { name: "pushed_finished"; + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; + } + program { name: "popped_finished"; + action: SIGNAL_EMIT "elm,action,popped,finished" ""; + } + program { + name: "title_clicked"; + signal: "mouse,clicked,1"; + source: "click_event_area"; + action: SIGNAL_EMIT "elm,action,title,clicked" ""; + } + } + } + group { name: "elm/naviframe/item/video/segment/instant/default"; + script { + public cbar_bg = 0; //Controlbar BG Show call count + } + parts { + part { name: "title_clip"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 1 NAVIFRAME_SEGMENT_TITLE_H_INC; + align: 0.0 0.0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + max: 0 0; + fixed: 1 1; + } + } + part { name: "content_clip"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + rel1.to_y: "title_clip"; + rel1.relative: 0 1; + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + repeat_events: 0; + clip_to: "content_clip"; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 1.0; + rel1.to_y: "title_clip"; + rel2.relative: 1.0 0.0; + rel2.to_y: "controlbar_clip"; + } + } + part { name: "title_base"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "title_clip"; } + rel2 { to: "title_clip"; } + color: NAVIFRAME_TITLE_BG_COLOR_INC; + } + } + part { name: "padding_before_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 0.0 0.0; to: "title_base"; } + rel2 { relative: 0.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_after_left_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 1.0 0.0; to: "elm.swallow.left_btn"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.left_btn"; } + visible: 0; + } + } + part { name: "padding_after_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "title_base"; } + rel2 { relative: 1.0 1.0; to: "title_base"; } + visible: 0; + } + } + part { name: "padding_before_right_btn"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.right_btn"; } + rel2 { relative: 0.0 1.0; to: "elm.swallow.right_btn"; } + visible: 0; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_PADDING_W_INC 0; + } + } + part { name: "padding_before_text"; + type: RECT; + scale: 1; + mouse_events: 0; + clip_to: "title_clip"; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { relative: 0.0 0.0; to_x: "elm.text.title"; to_y: "title_base"; } + rel2 { relative: 0.0 1.0; to_x: "elm.text.title"; to_y: "title_base"; } + fixed: 1 0; + min: NAVIFRAME_ICON_PADDING_INC; + visible: 0; + } + } + part { name: "elm.text.title"; + type: TEXT; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + text { font: "SLP:style=Medium"; + size: NAVIFRAME_TITLE_SEGMENT_FONT_SIZE_INC; + min: 0 0; + max: 1 0; + align: 0.5 0.5; + } + min: 0 NAVIFRAME_TITLE_SEGMENT_TEXT_H_INC; + max: 999999 NAVIFRAME_TITLE_SEGMENT_TEXT_H_INC; + fixed: 0 1; + color: NAVIFRAME_TITLE_TEXT_COLOR_INC; + align: 0.5 0; + rel1.to: "padding_before_left_btn"; + rel1.relative: 1 0; + rel2.to: "padding_after_right_btn"; + rel2.relative: 0 1; + } + } + part { name: "click_event_area"; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + rel1 { to: "title_base"; } + rel2 { to: "title_base"; } + } + } + part { name: "elm.swallow.left_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 0 0; + rel1.relative: 1.0 1.0; + rel1.to_x: "padding_before_left_btn"; + rel1.to_y: "elm.text.title"; + rel2.relative: 1.0 1.0; + rel2.to_x: "padding_before_left_btn"; + rel2.to_y: "elm.text.title"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + } + } + part { name: "elm.swallow.right_btn"; + type: SWALLOW; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 0; + align: 1 0; + fixed: 1 0; + rel1.relative: 0.0 1.0; + rel1.to_x: "padding_after_right_btn"; + rel1.to_y: "elm.text.title"; + rel2.relative: 0.0 1.0; + rel2.to_x: "padding_after_right_btn"; + rel2.to_y: "elm.text.title"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + max: NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC; + fixed: 1 1; + } + } + part { name: "elm.swallow.segment2"; + type: "SWALLOW"; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 NAVIFRAME_TITLE_SEGMENT_H_INC; + max: 999999 NAVIFRAME_TITLE_SEGMENT_H_INC; + fixed: 0 1; + align: 0.5 0; + rel1.to_y: "elm.text.title"; + rel1.relative: 0.28 1; + rel2.to_y: "elm.text.title"; + rel2.relative: 0.72 1; + } + } + part { name: "elm.swallow.segment3"; + type: "SWALLOW"; + scale: 1; + clip_to: "title_clip"; + description { state: "default" 0.0; + min: 0 NAVIFRAME_TITLE_SEGMENT_H_INC; + max: 999999 NAVIFRAME_TITLE_SEGMENT_H_INC; + fixed: 0 1; + align: 0.5 0; + rel1.to_y: "elm.text.title"; + rel1.relative: 0.2 1; + rel2.to_y: "elm.text.title"; + rel2.relative: 0.8 1; + } + } + part { name: "controlbar_clip"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 0 0; + max: 999999 0; + fixed: 0 1; + align: 0.5 1; + visible: 0; + rel1.to_x: "elm.swallow.content"; + rel2.to_x: "elm.swallow.content"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 0 CONTROLBAR_SMALL_HEIGHT_INC; + max: 999999 CONTROLBAR_SMALL_HEIGHT_INC; + visible: 1; + } + } + part { name: "controlbar_bg"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "controlbar_clip"; } + rel2 { to: "controlbar_clip"; } + color: NAVIFRAME_CONTROLBAR_BG_COLOR_INC; + } + } + part { name: "elm.swallow.prev_btn"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "controlbar_bg"; + rel1.relative: 0 0; + rel2.to: "controlbar_bg"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.controlbar"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + rel1.to: "elm.swallow.prev_btn"; + rel1.relative: 1 0; + rel2.to: "padding_after_controlbar"; + rel2.relative: 0 1; + } + } + part { name: "padding_after_controlbar"; + type: RECT; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + max: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + align: 1 1; + rel1.to: "controlbar_bg"; + rel2.to: "controlbar_bg"; + visible: 0; + } + } + } + programs { + program { name: "cur_pushed"; + signal: "elm,state,cur,pushed"; + source: "elm"; + after: "pushed_finished"; + } + program { name: "new_pushed"; + signal: "elm,state,new,pushed"; + source: "elm"; + after: "show_finished"; + } + program { name: "prev_popped"; + signal: "elm,state,prev,popped"; + source: "elm"; + after: "show_finished"; + } + program { name: "cur_popped"; + signal: "elm,state,cur,popped"; + source: "elm"; + after: "popped_finished"; + } + program { name: "title_show"; + signal: "elm,state,title,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "title_clip"; + } + program { name: "title_hide"; + signal: "elm,state,title,hide"; + source: "elm"; + action: STATE_SET "hide" 0.0; + target: "title_clip"; + } + program { name: "prev_btn_show"; + signal: "elm,state,prev_btn,show"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "prev_btn_hide"; + signal: "elm,state,prev_btn,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "left_btn_show"; + signal: "elm,state,elm.swallow.left_btn,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "elm.swallow.left_btn"; + } + program { name: "left_btn_hide"; + signal: "elm,state,elm.swallow.left_btn,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.left_btn"; + } + program { name: "right_btn_show"; + signal: "elm,state,elm.swallow.right_btn,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + target: "elm.swallow.right_btn"; + } + program { name: "right_btn_hide"; + signal: "elm,state,elm.swallow.right_btn,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.right_btn"; + } + program { name: "controlbar_show"; + signal: "elm,state,elm.swallow.controlbar,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "controlbar_hide"; + signal: "elm,state,elm.swallow.controlbar,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "controlbar_clip_show"; + signal: "elm,state,controlbar_clip,show"; + source: "elm"; + script { + set_state(PART:"controlbar_clip", "show", 0.0); + set_int(cbar_bg, get_int(cbar_bg) + 1); + } + } + program { name: "controlbar_clip_hide"; + signal: "elm,state,controlbar_clip,hide"; + source: "elm"; + script { + set_int(cbar_bg, get_int(cbar_bg) - 1); + if (get_int(cbar_bg) <= 0) + set_state(PART:"controlbar_clip", "default", 0.0); + } + } + program { name: "controlbar_open"; + signal: "elm,state,controlbar,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_close"; + signal: "elm,state,controlbar,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_instant_open"; + signal: "elm,state,controlbar,instant_open"; + source: ""; + script { + emit("elm,state,prev_btn,show", "elm"); + emit("elm,state,elm.swallow.controlbar,show", "elm"); + } + } + program { name: "controlbar_instant_close"; + signal: "elm,state,controlbar,instant_close"; + source: ""; + script { + emit("elm,state,prev_btn,hide", "elm"); + emit("elm,state,elm.swallow.controlbar,hide", "elm"); + } + } + program { name: "show_finished"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + } + program { name: "pushed_finished"; + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; + } + program { name: "popped_finished"; + action: SIGNAL_EMIT "elm,action,popped,finished" ""; + } + program { + name: "title_clicked"; + signal: "mouse,clicked,1"; + source: "click_event_area"; + action: SIGNAL_EMIT "elm,action,title,clicked" ""; + } + } + } + group { name: "elm/naviframe/item/tabbar/instant/default"; + script { + public cbar_bg = 0; //Controlbar BG Show call count + } + parts { + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + repeat_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + rel2.relative: 1.0 0.0; + rel2.to_y: "controlbar_clip"; + } + } + part { name: "controlbar_clip"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 0 0; + max: 999999 0; + fixed: 0 1; + align: 0.5 1; + visible: 0; + rel1.to_x: "elm.swallow.content"; + rel2.to_x: "elm.swallow.content"; + } + description { state: "show" 0.0; + inherit: "default" 0.0; + min: 0 CONTROLBAR_SMALL_HEIGHT_INC; + max: 999999 CONTROLBAR_SMALL_HEIGHT_INC; + visible: 1; + } + } + part { name: "controlbar_bg"; + type: RECT; + description { state: "default" 0.0; + rel1 { to: "controlbar_clip"; } + rel2 { to: "controlbar_clip"; } + color: NAVIFRAME_CONTROLBAR_BG_COLOR_INC; + } + } + part { name: "elm.swallow.prev_btn"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "controlbar_bg"; + rel1.relative: 0 0; + rel2.to: "controlbar_bg"; + rel2.relative: 0 1; + } + } + part { name: "elm.swallow.controlbar"; + type: SWALLOW; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + rel1.to: "elm.swallow.prev_btn"; + rel1.relative: 1 0; + rel2.to: "padding_after_controlbar"; + rel2.relative: 0 1; + } + } + part { name: "padding_after_controlbar"; + type: RECT; + scale: 1; + clip_to: "controlbar_clip"; + description { state: "default" 0.0; + min: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + max: NAVIFRAME_CONTROLBAR_PADDING_INC CONTROLBAR_SMALL_HEIGHT_INC; + align: 1 1; + rel1.to: "controlbar_bg"; + rel2.to: "controlbar_bg"; + visible: 0; + } + } + } + programs { + program { name: "cur_pushed"; + signal: "elm,state,cur,pushed"; + source: "elm"; + after: "pushed_finished"; + } + program { name: "new_pushed"; + signal: "elm,state,new,pushed"; + source: "elm"; + after: "show_finished"; + } + program { name: "prev_popped"; + signal: "elm,state,prev,popped"; + source: "elm"; + after: "show_finished"; + } + program { name: "cur_popped"; + signal: "elm,state,cur,popped"; + source: "elm"; + after: "popped_finished"; + } + program { name: "prev_btn_show"; + signal: "elm,state,prev_btn,show"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "prev_btn_hide"; + signal: "elm,state,prev_btn,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "controlbar_show"; + signal: "elm,state,elm.swallow.controlbar,show"; + source: "elm"; + action: STATE_SET "show" 0.0; + script { + emit("elm,state,controlbar_clip,show", "elm"); + } + } + program { name: "controlbar_hide"; + signal: "elm,state,elm.swallow.controlbar,hide"; + source: "elm"; + script { + emit("elm,state,controlbar_clip,hide", "elm"); + } + } + program { name: "controlbar_clip_show"; + signal: "elm,state,controlbar_clip,show"; + source: "elm"; + script { + set_state(PART:"controlbar_clip", "show", 0.0); + set_int(cbar_bg, get_int(cbar_bg) + 1); + } + } + program { name: "controlbar_clip_hide"; + signal: "elm,state,controlbar_clip,hide"; + source: "elm"; + script { + set_int(cbar_bg, get_int(cbar_bg) - 1); + if (get_int(cbar_bg) <= 0) + set_state(PART:"controlbar_clip", "default", 0.0); + } + } + program { name: "controlbar_open"; + signal: "elm,state,controlbar,open"; + source: ""; + action: STATE_SET "show" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_close"; + signal: "elm,state,controlbar,close"; + source: ""; + action: STATE_SET "default" 0.0; + target: "controlbar_clip"; + transition: LINEAR 0.2; + } + program { name: "controlbar_instant_open"; + signal: "elm,state,controlbar,instant_open"; + source: ""; + script { + emit("elm,state,prev_btn,show", "elm"); + emit("elm,state,elm.swallow.controlbar,show", "elm"); + } + } + program { name: "controlbar_instant_close"; + signal: "elm,state,controlbar,instant_close"; + source: ""; + script { + emit("elm,state,prev_btn,hide", "elm"); + emit("elm,state,elm.swallow.controlbar,hide", "elm"); + } + } + program { name: "show_finished"; + action: SIGNAL_EMIT "elm,action,show,finished" ""; + } + program { name: "pushed_finished"; + action: SIGNAL_EMIT "elm,action,pushed,finished" ""; + } + program { name: "popped_finished"; + action: SIGNAL_EMIT "elm,action,popped,finished" ""; + } + program { + name: "title_clicked"; + signal: "mouse,clicked,1"; + source: "click_event_area"; + action: SIGNAL_EMIT "elm,action,title,clicked" ""; + } + } + } diff --git a/res/edc/vp_font.edc b/res/edc/vp_font.edc new file mode 100755 index 0000000..0c050d1 --- /dev/null +++ b/res/edc/vp_font.edc @@ -0,0 +1,26 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#define FONT_NANE "SLP:style=Bold" +#define FONT_NORMAL_NANE "SLP:style=Medium" +#define FONT_COLOR 255 255 255 255 + + +#define FONT_START_COLOR 149 149 149 255 +#define FONT_END_COLOR 149 149 149 255 + +#define TITLE_FONT_SIZE 28 diff --git a/res/images/00_Option_header_bt.png b/res/images/00_Option_header_bt.png new file mode 100755 index 0000000000000000000000000000000000000000..659fc232d0bc0147d1618ca3c862c8d488b53914 GIT binary patch literal 3040 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 IM6N<$f|iw?q5uE@ literal 0 HcmV?d00001 diff --git a/res/images/00_Option_header_bt_press.png b/res/images/00_Option_header_bt_press.png new file mode 100755 index 0000000000000000000000000000000000000000..8a05504a2bd6179045ee247cf93599ce24172ce5 GIT binary patch literal 2993 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 literal 0 HcmV?d00001 diff --git a/res/images/00_winset_control_top_arrow.png b/res/images/00_winset_control_top_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..9f31c89edf61bb3f28683b8378f5cd26cff9ae0f GIT binary patch literal 3163 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 literal 0 HcmV?d00001 diff --git a/res/images/12_music_player_sound_path.png b/res/images/12_music_player_sound_path.png new file mode 100755 index 0000000000000000000000000000000000000000..771ebb835a70c58c5aa6a8c99745df99334ea851 GIT binary patch literal 313 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 literal 0 HcmV?d00001 diff --git a/res/images/T01_Option_header_bt.png b/res/images/T01_Option_header_bt.png new file mode 100755 index 0000000000000000000000000000000000000000..94b1e2f5e5f7829171f8742daea0f1d20ab3fc7d GIT binary patch literal 2984 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 literal 0 HcmV?d00001 diff --git a/res/images/T01_control_icon_reduce.png b/res/images/T01_control_icon_reduce.png new file mode 100755 index 0000000000000000000000000000000000000000..fbdb90624bfa6888587ec3a519573348b2c4dbc1 GIT binary patch literal 4817 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 literal 0 HcmV?d00001 diff --git a/res/images/T01_icon_soundPath_press.png b/res/images/T01_icon_soundPath_press.png new file mode 100755 index 0000000000000000000000000000000000000000..9fcc466b2f533a57a092fc067e45d6e3da963be2 GIT binary patch literal 3681 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 literal 0 HcmV?d00001 diff --git a/res/images/T01_player_progress_bar.png b/res/images/T01_player_progress_bar.png new file mode 100755 index 0000000000000000000000000000000000000000..2f2545216b594fac728c49ee0476a62b64072005 GIT binary patch literal 2802 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 literal 0 HcmV?d00001 diff --git a/res/images/T01_player_progress_point.png b/res/images/T01_player_progress_point.png new file mode 100755 index 0000000000000000000000000000000000000000..0e8c5c544f22f44e450b688e3705438fb9c792ee GIT binary patch literal 2825 zcmV+k3-004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( zX+uL$P-t&-Z*ypGa3D!TLm+T+Z)Rz1WdHz3$DNjUR8-d%htIutdZEoQ0#b(FyTAa_ zdy`&8VVD_UC<6{NG_fI~0ue<-nj%P0#DLLIBvwSR5EN9f2P6n6F&ITuEN@2Ei>|D^ z_ww@lRz|vC zuzLs)$;-`!o*{AqUjza0dRV*yaMRE;fKCVhpQKsoe1Yhg01=zBIT!&C1$=TK@rP|Ibo3vKKm@PqnO#LJhq6%Ij6Hz*<$V$@wQAMN5qJ)hzm2h zoGcOF60t^#FqJFfH{#e-4l@G)6iI9sa9D{VHW4w29}?su;^hF~NC{tY+*d5%WDCTX za!E_i;d2ub1#}&jF5T4HnnCyEWTkKf0>c0%E1Ah>(_PY1)0w;+02c53Su*0<(nUqK zG_|(0G&D0Z{i;y^b@OjZ+}lNZ8Th$p5Uu}MTtq^NHl*T1?CO*}7&0ztZsv2j*bmJyf3G7=Z`5B*PvzoDiKdLpOAxi2$L0#SX*@cY z_n(^h55xYX#km%V()bZjV~l{*bt*u9?FT3d5g^g~#a;iSZ@&02Abxq_DwB(I|L-^b zXThc7C4-yrInE_0gw7K3GZ**7&k~>k0Z0NWkO#^@9q0fwx1%qj zZ=)yBuQ3=54Wo^*!gyjLF-e%Um=erBOdIALW)L%unZshS@>qSW9o8Sq#0s#5*edK% z>{;v(b^`kbN5rY%%y90wC>#%$kE_5P!JWYk;U;klcqzOl-UjcFXXA75rT9jCH~u<) z0>40zCTJ7v2qAyk54cquI@7b&LHdZ`+zlTss6bJ7%PQ)z$cROu4wBhpu-r)01) zS~6}jY?%U?gEALn#wiFzo#H}aQ8rT=DHkadR18&{>P1bW7E`~Y4p3)hWn`DhhRJ5j z*2tcg9i<^OEt(fCg;q*CP8+7ZTcWhYX$fb^_9d-LhL+6BEtPYWVlfKTBusSTASKKb%HuWJzl+By+?gkLq)?+BTu761 zjmyXF)a;mc^>(B7bo*HQ1NNg1st!zt28YLv>W*y3CdWx9U8f|cqfXDAO`Q48?auQq zHZJR2&bcD49Ip>EY~kKEPV6Wm+eXFV)D)_R=tM0@&p?(!V*Qu1PXHG9o^ zTY0bZ?)4%01p8F`JoeS|<@=<@RE7GY07EYX@lwd>4oW|Yi!o+Su@M`;WuSK z8LKk71XR(_RKHM1xJ5XYX`fk>`6eqY>qNG6HZQwBM=xi4&Sb88?zd}EYguc1@>KIS z<&CX#T35dwS|7K*XM_5Nf(;WJJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@ zqL5!WvekBL-8R%V?zVyL=G&{be=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW z%ue3U;av{94wp%n<(7@__S@Z2PA@Mif3+uO&y|X06?J#oSi8M;ejj_^(0<4Lt#wLu#dYrva1Y$6_o(k^&}yhSh&h;f@JVA>W8b%o zZ=0JGnu?n~9O4}sJsfnnx7n(>`H13?(iXTy*fM=I`sj`CT)*pTHEgYKqqP+u1IL8N zo_-(u{qS+0<2@%BCt82d{Gqm;(q7a7b>wu+b|!X?c13m#p7cK1({0<`{-e>4hfb-U zsyQuty7Ua;Ou?B?XLHZaol8GAb3Wnxcu!2v{R_`T4=x`(GvqLI{-*2AOSimk zUAw*F_TX^n@STz9kDQ z$NC=!KfXWC8h`dn#xL(D3Z9UkR7|Q&Hcy#Notk!^zVUSB(}`#4&lYA1f0h2V_PNgU zAAWQEt$#LRcH#y9#i!p(Udq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6 z?<+s(e(3(_^YOu_)K8!O1p}D#{JO;G(*OVf32;bRa{vGi!~g&e!~vBn4jTXf06IxT zK~y+TWBB;-(_ruz?Cak{)5b7VxTe@HIVWE9Sy_LFeD=cMw1O0frh4q b>R|`~BhF5AbZAKd00000NkvXXu0mjf?JQ3z literal 0 HcmV?d00001 diff --git a/res/images/T01_sound_path.png b/res/images/T01_sound_path.png new file mode 100755 index 0000000000000000000000000000000000000000..d4f38430caaab0752053a66b98313c36d6132090 GIT binary patch literal 3081 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 Th#9g>00000NkvXXu0mjfQ@YYe literal 0 HcmV?d00001 diff --git a/res/images/T01_title_btn_press.png b/res/images/T01_title_btn_press.png new file mode 100755 index 0000000000000000000000000000000000000000..49861ed6816e1d36764e2f327b59ebf50dd904da GIT binary patch literal 3126 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_02.png b/res/images/gallery_loading_ani_02.png new file mode 100755 index 0000000000000000000000000000000000000000..e71d4918f01a1fc76810251bb70b3faa42690865 GIT binary patch literal 5234 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 N002ovPDHLkV1hP3>I(n> literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_04.png b/res/images/gallery_loading_ani_04.png new file mode 100755 index 0000000000000000000000000000000000000000..18cc497ee1d1a6fe07eb27a110676f8a2c1f199b GIT binary patch literal 5350 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 Ef`9@Qxc~qF literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_05.png b/res/images/gallery_loading_ani_05.png new file mode 100755 index 0000000000000000000000000000000000000000..036c49b5424e77202c5e962cfb50ad58d9b2c8a1 GIT binary patch literal 5285 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_06.png b/res/images/gallery_loading_ani_06.png new file mode 100755 index 0000000000000000000000000000000000000000..3cb5e33da0286eadaf7ed349a32f710d7c900d4c GIT binary patch literal 5333 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_07.png b/res/images/gallery_loading_ani_07.png new file mode 100755 index 0000000000000000000000000000000000000000..fae06de739cf948e7a7395c4bd2493e1d54416aa GIT binary patch literal 5297 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 Du0QV` literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_08.png b/res/images/gallery_loading_ani_08.png new file mode 100755 index 0000000000000000000000000000000000000000..70eaaf013ed6361db1d88be45becbd19288f7117 GIT binary patch literal 5426 zcmV-270v32P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000VINklZ%q}O8PCoR_Y_@1MdUxx6ZYSY3KZf*>3&5!tgo_ zLR}M#YLnB+fOiR4VfiHrj}s7XE$w;tT6mX0w(XPJJ{j|wihAAxnrf514qQZB0|vk* zYmPes`o5Cds_OM-QSgfZKA>5f3nVco!1h@gb4;PWL+EnW^8}xZN~urH0PGsxdGN%@ z?)RMn_5niemyWrYX0_*?=Q=Is8KW9^>*=dzh9oqf*@%l%eFIPtn z1}NmRl$+l!l?T2LaOM0N;czi=LDKa(VF7Imwj0XgGgB#9TlhZUTVs01e7hZ(Z_976!cY1RdtPp?*pFJVBZF`eC>_1QZ^eFBO5POhQAjE&id3$%iz<~ zw3f2|HMKPjK3;hE_OgOr?k3>-1XlpBrfHycYA&stqesq&TD~_8lcuz{`X_xwBwj3rIZJ9 zEHg-D?Q0$hm2T;&)k{0Tzoaaj7`-cj2JoZ$)XZ;z?*MZJyOwBM2Uau}C}Q+{S-F?o zfPWHr*i!F^CKs217wc0qbAb#LH-Tpy$37~hJW&AjrgAY&j{=z>s66h-19%-c;sC6F z*%0>St=e160<$r$WmiGaSJ+y~G;O+TsbmfO3!bU>72rkXPE73?;HKqoy9#nGVINi! zBsybR0zU%OBL3MHh+cBQMhG#d{JE`7ODT^Q2>q7DwL~qwsw}k6O+xfb2M_|#;)Gtnf#KkZpTdl~pog5$aZ=mFpa#kCFfYqb@<^vBUo0^bRI z&>@pT_c90kE=iAs5U< zh_fEr{6K-wZ+QgIvT`kL0snvjboBLWE(w^R9gorGMY@(yD%u92LzX+*0lrgZmae)& z+twX%Epgg>x?n4p7NrtCADF)|TTTl+&UZ`T%???&uQq?KKy4nDb>l{ihT8!i4&GuZ zQoWWz$BxHn^OFTy`HDxKWh4#oLEt@xqLl7d7JV|x6jmOW_Ma$Fn{RM;aVzS}tMeCT zOG$y(4L&OB!{5xRS3-zWbYI;(Y-^6%O1Q6@6!=3H8K}QLpK-@ruH{gH+Po2yb%vTe z5%9eRR}y{xc9y+T+Wdts)aGlpudHo}Eqte=ZUQi$Q|G$1Zoa9(Eg4))V&FAPk`wN` zl1HyR)BYl~`9@5AWiX8_bWK=V%&TW=NY16ri>RA7W3;$P0{kK3FOFZxxr1?O|H%Sf z3Wn#*Uzi<8Q%jMSz?my>rOlsryyfc!0LS6O1%~=~k`bT6r`{=T{<_1;bNxCVTOuEB z3zkLCd$bM7%@$z;zMzu^P1i}t+se-xRLdOhvC%AnyG}r23nxa47X|$VU;=mwcuEK{ zp?rMN7ET=SiX(M(ft3VTk$Sbr%!H1#`3tjiVXY;L<9oEKGT7*JMyD*a0l$j*nnAsd z)7!18d5M-mgUj0F^r|m#pElM9o?Pv@-gq@8P}X`J_)tucTu%yo!66AHa9@uDAI5wI zR=91Zv2f`~?E&`pDC`j}!z@KWhp*R?0>4Q7Rk8qf>sS)`a985ftH8%S z()&hI;A;ef4APO-k8@{asF#A}Aa^edrEj-tlhe&Ksr}y_DSp@v^%(HI#Lr+}N?S|$ zmqVq5`zFX}<%KS6WrCqcVF;G`wwM<9qQ#f%Ctv`0yhni7RKnx*-L=W-^|Zi4w;~Py8LSv3m~lOd--SMxu#{mt z2|RQym+-qzWe;!+c%aK+?;d4SSMFX%CDA{o1JHk_f@9TE+%gSd90DE% z{-(C|96(nI7Dszn6{1?W*P_+0sM-MDXa{zufa}nYX;y1mz9{PJ2Q=_+tMbA1j55Xp z1m)EVTbHhmUaBTFe;qz<0)J^2b|-;{(0@U&#NK^|FYgMjRe}NO3Dv20)Yi^CqWcL- zs&(b7qp?L;o=3m;3h>WP!0t3~9r|Z985lR$QyR4JqbjYI%HnS*Ww5MuT>sn-Z5!uK znb`MwcH7N67L*&=>=d9Z?sBpY{89zQ!}#AxN?@MevYR`z8%)2DmL=1bF<@;cJ$%nx z(k!wl;9)yQu-MoU1x;FNFmauCy(h_a>aKeQ>3>^NL3}w2C|Tch<2vwDf_XXX9`%eo$HbE=xf3xy6k12#or^ zMS{_pOA31KDQ;119r%aZMhIpnAh{izs-8St$!2hKJY&9e(M9@ czU}`500j<{9 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_09.png b/res/images/gallery_loading_ani_09.png new file mode 100755 index 0000000000000000000000000000000000000000..7fb390c187da6b83e4433da35fc7be473cd72aa4 GIT binary patch literal 5452 zcmV-S6|?GzP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000ViNkl0RcZ0pi&irLoSd2MMX+Z6eKZ4 zaij2!bGUJ$p!f&k0*;jBgL#CD!=uV6UU?i6$09hyU`uu!KO$+R)oyc`9@K7i_dGN^ zv+{0NZLL--?QVbOJKz5Oe$(A6q?GhqaV_X0=mYNq@3;I~)%MH9`MGZWyu$Nb>4VY4 z6TKTngtl$x##|;Yon7t9;ns7 z2aMOJW~ooj${1BgpoOJh0k8uYQ1_JtuT_qv6x4=*>1!8XcxY_@u^$B0p?%R4t@V`$ zfM*k0g>)!fKP!X+UWwkKX!Vz=@KN9i;QPR1yX&8MMu!bhsSZE0-dy^MIs>G~r)2^! zmzJ}ks+3cWLnBE~}E22m__BecgACB7EW+|CNG1K$N6QA&~~=vH(2 zvQrI%yPq@^E;ELVw!bwGoX`{>Y)9aaDA@aas$RPO#yK~Z;DpB(l2{0yuu)iEBVsb7 zBAaaidvRU7@&2WAwNZO|Rvp;=4d6L5VlkqZ{{vmPa7url!0>C4GM=xf zai^gUW>+b^4tz`9C-qwiuyXUQS3H0FY{t(c)gZX8211|uMGT|iyjTS}!ybx>g{5(8 z057(h%Rd5KdGSFh<@6RmpH$%2)IsohyL51><-x0(6YOtluwA|>jRETqz)SV1*#>}= z@+9D@`kVm1os&4$74(YM|F{xD^n49i-io~hIl`76h3M^V;Ag;#O5tjN6m!50$N$Xa zJk~^tU-iJVd4B-x)Jg<}0v`gt1`HP}eMXsJK#dAvwIYEZ13sMaZxkAzlV9 zx@<*CIod(!EiL>@Qbnvf#;x3e*MWy)ibv7UR}}1p6tC}7`Efei+7_kz3T8uT{X7fs zuUf)88~7{0FZF>jVVmnfOrF-)R}$nA(E-@mN#I{d=-Un8Oa|BpAua-E9Zyf^5R<2Y zP6DMz*=X*-M}W`SGDVBhf0fck%yzP5l}GlnZ1h(+LdL{3mo&g1Rw1CY6oPcve**r! z#m*KPlgACDtB#D+JOH&kfsX)(9lkA%q~?!X?WGXnMog+-B=jgwkE^{Ts-p)f)NOks z6a1MRJ9@gLnB3M@wEhR41gVw>@IhdT_=5kRftz{tP^J21#pE_WUrmty55{?U65xk4 z@AjQ`f9*g=ovD7oUXCL^H_!SYE*VM++*fWz!ESV*lid)lm~|Idx-T>@&kTG7m@q;= z6LtgmODB4$QvH`5Pd_T9JXoU2UD@Z3#re5PR^XEkMe9fXO^3e~q4Jp$RNiFsbx~m% z_c8(hbb><8-#XmM=RMDzp!n8cb1B!n4P^m7Xt5LXXx{)9JK4JgG5K`Cz@sZhuFMl) zU~zsfNDF+zaZ2g%|5;EcPj}Ja3E{O-5mRfarUib$qwJ_%D57^li03`2{_zrkuR4@1 z;(Xi(e6M4m)Rq2Dft_^5ZX{yWf?3*)>_I3J>VmimjS$+Vse|p z@0iQDI6pU-6!@S6vfgeMOs(#V66%pg(sXg2^ z3A4N8ABwHqPCb5hE)TKs)l zT_Gw1w*EMFwVkl-m$EoNcQ5dy;YB9!-vh7HyX^zO9)}>K`~OZ%&a5R-_@xAc=Wcqt zRV`w?L(wMeq?TfvRNn`_Q7aJ^C&(0~T=fi=(m0)Zu?={_L4jj|tq=GuM-3$czqiMM z53+fVN}%0R1HVRmJ$!$U!XCz6CDhwmTHu$k&-vED-`B$tiqB5KF>NGH;lcwO;G;bZ zJaE)cqT6a(;H$>KY0Er!^`MszstCoGS*}e?&a|`CQr>VVTfaZjW5CBO-fa$=x3knz z0N(OMDbeDigCtuzcsI0)I;#Uu{X_!qX9a#+dAZ9{qImRhj{qMxGE7@?vo~!$=d}>WRUhvKmG5Emrer4kHZfPik^o-?{^f{P^aJo& zJz=v@l@UL)>y#okxrUMMN>+sazNfAQfSrS!Y0 z?Nev2FYXqEQ}LR40f%r6&zi%_^`9S5;O~}<@*Yd9ZGvwlQFmJ4Yrw0X%v1mQOKku0 zZ4LOC<@Yx4zK)|h%wrwDh55RMdH2fo1O zO%QSi4)Ay2vcmK&`4M4`^ z>)>Bfr|v;@8^yj6qYt!8?IOm8ZmYuEHV(gKam|1VPRLp)$fxcCSlDi$a-kM5@wu`bO zY^<%3mO@(BH_`u^^KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000U&NklfCM6^Fk&s~l`e-X!DTL?JSSI4Q?a_#u#u5DE%XW#@$eFI4f$ zJFoC3@JA3HttzOnhH|kLTOg{06vRp_D4bY|Y|ECNXq&z~^lj_v>Mq?q-901CoT{#o zS{iBQ>oe#4&gr`dDJ4Uz&T2yhL*PT;Lo3c2wv&r9R z3E2CAW5D>>v9m8W+M`ndo9io=Zoc>D?*X%uC(lOKXpFD}ma6-pcEYAulfj_z3VV;PV;;n=F%-#~r^LbynvbG5iyW(l8Pymj5L@ z7u6Ml8VY=&NwrZz2>GhTt3#&0*=6A0z+00i&(BLKzYToN5kKz(=5^=`mo7*nJk>lQ z%$2Z(reRKojmQZ4=SPO$*1n>z1woCJxU;i!u zI)0}@EPHN}jOTd09d*==q$?bsLOtKLfwgX+Hwu8Agb^7iG!pv{@KfMshW~RBc-nIQ zsV-i7$KvrJ6Wv1Z26!8ILGx^3K)2cNm1k$QWls$6#-u8A>K+!tqVL=4lbN|P?M4>9 z0E}5=n6R8%1%8whHo$C2z;$om2xxY*138lCALRx9Ip9PJ*g~m}mw^9v0mP|Pq?C^p z1U*vFBTv#b8(^&}Ldt{!4*o{J0ImW*4kgBJfagq{A?U)Q--YE9&{iQSD$~QilCnf! zCABQ0dUrcTXYLhXu>=5RNy9Aa#n%iQ zDH8Z7@JIl(R7&J;CB6CC9soy+=b_ebD-F+D2JiMsq{Mz!;v26*8v1%Z!gD0nDgt;L zn0A2HWA`62mh1g04MR!PXTeyW2KXtXF=d0j2E1DGo32tCxIYBlvHTtybXOy^@ADFP9!o4$xSfo2lgmKJDl!=;7p2 z+1}k_X=uLxP23|6g2^)k{6SAio7mr}&SrZI93!l_I*QFaz}vvR4$z60-vr*T@Xhv8 z8tTPRWP#qbhaXK*RnAeZ^->z@wrL3`+v54++)Oho@Q*qACc3>{G4NhX!^Acm<-HEw z3f$KZKSFpk>i?>w9k`)9Rxxl_PbGP5WcBdTK(=0_H`Z%usK;_ViL;&+xX;67#mTat zq@fPnSH@?K;Wq89Uw~UZ0zTU(z@?#3YNY6iyMW(o0d88afcJwm)I$mu=mHRnb2E*! zNmDqqw{9!_2E1Zv*a=je!sgJmKp1g(crRyz^@}w0-RBf}3Ln>alZYNp!BbtsX^8j7sI^(RF1(d=F!#P@+8Xr6u%cqY&@FVn+?Sbr5ZzO47Cg{mHqdiRp7|X;jJ*JBJ?243+30SR<4yP1tD) zAL)5KFa#dFi=QcmFF7jBB%U80aNsSEBosI%*!qCq3MiC82j27~PhnJ|seoS#s1XSq zA5hpMMmcY@jjX`0SmL(X#F`plg`#_O&En;&S%JTceRi;ZJTRcZKVkrumhh6*3_XJhCup21yHa{p%@mOfK4` zR#V}m=F#2)&x&&);44b4=%CGoy_y5$ZI9SXuLw`AH&qWRC+ssFGz3cPqA21n_m@r8T4jc4B9gYT2t*UYc0q6i<01oYe2Gt2eg}D0N*GV_& zD)ZFuf2cq18bXnL-y&WBVYf=fI`QaX+fu3Kt+X|xRw)!Xz;BI&iK7xdNW8{uYZt=) zINLjdX8hK@{c2V*pVh9jH5f-Y`YTd{{@gAKFZ+n+HQnPV*=q*;B{DAHkavNa*N7J{ z@Wt^2{vic@vd>{308SdPeYeo=kYfaKH%l=6hON6oQJ^qt0bc|j>QmUq73{i0g_z#H zLC(nt-2h(){>aW5x)>KB(!M?eJgekZKUiBi!EsAn;aW7fL%fJXr)uCyJpZNEYmouj zh|;ystKLhqN1z)@g`8$cU*vShh!fpV+R&l!R0S(*l0XBe#Rs6g{Jga%Rq>Ax4TOGeNn{eo( z&NhK}@Z8C%8n_PqDJ@3(miy2jo5b75+^4etyXsi#;`NNHKFDF^1kw?AZDRvr`$EL? zMZhi^cmn-p;;!LjAiUTr)IloF%C?P| zetYZ+@J~wI=dG%3W!_L;^DyzS3W<9U2otc)b47~K;abC7Sk%({#LH}V$_7#8#z}XG zSHpi3_!RM6(1zz@uE%KMxF8}$Sdo?slqi-(6{o9OV5cX0vE3nF+i+G%!TYfUp}f&nWgd1YolSZ-6+M%Q r;Wq2l+He!KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000TRNklDigxwf7@9W1A${SWDt8N}LD*iHQ^=4iGL`kPvX= z#+fUB1%Ct*oRBXd5CSX&;gBd8A{>QSCN>DXOJeUj&VJ0!c5~>eOl?tB{W0A=y*u+t zt?uoa>79A%?O(n1)<=stj+t707EBRLflq-?tvm~DCpT_hZR+~mv<2B*=oLGMR1-F9M$jo{@4PEZ!V@Jp1F1+ID9+hFIFh1l4;tR>$Q9Vg%~Nw4l^lnbASi*(fS!z_|y$c?B2eAU2D z17CM&besv^;rAYTf2%!jm6Ryje^&!1G8UA&egGU)rSW0KUj0%IxFV-C2obcpb`2Mi zUYCuUExB!~YXsr!E0!=)*}!tG*pLt3|82?r zpvk~{6856yhuUD{Sg{;43tGwI5z74tp-CJ491U(!R zY_;D7-jJYoE3Uv}OXVwaL_kjH3cN3eQYP>o@Eu^r6Gz9E%Igm`fp&opJf4oFfrR{x zeIN9ylUF_9+tRbGp_}E${uB7Q)av5Y;&{pP^0f??h&0U(JW-SBEHl#63&rcB0Pg^= zYBFN0fK2#*l%8FNJy+6oBCW-lWrJ*V6QIVmmP7oO-?p|U&wu3wpmcy2O1OK@6toY{XGAqNEh3qz>8!{ajpYDsR;IY z=Y224^${x6eGhCix(V|#ECT#%j^?)6kXQ$PTI9AH6?h4@&;O@$UEbcV68MYK!)+}` zy%6?*Useda4$IP{S1EvY6~GsO=Tl@vy>_)`&DQO`665uKkCz8VT`0;1{(=z##+D7> zH5qGHZI>zruA-NLry(SasHHUE3&5(!qm|u}!0WK38l@%9@Y^$0pg|7rHa*++kAKDS zw7#bir2pM619%6x;DD_|{}b?_0dTHYa7`7X`?~!^7A?;L{An#$;;JzBNCw{2X;&QQ zwy0AB!3rG$dJWAN^AnJph~dVH{P z^J-8O_=S|pG6HVa?cF7$W=HXIy+_|QekLpm{9;N2r>aUS&7K>xm#0;p&S)h}iB5W+ zoJlOBlK(PU7HJivtBbCXho5q^B=zH44Fs}TQ)9^6AG&e#YM2-JV_IpNo~`!d0)F20 z!U(C^A|awJ$Kq9wFvY_aSYf%X0RGi9;5FHS0a#>}l^`V~6c!m#`}dh_i!3oYDUBm9 z@K0F6KplD$E6ew42JX}Gc3w#_2kn^A%7wi6IDwMxSI|< z5+YoYip#@i9E}__um6zAw#aZ;SF1C#q_}ROCQr_i8fp@P10fvOERuY}OY7{=NgW-T*o~p|EGL z_uT8y2YG@22YWA%etd31fp=3vLVRw{6nGjLU;lMLLa-=c_z>lLS7X-3-d3E+_l z)b7wCDf+hGTUm>W0Ke^NMJec?oiN}hw2)93O?ky;yGU55fTuO@&yjI#^f8IOXB~MI z9r$ih;17X&o{BS;x7g~006%GfwN;$^y_L0tqQC+E=FxDqtxkZK2NJlju+s}*r)W!4 zmz6#2nL>4LW&*r?fnmZ*IJ`RoJ{lExpWzH**BT=+NyqMS&98(c{ix>pSf;G(kTM59 z>y(r09A0Q9cH~(uA5-9udKx(T_8^NcWwD1O3&{8)mY8Jl=d;HQ_Ai5=jRDPf>4 zC4;ho1N=qC zEKSmJB&N)0Z6j|<=C%94Tcmd>>ClggymWylG}x|)M4j8jk%lc3IKW>?7H@PlhVbjmYFqm6UJG^-B$03NY;TF zX%cW*OQCK8ze@=NZJr-W;1}d=dW&jCz|P6m?~()<8GvKsygB3JK*An*711&m`&G~{ zGt3(LM&Rn_LK%)dE^`uhNfs&lV1)0pC;=}sT&7iDt4sfGuBkPu_q`O@Wdm2xe+_(z z!;2#L#!cE?1Px&aRNLPca-GRb_*494*W6)coijn$-hcx7{)&q>3mdO=5l{;rAUL=gP~t0A@AUL{-~fMIjp`dH>3m z*sklbGH;XgjXuTU(OSY0LW-0K#~1n7o(E*ROZ3m(Bbmm2P&J4;ADpyJvQ*PM68vd~ zBT!wP(`oYKk_lU3n4jC1QP6tc1k_OhZh~*iQ1A(c(^q2c_I3exNssUpnqEO}%dqo) z9Uk2T;CeK3OKz%R@|Xr+I2tIfD92YA52S3|XUvPCHRbV++rU5M)|Sv8k>Oz1xC2~L zf)=+AWCLo8@yy+9JaE(V?_tk1pTxeP`ha1oxX~u2k6EwRrVpW>0-pk(+7$TFwf_wO XvF#uC<-*V<00000NkvXXu0mjfIXDLs literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_12.png b/res/images/gallery_loading_ani_12.png new file mode 100755 index 0000000000000000000000000000000000000000..b36421a5235ee85c33b50335ffe9fbf4f5c5b245 GIT binary patch literal 5348 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 C!uz=Z literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_13.png b/res/images/gallery_loading_ani_13.png new file mode 100755 index 0000000000000000000000000000000000000000..d70d60934fc0837084b8c5638dd5cc8f3555c508 GIT binary patch literal 5435 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_15.png b/res/images/gallery_loading_ani_15.png new file mode 100755 index 0000000000000000000000000000000000000000..1de8adbd813e51263d802705628c1b6595cd85f2 GIT binary patch literal 5536 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%0APZ{Wxh)MCF zwS4Q^g(qA1Aedt6j zl|;-xR}I*qt8&)c!)+cvE2Bfg$lgQ@k7uGaCrY1mXgR3ySgrOyQp)d-Hp6CKSJFC i-U8mT7Vzxa{{{dArrG&gvdpRg0000KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000U7NklREaeCKz*=gc{0mDZYWG%hk-1YO`=;N3_sa<+r>S5LR<^&YYu zQ$P{8)hZV`GCq|Ic$1?S*e`Go0DEPx48UPe>MdYN_BVieV7;Xk-h>zejsnMkk$`&R zgf>1qBHM&@)NZ`G|;{tiV1F(*9Oa+end-LZJU=;Y8DE|Z5);j_C5HKl< z?lZvHa&r(g0gzFjwH3q&@B;9RDE@pSRiA6HqQ5MvRu*O2z`9b3ikW6Ime2d=?*pEc z?E~O#seE?@@JYF`{t(4x0tMizBvnWbR|yKmd6bJ!0lWpwwOhky68N?O+or6rw4sd+N1nHxM_WFtEPLgslt+Q@ z1JAaL!t=n_frlK5jAt1bA4B&Od$|__IK7hnTZC5f$RspA)s$75G;oe6}`}{g$MYc8X#Ex^}o2|NdX9 zC-5%<`z-1X=IwRhY#YKhp`S5wx(>094<<=1Nr30^`m%Kha6jG#?$X{d2mC3fbNNzS z*OCPIq{RZ-^7uc2o9vFb2ApGOPh?Q#{lGWUY-tVxj}qPMcT<4ZEk-A%8x8&3+?6-R z#FdySMeW)5`Nwm;!v`ysQn9#vtxzi7Jqs+R0sKizKZv$ep6A(}@h0#?|2_xzAAh=k z?~&(Krl+vg8X7wE{L1YM*VdLk`bDiNC66~o#O$=!meleuU}ZPb9-Ww81kMfaKmPQA zqc8qspfEmV!Uj+(+t)ul_JgQg9!KFv9UW5`1+W2J+@=EDXYPKt&1YFu}ptaT?1E=D`1}GI5 zUI#ADUp<|vR^f+2l47AeQ&e0@~g$!zx^Co8X2FeR118J@Rtcb@OFk= z0DcVo2q+}`-|}2}W97Bt%FJ(97p`0%otQ2~%_s>2-Xj;_N+nuc$wCK${%mu7`Iieb zXMYVWk4{W)DSH0u=`GuA8@3zt0gt)p;;9;Ha8o1YDpvS~RpRD5F-vM5$0%AKqN^a-WZi7Hj?L$-D5DZ?U0D!eDe4yslFo`RxZQA)j&#-(7N z(NR-MX~ib^sV0MtlVV~6clCLzW*3Ck`l%{l*9)}Gk*I2Yc&jRWs)ZD7gI*KxsOfmk zh{YBG9XF@Paw)+R*oL$XGzs|WkiWfZxQ=?mc0moDRpA1D+XC2xuGu~XuwkK;`UIGk zMv4jgQKi)P8mMaJNGn^wN5-diWC3OCzm?S_zGX4;X6fCa&O;(vJhB$S>HzSKBq?Pn zplD_Et!TU%W1SpPQ_mB%GyzsECos282cC&YEs23ITU<%SPFfi$lbxpF%wjG8o)P=Tpm=o zSqNiPIUTx9)Sbt^u9gbqZe1&IfR6$vs~9Q8JbrAK0?!lO9qSL>CJo?4?$1oKxfLJ! zFiD5{wg>E7L`&1p1UfC?;4P}Sfx9Qnhkk^eOCGheE9r5-4vx7j#W`UT;G1}T;M!pm z%@lJCZ}vpHH{bh06ivXH=(K@@_m*YF;#4YupR>St8(T$x1)vO$w>fO@72HTtib>H2HFm|^4@i0$XcO33NrhS5Z*+pLq*8C- z;LSl_v^0QhKHXRPP#ZLC1`XIM!U~qDV$H5vmSDOhY7hEx+j2}9yp<>(YEjtz0^8P@ zv5g|GNIw&e1imR&(bnvDsr?|{VvYG0aw0?AU&q|F#-f?awZPVm1`gf`+W#8RT}n6M z4+3AnTi7Mr{pQ-C_G5Vc>DdN?-h=n@dw}p+ z3$95Bl?UatV5be-hkglf3F$qSoA4{4ilyP? z?{j#QatreNy5!B06o#!Cot6K~NKVd%C>7k(A%oXjGMpH#2;5i1WwC$#;e z`OtcXpJHx0a-geg!1bjYHbpB(CzGo%Y=x+d>s_iB?0PHQjGK7V#2@DVl=8S0stvlb zKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000UCNklOQ|DBls#aQS`qn%v^bz!d_ks5t|&gUvHNW zIX!bB8}K%;BLa64*f0ASu<}5U_e;P>vcE3-t+rNp3v3^7Lbf9oSOw^SvL6tbY%`Yn z{|U^=m(i2J2Lx0ndrz-v$2O3gs7Dq~^zg(*j*NfZ>3h zq;%gGp*$_%v%odr4Pd1kfe!*t0gnX~sT16WvV6Jn{EfEW<7zR((z?!y+Fx%5_+|k= z51f&U)By-C*e=DUeXn+Os;>Y0IPfvxZQu``415B3+K4jn0Py)<0zN!VC#o`>cL?~r zfPV#8?6kz^6Tk(5uB{8z9&q-1lKv)iE|;Q}!`0X=W*Yde!0!l!4+38V4(D{f+p^u2 z?IVX`$BbM$1Ci2E;6-2-SZFukp?%n|li1h&~MbwbBgmXPe71}7nlz$M^!z^8yuO2p&?t}VYm0(=|zX}!>kIl=z2 z0b2z^IP;?ZETGFx%mub2?0Z|le=gwi>@QWJ2=Kh&l9~qm3&5x+@~~B1 z27V*J+tIFwt4Q0AOatF&Ch#YWW~Dt@U=05b@N3||w6}eb5Q*4*)1xA~h68^{27Fw@ zskXB3h_dg{8MYwM7ZW=E*q+Yn&uanxnS?YPL)n*F*fG{>n~q3C1(LU~H4^w)Nd&Yc zH&utSwfMp-9SGZm{)&~-D^IIFn8meZ0lr5vHQ(Tp`TFG!aw8%4@^XrC7l0?zMlD%@ zpOJVwshM5PYuup?>_5^{Nx1G|$wzVnzK7`kV`x}a3+StKm;GMA+Zm|6ofCJP3-B|Z zXv9u#UZ*?lSDp^jR{N8A051{Mh-gO&Y;ISHhE}`LR)E(MVsn6xC;9R;z>nh|0c+)5hYBn1DxqHfcdC%Ki=zCSJ|L?=_8 z%qspTYrt|dulC@n7g`Pc*21;fm4V{O;o*J99xaWGpC}IQKVB#f9|EXsugL;%0JR#uwJwD2GEjN2b)>`WWz_Y+Jy1M zZdXldD~w$41HPx|Te`CSR<&AwZEN-BFV^n-;|BMu&r$)OaAZ?0)fNi;J2?W575ulXCvd3RW~Z`rny%47g@44b-K}oG zE|+3JHzT;tH^lsn=!6#m-5Rsny>5tTF?aA@en zBTPL#b0L!t_qmq%c(@g`l~T*Vb6V?j5~VCR8F0v7Cr#`{xq@?9zT+vPY1+PNBdc_8 zSwtEuc);G{G(B^n;`<|)ttWJnd+BX+&G!WNl=M`gwclAO#6{~r(5q1eZhJ?>7t<4&#!B?)*89m|cFb>Txj=*xZc^p)@oP6AE> zej9)BX1pEk!RW-7^u$}WR^UsPTXA)u6SVJQWsR_bq*%Kig>Oo6{U1@v_y;3jm9pDz>dFWc) z%1{?aCdGg&QEAkj7C7uKY14t@lU)kD!FBNS9t z+^rnZTwTB+S{7-C2Mh9T_zw&CZi%^zDaJ^&upv+2JM3PdAhhz@4DM37PJ=y2a+QJ- zSEBO<4$+DWtGK70*s=L>N6+3#o#Y_ld6{MyxRd2u%xZIlM-gMSj}R@oIM9Kxhvjn@ zNM4X^J8QGaYU}K-3pZVhJ-{_gG(Uf&gWSll1GFpNj@@jv(ZJ*EbH$a`T5bk`JwyAC zDh^n%?VQ6_cQvcJ>j4hYQqb$9Th_EdG*^GRO<@m;Fcjfcoy}`1*V=??wF>YrBUE&K zID05yN;=b08@Z5C$&d@|zA+q%PPVAA7^>c7^wx={4OTpWU1RC-x+{~k?kOvA$GF#s zvy%p;;_KO@j#9roE_j`2vgnQnvTqD#QicL1ng~7yJtljVLe0v`xU2OxsXS~$l)mEu zZI8W}U%-TbKh(g%uK{UU``KNx7 zo_|eRPCZ5cCFu+YNnY^XS0x;Wy1Bs48+Z);J)$-JMgvicc~N$2D2WosjA&p>TF;J^ z)oDY)1Kb}*HLt6h(5b5c?224dZq>q#xJwg9FVjXC=v$LE^d*=|Ee1McEH&D#N_mc5 zC4A=R*rEX|J~#5V*dozt_K)CRpH`>XCn-y%P;W@Z+9Q|^QjBf4veWe0rug-x6aze= zXuXBJl;N9wk0fxl1baq-Z#IU)J&D)X zS;prrv%7e;Vb;t$?b}4R>XsxF+!p|m6h-I+h`ukuKF4Mrv2{DS6d(9oL=U4gp9E+Q z@uqojQYdNBgzu`y>%6Sz4Lj-4n60cOsmet!OC&NX+lU1z=~+Dr_d`BRi$lwDqdLQO zR=7{~D@3>O=A{KJixRg|gq6xV*OsVvS)!%oMn)cKJIq!qJf!>$PnJ0p@bMk7(3$E# pX1zCEN*{RN`oR0Z`KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000T9Nkl7v`|YB3Pgf{C{V88!Vy<+0eppi zf_{Kram@u>L6H#n0wDxk1QewxL2W7#OQaSgl%$Sb$8nuBUhnRlUhFgS>G3&dX5V*q z_mPhFHSz3kp7}p7bLNcFS~IrZS#FGA415fHY@M@$>&?ye)j{3fPXHx(uB^}Q49Z5% zF0C{Nd;sie8BYQe^4x~3jMwJ-?*n`Ccn8=5Dg*7|eXuFuSs70UpeoP5*T#2F1GB(q zjQ6&HHQ+zM2crtS1S|r}A{8+lZGkmkYinm{$BxhruRjgEBqN5u)(_7w^vRo-f#(c8 zc6qaQz_-8a+5w3YE90xcI`EHPdVQhC9(`UwlOPQQK0N`ov;I3!PJ%^9oPxWz**o;;7XQ(p8_t(qXHra2xUQa1xMAw-_{9% z*8aaIfUf~dz@LE4tQ9_A0KN~*1P*x|UT6=j=Pt1J=h`Dtw)VSr$Sm+al(lpxze$!;J zQwDzEi3ME+e!;wirD%Jn30v6sM?<*?G8!_S1j1N;TJ$6(vL z!0U!SE5|T@*CO!sUI3pK;C5hiRf93?9kOAYlKyR_Y#Dq*3cRiY|4Pa-`@X( zWFltp&slQwy>0@3K|CBID{=KfDm41cS%Ymt|D#dThguMG;^`d+eq1WGq~?+aE@wza ze0C4`9qBriUrw8~@1TAO{a|B3U28f*$U27I@Zz>iB*PU98-Vz}(G zQ5+FSgFnyFCRxkCKZmJ-#gz9@Z-`qupyg| z2LgN)>>B>lZ84L%&GpskR)O2v?J9Kcj(~TYUVhUdE4Dq?D)0qIaJ2i~>x`CNbp%dZ z&!2Avc+rp(`#fL#`a_A}qh$B2-|XrtKHCcLlMe5;_3AxF({3gdL2RzCE;bANlqWDm z#_Np{1^#c`a~e%^dU+wi!!_=?d6Dd__eT`?ZNf8q!P6%Xd3YKBi3LVbyIorDs!2?K zO#wfF`xIKd10IZl2d!yIF=4wVyFVUr;Jc)sLY)Zwln1z}<2?sHclP4I(B8Roxt=dh ze#((9^LY2xZOK&TXO~ts(g3%$JF@m#BsuuNnb!Ioho=Eeo2GGLfXfyGx${fSZo}lv zXE$~?uD)K~zh7=fQV0YE)kmPyz^lMdJz)E8xk7pVG3V&^yWW)LJI--9&%$->`y+;TT10B|E!DBPzN%)IR&+BSUh`xu@#Ex(vsQ+4 zx<1p*W+}FgM^^BR2DR|$6>Q^q>OwFCe21gwFzw9c6l3%C#dWiV&o2He(Bk)J#vXn| zMpUaF9;Z#A`Glnr*K+S748CBR1pK~Hb=s9@{Ca-u-Og2vS^~c9$WH7DK{G&pgn;KP z@UG=ZS_WR>aPp69`3^wLb`d@s;XiO1ZCc)8EJ%}GE}J3%wn@tQ-s zP53#QynHT$miK75_DD<1!0UYcx<#L~JjKUXX&bgcsXT2C)1r0?AJaAh#g8d9i$m<) zDj+3^!LnK46&kawTqhz-;8R1GCgu}3ncCek;Lzv|*8)XQZ1VzsSb}68|Dt56gJmng z>m0rQQaQ98k(P4CVJoBck<_57lk&7zZ_mdr#;dV8Q>Q< zTqk@G^?D*@`WFK~a^+rAqG z7f-KyB*pGA#KH6ojka#CkDyB;bA=Q+HkM~=mv^VRSxF~;a16cX$Xx6Wqgfoxh`09= zd<^=S9A%2|f|gii`+={(Nqc9QPW{mR1bOi_dvY}9zAT8`bgTK5li)pRXti%0a}|&g zZ#9`lzoD~>{qECPL1)3C(K?W?$3JpX#)14_k7;ii>4I!W0rzUku1jfLo*kuuoz}xU zy_|I{FQ1gdHq-|2JugTvX3F@nH5qkJ8J#mmK^`^!>ywm2E_{i>K~mY?%#EhHp`CT{ z^lic`+lQ(*b4SFQJ021zW?vu1 z2SO*jubcdyOP}o>y`Q%G*X(W7x}6+P6iXyXQc}RP17k?Ht7+sTOTc4I+!Ak}5zWmR`MORi1)sHRqE%>?;;wv;`%_gBQ8uz z4xlct4&B7VJ{oEUKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000VENklGm-3q)UkiQH(X8?;mz)fq`@3Y_QQ^qmi+j2Yv{v`_7>;~Y&z}EzJ$pRVGa2v68 zF0OG0xSk&eD!@0z;@<^U4kGZw0{Tl9P#dBTrgB)m3j9Cc-J;J8$ldia@L{vSHw*Yz zfeT{MF01qTWZQBJH6XiOkLwPxR?T13wB}GJJFhP6!|#V5-L7P@X%&^*9K8 zOThmQc+hEu&sTsq1Udm1ffWEr@qTLjZb*5B8cM1FKNR>KVc{j zRF42Z0DcZEwhM3#yO^R7F@IJCZc7nTZD2fk0Q_EHPs%YEaBcQA4+!+1?H76>C)iUN zl&3A~AHWRoeuH7#O|Ex=tMZsOJJQgi;_AOJz!nH|0cKgYMV68R)Aj${4~Xv&ey+(yG`6s;Fo}* zl(}&g_=EWCc9eI3Ux?+aK!Kz`R~fj{OyCzJ-woxl`rHz5J&y?AV7Y5#A|~{Lqt63y zO6rY<10My>do0;*nJ$TCKcO?^K_LB84(op{t3R&?_(cnD3A$_p8+`&6Kq(dQpXnSPMu7D*$G zfVIaY?dZ|GfS>hbA+`ek&cT%55FX^vkC*cRUSzko9ZCgn1M3GA_%iTkN6fNa%sJdm zu}r{E80C9p{KLqAy+zVqJ;-v)$XY_a{M>$lk30OfovD1(!6{%`*%0Wp#$aFF5AZ`I z4R}|O)UqYOyFqRV_)v;Cwm3I4S}*X51=}_7d%p{;+qCjKfuAd*K&%V+xRH1J+{(vv zm)uH`t(>a|ct6RsG#hqgoO?V5wg}?o#0Y!9N?}^K7LaAMP8UjOhGs zU>?3a6g&s(aVg4^oy4?wB|)13cTFbB>{49$w>fwFX_o_E4h7AuS;{bb``xjTnM6hr z(9N>su<$);;^N#)IW6#hkHwpoztOYsXRO`!z?hXlxj*aU$}G4=1?nZsR=y7zZNHIg-OM6Tn64FnTVrh%6iX|!2csK56mm2 zZZztWvik7;lmRpCYJ^71TNZ4Wltl?sh7!>5MG>>2h}nH!kIHyH(~MWshexe&DJfuw zg1ODcu9McjTv?6X8ig3k;GPNgw zZlndi=FphkxN16ZrPS3pj(;qG8ZA?f7^36DY;}EMV{`5P3s0BlKgP3yqH<>X)2uEf z4m@v#g`SmJG^GP5-o>Xl>jTHu9B=`(3WTV=U3$UWYeyvP%QTqisioI@aci!@u~HtxtZ06 zAIxM0zJ+^Qo0h}vQh`X2n-{-px`0Uo{_95IY^WR>ed&$WhadbjEAVxa29|HVx{^Df zZAW}0?VDwHj-Xb=lz@N52%6>m{%_yl;K-@Wh0hARdyn{hd6^CzVsjNjQdDX96Y^Mh zeAxKx?#&}(-^dKy)eko#@+b#HB;~u|a7$)5Q_I)u7QSQGlHm0Xtm?e5Z0| z+Wg!bi*qw;1e$xbEF6+ubA~+mxc2Aw>5eHA&dj57W;%6WDNXZgQG!Jrs6?M9nT+2} zR{nYNusAofXY;d=0@BQ$T{4Owds(+0ax0MRoYr;L?NUJKO=*DdkPIi;qxO;Y{5ZR7 zfDS5f*80BVDe8U-BSe^yF}r|cgfSxnoB(EB~W?V>O9l#zO1Z1C*TZrhh@WfaA| zlsd?b6l+*FmfwyW4IBZ!ZdtT1gBcL_GS~qwr07ZSR2o+j+8KYpz_n|s;-5oqzAgy# zqiqVi&uDYFf@93HJ3nt{g}qSjL=bwR{)|KQ5Ttoka@B&(wB9wrykPJvSs`*tA$b(kOm!*%gZ#nkx_VIHPYf9UP^(@4EDc#JN^fc}qkx)K((dRXM< zo*JDURK?ntNk85hf*<-aCD*yM8~9>a^=2be)n*kS%VO;#Buf%Qd)0;l95wRgdIQ@| zo`JC)fa~D*M2eje391Fpt?x@Il_R~ZrHt6)VqyVZrHRXDT2W$a@H!P75+5IVf~azU z_bG!E{#yI!ZCbESsg*sANZibtq;i8&_Ll-#hVleX0vU*Q89M8TTKJjUrirv;z%R&k zl|&KBD8tiy`I5HWs8OliK>%)Be$`WOxT;1oy=;3?y{}nsuJpcyx(B=myeB>2oh$zz Y0N=!p5|FH4LjV8(07*qoM6N<$f}7J=2><{9 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_20.png b/res/images/gallery_loading_ani_20.png new file mode 100755 index 0000000000000000000000000000000000000000..14cc33921e472a91564c36b4f2a4863a3b1d6b8f GIT binary patch literal 5375 zcmVKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000UqNkl$(SVL%WNLbI_dWI-sduN z=FD|TTTYHgo|*5g{o8Bp%Q{MHP2cjfLLWgNcprG*va>+SL(r)THW0dE5<0S^h_VfnW*T4>7p32+_Q0R9WS3tVe^4{w2u0S`+nSs+cwIz|o^ za8Q08HC}fOcnesT-q4f4hk*|Q$HbFerY)G-;nDWZ!STC8(mn;;0N#*R?FHatz!Sg+ zM2}sdd?1zK+1eo~+S4PF&T@vse3w#pzg#3(xf=4ENpml^4 zX-_Y(-(OpQe;9Zccm((ju-a*f&xe5*feFil@xYFQL;}f3^0hyv^Z~f4Y;N~3mgW1nPoJSHSh_6J?8lmQFkI9Xwr{^37zADgH+YR`H#JRk#M5<5s5lpw zfhGZd5EyVsiRtm11k31y+v8qC@F@xE|n>5ebf&{`R8184;-{ zK$Vvkj-&-X;Ye=mM5kAQFFNGJmYEq}Qsc8dG4m#x&Y9=V+Wuonh-^n9yr|;5$M? z*UX_RFD;akdU#QwDo?W0_wXQKP!S%jTsl4&BPZtGyOtlyFU_4qYdsHqT`nyHKU7Mc z&t1S5 O}lX^8=<37lgyJ@XY0WVvZPid`}f$sxnl~Q?zs;(usNJdGfXMM>}E9_gI z>qmj_0ynkRFKewo)54Az>5zpK5lYRI-sfpY6TIdW@H?&bTUzUHXssu6f*f}OFB15c zW1zHW42N3){Cvur(@d|Q@PO5xNG1~a9gj!X4EU`8ex}apgl2gCq(eq_z@MI-UrVdu zn%%o&x8?ssxr?JxuK_23@6`!DORt|KdLbgUhF3gV9=6ezj7Ul?E2YjTrS<`*Q_4)1 zUSIMImLc%B(*oaeWSFM41h@tNtWxT;1c#;a_WDwcM_1DVzk_>|z3J@_v_s05x7V*M zo|{RKkF2BxzU~PJO&uSn%`7Lce=I?WxLgnLs5rdVE*{E+rp zfi;BxplR27{l3GWK0P{d^k_tSzg%x>zlM9my)PbZckr2b{m{tN(|Zp*efq$$FP_;u zed4)+!BN}k-l!LNh22NDZSdplUXG&|yj~TCCP&9-zVP78i)S9#|HMZPiK!d-20M4e zDhK!iu#XP4EWBQ+fss9vv-2V|*IgNAQs5Aj&(Ky{Z+rSAT~KtgQLitK9eRwIJ@QE) ztr6^uH7Bs_glGVNWwxI2dQ})4COBl<5b$kBi0IPtsaDLde^*zYDmd88@)bp}J=C4xFs8(je1RjBO#_nn@dzdyz$sY;#3!$Uhlu-c;{lA-V@ z%5`=w&2^F$JivDWo1UH5Y5!;{S+hXn7(ByymQsht=LLtXxawgkK$n*m64zX>2S!z- zC2D>pyb0kM&rS&!%~QrvtM5*4PXfJO?|YA6fx_k4b{8BH=*13!ZEtz-m1L@GyGSG5 zJv_Y@RT0R1p9A;{HnxL=3^*i&i0H(nVu9E9K0PP-wmPza?=Z*F$c$Y2*K}KP@kTiPxVxotV*G75S)40@93Vc0oD8xdn8k< zO19RFQ_Z197w}hHc9lRiZMzZA&Kh_KeU;s_hQ83z-qt%Jk<7Nh-=wjE2?YbRiW$^> zpDDbyot5-uUCw$_JbfxA42-KzF(NIjyu8iMt#)xCohcWt2Xe%XGv;eD?QzX0*j^J) z-^=^6iv>&nRKie88B(C|?;apx(5q*%iin%rcECfc5X=}(^8QX+g}+8^RI)*gzPbjx zxVq&kV!+&LR`k^Dd5%r-_S+5}j4Cu4cdkf9z)Ny-lqEyvz_{7WP&KcKr3%5b(c)@i z>6pyUSBpHYT-et`(A&)hk>`Vxwh2xItP^aJE8>30hHp}=UWxE|eK-hjkz?}JibsQm z;FZMRBSz?^W28diFLb68MnmCXxJ?VP+*UsPP7};H-Z8SjVRlykOcFo)dP&z~P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000UKNkl7zo1B5L8=7eY9mn)s8VtP+5(MQD3ID}lO|1SJ8>PycGg~dUJmn2`sU?*=g02s z?yPqoX|=nvo5}by-+6w``@XBR*7U7?R_Y_@1MdUxTYfg++PJhZSJdPE0x)R2SMt0K ztQ6%S$4|^;1Kwd91jc}I0bB(RS>I9C!`!}ToPbY(TZLD62kZcF40u9d$3Zoft*!3@ zOv>})#?;EQ-d+Sg418HsZMy~K`8Ub~UB|c@*M5~_pM$`&z}E!) zpWC7Mb^-qq@Dxyq0q6shbRt}C$o08>qRbO=N`&xF;P2fGd=xk%&&u=1`&6FRZ)Z6% zw#(5*Ju(D*Lt@HB;C8naK2HPRa=_M>(oDr^1A_KsA#uUc2V13ZLDB0+fbR+Xu26Ux z_&RVT1t=X8B%|%Cz-Pdwq;%^JpjF_YJRg=vQXFvkeDkwuNmc&HzYzsVB zllBC_P2dxGEH!Z~k4i3nT#hS?D~jwG@O|L-dAXQ@oMAsF(O)O1*0wru6Zk+Borm3$ z$D5+~X9fOXjN8F-Z%VG53&3n1&hpwpl#a%{s#P7Tv-zA+@P15bVpP2tP@lnZT~((n-C?&4=)NwdsrqwS{dpt6PkVf} zeFD~iw>lUYn+d39`ll1B*6*|u_!FXV6_Z~_h0J?h2-}4IhEdXMPZEGA{9G%54~XCL zsoM-Rm%GS~_-q+?J!Q&x#?wA%3iwm;~{Q{<}(Ms`y-AhXK&h{5?TO}eKQZ>1B7El;&N>bd<4|? zDDX8=y6wm9CfCWN3N#JyL%==*u<5@e+Xb$(x9uI=H%+10YB<+BX+R7F6H}P zwk?6~8}SvfIo%BK3gO+GxIyIg9#FTb@~wov(Ztfi+(@Iq4|#mHx$SljsM}Qef}_7; zyOxv90C(lura!+yZ`nHunTiIUX%u+Xqw45U12%dL_!41LPRCTB6H5zom8`%=Jdgw9 zafjZt1^i=N9zbsfxbHsYN)H1kp%{A1SJe1y822bBGeE5MDDdkfkNO(Vs_>G>e@E_Q zgWk3!{5P95;Sj$}z^j(B1Eadsec%s(`?8hstS-eIisl+Txz*#q*J5Dfb2&bR?@y7T z^g8gnNpP1I<|fiAe87`?n`g5R{NbcRIlMw8EpWRV2oDcn*9rZV+->6I1+>;l~S((-!6#S zquF^S;%7pq27ccG-%JOGI+7A7b%}7K)6X)f{i4=-D(6F)O!)lctiZPuT*_d_@-U@V zl~O;>p!O+oF|XuV8W2Baz1E1r1LAM74RPXss_dtM^Sfasr{5EFg^&F<0ob^1K%~=ie3DesbQr+ z&?B{9Al(Gp%xYhppPjUFaMvLHYmHW#cdZ?1M*%cO!AvPNM>u(4t_5nJPLTp$X%zUn zql`BLX&`~KR6yvfN~sHZs(o>OcF1rizUGx8oF3T_@VZrX`ck0LqV_IwR{L3Tp}z5j z3RoOJF|*oC^JX;O>dria$h`SXQ-H zsz=WsIsW|1mFm$+{KF&OO4?6a;5$~vqH)he9wg=Txo%W@X<%q_baMLT(aGuaj*s6> zwT}$Pw~Bi?4m*g96sZ_$rP>X3*9ey+Ay43SD`T-2=rWalnD*ZhYP;GGj-NSaWG1z| zfkU{u+Ez@dZ~C<{x^R7RrPQ1b>QCxmCsDEG%Ghzjg@iAq-G3uM?l>U3hEkLzh;|+H z(!RmZmOuR63%m7=AAt6*OB?LgRtXolp_Rb5`Tt?c%9EFt3D;E_=oZ+E^Ro(I;^c*$ zfx+spYWHrO(n0+Vr;ojV=a-`JmI9BOS~XA3ZqLJypqGmddU1ZXWI_knKl0eE%r49Ivoa}vlAuI5B-d2$ZcG~>DxmHc(RDlCyW&!X za2otE!kNj=)tFoLlLXNmpCbuZika0^<)H7$$tenK<#31gwrCRBM}&8l8an=F16rMM zp60GcDXtZRA{R4Ey5&e)78`NTwY1B2dv1Nuj9Bu>AnKy@U58?n=Ok#tVHRW35Nap* zeR5^TwOF<1D$seHWpaidx9WuJa^5eEuVI1FDz~vut}c6lVPA%2t3Al$KpOJl<0ocZ zfweA8t}z~7eZrTk+d#_Fi`kWZ)tmJ5rn@LP;)yFrLh=%>-T;{<*=Qz9iTgvx1YUrD zxjj5rf&F^dxN-u|eiZHn;NxJqW-qvYCLw46mPT7&oV5zL%@DvI1O}G-|~7e{>8O7bqQ5$twKIW~-EL%(X3`g;Q!;-RIa5wQu15 zIfA4m`FvS|jtP7u)CAh&g6v9}ZUi3LhGa1{k{1T{wS093rDm-zque@ZHHdaLm9)5- zP07J4DKC8ze0&m69dlCKK82t|w2m(kG)VMXavM^nkSjN{s86feHi(6_I+(FOE@yR(~}nCj7W xwFGp5ss7Kbx7YeVLfr@62i~_n@b0z$4FLE;?J=WHYIFbq002ovPDHLkV1lt%PuTzf literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_22.png b/res/images/gallery_loading_ani_22.png new file mode 100755 index 0000000000000000000000000000000000000000..80d592e63ed127c4264d180b019dbb419c231f3b GIT binary patch literal 5374 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_23.png b/res/images/gallery_loading_ani_23.png new file mode 100755 index 0000000000000000000000000000000000000000..b4bd7ca8343b531619b369982b92d5690d53ed1e GIT binary patch literal 5527 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_24.png b/res/images/gallery_loading_ani_24.png new file mode 100755 index 0000000000000000000000000000000000000000..69445e4b384992839448a3abfa7b02c7eb6f9006 GIT binary patch literal 5481 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_25.png b/res/images/gallery_loading_ani_25.png new file mode 100755 index 0000000000000000000000000000000000000000..233a038de1dd202bdc4cdeaba0ecabd6aee1148d GIT binary patch literal 5409 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 LNkvXXu0mjfV%lSo literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_26.png b/res/images/gallery_loading_ani_26.png new file mode 100755 index 0000000000000000000000000000000000000000..d52a0175464fa9563b4bd6107623529586e3f60e GIT binary patch literal 5311 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_27.png b/res/images/gallery_loading_ani_27.png new file mode 100755 index 0000000000000000000000000000000000000000..4221eccb3e1654a0db9d08bc6985dcea291b0b3e GIT binary patch literal 5359 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_29.png b/res/images/gallery_loading_ani_29.png new file mode 100755 index 0000000000000000000000000000000000000000..41e97e170b195d65e28b7b0739e004d7ed22040c GIT binary patch literal 5489 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_loading_ani_30.png b/res/images/gallery_loading_ani_30.png new file mode 100755 index 0000000000000000000000000000000000000000..ac0bb550876682a642b1e880bf27e9847b59428c GIT binary patch literal 5600 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_video_control_ff.png b/res/images/gallery_video_control_ff.png new file mode 100755 index 0000000000000000000000000000000000000000..57d60d6058b1fe3b567a5610b97830d6682db1ea GIT binary patch literal 3056 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_video_control_frame_forword.png b/res/images/gallery_video_control_frame_forword.png new file mode 100755 index 0000000000000000000000000000000000000000..af2b77608a63b624bccee8104e4fafb34312debb GIT binary patch literal 3154 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 a{SE;5EWUrtA literal 0 HcmV?d00001 diff --git a/res/images/gallery_video_control_prev.png b/res/images/gallery_video_control_prev.png new file mode 100755 index 0000000000000000000000000000000000000000..029e57c596ba460726f1a34e9053ce09075769cd GIT binary patch literal 3175 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_video_control_rew.png b/res/images/gallery_video_control_rew.png new file mode 100755 index 0000000000000000000000000000000000000000..ad63c27f03f66cac795df8ef4dd594bff2b52093 GIT binary patch literal 477 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_video_delete_btn_press.png b/res/images/gallery_video_delete_btn_press.png new file mode 100755 index 0000000000000000000000000000000000000000..2d2466fb686b9a161f7355a83cfdd3316d298c7a GIT binary patch literal 3411 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_video_icon_btn.png b/res/images/gallery_video_icon_btn.png new file mode 100755 index 0000000000000000000000000000000000000000..9ef6888267446586587d358e6d7b59513b05f900 GIT binary patch literal 3306 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_video_icon_btn_press.png b/res/images/gallery_video_icon_btn_press.png new file mode 100755 index 0000000000000000000000000000000000000000..628c8e71c13d4ae1e3560439d8105e999ab53a5e GIT binary patch literal 3239 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 Z2LM{Nz4>9>;jRDx002ovPDHLkV1m1Q4;=si literal 0 HcmV?d00001 diff --git a/res/images/gallery_video_icon_mute.png b/res/images/gallery_video_icon_mute.png new file mode 100755 index 0000000000000000000000000000000000000000..e92f3763833a18986be58aa52940d55dd5b51cfe GIT binary patch literal 3154 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 literal 0 HcmV?d00001 diff --git a/res/images/gallery_video_icon_volume.png b/res/images/gallery_video_icon_volume.png new file mode 100755 index 0000000000000000000000000000000000000000..49d9cf55656f52e769ca49acc82f394b8b5691d4 GIT binary patch literal 3222 zcmV;H3~BR;P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0005ONklDubb_=KkPTpi&RoafIWaW0A_%n)!Z^4fHn>tzp$Q%h+H>AL?zi- za%HYejQ!=gFRs7nc?68b5gT&6{<9r`C97?C?zJn0_T=8W3PnUzvl{ZVT09e7+NW=s zLL1c#2a`4`=3>lCNU2W+;9cC8+%?qzhIY+xThif5su7Glj$YTJ!-cXe`0G`kIQ@id5kD0W501<5+l@Em&d$1`V z#sUHn#k`53KuM<-ifz`NkL(X=C)wn{`sm=6%3JRn^3Zy^^q(BO!K*8GI02@e;hbjZy)&Kwi07*qo IM6N<$g6y^NCIA2c literal 0 HcmV?d00001 diff --git a/res/images/gallery_video_player_bg.png b/res/images/gallery_video_player_bg.png new file mode 100755 index 0000000000000000000000000000000000000000..611a7b7a150eb45afbee504cf5b6ce0b0e9010f9 GIT binary patch literal 3468 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 literal 0 HcmV?d00001 diff --git a/res/images/navibar_item_separator_shadow.png b/res/images/navibar_item_separator_shadow.png new file mode 100755 index 0000000000000000000000000000000000000000..05d347df5a13c09eeeabcf2c7d341af6d5a7eb28 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrF!3HE-TH5A=1d4;)ofy`glX(f`uqAoByDx`7I;J!Gca%qgD@k*tT_@uLG}_)Usv|qEMlDUio0yjHUNbbJY5_^IIgoE xWaMQq;9%a6mXx35CwL(DLe}plUbP<&7~B?%mS)q@O1TaS?83{1OR8UDd7MB literal 0 HcmV?d00001 diff --git a/res/images/naviframe_optionheader.png b/res/images/naviframe_optionheader.png new file mode 100755 index 0000000000000000000000000000000000000000..e90f19c2d6fdee228d03446b71197bbe1b89ae7c GIT binary patch literal 2788 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 literal 0 HcmV?d00001 diff --git a/res/images/org.tizen.video-player.png b/res/images/org.tizen.video-player.png new file mode 100755 index 0000000000000000000000000000000000000000..a04a5034d202d26c85631beb5490fe1e64650839 GIT binary patch literal 18729 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 literal 0 HcmV?d00001 diff --git a/res/po/CMakeLists.txt b/res/po/CMakeLists.txt new file mode 100755 index 0000000..407cb2b --- /dev/null +++ b/res/po/CMakeLists.txt @@ -0,0 +1,23 @@ +# for i18n + +SET(POFILES el_GR.po es_ES.po it_IT.po ko_KR.po pt_PT.po tr_TR.po zh_HK.po de_DE.po en.po fr_FR.po ja_JP.po nl_NL.po ru_RU.po zh_CN.po zh_TW.po) +SET(MSGFMT "/usr/bin/msgfmt") + +FOREACH(pofile ${POFILES}) + SET(pofile ${CMAKE_CURRENT_SOURCE_DIR}/${pofile}) + MESSAGE("PO: ${pofile}") + GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE) + GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE) + SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo) + ADD_CUSTOM_COMMAND( + OUTPUT ${moFile} + COMMAND ${MSGFMT} -o ${moFile} ${absPofile} + DEPENDS ${absPofile} + ) + INSTALL(FILES ${moFile} + DESTINATION ${LOCALEDIR}/${lang}/LC_MESSAGES RENAME ${PROJECT_NAME}.mo) + SET(moFiles ${moFiles} ${moFile}) +ENDFOREACH(pofile) + +MESSAGE(".mo files: ${moFiles}") +ADD_CUSTOM_TARGET(po ALL DEPENDS ${moFiles}) diff --git a/res/po/POTFILES.in b/res/po/POTFILES.in new file mode 100755 index 0000000..567ca5d --- /dev/null +++ b/res/po/POTFILES.in @@ -0,0 +1,13 @@ +# List of source files containing translatable strings. +video-player.c +mp-util.c +mp-video-app-ctrl.c +mp-video-view-ctrl.c +mp-video-display-view.c +mp-video-info-view.c +mp-external-ug.c +mp-util-media-service.c +mp-video-sound-path-ctrl.c +mp-video-streaming-view.c +mp-video-streaming-ctrl.c +mp-external-appsvc.c \ No newline at end of file diff --git a/res/po/de_DE.po b/res/po/de_DE.po new file mode 100755 index 0000000..50a784c --- /dev/null +++ b/res/po/de_DE.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "Bereits vorhanden" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "Verbindung mit Bluetooth-Stereo-Headset getrennt" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "DRM-Datei nur für Typ Sperre weiterl. unterstützt" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "Neues Tag" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "Original" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "Im Stumm-Modus abspielen?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "DRM-Datei kann nicht wiedergegeben werden" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "Senden nicht möglich. Dieses Element ist gegen Weiterleitung gesperrt." + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "Nicht unterstützte DivX® DRM-Version" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "Lesezeichen" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "Fertig" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "Favorit" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "Details" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "Auflösung" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "Favorit hinzufügen" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "Nachricht" + +msgid "IDS_VPL_OPT_NAME" +msgstr "Name" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "Auf AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "Als neues Video zuschn." + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "Originalvideo zuschneiden" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "Konto" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "Shortcut hinzufügen" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "Tag hzfg." + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "Favoritenliste voll. Löschen Sie einige Favoriten" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "Verbindung zum Server getrennt" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "Gateway-Timeout" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "Interner Serverfehler" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "Lizenz abgelaufen" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "Ladevorgang läuft" + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "Keine Dateien" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "Kein Speicher mehr" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "Speichern unter" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "Um DivX® geschützte Videos wiederzugeben, muss Ihr Gerät registriert sein. Registrierungs Code: %s. Registrieren Sie es unter http://vod.divx.com" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "Video wird gekürzt..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "Verbinden nicht möglich" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "Wiedergabe nicht möglich. Ungültiges Paket vom Server" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Nicht autorisierter Videoausgang. Verwenden Sie den analogen Ausgang, um dieses DivX® geschützte Video anzusehen." + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Nicht autorisierter Videoausgang. Verwenden Sie HDMI, um dieses DivX® geschützte Video anzusehen." + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "Ihr Gerät ist nicht autorisiert, dieses kopiergeschützte DivX® Video abzuspielen." + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "Bestät." + +msgid "IDS_VPL_SK3_TRIM" +msgstr "Zu-\nschneiden" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "Video-Player" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "Keine Mediendatei" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "Video kann nicht wiedergegeben werden. Fehler aufgetreten." + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "Dateigröße" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "Zuschnei." + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "Video freig." + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "Videoliste" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "Bildseitenformat beibehalten" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "Einstellen als" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "Untertitel" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "Datei kann nicht gefunden werden" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "Video kann nicht wiedergegeben werden. Ungültige Streamingdaten" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "Nicht unterstütztes Audioformat" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Nicht unterstützter Dateityp" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "Nicht unterst. F." + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "Nicht unterstütztes Videoformat" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "Auflösung" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "Video kann während eines Anrufs nicht wiedergegeben werden" + diff --git a/res/po/el_GR.po b/res/po/el_GR.po new file mode 100755 index 0000000..6896d0d --- /dev/null +++ b/res/po/el_GR.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "Υπάρχει ήδη" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "Το κύριο στερεοφωνικό σετ ακουστικών Bluetooth αποσυνδέθηκε" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "Το αρχείο DRM υποστηρ. μόνο για κλείδωμα προώθησης" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "Νέα ετικέτα" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "Αρχικό" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "Αναπαραγωγή σε αθόρυβη λειτουργία;" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "Δεν είναι δυνατή η αναπαραγωγή του αρχείου DRM" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "Δεν είναι δυνατή η αποστολή. Έχει απενεργοποιηθεί η δυνατότητα προώθησης" + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "Μη υποστηριζόμενη έκδοση DivX DRM" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "Σελιδοδείκτης" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "Τέλος" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "Αγαπημένα" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "Λεπτομέρειες" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "Ανάλυση" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "Προσθήκη σελιδοδείκτη" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "Μήνυμα" + +msgid "IDS_VPL_OPT_NAME" +msgstr "Όνομα" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "Στο AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "Περικοπή ως νέο βίντεο" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "Περικοπή αρχικού βίντεο" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "Λογαριασμός" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "Προσθήκη συντόμευσης" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "Πρ. ετικ." + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "Η λίστα σελιδοδεικτών είναι πλήρης. Θέλετε να διαγράψετε μερικούς σελιδοδείκτες" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "Αποσυνδέθηκε από τον διακομιστή" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "Λήξη χρονικού ορίου για πύλη" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "Σφάλμα" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "Η άδεια χρήσης έχει λήξει" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "Φόρτωση..." + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "Δεν βρέθηκαν αρχεία" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "Η μνήμη εξαντλήθηκε" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "Αποθήκευση ως" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "Για την αναπαραγωγή προστατευμένων βίντεο DivX, η συσκευή σας πρέπει να είναι εγγεγραμμένη. Κωδικός εγγραφής: %s. Κάντε εγγραφή στη διεύθυνση http://vod.divx.com" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "Περικοπή βίντεο..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "Δεν είναι δυνατή η σύνδεση" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "Δεν είναι δυνατή η αναπαραγωγή. Μη έγκυρο πακέτο από διακομιστή" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Μη εξουσιοδοτημένη έξοδος βίντεο. Χρησιμοποιήστε την αναλογική έξοδο για να προβάλλετε αυτό το προστατευμένο βίντεο DivX" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Μη εξουσιοδοτημένη έξοδος βίντεο. Χρησιμοποιήστε HDMI για να προβάλλετε αυτό το προστατευμένο βίντεο DivX" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "Η συσκευή σας δεν έχει εξουσιοδότηση για αναπαραγωγή αυτού του προστατευμένου βίντεο DivX®" + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "Επιβεβαίωση" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "Ξάκρισμα" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "Βίντεο" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "Δεν βρέθηκε αρχείο μέσων" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "Δεν είναι δυνατή η αναπαραγωγή βίντεο. Προέκυψε σφάλμα" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "Μέγεθος αρχείου" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "Κόψιμο" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "Κοινή χρ.βίν." + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "Λίστα βίντεο" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "Διατήρηση αναλογίας εικόνας" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "Ορισμός ως" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "Υπότιτλοι" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "Δεν είναι δυνατή η εύρεση του αρχείου" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "Δεν είναι δυνατή η αναπαραγωγή βίντεο. Μη έγκυρα δεδομένα ροής" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "Μη υποστηριζόμενη μορφή ήχου" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Μη υποστηριζόμενος τύπος αρχείου" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "Μη υποστ. μορφή" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "Μη υποστηριζόμενη μορφή βίντεο" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "Ανάλυση" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "Δεν είναι δυνατή η αναπαραγωγή βίντεο κατά την κλήση" + diff --git a/res/po/en.po b/res/po/en.po new file mode 100755 index 0000000..04476ad --- /dev/null +++ b/res/po/en.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "Already exists" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "Bluetooth stereo headset disconnected" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "DRM file not supported except for forward lock type" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "New tag" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "Original" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "Play in Silent mode?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "Unable to play DRM file" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "Unable to send. This item is forward-locked" + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "Unsupported DivX DRM version" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "Bookmark" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "Done" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "Favourite" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "Details" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "Resolution" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "Add bookmark" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "Message" + +msgid "IDS_VPL_OPT_NAME" +msgstr "Name" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "On AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "Trim as new video" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "Trim original video" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "Account" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "Add shortcut" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "Add tag" + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "Bookmark list full. Delete some bookmarks" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "Disconnected from server" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "Gateway timeout" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "Internal server error" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "Licence expired" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "Loading..." + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "No files" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "Out of memories" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "Save as" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "To play DivX locked videos, your device must be registered. Registration code: %s Register at http://vod.divx.com" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "Trimming video..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "Unable to connect" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "Unable to play. Invalid packet from server" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Unauthorized Video Output. Please use Analog output to view this DivX Protected video" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Unauthorized Video Output. Please use HDMI to view this DivX Protected video" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "Your device is not authorized to play this DivX® protected video." + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "Confirm" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "Trim" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "Video player" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "No media file" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "Unable to play video. Error occurred" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "File size" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "Trim" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "Share video" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "Video list" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "Keep aspect ratio" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "Set as" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "Subtitles" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "Unable to find file" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "Unable to play video. Invalid streaming data" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "Unsupported audio format" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Unsupported file type" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "Unsupported format" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "Unsupported video format" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "Resolution" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "Unable to play video during call" + diff --git a/res/po/es_ES.po b/res/po/es_ES.po new file mode 100755 index 0000000..1481c71 --- /dev/null +++ b/res/po/es_ES.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "Ya existe" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "Auricular estéreo Bluetooth desconectado" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "Archivo DRM incompat, salvo para tipo bloq reenvío" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "Nueva etiqueta" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "Original" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "¿Reproducir en modo silencio?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "No se puede reproducir archivo DRM" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "Imposible enviar. Este elemento está bloqueado para el reenvío." + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "Versión DivX DRM no admitida" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "Favorito" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "Finalizado" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "Favorito" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "Detalles" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "Resolución" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "Añadir elemento favorito" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "Mensajes" + +msgid "IDS_VPL_OPT_NAME" +msgstr "Nombre" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "En AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "Recortar como vídeo nuevo" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "Recortar vídeo original" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "Cuenta" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "Agregar acceso directo" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "Añad etiq" + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "Lista de favoritos llena. Elimine algunos favoritos" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "Desconectado del servidor" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "Tiempo de espera de puerta de enlace" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "Error interno del servidor" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "La licencia ha caducado" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "Cargando..." + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "Ningún archivo" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "Sin memoria" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "Guardar como" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "Para reproducir vídeos DivX protegidos, su dispositivo debe estar registrado. Código de registro: %s. Regístrese en http://vod.divx.com" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "Recortando vídeo..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "No se puede conectar" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "No se puede reproducir. Paquete no válido procedente del servidor" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Salida de vídeo no autorizada. Utilice la salida analógica para ver este vídeo DivX protegido" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Salida de vídeo no autorizada. Utilice HDMI para ver este vídeo DivX protegido" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "Su aparato no esta autorizado para reproducir este video de DivX® protegido." + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "Confirmar" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "Recortar" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "Vídeos" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "No hay archivo multimedia" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "No se puede reproducir vídeo. Se ha producido un error" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "Tamaño del archivo" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "Recortar" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "Compart vídeo" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "Lista de vídeos" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "Mantener relación de aspecto" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "Definir como" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "Subtítulos" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "No se puede encontrar el archivo" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "No se puede reproducir vídeo. Datos de streaming no válidos" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "Formato de audio no compatible" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tipo de archivo no admitido" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "Formato no admitido" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "Formato de vídeo no admitido" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "Resolución" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "No se puede reproducir vídeo durante la llamada" + diff --git a/res/po/fr_FR.po b/res/po/fr_FR.po new file mode 100755 index 0000000..c37e194 --- /dev/null +++ b/res/po/fr_FR.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "Existe déjà" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "Casque stéréo Bluetooth déconnecté" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "Fichier DRM non pris en charge sf contenu protégé" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "Nouveau libellé" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "Original" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "Activer le son ?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "Impossible de lire le fichier DRM" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "Envoi impossible. Le transfert de cet élément est verrouillé" + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "Version DivX® DRM non prise en charge" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "Favori" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "OK" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "Favori" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "Détails" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "Résolution" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "Ajouter un favori" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "Message" + +msgid "IDS_VPL_OPT_NAME" +msgstr "Nom" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "Sur AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "Rogner comme nouv. vidéo" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "Rogner la vidéo originale" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "Compte" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "Ajouter raccourci" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "Libellé" + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "Liste de favoris saturée. Supprimer des favoris" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "Déconnecté du serveur" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "Passerelle expirée" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "Erreur du serveur interne" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "Licence expirée" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "Chargement..." + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "Aucun fichier" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "Mémoire saturée" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "Enregistrer sous" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "Pour lire les vidéos protégées DivX®, votre périphérique doit être enregistré. Code d'enregistrement : %s. Enregistrez-vous sur http://vod.divx.com" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "Rognage de la vidéo..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "Connexion impossible" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "Lecture impossible. Paquet du serveur non valide" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Sortie vidéo non autorisée. Utilisez une sortie analogique pour regarder cette vidéo DivX® protégée" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Sortie vidéo non autorisée. Utilisez une sortie HDMI pour regarder cette vidéo DivX® protégée" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "Votre appareil n’est pas autorisé à lire cette vidéo protégée DivX®." + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "Confirmer" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "Rogner" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "Lecteur vidéo" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "Aucun fichier média" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "Impossible de lire la vidéo. Une erreur est survenue" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "Taille du fichier" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "Rogner" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "Partager vidéo" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "Liste vidéo" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "Conserver la taille de l'écran" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "Définir comme" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "Sous-titres" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "Impossible de trouver le fichier" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "Impossible de lire la vidéo. Données de diffusion non valides" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "Format audio non pris en charge" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Type de fichier non pris en charge" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "Form. non supporté" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "Format vidéo non pris en charge" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "Résolution" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "Impossible de lire la vidéo pendant un appel" + diff --git a/res/po/it_IT.po b/res/po/it_IT.po new file mode 100755 index 0000000..b8985a2 --- /dev/null +++ b/res/po/it_IT.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "Già esiste" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "Auricolare stereo Bluetooth disconnesso" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "File DRM non support.escl.tipo bloccato per invio" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "Nuovo tag" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "Originali" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "Riprodurre con profilo Silenzioso?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "Impossibile riprodurre file DRM" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "Impossibile inviare. L'elemento è bloccato per l'invio" + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "Versione DRM DivX non supportata" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "Preferito" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "Fatto" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "Preferiti" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "Dettagli" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "Risoluzione" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "Aggiungi preferito" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "DLNA" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "Messaggio" + +msgid "IDS_VPL_OPT_NAME" +msgstr "Nome" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "Su AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "Ritaglia come nuovo video" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "Ritaglia video originale" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "Account" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "Aggiungi collegamento" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "Aggiungi tag" + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "Elenco preferiti pieno. Eliminare alcuni preferiti" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "Disconnesso dal server" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "Time out Gateway" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "Errore interno server" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "Licenza scaduta" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "Caricamento" + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "Nessun file" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "Memoria insufficiente" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "Salva con nome" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "Per riprodurre video DivX protetti, il dispositivo deve essere registrato. Codice di registrazione: %s. Registrarsi su http://vod.divx.com" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "Ritaglio video in corso..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "Impossibile stabilire connessione" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "Impossibile avviare riproduzione. Pacchetto non valido dal server" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Output video non autorizzato. Utilizzare l'output analogico per visualizzare questo video DivX protetto" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Output video non autorizzato. Utilizzare l'HDMI per visualizzare questo video DivX protetto" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "Il dispositivo non è autorizzato a riprodurre un video DivX® protetto" + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "Conferma" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "Ritaglia" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "Lettore video" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "Nessun file multimediale" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "Impossibile riprodurre il video. Si è verificato un errore" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "Dimensioni file" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "Ritaglia" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "Condiv. video" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "Elenco video" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "Conserva formato" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "Imposta come" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "Sottotitoli" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "Espl. file non riuscita" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "Impossibile riprodurre il video. Dati di streaming non validi" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "Formato audio non supportato" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tipo file non supportato" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "Formato non supp." + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "Formato video non supportato" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "Risoluzione" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "Impossibile riprodurre durante chiamata" + diff --git a/res/po/ja_JP.po b/res/po/ja_JP.po new file mode 100755 index 0000000..29da5a2 --- /dev/null +++ b/res/po/ja_JP.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "既に登録されています。" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "Bluetooth​ステレオ​ヘッド​セット​は​切断​され​ました" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "フォワード​ロック​タイプ​以外​の​DRM​ファイル​には​対応​して​いません" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "新しい​タグ" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "オリジナル" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "マナーモード中ですが、再生しますか?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "DRMファイルを再生できません" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "送信​できません。​この​アイテム​は​転送​ロック​されて​います" + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "未対応​DivX DRM​バージョン" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "ブック​マーク" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "完了" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "お気に入り" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "詳細" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "解像度" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "ブックマーク登録" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "SMS" + +msgid "IDS_VPL_OPT_NAME" +msgstr "名前" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "新しいビデオとしてトリミング" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "元のビデオをトリミング" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "アカウント" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "ショートカット​を​追加​" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "タグ​を​追加​" + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "ブックマーク​リスト​が​いっぱいです。​ブックマーク​を​いくつか​削除​してください。" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "サーバー​から​切断​され​ました" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "ゲートウェイ​タイムアウト" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "Internal server error" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "ライセンス​の​有効期限​が​切れ​ました" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "読み込み中..." + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "ファイルがありません。" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "メモリが不足しています" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "名前​を​付けて​保存​" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "DivX​保護​ビデオを​再生するには、デバイスの​登録が​必要です。登録​コード: %s 登録はhttp://vod.divx.com にて行ってください" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "ビデオをトリミング中..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "接続​できません。" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "再生​できません。​サーバー​から​の​パケット​が​無効​です" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "許可されていない​ビデオが​再生されました。​​保護されてるDivX​ビデオを​再生するには​アナログ出力を​使用してください" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "許可されていない​ビデオが​再生されました。保護されてるDivXビデオを​再生するには​HDMI出力を​使用してください" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "このデバイスではDivX®保護ビデオを再生できません" + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "確認" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "整備" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "動画" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "メディア​ファイルが​ありません" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "ビデオ​を​再生​できません​。​エラー​が​発生​しました" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "ファイル​サイズ" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "トリミング" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "動画を共有" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "ビデオ​リスト" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "縦横​比​を​保存​" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "登録" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "サブタイトル" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "ファイル​が​見つかり​ません" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "ビデオ​を​再生​できません​。​無効​な​ストリーミング​データ​です" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "サポートされていない​オーディオ​形式" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "未対応のファイルです" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "未対応フォーマット" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "未対応​ビデオ​形式" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "撮影サイズ" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "通話中​は​ビデオ​再生​できません" + diff --git a/res/po/ko_KR.po b/res/po/ko_KR.po new file mode 100755 index 0000000..9dfa9b3 --- /dev/null +++ b/res/po/ko_KR.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "이미 저장되어 있습니다" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "블루투스 스테레오 헤드셋 연결이 끊어졌습니다" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "전달 잠금 파일을 제외한 DRM 파일은 지원되지 않습니다" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "태그 추가" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "원본" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "무음 모드에서 재생할까요?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "DRM 파일은 재생할 수 없습니다" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "전송할 수 없습니다. 잠금이 설정되어 있습니다" + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "지원되지 않는 DivX DRM 버전입니다" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "북마크" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "완료" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "즐겨찾기" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "상세 정보" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "해상도" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "북마크 추가" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "메시지" + +msgid "IDS_VPL_OPT_NAME" +msgstr "이름" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "AllShare에서" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "새 동영상으로 잘라내기" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "원본 동영상 잘라내기" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "계정" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "단축메뉴 추가" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "태그 추가" + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "북마크 목록이 가득 찼습니다. 북마크 일부를 삭제하세요" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "서버와 연결이 끊어졌습니다" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "게이트웨이 시간이 만료되었습니다" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "서버 오류가 발생하였습니다" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "라이선스 기한이 만료되었습니다" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "로딩 중..." + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "파일이 없습니다" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "메모리가 부족합니다" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "저장" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "DivX 동영상을 재생하려면 내 디바이스를 등록해야 합니다. 등록 코드: %s http://vod.divx.com에서 등록하세요" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "동영상 잘라내는 중..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "연결할 수 없습니다" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "서버에서 받은 패킷이 바르지 않아 재생할 수 없습니다" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "허가되지 않은 비디오 출력 방식입니다. 이 DivX 동영상을 보려면 아날로그 출력 방식을 사용하세요" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "허가되지 않은 비디오 출력 방식입니다. 이 DivX 동영상을 보려면 HDMI 방식를 사용하세요" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "귀하의 제품은 DivX® DRM이 적용된 동영상의 재생 권한이 없습니다." + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "확인" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "잘라내기" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "비디오 플레이어" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "미디어 파일이 없습니다" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "동영상을 재생할 수 없습니다. 오류가 발생하였습니다" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "파일 크기" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "잘라내기" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "동영상 공유" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "동영상 목록" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "비율 유지" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "설정" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "자막" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "파일을 찾을 수 없습니다" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "동영상을 재생할 수 없습니다. 스트리밍 데이터가 바르지 않습니다" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "지원되지 않는 오디오 포맷입니다" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "지원되지 않는 파일 형식입니다" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "지원되지 않는 형식입니다" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "지원되지 않는 동영상 포맷입니다" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "해상도" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "통화 중에는 동영상을 재생할 수 없습니다" + diff --git a/res/po/nl_NL.po b/res/po/nl_NL.po new file mode 100755 index 0000000..a41f518 --- /dev/null +++ b/res/po/nl_NL.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "Bestaat al" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "Bluetooth-stereoheadset losgekoppeld" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "DRM-best alleen ondersteund voor blokkeren doorst" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "Nieuwe tag" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "Oorspronkelijk" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "Afspelen in stille stand?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "Kan DRM-bestand niet afspelen" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "Verzenden onmogelijk. Dit item is geblokkeerd voor doorsturen." + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "DivX® DRM-versie niet ondersteund" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "Favorieten" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "Gereed" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "Favoriet" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "Details" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "Resolutie" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "Favoriet toevoegen" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "Bericht" + +msgid "IDS_VPL_OPT_NAME" +msgstr "Naam" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "Op AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "Bijsnijden als nwe video" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "Oorspr. video bijsnijden" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "Account" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "Sneltoets toevoegen" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "Tag toev." + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "Favorieten vol. Verwijder een aantal favorieten." + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "Verbinding met server verbreken" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "Time-out voor gateway" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "Interne serverfout" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "Licentie verlopen" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "Laden..." + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "Geen bestanden" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "Geen geheugen meer" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "Opslaan als" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "Als u video's met DivX®-beveiliging wilt afspelen, moet uw apparaat zijn geregistreerd. Registratiecode: %s. Registreer op http://vod.divx.com" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "Video bijsnijden..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "Verbinding mislukt" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "Kan niet afspelen. Ongeldig pakket van server" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Niet-toegestane video-uitvoer. Gebruik Analoge uitvoer om deze met DivX®-beveiligde video weer te geven" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Niet-toegestane video-uitvoer. Gebruik HDMI om deze met DivX®-beveiligde video weer te geven" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "Uw apparaat heeft geen toestemming om video met DivX®-beveiliging af te spelen" + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "OK" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "Bijsnijd." + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "Videospeler" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "Geen mediabestand" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "Kan video niet afspelen. Fout opgetreden" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "Bestandsgrootte" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "Bijsnijden" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "Video delen" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "Videolijst" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "Verhouding behouden" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "Instellen als" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "Ondertitels" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "Browsen mislukt" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "Kan video niet afspelen. Ongeldige streaminggegevens" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "Niet-ondersteunde audio-indeling" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Niet-ondersteund bestandstype" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "Niet onderst. formaat" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "Niet-ondersteunde video-indeling" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "Resolutie" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "Kan video niet afspelen tijdens gesprek" + diff --git a/res/po/pt_PT.po b/res/po/pt_PT.po new file mode 100755 index 0000000..9ec1c05 --- /dev/null +++ b/res/po/pt_PT.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "Já existe" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "Auricular estéreo Bluetooth desligado" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "Fich. DRM não supor. excepto p/ tipo bloq. reenc." + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "Etiqueta nova" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "Original" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "Reproduzir no modo silencioso?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "Impossível reproduzir ficheiro DRM" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "Impossível enviar. Este item tem o reencaminhamento bloqueado." + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "Versão de DRM DivX não suportada" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "Favorito" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "Concluir" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "Favoritos" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "Detalhes" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "Resolução" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "Adicionar favorito" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "Mensagem" + +msgid "IDS_VPL_OPT_NAME" +msgstr "Nome" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "Com AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "Cortar como vídeo novo" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "Cortar vídeo original" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "Conta" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "Adicionar atalho" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "Ad. etiq." + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "Lista de marcadores cheia. Apague alguns marcadores" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "Desligada do servidor" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "Tempo de gateway esgotado" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "Erro interno de servidor" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "Licença expirou" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "A carregar" + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "Sem ficheiros" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "Memória esgotada" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "Guardar como" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "Para reproduzir vídeos DivX protegidos, o dispositivo tem de estar registado. Código de registo: %s. Registar em http://vod.divx.com" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "A limitar vídeo..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "Impossível ligar" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "Impossível reproduzir. Pacote inválido do servidor" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Saída de vídeo não autorizada. Utilize a saída analógica para ver este vídeo protegido DivX" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Saída de vídeo não autorizada. Utilize HDMI para ver este vídeo protegido DivX" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "O seu dispositivo não está autorizado a reproduzir vídeos protegidos DivX®" + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "Confirmar" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "Cortar" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "Leitor de vídeo" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "Nenhum ficheiro multimédia" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "Impossível reproduzir vídeo. Ocorreu um erro" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "Tamanho do ficheiro" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "Cortar" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "Part. vídeo" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "Lista de vídeos" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "Manter relação de visualização" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "Definir como" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "Legendas" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "Ficheiro não encontrado" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "Impossível reproduzir vídeo. Dados de streaming inválidos" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "Formato de áudio não suportado" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tipo de ficheiro não suportado" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "Formato não suportado" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "Formato de vídeo não suportado" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "Resolução" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "Impossível reproduzir vídeo durante chamada" + diff --git a/res/po/ru_RU.po b/res/po/ru_RU.po new file mode 100755 index 0000000..f6db550 --- /dev/null +++ b/res/po/ru_RU.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "Уже существует" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "Стереогарнитура Bluetooth отключена" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "Поддерживается только запрет на пересылку для файлов DRM" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "Новый тег" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "Исходный" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "Воспроизвести в профиле “Без звука”?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "Невозможно воспроизвести файл DRM" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "Нельзя отправить. Этот элемент заблокирован для пересылки." + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "Неподдерживаемая DRM-версия DivX" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "Закладка" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "Готово" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "Избранное" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "Сведения" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "Разрешение" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "Добавить закладку" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "Сообщение" + +msgid "IDS_VPL_OPT_NAME" +msgstr "Имя" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "На AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "Обрезать и сохранить" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "Обрезать исходное видео" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "Учетная запись" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "Добавить ссылку" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "Добавить метку" + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "Список закладок заполнен.\nУдалите некоторые закладки" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "Отключен от сервера" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "Тайм-аут шлюза" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "Внутренняя ошибка сервера" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "Лицензия просрочена" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "Загрузка..." + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "Нет файлов" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "Недостаточно памяти" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "Сохранить как" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "Для воспроизведения защищенного видео DivX необходимо зарегистрировать устройство. Код регистрации: %s. Регистрация выполняется на сайте http://vod.divx.com" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "Обрезка видео..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "Невозможно подключиться" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "Сбой воспроизведения. От сервера получен недопустимый пакет" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Несанкционированный видеовывод. Используйте для воспроизведения защищенного видео DivX аналоговый вывод" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Несанкционированный видеовывод. Используйте для воспроизведения защищенного видео DivX кабель HDMI" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "Это устройство не авторизовано для воспроизведения защищенного видео DivX®" + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "Да" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "Обрезать" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "Видеоплеер" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "Нет медиафайлов" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "Невозможно воспроизвести видео. Ошибка" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "Размер файла" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "Настроить" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "Обмен видео" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "Список видео" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "Сохранять пропорции" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "Установить как" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "Субтитры" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "Невозможно найти файл" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "Невозможно воспроизвести видео. Недопустимые потоковые данные" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "Неподдерживаемый формат аудио" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Неподдерживаемый тип файла" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "Неподдерживаемый формат" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "Неподдерживаемый формат видео" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "Разрешение" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "Воспроизведение видео во время вызова невозможно" + diff --git a/res/po/tr_TR.po b/res/po/tr_TR.po new file mode 100755 index 0000000..3f769f4 --- /dev/null +++ b/res/po/tr_TR.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "Zaten var" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "Bluetooth stereo kulaklık takılı değil" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "DRM dosyası iletme türü hariç desteklenmiyor" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "Yeni im" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "Orijinal" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "Sessiz modda oynatılsın mı?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "DRM dosyası çalınamıyor" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "Gönderilemiyor. Bu öğe iletmeye karşı kilitli." + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "Desteklenmeyen DivX DRM sürümü" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "Yer imi" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "Tamam" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "Sık kullanılanlar" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "Ayrıntılar" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "Çözünürlük" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "Yer imi ekle" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "Mesaj" + +msgid "IDS_VPL_OPT_NAME" +msgstr "İsim" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "AllShare üzerinde" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "Yeni videoyu kırp" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "Orijinal videoyu kırp" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "Hesap" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "Kısayol ekle" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "İm ekle" + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "Yer işaretleri listesi dolu. Bazılarını silin" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "Sunucu bağlantısı kesildi" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "Ağ geçidi zaman aşımı" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "Dahili sunucu hatası" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "Lisans süresi doldu" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "Yükleniyor..." + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "Dosya yok" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "Bellek yetersiz" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "Farklı kaydet" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "DivX korumalı videoları oynatmak için cihazınız kayıtlı olmalıdır. Kayıt kodu: %s. http://vod.divx.com adresine kayıt olun" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "Video kırpılıyor..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "Bağlantı başarısız" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "Oynatılamıyor. Sunucudan geçersiz paket" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Yetkisiz Video Çıkışı. Lütfen DivX Korumalı videoyu izlemek için Analog çıkış kullanın" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "Yetkisiz Video Çıkışı. Lütfen DivX Korumalı videoyu izlemek için HDMI kullanın" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "Cihazınızın DivX korumalı videoyu oynatma izni yok" + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "Onayla" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "Kes" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "Video oynatıcı" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "Hiç ortam dosyası yok" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "Video oynatılamıyor. Hata oluştu" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "Dosya boyutu" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "Kes" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "Video paylaş" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "Video listesi" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "En-boy oranını koru" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "Yap" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "Altyazılar" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "Dosya bulunamıyor" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "Video oynatılamıyor. Geçersiz veri akışı." + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "Desteklenmeyen ses biçimi" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Desteklenmeyen dosya türü" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "Desteklenmeyen biçim" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "Desteklenmeyen video biçimi" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "Çözünürlük" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "Görüşme sırasında video oynatılamıyor" + diff --git a/res/po/zh_CN.po b/res/po/zh_CN.po new file mode 100755 index 0000000..82c9c2d --- /dev/null +++ b/res/po/zh_CN.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "已经存在" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "蓝牙立体声耳机未连接" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "不支持除转寄锁定类型之外的 DRM 文件" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "新标签" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "原作" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "在安静模式下播放?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "无法播放DRM文件" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "无法发送。此项目禁止转发" + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "不支持的DivX® DRM版本" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "书签" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "完成" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "收藏" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "详情" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "分辨率" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "添加书签" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "娱乐共享" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "信息" + +msgid "IDS_VPL_OPT_NAME" +msgstr "名称" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "在AllShare上" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "修剪作为新视频" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "修剪原始视频" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "帐户" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "添加快捷键" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "添加标签" + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "书签列表满。删除部分书签" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "已从服务器断开" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "网关超时" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "内部服务器无效" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "许可已过期" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "裝载中…" + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "无文件" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "内存不足" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "另存为" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "如欲播放被保护的DivX®视频,必须注册您的设备。请在 http://vod.divx.com注册,注册码:%s" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "正在剪切视频…" + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "无法连接" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "无法播放。服务器无效信息包" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "未经授权的视频输出。请使用模拟输出查看该DivX®保护视频" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "未经授权的视频输出。请使用HDMI查看该DivX®保护视频" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "您的设备没有被授权播放这个DivX®加密的视频." + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "确认" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "剪切" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "视频播放器" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "没有媒体文件" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "无法播放视频。出现错误" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "文件大小" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "剪切" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "共享视频" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "视频列表" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "保持屏幕高宽比例" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "设定为" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "说明字幕" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "无法找到文件" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "无法播放视频。无效视频流数据" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "不支持的音频格式" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "不支持的文件类型" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "不支持格式" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "不支持的视频格式" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "分辨率" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "通话中无法播放视频" + diff --git a/res/po/zh_HK.po b/res/po/zh_HK.po new file mode 100755 index 0000000..720e2d7 --- /dev/null +++ b/res/po/zh_HK.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "已存在" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "藍牙立體聲耳機已中斷連接" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "不支援 DRM 檔案,轉寄鎖定類型除外" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "新標籤" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "原圖" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "以靜音模式播放?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "Unable to play DRM file" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "無法發送。此項目已轉寄鎖定" + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "不支援的 DivX DRM 版本" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "書籤" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "完成" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "我的最愛" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "詳情" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "解像度" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "加入書籤" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "訊息" + +msgid "IDS_VPL_OPT_NAME" +msgstr "名稱" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "在 AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "修剪為新影片" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "修剪原始影片" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "帳戶" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "加入捷徑" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "加入標籤" + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "書籤清單已滿。請刪除一些書籤" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "伺服器連接中斷" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "網關逾時" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "內部伺服器錯誤" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "許可已過期" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "正在載入..." + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "無檔案" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "記憶體不足" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "另存為" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "要播送DivX保護的影片,必須登記裝置。登記號碼:%s ,請前往http://vod.divx.com網站登記" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "正在修剪影片..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "無法連接" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "無法播放。來自伺服器的分組數據無效" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "未經授權的影片輸出。請使用模擬輸出觀看此段受 DivX 保護的影片" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "未經授權的影片輸出。請使用 HDMI 觀看此段受 DivX 保護的影片" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "裝置未獲授權,無法播放此DivX®保護的影片" + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "確認" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "修剪" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "影片播放器" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "無媒體檔案" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "無法播放影片。發生錯誤" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "檔案大小" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "修剪" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "共享影片" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "影片清單" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "保持屏幕寬高比例" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "設定為" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "字幕" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "無法尋找檔案" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "無法播放影片。無效串流數據" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "不支援的音效格式" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "不支援的檔案類型" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "不支援格式" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "不支援的影片格式" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "解像度" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "通話期間無法播放影片" + diff --git a/res/po/zh_TW.po b/res/po/zh_TW.po new file mode 100755 index 0000000..c9757a9 --- /dev/null +++ b/res/po/zh_TW.po @@ -0,0 +1,180 @@ +msgid "IDS_VPL_BODY_ALREADY_EXISTS" +msgstr "已存在" + +msgid "IDS_VPL_BODY_BLUETOOTH_STEREO_HEADSET_DISCONNECTED" +msgstr "藍牙立體聲耳機已中斷連線" + +msgid "IDS_VPL_BODY_DRM_FILE_NOT_SUPPORTED_EXCEPT_FOR_FORWARD_LOCK_TYPE" +msgstr "不支援除了轉寄鎖定類型外的 DRM 檔案" + +msgid "IDS_VPL_BODY_NEW_TAG" +msgstr "新標籤" + +msgid "IDS_VPL_BODY_ORIGINAL" +msgstr "原圖" + +msgid "IDS_VPL_BODY_PLAY_IN_SILENT_MODE_Q" +msgstr "在靜音模式下播放嗎?" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_DRM_FILE" +msgstr "Unable to play DRM file" + +msgid "IDS_VPL_BODY_UNABLE_TO_SEND_THIS_ITEM_IS_FORWARD_LOCKED" +msgstr "無法傳送。此項目已鎖定轉寄" + +msgid "IDS_VPL_BODY_UNSUPPORTED_DIVX_DRM_VERSION" +msgstr "不支援的 DivX DRM 版本" + +msgid "IDS_VPL_BUTTON_BOOKMARK" +msgstr "書籤" + +msgid "IDS_VPL_BUTTON_DONE" +msgstr "完成" + +msgid "IDS_VPL_HEADER_FAVOURITE" +msgstr "我的最愛" + +msgid "IDS_VPL_MBODY_DETAILS_ABB" +msgstr "詳細" + +msgid "IDS_VPL_MBODY_RESOLUTION" +msgstr "解析度" + +msgid "IDS_VPL_OPT_ADD_BOOKMARK" +msgstr "新增書籤" + +msgid "IDS_VPL_OPT_ALLSHARE" +msgstr "AllShare" + +msgid "IDS_VPL_OPT_MESSAGE" +msgstr "訊息" + +msgid "IDS_VPL_OPT_NAME" +msgstr "名稱" + +msgid "IDS_VPL_OPT_ON_ALLSHARE_ABB" +msgstr "On AllShare" + +msgid "IDS_VPL_OPT_TRIM_AS_NEW_VIDEO_ABB" +msgstr "剪輯為新影片" + +msgid "IDS_VPL_OPT_TRIM_ORIGINAL_VIDEO_ABB" +msgstr "剪輯原始影片" + +msgid "IDS_VPL_POP_ACCOUNT" +msgstr "帳戶" + +msgid "IDS_VPL_POP_ADD_SHORTCUT" +msgstr "加入捷徑" + +msgid "IDS_VPL_POP_ADD_TAG" +msgstr "加入標籤" + +msgid "IDS_VPL_POP_BOOKMARK_LIST_FULL_DELETE_SOME_BOOKMARKS" +msgstr "書籤清單已滿。請刪除部分書籤" + +msgid "IDS_VPL_POP_DISCONNECTED_FROM_SERVER" +msgstr "伺服器連線中斷" + +msgid "IDS_VPL_POP_GATEWAY_TIME_OUT" +msgstr "閘道逾時" + +msgid "IDS_VPL_POP_INTERNAL_SERVER_ERROR" +msgstr "內部伺服器錯誤" + +msgid "IDS_VPL_POP_LICENCE_EXPIRED" +msgstr "授權已到期" + +msgid "IDS_VPL_POP_LOADING_ING" +msgstr "正在載入..." + +msgid "IDS_VPL_POP_NO_FILES" +msgstr "無檔案" + +msgid "IDS_VPL_POP_OUT_OF_MEMORIES" +msgstr "記憶體不足" + +msgid "IDS_VPL_POP_SAVE_AS" +msgstr "另存為" + +msgid "IDS_VPL_POP_TO_PLAY_DIVX_PROTECTED_VIDEOS_YOUR_DEVICE_MUST_BE_REGISTERED_REGISTRATION_CODE_C_PS_REGISTER_AT_HTTP_C_VODDIVXCOM_DIVX" +msgstr "要播放DivX保護的影片,您的設備必須註冊。註冊代碼:%s登錄在http://vod.divx.com" + +msgid "IDS_VPL_POP_TRIMMING_VIDEO_ING" +msgstr "正在剪輯影片..." + +msgid "IDS_VPL_POP_UNABLE_TO_CONNECT" +msgstr "無法連線" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER" +msgstr "無法播放。來自伺服器的封包無效" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_ANALOG_OUTPUT_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "未經授權的影片輸出。請使用模擬輸出觀賞受DivX保護的影片" + +msgid "IDS_VPL_POP_UNAUTHORIZED_VIDEO_OUTPUT_PLEASE_USE_HDMI_TO_VIEW_THIS_DIVX_PROTECTED_VIDEO_DIVIX" +msgstr "未經授權的影片輸出。請使用HDMI觀賞受DivX保護的影片" + +msgid "IDS_VPL_POP_YOUR_DEVICE_IS_NOT_AUTHORIZED_TO_PLAY_THIS_DIVX_PROTECTED_VIDEO_DIVX" +msgstr "您的設備沒有被授權播放這個DivX®加密的視頻。" + +msgid "IDS_VPL_SK_CONFIRM" +msgstr "確認" + +msgid "IDS_VPL_SK3_TRIM" +msgstr "修剪" + +msgid "IDS_VPL_HEADER_VIDEO_PLAYER" +msgstr "視訊播放器" + +msgid "IDS_VPL_POP_NO_MEDIA_FILE" +msgstr "無媒體文件" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_ERROR_OCCURRED" +msgstr "無法播放影片。發生錯誤" + +msgid "IDS_VPL_BODY_FILE_SIZE" +msgstr "檔案大小" + +msgid "IDS_VPL_BUTTON_TRIM" +msgstr "剪輯" + +msgid "IDS_VPL_HEADER_SHARE_VIDEO_ABB" +msgstr "影像分享" + +msgid "IDS_VPL_HEADER_VIDEO_LIST" +msgstr "影片清單" + +msgid "IDS_VPL_OPT_KEEP_ASPECT_RATIO" +msgstr "保持螢幕顯示比例" + +msgid "IDS_VPL_OPT_SET_AS" +msgstr "設定為" + +msgid "IDS_VPL_OPT_SUBTITLES" +msgstr "字幕" + +msgid "IDS_VPL_POP_UNABLE_TO_FIND_FILE" +msgstr "無法找到檔案" + +msgid "IDS_VPL_POP_UNABLE_TO_PLAY_VIDEO_INVALID_STREAMING_DATA" +msgstr "無法播放影片。無效的串流數據" + +msgid "IDS_VPL_POP_UNSUPPORTED_AUDIO_FORMAT" +msgstr "不支援的音訊格式" + +msgid "IDS_VPL_POP_UNSUPPORTED_FILE_TYPE" +msgstr "不支援的檔案類型" + +msgid "IDS_VPL_POP_UNSUPPORTED_FORMAT" +msgstr "不支援格式" + +msgid "IDS_VPL_POP_UNSUPPORTED_VIDEO_FORMAT" +msgstr "不支援的視訊格式" + +msgid "IDS_VPL_OPT_RESOLUTION" +msgstr "解析度" + +msgid "IDS_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL" +msgstr "無法在通話期間播放影片" + diff --git a/src/mp-util-media-service.c b/src/mp-util-media-service.c new file mode 100755 index 0000000..c4487a8 --- /dev/null +++ b/src/mp-util-media-service.c @@ -0,0 +1,657 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include + +#include "mp-video-log.h" +#include "mp-video-value-define.h" +#include "mp-video-type-define.h" +#include "mp-util-media-service.h" +#include "mp-video-string-define.h" + +static Eina_List *VideoItemList = NULL; +static Eina_List *pAllTagList = NULL; + +MediaSvcHandle *pMediaSvcHandle = NULL; + +/* + * Callback function + */ +static int MpUtilMediaSvcMitemIterateCb(Mitem * pItem, void *pUserData) +{ + VideoLogInfo("Cluster ID: %s, File path:%s", pItem->cluster_uuid, pItem->file_url); + + if (pItem->type == MINFO_ITEM_VIDEO) { + Eina_List **pList = (Eina_List **)pUserData; + *pList = eina_list_append(*pList, pItem); + } + + return 0; +} + +static int MpUtilMediaSvcMtagIterateGetTagListCb(Mtag * pItem, void *pUserData) +{ + VideoLogInfo(""); + + Eina_List **pList = (Eina_List **)pUserData; + *pList = eina_list_append(*pList, pItem); + + return 0; +} + +/* + * Internal function + */ +bool MpUtilMediaSvcGetFileDirectoryName(char *szFilePath, char *szFileName, + char *szDirectoryName, + char *szDirectoryPath) +{ + VideoLogInfo(""); + + if (!szFilePath) { + VideoLogInfo("[ERR]"); + return FALSE; + } + + int nCount = 0; + int nLoopCount = 0; + + for (nLoopCount = strlen(szFilePath); nLoopCount >= 0; nLoopCount--) { + if (szFilePath[nLoopCount] != '\0') + nCount++; + + if (szFilePath[nLoopCount] == '/') { + if (szFileName) { + memcpy(szFileName, &szFilePath[nLoopCount + 1], --nCount); + *(szFileName + nCount) = '\0'; + VideoLogInfo("File name = %s\n", szFileName); + } + + if (szDirectoryPath) { + memcpy(szDirectoryPath, &szFilePath[0], nLoopCount); + *(szDirectoryPath + nLoopCount + 1) = '\0'; + VideoLogInfo("Directory path = %s", szDirectoryPath); + } + + if (szDirectoryName) { + nCount = 0; + for (--nLoopCount; nLoopCount >= 0; nLoopCount--) { + nCount++; + if (szFilePath[nLoopCount] == '/') { + memcpy(szDirectoryName, &szFilePath[nLoopCount + 1], --nCount); + *(szDirectoryName + nCount) = '\0'; + VideoLogInfo("Directory Name = %s", szDirectoryName); + + return TRUE; + } + } + } + + return TRUE; + } + } + + return FALSE; +} + +bool MpUtilMediaSvcDestroyList(Eina_List *pList) +{ + if (!pList) { + VideoLogInfo("pList is empty already."); + return FALSE; + } + + Mitem *pMitem = NULL; + EINA_LIST_FREE(pList, pMitem) { + if (pMitem) { + minfo_destroy_mtype_item(pMitem); + pMitem = NULL; + } + } + + pList = NULL; + + return TRUE; +} + +/* + * External function + */ + +void MpUtilMediaSvcInitSession(void) +{ + VideoLogInfo(""); + + int nRet = 0; + + nRet = media_svc_connect(&pMediaSvcHandle); + + if(nRet < 0) + { + VideoLogInfo("[ERR]"); + } +} + +void MpUtilMediaSvcFinishSession(void) +{ + VideoLogInfo(""); + + media_svc_disconnect(pMediaSvcHandle); +} + +void MpUtilMediaSvcDestoryVideoList(void) +{ + VideoLogInfo(""); + + if (VideoItemList) { + MpUtilMediaSvcDestroyList(VideoItemList); + VideoItemList = NULL; + } +} + +bool MpUtilMediaSvcDestroyItem(char *szFilePath) +{ + VideoLogInfo(""); + + if (!szFilePath) { + VideoLogInfo("[ERR]"); + return FALSE; + } + + if (!VideoItemList) { + VideoLogInfo("pList is empty already."); + return FALSE; + } + + Mitem *pMitem = NULL; + Eina_List *pIterateList = NULL; + EINA_LIST_FOREACH(VideoItemList, pIterateList, pMitem) { + if (pMitem) { + if (!strcmp(pMitem->file_url, szFilePath)) { + VideoItemList = eina_list_remove(VideoItemList, pMitem); + } + } + } + return TRUE; +} + +bool MpUtilMediaSvcGetVideoFileListFromFolder(char *szFilePath, int nSortType) +{ + VideoLogInfo(""); + + if (!szFilePath) { + VideoLogInfo("[ERR]"); + return FALSE; + } + + if (VideoItemList) { + VideoLogInfo("Already exist video list."); + return FALSE; + } + + VideoLogInfo("szFilePath : %s", szFilePath); + + int nRet = 0; + char szFolderID[STR_UUID_LEN_MAX] = { 0, }; + char szDirectoryPath[STR_LEN_MAX] = { 0, }; + minfo_item_filter m_Filter = { 0, }; + + // Get directory path from filepath. + MpUtilMediaSvcGetFileDirectoryName(szFilePath, NULL, NULL, szDirectoryPath); + VideoLogInfo("Directory Path : %s", szDirectoryPath); + + // Get folder ID by directory path. + nRet = minfo_get_cluster_id_by_url(pMediaSvcHandle, szDirectoryPath, szFolderID, STR_UUID_LEN_MAX); + VideoLogInfo("Folder ID : %s", szFolderID); + + // Set sorting type. + switch (nSortType) { + case MP_MEDIA_SORT_BY_NONE: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NONE; + break; + + case MP_MEDIA_SORT_BY_NAME_DESC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_DESC; + break; + + case MP_MEDIA_SORT_BY_NAME_ASC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_ASC; + break; + + case MP_MEDIA_SORT_BY_DATE_DESC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_DATE_DESC; + break; + + case MP_MEDIA_SORT_BY_DATE_ASC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_ASC; + break; + + default: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_ASC; + } + + // Set sorting type. + m_Filter.favorite = MINFO_MEDIA_FAV_ALL; + m_Filter.file_type = MINFO_ITEM_VIDEO; + m_Filter.start_pos = -1; + m_Filter.end_pos = -1; + m_Filter.with_meta = TRUE; + + // Get Item List. + minfo_get_item_list(pMediaSvcHandle, szFolderID, m_Filter, MpUtilMediaSvcMitemIterateCb, &VideoItemList); + return TRUE; +} + +bool MpUtilMediaSvcGetVideoFileListFromAllFolderOfGallery(int nSortType) +{ + VideoLogInfo(""); + + if (VideoItemList) { + VideoLogInfo("Already exist video list."); + return FALSE; + } + + minfo_item_filter m_Filter = { 0 }; + + /* Set sorting type. */ + switch (nSortType) { + case MP_MEDIA_SORT_BY_NONE: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NONE; + break; + + case MP_MEDIA_SORT_BY_NAME_DESC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_DESC; + break; + + case MP_MEDIA_SORT_BY_NAME_ASC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_ASC; + break; + + case MP_MEDIA_SORT_BY_DATE_DESC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_DATE_DESC; + break; + + case MP_MEDIA_SORT_BY_DATE_ASC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_ASC; + break; + + default: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_ASC; + } + + VideoLogInfo("Sorting : %d", nSortType); + + /* Set sorting type. */ + m_Filter.favorite = MINFO_MEDIA_FAV_ALL; + m_Filter.file_type = MINFO_ITEM_VIDEO; + m_Filter.start_pos = -1; + m_Filter.end_pos = -1; + m_Filter.with_meta = TRUE; + + /* Get All Item. */ + minfo_get_all_item_list(pMediaSvcHandle, MINFO_CLUSTER_TYPE_LOCAL_ALL, m_Filter, MpUtilMediaSvcMitemIterateCb, &VideoItemList); + + return TRUE; +} + +bool MpUtilMediaSvcGetVideoFileListByTagName(char *szTagName) +{ + VideoLogInfo(""); + + if (!szTagName) { + VideoLogInfo("[ERR] No Exist tag name."); + return FALSE; + } + + if (VideoItemList) { + VideoLogInfo("Already exist video list."); + return FALSE; + } + + VideoLogInfo("szTagName : %s", szTagName); + + int nRet = minfo_get_media_list_by_tagname(pMediaSvcHandle, szTagName, FALSE, MpUtilMediaSvcMitemIterateCb, &VideoItemList); + if (nRet < 0) { + VideoLogInfo("Failed to get a media items' list. error code->%d", nRet); + return FALSE; + } + + return TRUE; +} + +bool MpUtilMediaSvcGetVideoFileListFromFavorite(int nSortType) +{ + VideoLogInfo(""); + + if (VideoItemList) { + VideoLogInfo("Already exist video list."); + return FALSE; + } + + minfo_item_filter m_Filter = { 0 }; + + /* Set sorting type. */ + switch (nSortType) { + case MP_MEDIA_SORT_BY_NONE: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NONE; + break; + + case MP_MEDIA_SORT_BY_NAME_DESC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_DESC; + break; + + case MP_MEDIA_SORT_BY_NAME_ASC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_ASC; + break; + + case MP_MEDIA_SORT_BY_DATE_DESC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_DATE_DESC; + break; + + case MP_MEDIA_SORT_BY_DATE_ASC: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_ASC; + break; + + default: + m_Filter.sort_type = MINFO_MEDIA_SORT_BY_DATE_DESC; + } + + m_Filter.favorite = MINFO_MEDIA_FAV_ONLY; + m_Filter.file_type = MINFO_ITEM_VIDEO; + m_Filter.start_pos = -1; + m_Filter.end_pos = -1; + m_Filter.with_meta = FALSE; + + int nRet = minfo_get_item_list(pMediaSvcHandle, NULL, m_Filter, MpUtilMediaSvcMitemIterateCb, &VideoItemList); + if (nRet < 0) { + VideoLogInfo("Failed to get a media items' list. error code->%d", nRet); + return FALSE; + } + + return TRUE; +} + +void MpUtilMediaSvcMtagIterateDestroyTagList(void) +{ + VideoLogInfo(""); + + if (!pAllTagList) { + VideoLogInfo("pAllTagList is empty already."); + return; + } + + Mtag *pMtag = NULL; + EINA_LIST_FREE(pAllTagList, pMtag) { + if (pMtag) { + if (pMtag->tag_name) { + free(pMtag->tag_name); + pMtag->tag_name = NULL; + } + free(pMtag); + pMtag = NULL; + } + } + + pAllTagList = NULL; +} + +int MpUtilMediaSvcMtagGetAllTagList(char *pTagList[]) +{ + VideoLogInfo(""); + + int nErr = 0; + int nCount = 0; + + if (pAllTagList) { + MpUtilMediaSvcMtagIterateDestroyTagList(); + } + + minfo_get_tag_list_by_media_id(pMediaSvcHandle, NULL, MpUtilMediaSvcMtagIterateGetTagListCb, &pAllTagList); + + if (nErr == 0 && pAllTagList != NULL) { + Mtag *pMtag = NULL; + Eina_List *pTmpList = NULL; + + EINA_LIST_FOREACH(pAllTagList, pTmpList, pMtag) { + if (pMtag && pMtag->tag_name) { + VideoLogInfo("%s of the tag has %d item(s).", pMtag->tag_name, pMtag->count); + pTagList[nCount++] = pMtag->tag_name; + } + } + } + + VideoLogInfo("Size of User tag list is %d.", nCount); + + return nCount; +} + +bool MpUtilMediaSvcMtagAddItemToTag(const char *szTagName, char *szMediaUri) +{ + VideoLogInfo(""); + + if (!szTagName) { + VideoLogInfo("[ERR] No exist string pointer szTagName."); + return FALSE; + } + + Mitem *m_Item = NULL; + + if (szMediaUri) { + minfo_get_item(pMediaSvcHandle, szMediaUri, &m_Item); + } + + if (m_Item) { + minfo_add_tag(pMediaSvcHandle, m_Item->uuid, szTagName); + minfo_destroy_mtype_item(m_Item); + } else { + minfo_add_tag(pMediaSvcHandle, NULL, szTagName); + } + + return TRUE; +} + +bool MpUtilMediaSvcMtagGetItemToFavorite(char *szMediaUri) +{ + VideoLogInfo(""); + + if (!szMediaUri) { + VideoLogInfo("[ERR] No exist string pointer szMediaUri."); + return FALSE; + } + + Mitem *m_Item = NULL; + + minfo_get_item(pMediaSvcHandle, szMediaUri, &m_Item); + + if (m_Item) { + VideoLogInfo("Favorate value : %d", m_Item->rate); + if (m_Item->rate) { + minfo_destroy_mtype_item(m_Item); + return TRUE; + } else { + minfo_destroy_mtype_item(m_Item); + return FALSE; + } + + } else { + VideoLogInfo("[ERR] m_Item is NULL."); + return FALSE; + } + + return TRUE; +} + +bool MpUtilMediaSvcMtagAddItemToFavorite(char *szMediaUri, bool bFavorite) +{ + VideoLogInfo(""); + + if (!szMediaUri) { + VideoLogInfo("[ERR] No exist string pointer szMediaUri."); + return FALSE; + } + + Mitem *m_Item = NULL; + + minfo_get_item(pMediaSvcHandle, szMediaUri, &m_Item); + + if (m_Item) { + int nRet = minfo_update_media_favorite(pMediaSvcHandle, m_Item->uuid, bFavorite); + + if (nRet == 0) { + VideoLogInfo("success to add item to favourites folder."); + } else { + VideoLogInfo("fail - error code : %d ", nRet); + } + + minfo_destroy_mtype_item(m_Item); + } else { + VideoLogInfo("[ERR] m_Item is NULL."); + return FALSE; + } + + return TRUE; +} + +char *MpUtilMediaSvcMitemGetThumbnailUrl(char *szMediaUri) +{ + VideoLogInfo(""); + + if (!szMediaUri) { + VideoLogInfo("[ERR] No exist string pointer szMediaUri."); + return FALSE; + } + + Mitem *m_Item = NULL; + char *thumb_path = NULL; + + minfo_get_item(pMediaSvcHandle, szMediaUri, &m_Item); + + if (m_Item) { + /* prevent 2011/07/12 */ + thumb_path = strdup(m_Item->thumb_url); + minfo_destroy_mtype_item(m_Item); + return thumb_path; + } + + return NULL; +} + +bool MpUtilMediaSvcGetPreNextVideoUrl(char *szCurrMediaUri, char *szPreMediaUri, char *szNextMediaUri) +{ + VideoLogInfo(""); + + if (!szCurrMediaUri) { + VideoLogInfo("[ERR] No exist current file path."); + return FALSE; + } + + if (!VideoItemList) { + VideoLogInfo("No exist VideoItemList."); + return FALSE; + } + + int nCount = 0; + int nListSize = 0; + Mitem *m_Item = NULL; + Eina_List *pIterateList = NULL; + + memset(szPreMediaUri, 0, sizeof(char) * STR_LEN_MAX); + memset(szNextMediaUri, 0, sizeof(char) * STR_LEN_MAX); + + nListSize = eina_list_count(VideoItemList); + + if (nListSize <= 1) { + VideoLogInfo("Video list size == 1."); + return FALSE; + } + + EINA_LIST_FOREACH(VideoItemList, pIterateList, m_Item) { + if (m_Item == NULL) + continue; + + VideoLogInfo("URL of the File item - %s (%d / %d)", m_Item->file_url, nCount, nListSize); + + if (!strcmp(m_Item->file_url, szCurrMediaUri)) { + m_Item = NULL; + m_Item = (Mitem *) eina_list_nth(VideoItemList, nCount - 1); + if (m_Item) { + strncpy(szPreMediaUri, m_Item->file_url, (sizeof(char) * STR_LEN_MAX) - 1); + } + + m_Item = NULL; + m_Item = (Mitem *) eina_list_nth(VideoItemList, nCount + 1); + if (m_Item) { + strncpy(szNextMediaUri, m_Item->file_url, (sizeof(char) * STR_LEN_MAX) - 1); + } + + VideoLogInfo("PreMediaUri:%s", szPreMediaUri); + VideoLogInfo("NextMediaUri:%s", szNextMediaUri); + + return TRUE; + } + + ++nCount; + } + + return FALSE; +} + +void MpUtilMediaSvcGetVideoID(const char *szPath, char *szVideoID) +{ + + VideoLogInfo(""); + + Mitem *item = NULL; + int ret = 0; + + ret = minfo_get_item(pMediaSvcHandle, szPath, &item); + if (ret < 0) { + VideoLogInfo("minfo_get_item API error return:%s, %d", szPath, ret); + return; + } + + if (item) { + memset((void*)szVideoID, 0, STR_LEN_MAX); + strncpy(szVideoID, item->uuid, STR_LEN_MAX-1); + minfo_destroy_mtype_item(item); + } +} + + +void MpUtilMediaSvcSaveLastPlayedTime(char* szMediaUri, unsigned int nLastPlayedTime) +{ + if (!szMediaUri) { + VideoLogInfo("No exist media uri."); + return; + } + + VideoLogInfo(""); + + char szVid[STR_LEN_MAX] = {0}; + + MpUtilMediaSvcGetVideoID(szMediaUri, szVid); + + if (strlen(szVid) > 0) { + minfo_update_video_meta_info_int(pMediaSvcHandle, szVid, MINFO_VIDEO_META_BOOKMARK_LAST_PLAYED, nLastPlayedTime); + } else { + VideoLogInfo("Invalid video ID."); + } +} diff --git a/src/mp-util.c b/src/mp-util.c new file mode 100755 index 0000000..a3afa48 --- /dev/null +++ b/src/mp-util.c @@ -0,0 +1,1466 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "mp-xml-parser.h" +#include "mp-util-media-service.h" +#include "mp-video-type-define.h" +#include "mp-video-value-define.h" +#include "mp-video-string-define.h" +#include "mp-video-info-ctrl.h" + +#define MP_LAUNCH_BLUETOOTH_PACKAGE_NAME "org.tizen.bluetooth" + +#define MP_UTIL_VIDEO_PATH "path" +#define MP_UTIL_USER_AGENT_KEY "db/admin/uagent" +#define MP_UTIL_COOKIE "cookie" + +#define MP_UTIL_MMC_PATH "/opt/storage/sdcard" + +#define MP_UTIL_FILE_PREFIX "file://" + + +static Ecore_X_Window pMainXwindow = 0; +static Ecore_X_Display *pX11DisplayHandle = NULL; +static Evas_Object *pPopUpHandle = NULL; +static Evas_Object *pPopupWindow = NULL; + +MpXMLItemInfo pXmlItem[XML_ITEM_NUM]; +int nXmlItemCount = 0; +int nHttpQuality = 0; +int nHttpCount = 0; +int nRtspCount = 0; +bool bXmlLoad = FALSE; + +/* + * Callback function + */ + +static void MpUtilBatteryStatusChangeCb(keynode_t *pKeyNode, void *pUserData) +{ + VideoLogInfo(""); + + int nLowBatteryStatus = 0; + + if (!pUserData) { + VideoLogInfo("User data is NULL."); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!vconf_get_int + (VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &nLowBatteryStatus)) { + if (nLowBatteryStatus <= VCONFKEY_SYSMAN_BAT_POWER_OFF) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData); + return; + } + } else { + VideoLogInfo("Fail to get vconf"); + } +} + +static void MpUtilMMCStatusChangeCb(keynode_t * pKeyNode, void *pUserData) +{ + VideoLogInfo(""); + + char szFilename[9] = { 0 }; + + if (!pUserData || !pKeyNode) { + VideoLogInfo("User data is NULL."); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + char *keyname = vconf_keynode_get_name(pKeyNode); + if (strcmp(keyname, VCONFKEY_FILEMANAGER_DB_STATUS) == 0) { + int nMMCState = vconf_keynode_get_int(pKeyNode); + if (nMMCState == VCONFKEY_FILEMANAGER_DB_UPDATED) { + strncpy(szFilename, pAppData->szMediaUri, sizeof(szFilename) - 1); + VideoLogInfo("FILE NAME[%s]", szFilename); + if (!strcmp(MP_UTIL_MMC_PATH, szFilename)) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData); + } + } + } else { + VideoLogInfo("Fail to get vconf"); + } +} + + +/* + * External function + */ + +void MpUtilExitVideoPlayer(void) +{ + VideoLogInfo(""); + + elm_exit(); +} + +static void MpUtilDestroyMainWindow(void *pUserData, Evas_Object *pEvasObject, + void *pEvent) +{ + VideoLogInfo(""); + + MpUtilExitVideoPlayer(); +} + +void MpUtilResetForRelaunching(void) +{ + VideoLogInfo(""); + + pX11DisplayHandle = NULL; + pPopUpHandle = NULL; + pPopupWindow = NULL; + + memset(pXmlItem, 0, sizeof(MpXMLItemInfo) * XML_ITEM_NUM); + + nXmlItemCount = 0; + nHttpQuality = 0; + nHttpCount = 0; + nRtspCount = 0; + bXmlLoad = FALSE; +} + +void *MpUtilCreateMainWindow(const char *pStrName) +{ + VideoLogInfo(""); + + if (!pStrName) { + VideoLogInfo("[ERR] No exist pStrName."); + return NULL; + } + + if (pMainXwindow) { + evas_object_del((Evas_Object *)pMainXwindow); + pMainXwindow = 0; + } + + int nWidth, nHeight; + Evas_Object *pEvasObject; + + ecore_evas_app_comp_sync_set(0); + pEvasObject = elm_win_add(NULL, pStrName, ELM_WIN_BASIC); + if (pEvasObject) { + elm_win_title_set(pEvasObject, pStrName); + elm_win_borderless_set(pEvasObject, EINA_TRUE); + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &nWidth, &nHeight); + + evas_object_resize(pEvasObject, nWidth, nHeight); + + evas_object_smart_callback_add(pEvasObject, "delete,request", + MpUtilDestroyMainWindow, NULL); + } + + pMainXwindow = elm_win_xwindow_get(pEvasObject); + + //////////////////////////// + // TEMP + + Evas_Object *pRect = NULL; + Evas *pMainWindowEvas = evas_object_evas_get(pEvasObject); + + pRect = evas_object_rectangle_add(pMainWindowEvas); + evas_object_color_set(pRect, 0, 0, 0, 0); + evas_object_render_op_set(pRect, EVAS_RENDER_COPY); + evas_object_resize(pRect, nWidth, nHeight); + evas_object_show(pRect); + + return (void *)pEvasObject; +} + +void *MpUtilCreateWindow(const char *pStrName) +{ + VideoLogInfo(""); + + if (!pStrName) { + VideoLogInfo("[ERR] No exist pStrName."); + return NULL; + } + + if (!pMainXwindow) { + VideoLogInfo("[ERR] No exist pMainXwindow."); + return NULL; + } + + int nWidth = 0, nHeight = 0; + Evas_Object *pEvasObject = NULL; + + pEvasObject = elm_win_add(NULL, pStrName, ELM_WIN_BASIC); + if (pEvasObject) { + elm_win_title_set(pEvasObject, pStrName); + elm_win_borderless_set(pEvasObject, EINA_TRUE); + ecore_x_window_size_get(ecore_x_window_root_first_get(), &nWidth, &nHeight); + evas_object_resize(pEvasObject, nWidth, nHeight); + } + + elm_win_alpha_set(pEvasObject, TRUE); + ecore_x_icccm_transient_for_set(elm_win_xwindow_get(pEvasObject), pMainXwindow); + utilx_set_window_effect_state(ecore_x_display_get(), elm_win_xwindow_get(pEvasObject), 0); + evas_object_show(pEvasObject); + + return (void *)pEvasObject; +} + +int MpUtilSetKeyGrab(const char *szKeyName, int nGrabMode) +{ + VideoLogInfo(""); + + if (!pX11DisplayHandle) { + pX11DisplayHandle = ecore_x_display_get(); + } + + if (!pMainXwindow) { + VideoLogInfo("Not exist pMainXwindow."); + } + + utilx_grab_key(pX11DisplayHandle, pMainXwindow, szKeyName, nGrabMode); + + return TRUE; +} + +int MpUtilSetKeyUngrab(const char *szKeyName) +{ + VideoLogInfo(""); + if (pMainXwindow && pX11DisplayHandle) { + utilx_ungrab_key(pX11DisplayHandle, pMainXwindow, szKeyName); + } + + return TRUE; +} + +bool MpUtilCheckRTSPType(char *szUriPath) +{ + if(szUriPath == NULL) { + VideoLogInfo("ERR:"); + return FALSE; + } + + if (strstr(szUriPath, "rtp")) + return TRUE; + else if (strstr(szUriPath, "rtsp")) + return TRUE; + + return FALSE; +} + +int MpUtilCheckPlayerType(char *szUriPath) +{ + if(szUriPath == NULL) { + VideoLogInfo("ERR:"); + return FALSE; + } + + VideoLogInfo(" URI : %s", szUriPath); + + if (strstr(szUriPath, "rtp")) + return 1; + else if (strstr(szUriPath, "rtsp")) + return 1; + else if (strstr(szUriPath, "http")) + return 1; + else if (strstr(szUriPath, "https")) + return 1; + + return 0; +} + +bool MpUtilGetURIFromBundle(bundle * pBundleData, VideoAppData *pAppData) +{ + char *pStrVideoURI = NULL; + + if (!pBundleData || !bundle_get_count(pBundleData)) { + VideoLogInfo + ("[ERR] No exist pBundleData pointer or bundle count value."); + return FALSE; + } + + pStrVideoURI = (char *)bundle_get_val(pBundleData, MP_UTIL_VIDEO_PATH); + if (pStrVideoURI) { + strncpy(pAppData->szMediaUri, pStrVideoURI, STR_LEN_MAX - 1); + } else { + VideoLogInfo("[ERR] No exist video/streaming URI."); + return FALSE; + } + + VideoLogInfo("Video/Streaming URI path pStrVideoURI : %s", + pStrVideoURI); + VideoLogInfo("Video/Streaming URI path pAppData->szMediaUri : %s", + pAppData->szMediaUri); + + return TRUE; +} + +bool MpUtilGetURIFromAUL(bundle * pBundleData, VideoAppData *pAppData) +{ + char *pStrVideoURI = NULL; + + if (!pBundleData || !bundle_get_count(pBundleData)) { + VideoLogInfo + ("[ERR] No exist pBundleData pointer or bundle count value."); + return FALSE; + } + + + if(!strcmp(APPSVC_OPERATION_VIEW , appsvc_get_operation(pBundleData))) + { + pStrVideoURI = (char *)appsvc_get_uri(pBundleData); + if (pStrVideoURI) { + strncpy(pAppData->szMediaUri, pStrVideoURI, STR_LEN_MAX - 1); + } else { + VideoLogInfo("[ERR] No exist video/streaming URI."); + return FALSE; + } + } + else + { + VideoLogInfo("[ERR] No exist Operation."); + return FALSE; + } + + VideoLogInfo("Video/Streaming URI path pStrVideoURI : %s", + pStrVideoURI); + VideoLogInfo("Video/Streaming URI path pAppData->szMediaUri : %s", + pAppData->szMediaUri); + + return TRUE; +} + + +bool MpUtilGetCookieFromBundle(bundle * pBundleData, VideoAppData *pAppData) +{ + char *pStrVideoCookie = NULL; + + if (!pBundleData || !bundle_get_count(pBundleData)) { + VideoLogInfo + ("[ERR] No exist pBundleData pointer or bundle count value."); + return FALSE; + } + + pStrVideoCookie = (char *)bundle_get_val(pBundleData, MP_UTIL_COOKIE); + if (pStrVideoCookie) { + strncpy(pAppData->szCookie, pStrVideoCookie, STR_LEN_MAX - 1); + } else { + VideoLogInfo("[ERR] No exist video/streaming URI."); + return FALSE; + } + + VideoLogInfo("Video/Streaming URI path Cookie : %s", pStrVideoCookie); + + return TRUE; +} + +bool MpUtilCheckLocalFileExist(char *uri) +{ + VideoLogInfo(""); + + if (uri == NULL) { + VideoLogInfo("[ERR]"); + return FALSE; + } + + if(strstr(uri,MP_UTIL_FILE_PREFIX)) + { + if (!g_file_test(uri+strlen(MP_UTIL_FILE_PREFIX), + G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) { + return FALSE; + } + return TRUE; + } + else + { + if (!g_file_test(uri, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) { + return FALSE; + } + return TRUE; +} + +} + +bool MpUtilCheckVideoURI(VideoAppData *pAppData) +{ + VideoLogInfo(""); + + if (pAppData == NULL) { + VideoLogInfo("[ERR]"); + return FALSE; + } + + if (strlen(pAppData->szMediaUri) > 0) { + if (MpUtilCheckPlayerType(pAppData->szMediaUri)) { + VideoLogInfo("=== SETTING STREAMING TYPE ==="); + strncpy(pAppData->szVideoTitle, MP_STREAMING_PLAYER_STR, + STR_LEN_MAX - 1); + pAppData->nCurPlayerType = MP_STREAMING_PLAYER; + } else { + VideoLogInfo("=== SETTING VIDEO TYPE ==="); + pAppData->nCurPlayerType = MP_VIDEO_PLAYER; + } + } else { + VideoLogInfo("[ERR] No exist video/streaming URI."); + return FALSE; + } + + VideoLogInfo("pAppData->szMediaUri : %s", pAppData->szMediaUri); + + return TRUE; +} + +bool MpUtilCheckBatteryStatus(void) +{ + VideoLogInfo(""); + + int nLowBatteryStatus = 0; + + if (!vconf_get_int + (VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &nLowBatteryStatus)) { + if (nLowBatteryStatus <= VCONFKEY_SYSMAN_BAT_POWER_OFF) { + return FALSE; + } + } + + return TRUE; +} + + +int MpUtilBatteryStatusNoti(VideoAppData *pAppData) +{ + VideoLogInfo(""); + + if (!pAppData) { + VideoLogInfo("[ERR] No exist appdata."); + return FALSE; + } + + if (vconf_notify_key_changed + (VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, MpUtilBatteryStatusChangeCb, + pAppData)) { + VideoLogInfo("[ERR] Fail to set Battery notification."); + } + + return TRUE; +} + +int MpUtilBatteryStatusNotiIgnore(void) +{ + VideoLogInfo(""); + + if (vconf_ignore_key_changed + (VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, + MpUtilBatteryStatusChangeCb) < 0) { + VideoLogInfo("[ERR] Fail to ignore battery status."); + return FALSE; + } + + return TRUE; +} + +int MpUtilMMCstatusNoti(VideoAppData *pAppData) +{ + VideoLogInfo(""); + + if (!pAppData) { + VideoLogInfo("[ERR] No exist appdata."); + return FALSE; + } + + if (vconf_notify_key_changed + (VCONFKEY_FILEMANAGER_DB_STATUS, MpUtilMMCStatusChangeCb, + pAppData) < 0) { + VideoLogInfo("[ERR] Fail to set MMC notification."); + } + + return TRUE; +} + + + +int MpUtilMMCstatusNotiIgnore(void) +{ + VideoLogInfo(""); + + if (vconf_ignore_key_changed + (VCONFKEY_FILEMANAGER_DB_STATUS, MpUtilMMCStatusChangeCb) < 0) { + VideoLogInfo("[ERR] Fail to ignore MMC status."); + } + + return TRUE; +} + +void MpUtilLanguageInit(VideoAppData *pAppData) +{ + VideoLogInfo(""); + + if (!pAppData) { + VideoLogInfo("[ERR] No exist appdata."); + return; + } + + char *szPath = NULL; + + szPath = vconf_get_str(VCONFKEY_LANGSET); + if (!szPath) { + VideoLogInfo("Language setting has no proper value (nil)"); + return; + } + + VideoLogInfo("Setting language is %s", szPath); + + setenv("LANG", szPath, 1); + setenv("LC_ALL", szPath, 1); + setenv("LANGUAGE", szPath, 1); + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); +} + +int MpUtilCheckStartPositionTime(void *pBundle, char *szBundleKey) +{ + VideoLogInfo(""); + + if (!pBundle) { + VideoLogInfo("No exist bundle data."); + return 0; + } + + int nStartPositionTime = 0; + char *szStartPosTime = (char *)bundle_get_val(pBundle, szBundleKey); + + if (!szStartPosTime) { + VideoLogInfo("No exist start position time."); + return 0; + } + + nStartPositionTime = atoi(szStartPosTime); + + VideoLogInfo("Start position time : %d", nStartPositionTime); + + return nStartPositionTime; +} + +bool MpUtilCheckLaunchingByMime(void *pBundle, char *szMediaUri) +{ + VideoLogInfo(""); + + if (!pBundle) { + VideoLogInfo("[ERR] No Exist bundle."); + return FALSE; + } + + if (!szMediaUri) { + VideoLogInfo("[ERR] No Exist media uri."); + return FALSE; + } + + char *szMimeContent = + (char *)bundle_get_val(pBundle, AUL_K_MIME_CONTENT); + + if (!szMimeContent) { + VideoLogInfo("No exist mime type."); + return FALSE; + } + + VideoLogInfo("Mime content : %s", szMimeContent); + strncpy(szMediaUri, szMimeContent, STR_LEN_MAX - 1); + + return TRUE; +} + +int MpUtilCheckLaunchingByOtherApp(void *pBundle, char *szBundleKey) +{ + VideoLogInfo(""); + + if (!pBundle) { + VideoLogInfo("No exist bundle data."); + return MP_LAUNCH_APP_DEFAULT; + } + + char *szLaunchingByOtherApp = + (char *)bundle_get_val(pBundle, szBundleKey); + MpLaunchingAppType nTmpLaunchingAppType = MP_LAUNCH_APP_DEFAULT; + + if (!szLaunchingByOtherApp) { + VideoLogInfo("No exist Launching application."); + return nTmpLaunchingAppType; + } + + if (!strcmp(szLaunchingByOtherApp, "gallery")) { + nTmpLaunchingAppType = MP_LAUNCH_APP_GALLERY; + } else if (!strcmp(szLaunchingByOtherApp, "image_viewer")) { + nTmpLaunchingAppType = MP_LAUNCH_APP_IMAGE_VIEWER; + } else if (!strcmp(szLaunchingByOtherApp, "email")) { + nTmpLaunchingAppType = MP_LAUNCH_APP_SIMPLE_VIEW; + } else if (!strcmp(szLaunchingByOtherApp, "message")) { + nTmpLaunchingAppType = MP_LAUNCH_APP_SIMPLE_VIEW; + } else if (!strcmp(szLaunchingByOtherApp, "light_play_view")) { + nTmpLaunchingAppType = MP_LAUNCH_APP_SIMPLE_VIEW; + } else { + nTmpLaunchingAppType = MP_LAUNCH_APP_DEFAULT; + } + + VideoLogInfo("Start position time : %d", nTmpLaunchingAppType); + + return (int)nTmpLaunchingAppType; +} + +int MpUtilCheckSortType(void *pBundle, char *szBundleKey) +{ + VideoLogInfo(""); + + if (!pBundle) { + VideoLogInfo("No exist bundle data."); + return (int)MP_MEDIA_SORT_BY_NONE; + } + + char *szSortType = (char *)bundle_get_val(pBundle, szBundleKey); + MpMediaSortType nTmpSortType = MP_MEDIA_SORT_BY_NAME_DESC; + + if (!szSortType) { + VideoLogInfo("No exist sort type information."); + return (int)nTmpSortType; + } + + if (!strcmp(szSortType, "name_asc")) { + nTmpSortType = MP_MEDIA_SORT_BY_NAME_ASC; + } else if (!strcmp(szSortType, "name_desc")) { + nTmpSortType = MP_MEDIA_SORT_BY_NAME_DESC; + } else if (!strcmp(szSortType, "date_asc")) { + nTmpSortType = MP_MEDIA_SORT_BY_DATE_ASC; + } else if (!strcmp(szSortType, "date_desc")) { + nTmpSortType = MP_MEDIA_SORT_BY_DATE_DESC; + } else if (!strcmp(szSortType, "none")) { + nTmpSortType = MP_MEDIA_SORT_BY_NONE; + } else { + nTmpSortType = MP_MEDIA_SORT_BY_NAME_DESC; + } + + return (int)nTmpSortType; +} + +int MpUtilCheckListType(void *pBundle, char *szBundleKey) +{ + VideoLogInfo(""); + + if (!pBundle) { + VideoLogInfo("No exist bundle data."); + VideoLogInfo("Video list type : folder"); + return (int)MP_VIDEO_LIST_TYPE_FOLDER; + } + + if (!szBundleKey) { + VideoLogInfo("No exist bundle kay."); + VideoLogInfo("Video list type : folder"); + return (int)MP_VIDEO_LIST_TYPE_FOLDER; + } + + char *szVideoListType = (char *)bundle_get_val(pBundle, szBundleKey); + MpVideoListType nTmpVideoListType = MP_VIDEO_LIST_TYPE_FOLDER; + + if (!szVideoListType) { + VideoLogInfo("No exist video list type information."); + VideoLogInfo("Video list type : folder"); + return (int)nTmpVideoListType; + } + + if (!strcmp(szVideoListType, "folder")) { + nTmpVideoListType = MP_VIDEO_LIST_TYPE_FOLDER; + VideoLogInfo("Video list type : folder"); + } else if (!strcmp(szVideoListType, "all_folder_video")) { + nTmpVideoListType = MP_VIDEO_LIST_TYPE_ALL_FOLDER_GALLERY; + VideoLogInfo("Video list type : all_folder_video"); + } else if (!strcmp(szVideoListType, "tag_video")) { + nTmpVideoListType = MP_VIDEO_LIST_TYPE_TAG_GALLERY; + VideoLogInfo("Video list type : tag_video"); + } else if (!strcmp(szVideoListType, "favorite")) { + nTmpVideoListType = MP_VIDEO_LIST_TYPE_FAVORITE; + VideoLogInfo("Video list type : favorite"); + } else { + nTmpVideoListType = MP_VIDEO_LIST_TYPE_FOLDER; + VideoLogInfo("Video list type : folder"); + } + + return (int)nTmpVideoListType; +} + +bool MpUtilGetTagNameOfGallery(void *pBundle, char *szBundleKey, + char *szTagName) +{ + VideoLogInfo(""); + + if (!pBundle) { + VideoLogInfo("No exist bundle."); + return FALSE; + } + + if (!szBundleKey) { + VideoLogInfo("No exist bundle kay."); + return FALSE; + } + + if (!szTagName) { + VideoLogInfo("No exist pAppData."); + return FALSE; + } + + char *szVideoTagName = (char *)bundle_get_val(pBundle, szBundleKey); + + if (!szVideoTagName) { + VideoLogInfo("No exist video tag name."); + return FALSE; + } + + strncpy(szTagName, szVideoTagName, STR_LEN_MAX - 1); + + VideoLogInfo("szTagName : %s", szTagName); + + return TRUE; +} + +int MpUtilCheckDlnaSortType(void *pBundle, char *szBundleKey) +{ + VideoLogInfo(""); + + if (!pBundle) { + VideoLogInfo("No exist bundle data."); + return (int)MP_MEDIA_SORT_BY_NONE; + } + + char *szSortType = (char *)bundle_get_val(pBundle, szBundleKey); + if(szSortType == NULL) { + VideoLogInfo("No exist bundle value."); + return -1; + } + int nTmpSortType = atoi(szSortType); + + return (int)nTmpSortType; +} + +int MpUtilCheckDlnaMediaID(void *pBundle, char *szBundleKey) +{ + VideoLogInfo(""); + + if (!pBundle) { + VideoLogInfo("No exist bundle data."); + return -1; + } + + char *szMediID = (char *)bundle_get_val(pBundle, szBundleKey); + + if (szMediID == NULL) { + VideoLogInfo("No exist bundle value."); + return -1; + } + + int media_id = atoi(szMediID); + + return (int)media_id; +} + +bool MpUtilIsXMLUrl(char *szMediaUri) +{ + VideoLogInfo("URI : %s", szMediaUri); + + if (!g_str_has_suffix(szMediaUri, ".xml")) { + VideoLogInfo("No have xml uri."); + return FALSE; + } + + return TRUE; +} + +void MpUtilInitXML() +{ + VideoLogInfo(""); + + mp_xml_init(); +} + +void MpUtilDestroyXML() +{ + VideoLogInfo(""); + + mp_xml_destroy(); +} + +char *MpUtilGetXMLQualityURL(void) +{ + VideoLogInfo(""); + + if (nHttpCount > 1 || nRtspCount > 1) { + nHttpQuality = (nHttpQuality + 1) % 2; + return strdup(pXmlItem[nHttpQuality].szURL); + } + + return NULL; +} + +bool MpUtilParsingXML(char *szMediaUri, VideoAppData *pAppData) +{ + VideoLogInfo(""); + char *pXmlData = NULL; + char *szTmpUri = NULL; + int nInsertCount = 0; + unsigned int nFileSize = 0; + + if (!szMediaUri) { + VideoLogInfo("[ERR] No have Media uri."); + return FALSE; + } + MpUtilInitXML(); + + szTmpUri = (char *)strdup(pAppData->szMediaUri); + + if (szTmpUri == NULL) { + VideoLogInfo("[ERR]"); + return FALSE; + } + + if (!g_str_has_suffix(szTmpUri, ".xml")) { + VideoLogInfo("No have xml uri."); + if (szTmpUri) + free(szTmpUri); + return TRUE; + } + + memset(pXmlItem, 0, sizeof(MpXMLItemInfo) * XML_ITEM_NUM); + + nFileSize = mp_read_xml_file(szTmpUri, &pXmlData); + if (nFileSize == 0 || pXmlData == NULL) { + VideoLogInfo("[ERR] Invalid XML File : %s", szTmpUri); + if (szTmpUri) + free(szTmpUri); + + if (pXmlData) + free(pXmlData); + + return FALSE; + } + + nInsertCount = mp_get_xmlitem(pXmlData, nFileSize, + pXmlItem, &nHttpCount, &nRtspCount); + if (nInsertCount > 0) { + VideoLogInfo("Get xml item : %d", nInsertCount); + nXmlItemCount = nInsertCount; + } + + if (nHttpCount > 1) { + nHttpQuality = 0; + memset((void *)pAppData->szMediaUri, 0, + sizeof(pAppData->szMediaUri)); + strncpy(pAppData->szMediaUri, pXmlItem[nHttpQuality].szURL, + STR_LEN_MAX - 1); + nXmlItemCount = nHttpCount; + } else if (nRtspCount > 1) { + nHttpQuality = 0; + memset((void *)pAppData->szMediaUri, 0, + sizeof(pAppData->szMediaUri)); + strncpy(pAppData->szMediaUri, pXmlItem[nHttpQuality].szURL, + STR_LEN_MAX - 1); + VideoLogInfo("URL : %s", pAppData->szMediaUri); + nXmlItemCount = nRtspCount; + } else { + char *szParsedUrl = NULL; + bool bResult = + mp_get_url_from_xml(pXmlData, nFileSize, &szParsedUrl, + _WIFI_MODE_); + + if (bResult == FALSE || szParsedUrl == NULL) { + VideoLogInfo("[ERR] XML parsing failed!"); + free(szTmpUri); + return FALSE; + } + + memset((void *)pAppData->szMediaUri, 0, STR_LEN_MAX); + strncpy(pAppData->szMediaUri, szParsedUrl, STR_LEN_MAX - 1); + + if (szParsedUrl) { + free(szParsedUrl); + } + } + + pAppData->nCurPlayerType = MP_STREAMING_PLAYER; + + strncpy(pAppData->szVideoTitle, mp_get_title_from_xml(szTmpUri), + STR_LEN_MAX - 1); + + bXmlLoad = TRUE; + + if (pXmlData) { + free(pXmlData); + } + + if (szTmpUri) { + free(szTmpUri); + } + + return TRUE; +} + +int MpUtilGetXMLItemCount(void) +{ + VideoLogInfo(""); + + if (nHttpCount > 0) + return nHttpCount; + + if (nRtspCount > 0) + return nRtspCount; + + return 0; + +} + +bool MpUtilGetTitleFromFilepath(char *szFilepath, char *szTitle) +{ + VideoLogInfo(""); + + if (!szFilepath || !szTitle) { + VideoLogInfo("[ERR]"); + return FALSE; + } + + char *szTitleName; + char *szExt; + + szTitleName = strrchr(szFilepath, '/'); + + if (szTitleName) + szTitleName++; + else + szTitleName = szFilepath; + + szExt = strrchr(szTitleName, '.'); + + if (szExt) { + int nTmpStringSize = szExt - szTitleName; + strncpy(szTitle, szTitleName, nTmpStringSize); + } else { + strncpy(szTitle, szTitleName, STR_LEN_MAX - 1); + } + + return TRUE; +} + +void MpUtilInitSession(void) +{ + VideoLogInfo(""); + + mm_session_init(MM_SESSION_TYPE_EXCLUSIVE); +} + +void MpUtilFinishSession(void) +{ + VideoLogInfo(""); + + mm_session_finish(); +} + +void MpUtilVolumeTypeSet(void) +{ + VideoLogInfo(""); + + mm_sound_volume_primary_type_set(VOLUME_TYPE_MEDIA); +} + +void MpUtilVolumeTypeUnset(void) +{ + VideoLogInfo(""); + + mm_sound_volume_primary_type_clear(); +} + +void MpUtilDeletePopupHandle(void) +{ + VideoLogInfo(""); + + if (pPopUpHandle) { + evas_object_del(pPopUpHandle); + pPopUpHandle = NULL; + } else { + VideoLogInfo("No exist popup."); + } + + if (pPopupWindow) { + evas_object_del(pPopupWindow); + pPopupWindow = NULL; + } else { + VideoLogInfo("No exist popup window."); + } +} + +bool MpUtilNotifyPopUp(VideoAppData *pAppData, char *szContents, void *PopupButtonCallbackFunc) +{ + VideoLogInfo(""); + + if (pAppData == NULL || szContents == NULL) { + VideoLogInfo("No have popup message or pAppData is null."); + return FALSE; + } + + MpUtilDeletePopupHandle(); + pPopUpHandle = elm_popup_add(pAppData->pMainWindow); + + evas_object_size_hint_weight_set(pPopUpHandle, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(pPopUpHandle, szContents); + elm_object_part_text_set(pPopUpHandle, "title,text", dgettext("sys_string", MP_COM_POP_ERROR)); + elm_popup_timeout_set(pPopUpHandle, 3.0); + + if (PopupButtonCallbackFunc) { + evas_object_smart_callback_add(pPopUpHandle, "timeout", PopupButtonCallbackFunc, (void *)pAppData); + } + + evas_object_show(pPopUpHandle); + + return TRUE; +} + +bool MpUtilWarinigPopUp(VideoAppData *pAppData, char *szContents, + void *PopupButtonCallbackFunc) +{ + VideoLogInfo(""); + + if (pAppData == NULL || szContents == NULL) { + VideoLogInfo("No have popup message or pAppData is null."); + return FALSE; + } + + MpUtilDeletePopupHandle(); + pPopUpHandle = elm_popup_add(pAppData->pMainWindow); + + evas_object_size_hint_weight_set(pPopUpHandle, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_object_text_set(pPopUpHandle, szContents); + elm_object_part_text_set(pPopUpHandle, "title,text", dgettext("sys_string", MP_COM_POP_ERROR)); + elm_popup_timeout_set(pPopUpHandle, 3.0); + + if (PopupButtonCallbackFunc) { + evas_object_smart_callback_add(pPopUpHandle, "timeout", PopupButtonCallbackFunc, (void *)pAppData); + } + + evas_object_show(pPopUpHandle); + + return TRUE; +} + + +bool MpUtilYesNoPopUp(VideoAppData *pAppData, char *szTitle, char *szContents, + void *PopupYesButtonCallbackFunc, void *PopupNoButtonCallbackFunc) +{ + VideoLogInfo(""); + + if (szTitle == NULL || szContents == NULL || pAppData == NULL) { + VideoLogInfo("No have popup message or pAppData is null."); + return FALSE; + } + + Evas_Object *pButton = NULL; + + MpUtilDeletePopupHandle(); + + pPopUpHandle = elm_popup_add(pAppData->pMainWindow); + + evas_object_size_hint_weight_set(pPopUpHandle, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(pPopUpHandle, szContents); + elm_object_part_text_set(pPopUpHandle, "title,text", szTitle); + + pButton = elm_button_add(pPopUpHandle); + elm_object_text_set(pButton, dgettext(MP_SYS_STRING, MP_COM_SK_YES)); + elm_object_part_content_set(pPopUpHandle, "button1", pButton); + + if(PopupYesButtonCallbackFunc) + { + evas_object_smart_callback_add(pButton, "clicked", PopupYesButtonCallbackFunc, (void*)pAppData); + } + + pButton = elm_button_add(pPopUpHandle); + elm_object_text_set(pButton, dgettext(MP_SYS_STRING, MP_COM_SK_NO)); + elm_object_part_content_set(pPopUpHandle, "button2", pButton); + + if(PopupNoButtonCallbackFunc) + { + evas_object_smart_callback_add(pButton, "clicked", PopupNoButtonCallbackFunc, (void*)pAppData); + } + + elm_popup_timeout_set(pPopUpHandle, 3.0); + + evas_object_show(pPopUpHandle); + + return TRUE; +} + +void MpUtilSetLabelForDetail(Evas_Object *pBox, char *szString) +{ + VideoLogInfo(""); + + Evas_Object *pLabel = NULL; + + pLabel = elm_label_add(pBox); + elm_object_text_set(pLabel, szString); + elm_label_ellipsis_set(pLabel, EINA_TRUE); + elm_label_wrap_width_set(pLabel, 614 * elm_config_scale_get()); + evas_object_size_hint_weight_set(pLabel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_min_set(pLabel, 614 * elm_config_scale_get(), 35 * elm_config_scale_get()); + elm_box_pack_end(pBox, pLabel); + evas_object_show(pLabel); +} + +bool MpUtilDetailPopup(VideoAppData *pAppData, char *szTitle, void *PopupButtonCallbackFunc) +{ + VideoLogInfo(""); + + if(szTitle == NULL || pAppData == NULL) + { + VideoLogInfo("No have popup message or pAppData is null."); + return FALSE; + } + + char szTmpStr[STR_LEN_MAX] = {0}; + char szTmpFileDate[STR_LEN_MAX] = {0}; + char szTmpFileExtension[STR_LEN_MAX] = {0}; + char szTmpFileSize[STR_LEN_MAX] = {0}; + + double nLongtitude = 0.0; + double nLatitude = 0.0; + + Evas_Object *pBox = NULL; + Evas_Object *pButton = NULL; + + MpUtilDeletePopupHandle(); + + pPopUpHandle = elm_popup_add(pAppData->pMainWindow); + + evas_object_size_hint_weight_set(pPopUpHandle, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + MpVideoInfoCtrlGetFileInfo(pAppData->szMediaUri, szTmpFileDate, STR_LEN_MAX, szTmpFileExtension, STR_LEN_MAX, szTmpFileSize, STR_LEN_MAX); + MpVideoInfoCtrlGetGPS(pAppData->szMediaUri, &nLongtitude, &nLatitude); + + pBox = elm_box_add(pPopUpHandle); + + snprintf(szTmpStr, STR_LEN_MAX, " %s: %s ", dgettext(MP_SYS_STRING, MP_COM_BODY_DETAILS_TITLE), pAppData->szVideoTitle); + MpUtilSetLabelForDetail(pBox, szTmpStr); + memset(szTmpStr, 0, STR_LEN_MAX); + + snprintf(szTmpStr, STR_LEN_MAX, " %s: %s", dgettext(MP_SYS_STRING, MP_COM_BODY_FORMAT), szTmpFileExtension); + MpUtilSetLabelForDetail(pBox, szTmpStr); + memset(szTmpStr, 0, STR_LEN_MAX); + + snprintf(szTmpStr, STR_LEN_MAX, " %s: %s", dgettext(MP_SYS_STRING, MP_COM_POP_DATE), szTmpFileDate); + MpUtilSetLabelForDetail(pBox, szTmpStr); + memset(szTmpStr, 0, STR_LEN_MAX); + + snprintf(szTmpStr, STR_LEN_MAX, " %s: %s", dgettext(MP_SYS_STRING, MP_COM_BODY_SIZE), szTmpFileSize); + MpUtilSetLabelForDetail(pBox, szTmpStr); + memset(szTmpStr, 0, STR_LEN_MAX); + + snprintf(szTmpStr, STR_LEN_MAX, " %s: %d x %d", dgettext(MP_SYS_STRING, MP_IDLE_BODY_RESOLUTION), pAppData->nVideoWidthResolution, pAppData->nVideoHeightResolution); + MpUtilSetLabelForDetail(pBox, szTmpStr); + memset(szTmpStr, 0, STR_LEN_MAX); + + snprintf(szTmpStr, STR_LEN_MAX, " %s: %f", _(MP_VPL_GPS_LATITUDE), nLatitude); + MpUtilSetLabelForDetail(pBox, szTmpStr); + memset(szTmpStr, 0, STR_LEN_MAX); + + snprintf(szTmpStr, STR_LEN_MAX, " %s: %f", _(MP_VPL_GPS_LONGITUTD), nLongtitude); + MpUtilSetLabelForDetail(pBox, szTmpStr); + memset(szTmpStr, 0, STR_LEN_MAX); + + elm_object_content_set(pPopUpHandle, pBox); + + elm_object_part_text_set(pPopUpHandle, "title,text", szTitle); + pButton = elm_button_add(pPopUpHandle); + elm_object_text_set(pButton, dgettext(MP_SYS_STRING, MP_COM_SK_BACK)); + elm_object_part_content_set(pPopUpHandle, "button1", pButton); + + if(PopupButtonCallbackFunc) + { + evas_object_smart_callback_add(pButton, "clicked", PopupButtonCallbackFunc, (void*)pAppData); + } + + evas_object_show(pPopUpHandle); + + return TRUE; +} + +bool MpUtilProgressPopUp(VideoAppData *pAppData, char *szLabel) +{ + VideoLogInfo(""); + + if (pAppData == NULL || szLabel == NULL) { + VideoLogInfo("No have popup message or pAppData is null."); + return FALSE; + } + + MpUtilDeletePopupHandle(); + pPopUpHandle = elm_popup_add(pAppData->pMainWindow); + + evas_object_size_hint_weight_set(pPopUpHandle, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + Evas_Object *progressbar, *box, *label; + + label = elm_label_add(pPopUpHandle); + elm_object_text_set(label, szLabel); + evas_object_show(label); + + progressbar = elm_progressbar_add(pPopUpHandle); + elm_object_style_set(progressbar, "pending_list"); + elm_progressbar_pulse(progressbar, EINA_TRUE); + evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_pulse(progressbar, EINA_TRUE); + evas_object_show(progressbar); + + box = elm_box_add(pPopUpHandle); + elm_box_pack_end(box, label); + elm_box_pack_end(box, progressbar); + evas_object_show(box); + elm_object_content_set(pPopUpHandle, box); + + evas_object_show(pPopUpHandle); + + return TRUE; +} + +void *MpUtilCreateButtonIcon(void *pParent, const char *szIconPath, bool nX, bool nY, void *pUserData, char* szButtonStyle, void *func) +{ + VideoLogInfo(""); + + Evas_Object *pButton = NULL; + Evas_Object *pIcon = NULL; + + pButton = elm_button_add(pParent); + pIcon = elm_icon_add(pParent); + elm_icon_file_set(pIcon, szIconPath, NULL); + evas_object_size_hint_aspect_set(pIcon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_resizable_set(pIcon, nX, nY); + + if(szButtonStyle) { + elm_object_style_set(pButton, szButtonStyle); + } + + elm_object_part_content_set(pButton,PART_BUTTON_ICON, pIcon); + evas_object_smart_callback_add(pButton, "clicked", func, (void *)pUserData); + evas_object_show(pButton); + + return (void *)pButton; +} + +int MpUtilSendFileViaBluetooth(char *szFilepath) +{ + VideoLogInfo(""); + + if (!szFilepath) { + VideoLogInfo("[ERR] filepath == NULL."); + } + + int nRet = 0; + + bundle *pBundleHandle = NULL; + + pBundleHandle = bundle_create(); + + bundle_add(pBundleHandle, "launch-type", "send"); + bundle_add(pBundleHandle, "filecount", "1"); + bundle_add(pBundleHandle, "files", szFilepath); + + nRet = aul_launch_app(MP_LAUNCH_BLUETOOTH_PACKAGE_NAME, pBundleHandle); + + bundle_free(pBundleHandle); + + return nRet; +} + +void *MpUtilLoadEdjFile(Evas * pEvas, char *szEdjName, char *szGroupName) +{ + VideoLogInfo(""); + + Evas_Object *pEdj = NULL; + int nWidth = 0; + int nHeight = 0; + + pEdj = edje_object_add(pEvas); + if (!edje_object_file_set(pEdj, szEdjName, szGroupName)) { + VideoLogInfo("[ERR] EDJ file error : %s | %s\n", szEdjName, + szGroupName); + return NULL; + } + + edje_object_size_min_get(pEdj, &nWidth, &nHeight); + evas_object_resize(pEdj, nWidth, nHeight); + + return (void *)pEdj; +} + +bool MpUtilCheckCallStatus(void) +{ + VideoLogInfo(""); + + int nCallStatus = 0; + + if (!vconf_get_int(VCONFKEY_CALL_STATE, &nCallStatus)) { + if (nCallStatus != VCONFKEY_CALL_OFF) { + return FALSE; + } + } + + return TRUE; +} + +bool MpUtilIsConnectEarjack(void) +{ + VideoLogInfo(""); + + int nEarjack = 0; + + if (!vconf_get_int(VCONFKEY_SYSMAN_EARJACK, &nEarjack)) { + if (nEarjack) { + return TRUE; + } + } + + return FALSE; +} + +bool MpUtilRegisteEarjackCbFunc(void *pEarjackCb, void *pUserData) +{ + if (!pEarjackCb) { + VideoLogInfo("pEarjackCb is empty."); + return FALSE; + } + + VideoLogInfo(""); + + vconf_notify_key_changed(VCONFKEY_SYSMAN_EARJACK, pEarjackCb, pUserData); + + return TRUE; +} + +int *MpUtilGetMainWindowXID(void) +{ + VideoLogInfo(""); + + if (pMainXwindow) { + VideoLogInfo("pMainXwindow : %d", pMainXwindow); + return (int *)&pMainXwindow; + } else { + VideoLogInfo("No exist main window XID."); + } + + return 0; +} + +void MpUtilGetUserAgent(VideoAppData *pAppData) +{ + VideoLogInfo(""); + + int nWifiMode = 0; + + char *szUserAgent = NULL; + szUserAgent = vconf_get_str(VCONFKEY_ADMIN_UAGENT); + if (szUserAgent) { + memset(pAppData->szUserAgent, 0, STR_LEN_MAX); + strncpy(pAppData->szUserAgent, szUserAgent, STR_LEN_MAX - 1); + free(szUserAgent); + } else { + VideoLogInfo("!!!!! NO EXIST USER AGENT !!!!!"); + } + + if (!vconf_get_int(VCONFKEY_WIFI_STATE, &nWifiMode)) { + VideoLogInfo("User Agent : %s, Wi-Fi : %d", pAppData->szUserAgent, nWifiMode); + } + +} + + +double MpUtilGetSysTime(void) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + return (double)tv.tv_sec + (double)tv.tv_usec / 1E6; +} + +void MpUtilLcdNormalPowerLockForResume(void) +{ + VideoLogInfo(""); + + pm_lock_state(LCD_NORMAL, GOTO_STATE_NOW, 0); +} + +void MpUtilLcdNormalPowerUnlockForPause(void) +{ + VideoLogInfo(""); + + pm_unlock_state(LCD_NORMAL, PM_KEEP_TIMER); +} + +void MpUtilLcdOffForPowerButton(void) +{ + VideoLogInfo(""); + + pm_unlock_state(LCD_NORMAL, PM_KEEP_TIMER); +} + +void MpUtilMultimediaKeyGrab(void) +{ + VideoLogInfo(""); + + MpUtilSetKeyGrab(PLAY_KEY, KEY_GRAB_OR_EXCLUSIVE); + MpUtilSetKeyGrab(STOP_KEY, KEY_GRAB_OR_EXCLUSIVE); + MpUtilSetKeyGrab(PAUSE_KEY, KEY_GRAB_OR_EXCLUSIVE); + MpUtilSetKeyGrab(NEXT_KEY, KEY_GRAB_OR_EXCLUSIVE); + MpUtilSetKeyGrab(PREV_KEY, KEY_GRAB_OR_EXCLUSIVE); + MpUtilSetKeyGrab(REWIND_KEY, KEY_GRAB_OR_EXCLUSIVE); + MpUtilSetKeyGrab(FORWARD_KEY, KEY_GRAB_OR_EXCLUSIVE); +} + +void MpUtilMultimediaKeyUngrab(void) +{ + VideoLogInfo(""); + + MpUtilSetKeyUngrab(PAUSE_KEY); + MpUtilSetKeyUngrab(PLAY_KEY); + MpUtilSetKeyUngrab(STOP_KEY); + MpUtilSetKeyUngrab(NEXT_KEY); + MpUtilSetKeyUngrab(PREV_KEY); + MpUtilSetKeyUngrab(FORWARD_KEY); + MpUtilSetKeyUngrab(REWIND_KEY); +} + diff --git a/src/mp-video-animation-ctrl.c b/src/mp-video-animation-ctrl.c new file mode 100755 index 0000000..44095bf --- /dev/null +++ b/src/mp-video-animation-ctrl.c @@ -0,0 +1,150 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "video-player.h" +#include "mp-video-value-define.h" +#include "mp-video-animation-ctrl.h" + +#define BUFFERING_TXT_MAX_LEN 16 + +static Evas_Object *pAnimationEdj = NULL; +static Ecore_Timer *pAnimationTimer = NULL; + +static int nIconIndex = 0; + +static Eina_Bool MpVideoAnimationCtrlTimerCb(void *data) +{ + char sig_format[SIGNAL_TEXT_MAX_LEN] = { 0, }; + + snprintf(sig_format, SIGNAL_TEXT_MAX_LEN, "%s.%d", + SIGNAL_ANIMATION_IMAGE_LOADING, nIconIndex); + + edje_object_signal_emit(pAnimationEdj, sig_format, "*"); + + nIconIndex += 1; + if (nIconIndex > ANIMATION_MAX_COUNT) + nIconIndex = 1; + + return EINA_TRUE; +} + +void *MpVideoAnimationCtrlInit(void *pUserData) +{ + VideoLogInfo(""); + + if (pUserData == NULL) { + VideoLogInfo("data is NULL"); + return NULL; + } + + Evas *pMainWindowEvas = (Evas *) pUserData; + + pAnimationEdj = MpUtilLoadEdjFile(pMainWindowEvas, + VIDEO_PLAYER_ANIMATION_EDJ, + ANIMATION_EDJ_GROUP); + + evas_object_hide(pAnimationEdj); + + return (void *)pAnimationEdj; +} + +void MpVideoAnimationCtrlDestroy(void) +{ + VideoLogInfo(""); + + if (pAnimationTimer) { + ecore_timer_del(pAnimationTimer); + pAnimationTimer = NULL; + } + + if (pAnimationEdj) { + evas_object_hide(pAnimationEdj); + evas_object_del(pAnimationEdj); + pAnimationEdj = NULL; + } + + nIconIndex = 0; +} + +void MpVideoAnimationCtrlSetPercent(int nPercent) +{ + VideoLogInfo(""); + if (nPercent >= 0) { + char szBuffering[BUFFERING_TXT_MAX_LEN] = { 0, }; + + snprintf(szBuffering, BUFFERING_TXT_MAX_LEN, "Loading %d%%...", + nPercent); + edje_object_part_text_set(pAnimationEdj, "loading.txt", + szBuffering); + } else { + edje_object_part_text_set(pAnimationEdj, "loading.txt", + "Loading..."); + } +} + +void MpVideoAnimationCtrlPlay(void) +{ + VideoLogInfo(""); + if (pAnimationTimer == NULL) { + pAnimationTimer = ecore_timer_add(ANIMATION_TIMER_INTERVAL, + MpVideoAnimationCtrlTimerCb, + NULL); + } +} + +void MpVideoAnimationCtrlStop(void) +{ + VideoLogInfo(""); + + if (pAnimationTimer) { + ecore_timer_del(pAnimationTimer); + pAnimationTimer = NULL; + } +} + +void MpVideoAnimationCtrlShow(void) +{ + VideoLogInfo(""); + + if (pAnimationTimer == NULL) { + MpVideoAnimationCtrlPlay(); + MpVideoAnimationCtrlSetPercent(-1); + evas_object_show(pAnimationEdj); + } +} + +void MpVideoAnimationCtrlHide(void) +{ + VideoLogInfo(""); + + MpVideoAnimationCtrlStop(); + evas_object_hide(pAnimationEdj); +} + +bool MpVideoAnimationCtrlGetActiveState(void) +{ + VideoLogInfo(""); + if (pAnimationTimer) + return true; + else + return false; +} diff --git a/src/mp-video-app-ctrl.c b/src/mp-video-app-ctrl.c new file mode 100755 index 0000000..a84a010 --- /dev/null +++ b/src/mp-video-app-ctrl.c @@ -0,0 +1,1604 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "mp-video-app-ctrl.h" +#include "mp-video-view-ctrl.h" +#include "mp-util-media-service.h" +#include "mp-video-value-define.h" +#include "mp-video-subtitle-ctrl.h" +#include "mp-video-string-define.h" +#include "mp-video-streaming-ctrl.h" + +#include "mp-video-ctrl-mgr.h" + +static int nBufferingRate = 0; +static double nDurationTime = 0; +static char szSubtitleString[STR_LEN_MAX] = {0}; +static int nErrorCode = 0; + +static Ecore_Pipe *pEcorePipeHandleForErrorMsg = NULL; +static Ecore_Pipe *pEcorePipeHandleBOF = NULL; +static Ecore_Pipe *pEcorePipeHandleEOF = NULL; +static Ecore_Pipe *pEcorePipeHandleForBuffering = NULL; +static Ecore_Pipe *pEcorePipeHandleForBluetooth = NULL; +static Ecore_Pipe *pEcorePipeHandleForSubTitle = NULL; +static Ecore_Pipe *pEcorePipeHandleForResumed = NULL; +static Ecore_Pipe *pEcorePipeHandleForInterruped = NULL; + +static void MpVideoAppCtrlStart(VideoAppData *pAppData); +static void MpVideoAppCtrlStop(VideoAppData *pAppData); +static void MpVideoAppCtrlPause(VideoAppData *pAppData); +static void MpVideoAppCtrlResume(VideoAppData *pAppData); +static void MpVideoAppCtrlStopByAppPause(VideoAppData *pAppData); +static void MpVideoAppCtrlStartByAppResume(VideoAppData *pAppData); +static void MpVideoAppCtrlFFDown(VideoAppData *pAppData); +static void MpVideoAppCtrlRewDown(VideoAppData *pAppData); +static void MpVideoAppCtrlFFUp(VideoAppData *pAppData); +static void MpVideoAppCtrlRewUp(VideoAppData *pAppData); +static void MpVideoAppCtrlSetMute(VideoAppData *pAppData); +static void MpVideoAppCtrlSetScreenType(VideoAppData *pAppData); +static void MpVideoAppCtrlSetScreenSize(VideoAppData *pAppData, int nScreenSize); +static void MpVideoAppCtrlGetPosition(VideoAppData *pAppData); +static void MpVideoAppCtrlSetPosition(VideoAppData *pAppData); +static void MpVideoAppCtrlHideLayout(VideoAppData *pAppData); +static void MpVideoAppCtrlShowLayout(VideoAppData *pAppData); +static void MpVideoAppCtrlGetVideoResolution(VideoAppData *pAppData); +static void MpVideoAppCtrlReqDurationTime(VideoAppData *pAppData); +static void MpVideoAppCtrlBeginOfStream(VideoAppData *pAppData); +static void MpVideoAppCtrlEndOfStream(VideoAppData *pAppData); +static void MpVideoAppCtrlExit(VideoAppData *pAppData); +static void MpVideoAppCtrlStartStreaming(VideoAppData *pAppData); +static void MpVideoAppCtrlReLaunching(VideoAppData *pAppData); +static void MpVideoAppCtrlPlayPreMedia(VideoAppData *pAppData); +static void MpVideoAppCtrlPlayNextMedia(VideoAppData *pAppData); +static void MpVideoAppCtrlGetBufferingPosition(VideoAppData *pAppData); +static void MpVideoAppCtrlErrorMsg(VideoAppData *pAppData, unsigned int nErrorCode); +static void MpVideoAppCtrlPipeInit(VideoAppData *pAppData); + + +/* + * Callback function + */ +static void MpVideoAppCtrlWarningPopupCb(void *pUserData, Evas_Object *pObject, + void *pEventInfo) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return; + } + + VideoLogInfo(""); + + MpUtilDeletePopupHandle(); +} + +static void MpVideoAppCtrlExitCb(void *pUserData, Evas_Object *pObject, + void *pEventInfo) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData); +} + +static int MpVideoAppCtrlPauseByInterrupteCb(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return 0; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + MpVideoViewHideSoundpath(pUserData); + MpVideoAppCtrlPause(pAppData); + + return 0; +} + +static int MpVideoAppCtrlBeginOfPlayCb(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return 0; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + MpVideoAppCtrlSetMute(pAppData); + MpVideoAppCtrlBeginOfStream(pAppData); + + return 0; +} + +static int MpVideoAppCtrlEndOfPlayCb(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return 0; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + MpVideoAppCtrlEndOfStream(pAppData); + + return 0; +} + +static int MpVideoAppCtrlBufferingCb(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return 0; + } + + VideoLogInfo(""); + + MpVideoViewSetBufferingRateForStreamingView(nBufferingRate, pUserData); + + return 0; +} + +static int MpVideoAppCtrlBluetoothCb(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return 0; + } + + VideoLogInfo(""); + + return 0; +} + +static int MpVideoAppCtrlResumeByRewCb(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return 0; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + MpVideoAppCtrlResume(pAppData); + + return 0; +} + +static Eina_Bool MpVideoAppCtrlUpdateSubtitleCb(void* pUserData) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return EINA_FALSE; + } + + VideoLogInfo(""); + + if (strlen(szSubtitleString) > 0 && nDurationTime > 0) { + MpVideoViewCtrlUpdateSubtitle(nDurationTime, szSubtitleString); + } + + return EINA_FALSE; +} + +static int MpVideoAppCtrlMmfErrormsgCb(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return 0; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + MpVideoAppCtrlErrorMsg(pAppData, nErrorCode); + + return 0; +} + +static void MpVideoAppCtrlErrorMsg(VideoAppData *pAppData, + unsigned int nErrorCode) +{ + VideoLogInfo("[MMF ERROR] CtrlErrorMsg."); + + switch (nErrorCode) { + case 1: + VideoLogInfo("Connection Fail."); + break; + + case MM_ERROR_PLAYER_CODEC_NOT_FOUND: + VideoLogInfo("CODEC NOT FOUND"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_POP_UNSUPPORTED_FILE_TYPE), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_AUDIO_CODEC_NOT_FOUND: + VideoLogInfo("UNSUPPORTED_AUDIO_FORMAT"); + MpUtilNotifyPopUp(pAppData, + _(MP_VPL_POP_UNSUPPORTED_AUDIO_FORMAT), + MpVideoAppCtrlWarningPopupCb); + break; + + case MM_ERROR_PLAYER_VIDEO_CODEC_NOT_FOUND: + VideoLogInfo("UNSUPPORTED_VIDEO_FORMAT"); + MpVideoViewCtrlShowNocontentImage(); + MpUtilNotifyPopUp(pAppData, + _(MP_VPL_POP_UNSUPPORTED_VIDEO_FORMAT), + MpVideoAppCtrlWarningPopupCb); + break; + + case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_AUDIO: + VideoLogInfo("UNSUPPORTED_AUDIO_FORMAT"); + MpUtilNotifyPopUp(pAppData, + _(MP_VPL_POP_UNSUPPORTED_AUDIO_FORMAT), + MpVideoAppCtrlWarningPopupCb); + break; + + case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_VIDEO: + VideoLogInfo("UNSUPPORTED_VIDEO_FORMAT"); + MpVideoViewCtrlShowNocontentImage(); + MpUtilNotifyPopUp(pAppData, + _(MP_VPL_POP_UNSUPPORTED_VIDEO_FORMAT), + MpVideoAppCtrlWarningPopupCb); + break; + + case MM_ERROR_PLAYER_STREAMING_CONNECTION_FAIL: + VideoLogInfo("CONNECTION_FAILED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_INVALID_STREAM: + VideoLogInfo("MM_ERROR_PLAYER_INVALID_STREAM"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_UNABLE_TO_PLAY_VIDEO), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_FILE_NOT_FOUND: + VideoLogInfo("MM_ERROR_PLAYER_FILE_NOT_FOUND"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_POP_INVALID_STREAMING_DATA), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_DNS_FAIL: + VideoLogInfo("DNS_FAILED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_SERVER_DISCONNECTED: + VideoLogInfo("DESCONNECTED_FROM_SERVER"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_BAD_SERVER: + VideoLogInfo("UNABLE_TO_PLAY_INVALID_PACKET_FROM_SERVER"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_INVALID_PROTOCOL: + VideoLogInfo("UNSUPPORTED_TRANSPORT_PROTOCOL"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_INVALID_URL: + VideoLogInfo("INVALID_URL"); + MpUtilNotifyPopUp(pAppData, + _(MP_VPL_POP_INVALID_STREAMING_DATA), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_UNEXPECTED_MSG: + VideoLogInfo("UNEXPECTED_MESSAGE"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_OUT_OF_MEMORIES: + VideoLogInfo("OUT_OF_MEMORIES"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_RTSP_TIMEOUT: + VideoLogInfo("NO_RESPONSE_FROM_SERVER"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_BAD_REQUEST: + VideoLogInfo("BAD_REQUEST"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_NOT_AUTHORIZED: + VideoLogInfo("NOT_AUTHORIZED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_PAYMENT_REQUIRED: + VideoLogInfo("PAYMENT_REQUIRED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_FORBIDDEN: + VideoLogInfo("FORBIDDEN"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_CONTENT_NOT_FOUND: + VideoLogInfo("CONTENT_NOT_FOUND"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_METHOD_NOT_ALLOWED: + VideoLogInfo("METHOD_NOT_ALLOWED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_NOT_ACCEPTABLE: + VideoLogInfo("NOT_ACCEPTABLE"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_PROXY_AUTHENTICATION_REQUIRED: + VideoLogInfo("PROXY_AUTHENTICATION_REQUIRED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_SERVER_TIMEOUT: + VideoLogInfo("SERVER_TIMEOUT"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_GONE: + VideoLogInfo("GONE_MERROR"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_LENGTH_REQUIRED: + VideoLogInfo("LENGTH_REQUIRED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_PRECONDITION_FAILED: + VideoLogInfo("PRECONDITION_FAILED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_REQUEST_ENTITY_TOO_LARGE: + VideoLogInfo("REQUEST_ENTITY_TOO_LARGE"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_REQUEST_URI_TOO_LARGE: + VideoLogInfo("REQUEST_URI_TOO_LARGE"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_MEDIA_TYPE: + VideoLogInfo("UNSUPPORTED_MEDIA_TYPE"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_UNABLE_TO_PLAY_VIDEO), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_PARAMETER_NOT_UNDERSTOOD: + VideoLogInfo("PARAMETER_NOT_UNDERSTOOD"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_CONFERENCE_NOT_FOUND: + VideoLogInfo("CONFERENCE_NOT_FOUND"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_NOT_ENOUGH_BANDWIDTH: + VideoLogInfo("NOT_ENOUGH_BANDWIDTH"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_NO_SESSION_ID: + VideoLogInfo("NO_SESSION_ID"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_METHOD_NOT_VALID_IN_THIS_STATE: + VideoLogInfo("METHOD_NOT_VALID_IN_THIS_STATE"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_HEADER_FIELD_NOT_VALID_FOR_SOURCE: + VideoLogInfo("HEADER_FIELD_NOT_VALID_FOR_SOURCE"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_INVALID_RANGE: + VideoLogInfo("INVALID_RANGE"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_PARAMETER_IS_READONLY: + VideoLogInfo("PARAMETER_IS_READONLY"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_AGGREGATE_OP_NOT_ALLOWED: + VideoLogInfo("AGGREGATE_OP_NOT_ALLOWED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_ONLY_AGGREGATE_OP_ALLOWED: + VideoLogInfo("ONLY_AGGREGATE_OP_ALLOWED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_BAD_TRANSPORT: + VideoLogInfo("BAD_TRANSPORT"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_DESTINATION_UNREACHABLE: + VideoLogInfo("DESTINATION_UNREACHABLE"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_INTERNAL_SERVER_ERROR: + VideoLogInfo("INTERNAL_SERVER_ERROR"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_NOT_IMPLEMENTED: + VideoLogInfo("NOT_IMPLEMENTED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_BAD_GATEWAY: + VideoLogInfo("BAD_GATEWAY"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_SERVICE_UNAVAILABLE: + VideoLogInfo("SERVICE_UNAVAILABLE"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_GATEWAY_TIME_OUT: + VideoLogInfo("GATEWAY_TIME_OUT"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_RTSP_VERSION_NOT_SUPPORTED: + VideoLogInfo("RTSP_VERSION_NOT_SUPPORTED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_OPTION_NOT_SUPPORTED: + VideoLogInfo("OPTION_NOT_SUPPORTED"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_CONNECTION_FAIL), + MpVideoAppCtrlExitCb); + break; + + case MM_ERROR_PLAYER_STREAMING_FAIL: + VideoLogInfo("INTERNAL_ERROR"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_UNABLE_TO_PLAY_VIDEO), + MpVideoAppCtrlExitCb); + break; + case MM_MESSAGE_DRM_NOT_AUTHORIZED : + VideoLogInfo("DRM_NOT_AUTHORIZED ERROR"); + MpUtilNotifyPopUp(pAppData, _(MP_VPL_UNABLE_TO_PLAY_VIDEO), + MpVideoAppCtrlExitCb); + break; + + default: + break; + } + + } + +static void MpVideoAppCtrlPlayerMsgCallback(int MessageType, + void *MessageParam, void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoLogInfoWithTid("Callback func"); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + MMMessageParamType *pParam = (MMMessageParamType *) MessageParam; + + switch (MessageType) { + case MM_MESSAGE_UNKNOWN: + VideoLogInfo("MM_MESSAGE_UNKNOWN", MessageType); + if(pEcorePipeHandleForErrorMsg) { + if(!ecore_pipe_write(pEcorePipeHandleForErrorMsg, + (void *)pAppData, sizeof(pAppData))) { + VideoLogDebug("FAIL PIPE WRITE"); + } + } + + break; + + case MM_MESSAGE_ERROR: + VideoLogInfo("[ERR]MM_MESSAGE_ERROR : code-0x%x", + (int)pParam->code); + nErrorCode = (int)pParam->code; + if(pEcorePipeHandleForErrorMsg) { + if(!ecore_pipe_write(pEcorePipeHandleForErrorMsg, + (void *)pAppData, sizeof(pAppData))) { + VideoLogDebug("FAIL PIPE WRITE"); + } + } + break; + + case MM_MESSAGE_STATE_CHANGED: + VideoLogInfo("MM_MESSAGE_STATE_CHANGED"); + break; + + case MM_MESSAGE_BEGIN_OF_STREAM: + VideoLogInfo("MM_MESSAGE_BEGIN_OF_STREAM"); + if(pEcorePipeHandleBOF) { + if(!ecore_pipe_write(pEcorePipeHandleBOF, + (void *)pAppData, sizeof(pAppData))) { + VideoLogDebug("FAIL PIPE WRITE"); + } + } + break; + + case MM_MESSAGE_END_OF_STREAM: + VideoLogInfo("END OF STREAM."); + if(pEcorePipeHandleEOF) { + if(!ecore_pipe_write(pEcorePipeHandleEOF, + (void *)pAppData, sizeof(pAppData))) { + VideoLogDebug("FAIL PIPE WRITE"); + } + } + break; + + case MM_MESSAGE_READY_TO_RESUME: + VideoLogInfo("MM_MESSAGE_READY_TO_RESUME"); + break; + + case MM_MESSAGE_CONNECTING: + VideoLogInfo("MM_MESSAGE_CONNECTING"); + break; + + case MM_MESSAGE_CONNECTED: + VideoLogInfo("MM_MESSAGE_CONNECTED"); + break; + + case MM_MESSAGE_CONNECTION_TIMEOUT: + VideoLogInfo("MM_MESSAGE_CONNECTION_TIMEOUT"); + break; + + case MM_MESSAGE_BUFFERING: + VideoLogInfo("MM_MESSAGE_BUFFERING - Buffering : %d%% ", + pParam->connection.buffering); + nBufferingRate = pParam->connection.buffering; + + if (nBufferingRate < 10) + MpVideoAppCtrlShowLayout(pAppData); + if(pEcorePipeHandleForBuffering) { + if(!ecore_pipe_write(pEcorePipeHandleForBuffering, + (void *)pAppData, sizeof(pAppData))) { + VideoLogDebug("FAIL PIPE WRITE"); + } + } + break; + + case MM_MESSAGE_BLUETOOTH_ON: + VideoLogInfo("MM_MESSAGE_BLUETOOTH_ON"); + break; + + case MM_MESSAGE_BLUETOOTH_OFF: + VideoLogInfo("MM_MESSAGE_BLUETOOTH_OFF "); + if(pEcorePipeHandleForBluetooth) { + if(!ecore_pipe_write(pEcorePipeHandleForBluetooth, + (void *)pAppData, sizeof(pAppData))) { + VideoLogDebug("FAIL PIPE WRITE"); + } + } + break; + + case MM_MESSAGE_UPDATE_SUBTITLE: + VideoLogInfo("UPDATE_SUBTITLE "); + + nDurationTime = 0; + memset(szSubtitleString, 0, sizeof(char) * STR_LEN_MAX); + + if (pParam->subtitle.duration <= 0) { + VideoLogInfo("[ERR] MMF Error : code-0x%x", (int)pParam->code); + break; + } else { + nDurationTime = (double)pParam->subtitle.duration / 1000; + } + + if (pParam->data == NULL) { + VideoLogInfo("[ERR] MMF Error : code-0x%x", (int)pParam->code); + break; + } else { + strncpy(szSubtitleString, pParam->data, STR_LEN_MAX - 1); + } + + VideoLogInfo("Subtitle duration : %d sec", nDurationTime); + VideoLogInfo("Subtitle contents : %s", szSubtitleString); + if(pEcorePipeHandleForSubTitle) { + if(!ecore_pipe_write(pEcorePipeHandleForSubTitle, + (void *)pAppData, sizeof(pAppData))) { + VideoLogDebug("FAIL PIPE WRITE"); + } + } + break; + + case MM_MESSAGE_RESUMED_BY_REW: + VideoLogInfo("Change play state to play."); + if(pEcorePipeHandleForResumed) { + if(!ecore_pipe_write(pEcorePipeHandleForResumed, + (void *)pAppData, sizeof(pAppData))) { + VideoLogDebug("FAIL PIPE WRITE"); + } + } + break; + + case MM_MESSAGE_RTP_SENDER_REPORT: + VideoLogInfo("%08x", MessageType); + break; + + case MM_MESSAGE_RTP_RECEIVER_REPORT: + VideoLogInfo("%08x", MessageType); + break; + + case MM_MESSAGE_RTP_SESSION_STATUS: + VideoLogInfo("%08x", MessageType); + break; + + case MM_MESSAGE_SENDER_STATE: + VideoLogInfo("%08x", MessageType); + break; + + case MM_MESSAGE_RECEIVER_STATE: + VideoLogInfo("%08x", MessageType); + break; + + case MM_MESSAGE_FILE_NOT_SUPPORTED: + VideoLogInfo("%08x", MessageType); + break; + + case MM_MESSAGE_FILE_NOT_FOUND: + VideoLogInfo("%08x", MessageType); + break; + + case MM_MESSAGE_DRM_NOT_AUTHORIZED: + VideoLogInfo("%08x", MessageType); + break; + + case MM_MESSAGE_STATE_INTERRUPTED: + VideoLogDebug("%08x", MessageType); + + switch ((int)pParam->code) { + case MM_MSG_CODE_INTERRUPTED_BY_OTHER_APP: + VideoLogInfo("MM_ERROR_PLAYER_BT_CONNECTION"); + break; + + case MM_MSG_CODE_INTERRUPTED_BY_CALL_START: + VideoLogInfo("MM_MSG_CODE_INTERRUPTED_BY_CALL_START"); + break; + + case MM_MSG_CODE_INTERRUPTED_BY_CALL_END: + VideoLogInfo("MM_MSG_CODE_INTERRUPTED_BY_CALL_END"); + break; + + case MM_MSG_CODE_INTERRUPTED_BY_EARJACK_UNPLUG: + VideoLogInfo("MM_MSG_CODE_INTERRUPTED_BY_EARJACK_UNPLUG"); + break; + + case MM_MSG_CODE_INTERRUPTED_BY_RESOURCE_CONFLICT: + VideoLogInfo + ("MM_MSG_CODE_INTERRUPTED_BY_RESOURCE_CONFLICT"); + break; + + case MM_MSG_CODE_INTERRUPTED_BY_ALARM_START: + VideoLogInfo + ("MM_MSG_CODE_INTERRUPTED_BY_ALARM_START"); + break; + + case MM_MSG_CODE_INTERRUPTED_BY_ALARM_END: + VideoLogInfo("MM_MSG_CODE_INTERRUPTED_BY_ALARM_END"); + break; + } + if(pEcorePipeHandleForInterruped) { + if(!ecore_pipe_write( + pEcorePipeHandleForInterruped, + (void *)pAppData, sizeof(pAppData))) { + VideoLogDebug("FAIL PIPE WRITE"); + } + } + break; + case MM_MESSAGE_SEEK_COMPLETED: + { + VideoLogInfo("MM_MESSAGE_SEEK_COMPLETED"); + if(MpUtilCheckRTSPType(pAppData->szMediaUri)) { + VideoLogInfo("RTSP SEEK Start"); + nBufferingRate = 100; + MpVideoAppCtrlShowLayout(pAppData); + if(pEcorePipeHandleForBuffering) { + if(!ecore_pipe_write(pEcorePipeHandleForBuffering, + (void *)pAppData, sizeof(pAppData))) { + VideoLogDebug("FAIL PIPE WRITE"); + } + } + + } + + } + break; + default: + VideoLogInfo("No message %08x", MessageType); + break; + } +} + +/* + * Internal function + */ +void MpVideoAppCtrlFuncInit(VideoAppData *pAppData) +{ + VideoLogInfo(""); + + if (!pAppData) { + VideoLogInfo("[ERR]"); + return; + } + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStart = + (void *)MpVideoAppCtrlStart; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStop = + (void *)MpVideoAppCtrlStop; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause = + (void *)MpVideoAppCtrlPause; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume = + (void *)MpVideoAppCtrlResume; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStopByAppPause = + (void *)MpVideoAppCtrlStopByAppPause; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStartByAppResume = + (void *)MpVideoAppCtrlStartByAppResume; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlFFDown = + (void *)MpVideoAppCtrlFFDown; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlRewDown = + (void *)MpVideoAppCtrlRewDown; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlFFUp = + (void *)MpVideoAppCtrlFFUp; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlRewUp = + (void *)MpVideoAppCtrlRewUp; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetMute = + (void *)MpVideoAppCtrlSetMute; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetScreenType = + (void *)MpVideoAppCtrlSetScreenType; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetScreenSize = + (void *)MpVideoAppCtrlSetScreenSize; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition = + (void *)MpVideoAppCtrlGetPosition; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition = + (void *)MpVideoAppCtrlSetPosition; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlHideLayout = + (void *)MpVideoAppCtrlHideLayout; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlShowLayout = + (void *)MpVideoAppCtrlShowLayout; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetVideoResolution = + (void *)MpVideoAppCtrlGetVideoResolution; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlReqDurationTime = + (void *)MpVideoAppCtrlReqDurationTime; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlBeginOfStream = + (void *)MpVideoAppCtrlBeginOfStream; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlEndOfStream = + (void *)MpVideoAppCtrlEndOfStream; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit = + (void *)MpVideoAppCtrlExit; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStartStreaming = + (void *)MpVideoAppCtrlStartStreaming; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlReLaunching = + (void *)MpVideoAppCtrlReLaunching; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPlayPreMedia = + (void *)MpVideoAppCtrlPlayPreMedia; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPlayNextMedia = + (void *)MpVideoAppCtrlPlayNextMedia; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetBufferingPosition = + (void *)MpVideoAppCtrlGetBufferingPosition; +} + +static void MpVideoAppCtrlPlayPreMedia(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + if (strlen(pAppData->szPreMediaUri) <= 0) { + VideoLogInfo("szPreMediaUri is NULL."); + return; + } + + VideoLogInfo("Current media uri : %s", pAppData->szMediaUri); + VideoLogInfo("Previous media uri : %s", pAppData->szPreMediaUri); + + strncpy(pAppData->szMediaUri, pAppData->szPreMediaUri, + sizeof(pAppData->szMediaUri) - 1); + MpVideoAppCtrlShowLayout(pAppData); + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpUtilMediaSvcGetPreNextVideoUrl(pAppData->szMediaUri, + pAppData->szPreMediaUri, + pAppData->szNextMediaUri); + } + + MpVideoAppCtrlReLaunching(pAppData); +} + +static void MpVideoAppCtrlPlayNextMedia(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + if (strlen(pAppData->szNextMediaUri) <= 0) { + VideoLogInfo("szNextMediaUri is NULL."); + return; + } + + VideoLogInfo("Current media uri : %s", pAppData->szMediaUri); + VideoLogInfo("Next media uri : %s", pAppData->szNextMediaUri); + + strncpy(pAppData->szMediaUri, pAppData->szNextMediaUri, + sizeof(pAppData->szMediaUri) - 1); + MpVideoAppCtrlShowLayout(pAppData); + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpUtilMediaSvcGetPreNextVideoUrl(pAppData->szMediaUri, + pAppData->szPreMediaUri, + pAppData->szNextMediaUri); + } + + MpVideoAppCtrlReLaunching(pAppData); +} + +static void MpVideoAppCtrlGetBufferingPosition(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + if (pAppData == NULL) { + VideoLogInfo("ERR"); + return; + } + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + VideoLogInfo("Skip Normal Play mode"); + return; + } + if(MpUtilCheckRTSPType(pAppData->szMediaUri)) { + return; + } + pAppData->nBufferingPosition = MpVideoCtrlMgrGetBufferingPosition(); +} + + +static void MpVideoAppCtrlStart(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + char szSubtitleUri[STR_LEN_MAX] = {0}; + + if (!MpVideoSubtitleCtrlGetSubtitleUri(szSubtitleUri)) { + memset(szSubtitleUri, 0, STR_LEN_MAX); + } else { + VideoLogInfo("szSubtitleUriPath : %s", szSubtitleUri); + } + + if (!MpVideoCtrlMgrMediaCreate(pAppData->szMediaUri, + MpVideoAppCtrlPlayerMsgCallback, + (void *)MpUtilGetMainWindowXID(), + szSubtitleUri, + (void *)pAppData)) { + MpUtilNotifyPopUp(pAppData, + "It is unable to play video contents.", + MpVideoAppCtrlExitCb); + } + + if (pAppData->nSetPosition > 0) { + VideoLogInfo("Start position time : %dms", + pAppData->nSetPosition); + MpVideoAppCtrlSetPosition(pAppData); + } + + MpVideoCtrlMgrMediaPlay((void *)pAppData); + + } else if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER ) { + if (MpVideoStreamingCtrlInit((void *)pAppData)) { + VideoLogInfo("Connect to network."); + MpVideoAppCtrlStartStreaming((void *)pAppData); + } else { + VideoLogInfo("No connect to network."); + MpUtilNotifyPopUp(pAppData, + "It is impossible to connect to network.", + MpVideoAppCtrlExitCb); + } + } +} + +static void MpVideoAppCtrlStop(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + pAppData->nCurPlayerState = MP_PLAYER_STATE_STOP; + + MpVideoCtrlMgrMediaStop((void *)pAppData); +} + +static void MpVideoAppCtrlPause(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PAUSE) { + VideoLogInfo("Allready Pause video player."); + return; + } + + pAppData->nCurPlayerState = MP_PLAYER_STATE_PAUSE; + + MpVideoCtrlMgrMediaPause(pAppData); + MpVideoViewCtrlPause(pAppData); + MpVideoAppCtrlShowLayout(pAppData); + MpUtilLcdNormalPowerUnlockForPause(); +} + +static void MpVideoAppCtrlResume(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME || + pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY) { + VideoLogInfo("Allready Resume video player."); + return; + } + + pAppData->nCurPlayerState = MP_PLAYER_STATE_RESUME; + MpUtilMultimediaKeyGrab(); + + MpVideoAppCtrlGetPosition(pAppData); + MpVideoCtrlMgrMediaResume(pAppData); + MpVideoViewCtrlResume(pAppData); + MpVideoAppCtrlShowLayout(pAppData); + MpUtilLcdNormalPowerLockForResume(); +} + +static void MpVideoAppCtrlStopByAppPause(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + if (!MpVideoCtrlMgrIsExistPlayerHandle()) { + VideoLogInfo("Not exist Player handle."); + return; + } + + VideoLogInfo(""); + + MpVideoAppCtrlGetPosition(pAppData); + pAppData->nSetPosition = pAppData->nCurPosition; + VideoLogInfo("Current position time : %d", pAppData->nSetPosition); + MpVideoViewCtrlPause(pAppData); + MpVideoAppCtrlStop(pAppData); + MpVideoCtrlMgrMediaDestroy(pAppData); + MpUtilLcdNormalPowerUnlockForPause(); + + MpVideoViewCtrlResetProgressBar((void *)pAppData); + + MpUtilMultimediaKeyUngrab(); + + if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + MpVideoViewSetBufferingRateForStreamingView(0, (void *)pAppData); + } +} + +static void MpVideoAppCtrlStartByAppResume(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + MpVideoAppCtrlStart(pAppData); + MpVideoViewCtrlResume(pAppData); + MpVideoAppCtrlShowLayout(pAppData); + MpUtilLcdNormalPowerLockForResume(); + + return; +} + +static void MpVideoAppCtrlFFDown(VideoAppData *pAppData) +{ + VideoLogInfo(""); +} + +static void MpVideoAppCtrlRewDown(VideoAppData *pAppData) +{ + VideoLogInfo(""); +} + +static void MpVideoAppCtrlFFUp(VideoAppData *pAppData) +{ + VideoLogInfo(""); +} + +static void MpVideoAppCtrlRewUp(VideoAppData *pAppData) +{ + VideoLogInfo(""); +} + +static void MpVideoAppCtrlSetMute(VideoAppData *pAppData) +{ + VideoLogInfo(""); + + if (pAppData->bIsMute) { + MpVideoCtrlMgrSetMute(TRUE); + } else { + MpVideoCtrlMgrSetMute(FALSE); + } +} + +static void MpVideoAppCtrlSetScreenType(VideoAppData *pAppData) +{ + VideoLogInfo(""); +} + +static void MpVideoAppCtrlSetScreenSize(VideoAppData *pAppData, int nScreenSize) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + switch(nScreenSize) + { + case MP_DISPLAY_METHOD_LETTER_BOX: VideoLogInfo("LETTER_BOX"); break; + case MP_DISPLAY_METHOD_ORIGIN_SIZE: VideoLogInfo("ORIGIN_SIZE"); break; + case MP_DISPLAY_METHOD_FULL_SCREEN: VideoLogInfo("FULL_SCREEN"); break; + case MP_DISPLAY_METHOD_CROPPED_FULL: VideoLogInfo("CROPPED_FULL"); break; + case MP_DISPLAY_METHOD_CUSTOM_ROI: VideoLogInfo("CUSTOM_ROI"); break; + default: VideoLogInfo("Nothing."); return; + } + + MpVideoCtrlMgrSetRatioVideoScreen((void*)pAppData, nScreenSize); +} + +static void MpVideoAppCtrlGetPosition(VideoAppData *pAppData) +{ + pAppData->nCurPosition = MpVideoCtrlMgrGetPosition(); +} + +static void MpVideoAppCtrlSetPosition(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + MpVideoCtrlMgrSetPosition(pAppData->nSetPosition); + + if(MpUtilCheckRTSPType(pAppData->szMediaUri)) { + VideoLogInfo("RTSP SEEK Start"); + nBufferingRate = 0; + MpVideoAppCtrlBufferingCb((void *)pAppData); + + } +} + +static void MpVideoAppCtrlHideLayout(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + MpVideoViewHideLayout((void *)pAppData); +} + +static void MpVideoAppCtrlShowLayout(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + MpVideoViewShowLayout((void *)pAppData); +} + +static void MpVideoAppCtrlGetVideoResolution(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + pAppData->nVideoWidthResolution = + MpVideoCtrlMgrGetVideoWidthResolution(); + pAppData->nVideoHeightResolution = + MpVideoCtrlMgrGetVideoHeightResolution(); +} + +static void MpVideoAppCtrlReqDurationTime(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + pAppData->nDuration = MpVideoCtrlMgrGetDuration(); +} + +static void MpVideoAppCtrlBeginOfStream(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + pAppData->nCurPlayerState = MP_PLAYER_STATE_PLAY; + MpUtilMultimediaKeyGrab(); + + MpVideoAppCtrlGetVideoResolution(pAppData); + pAppData->nDuration = MpVideoCtrlMgrGetDuration(); + MpVideoViewCtrlInitAfterBeginOfStream((void *)pAppData); +} + +static void MpVideoAppCtrlEndOfStream(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + if (pAppData->nLaunchingAppType == MP_LAUNCH_APP_GALLERY ) { + if (pAppData->nCurPosition >= 0 ) { + MpUtilMediaSvcSaveLastPlayedTime(pAppData->szMediaUri, 0); + } else { + VideoLogInfo("Invalid Plaing time or duration time."); + } + } + + if (strlen(pAppData->szNextMediaUri) > 0) { + MpVideoAppCtrlPlayNextMedia(pAppData); + } + else { + MpVideoAppCtrlExit(pAppData); + } +} + +static void MpVideoAppCtrlExit(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + if(pEcorePipeHandleForErrorMsg) { + ecore_pipe_del(pEcorePipeHandleForErrorMsg); + pEcorePipeHandleForErrorMsg = NULL; + } + + if(pEcorePipeHandleBOF) { + ecore_pipe_del(pEcorePipeHandleBOF); + pEcorePipeHandleBOF = NULL; + } + if (pEcorePipeHandleEOF) { + ecore_pipe_del(pEcorePipeHandleEOF); + pEcorePipeHandleEOF = NULL; + } + + if (pEcorePipeHandleForBuffering) { + ecore_pipe_del(pEcorePipeHandleForBuffering); + pEcorePipeHandleForBuffering = NULL; + } + + if (pEcorePipeHandleForBluetooth) { + ecore_pipe_del(pEcorePipeHandleForBluetooth); + pEcorePipeHandleForBluetooth = NULL; + } + + if (pEcorePipeHandleForSubTitle) { + ecore_pipe_del(pEcorePipeHandleForSubTitle); + pEcorePipeHandleForSubTitle = NULL; + } + if (pEcorePipeHandleForResumed) { + ecore_pipe_del(pEcorePipeHandleForResumed); + pEcorePipeHandleForResumed = NULL; + } + if (pEcorePipeHandleForInterruped) { + ecore_pipe_del(pEcorePipeHandleForInterruped); + pEcorePipeHandleForInterruped = NULL; + } + + MpVideoAppCtrlStop(pAppData); + MpVideoCtrlMgrMediaDestroy(pAppData); + + MpUtilDeletePopupHandle(); + + MpVideoViewCtrlDestroy((void *)pAppData); + + if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + MpVideoStreamingCtrlDestroy((void *)pAppData); + } + + elm_win_indicator_mode_set(pAppData->pMainWindow, ELM_WIN_INDICATOR_SHOW); + + elm_exit(); +} + +static void MpVideoAppCtrlStartStreaming(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + MpVideoCtrlMgrMediaCreate(pAppData->szMediaUri, + MpVideoAppCtrlPlayerMsgCallback, + (void *)MpUtilGetMainWindowXID(), + NULL, + (void *)pAppData); + + MpVideoCtrlMgrMediaPlay((void *)pAppData); + + if (pAppData->nSetPosition > 0) { + VideoLogInfo("Start position time : %dms", + pAppData->nSetPosition); + MpVideoAppCtrlSetPosition(pAppData); + } +} + + +static void MpVideoAppCtrlReLaunching(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + + MpVideoAppCtrlStop(pAppData); + MpVideoCtrlMgrMediaDestroy(pAppData); + + pAppData->nSetPosition = 0; + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + memset(pAppData->szVideoTitle, 0, STR_LEN_MAX); + MpUtilGetTitleFromFilepath(pAppData->szMediaUri, pAppData->szVideoTitle); + MpVideoSubtitleCtrlInit(pAppData); + } + + MpVideoViewCtrlChangeTitle(pAppData); + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpVideoAppCtrlStart(pAppData); + } else if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + MpVideoAppCtrlStartStreaming(pAppData); + } + + MpVideoAppCtrlSetMute(pAppData); +} + +static void MpVideoAppCtrlPipeInit(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return; + } + + VideoLogInfo(""); + if(pEcorePipeHandleForErrorMsg) { + ecore_pipe_del(pEcorePipeHandleForErrorMsg); + pEcorePipeHandleForErrorMsg = NULL; + } + pEcorePipeHandleForErrorMsg = ecore_pipe_add( + (Ecore_Pipe_Cb)MpVideoAppCtrlMmfErrormsgCb, + (void *)pAppData); + + if(pEcorePipeHandleBOF) { + ecore_pipe_del(pEcorePipeHandleBOF); + pEcorePipeHandleBOF = NULL; + } + pEcorePipeHandleBOF = ecore_pipe_add( + (Ecore_Pipe_Cb)MpVideoAppCtrlBeginOfPlayCb, + (void *)pAppData); + + if(pEcorePipeHandleEOF) { + ecore_pipe_del(pEcorePipeHandleEOF); + pEcorePipeHandleEOF = NULL; + } + pEcorePipeHandleEOF = ecore_pipe_add( + (Ecore_Pipe_Cb)MpVideoAppCtrlEndOfPlayCb, + (void *)pAppData); + + if (pEcorePipeHandleForBuffering) { + ecore_pipe_del(pEcorePipeHandleForBuffering); + pEcorePipeHandleForBuffering = NULL; + } + pEcorePipeHandleForBuffering = ecore_pipe_add( + (Ecore_Pipe_Cb)MpVideoAppCtrlBufferingCb, + (void *)pAppData); + + if (pEcorePipeHandleForBluetooth) { + ecore_pipe_del(pEcorePipeHandleForBluetooth); + pEcorePipeHandleForBluetooth = NULL; + } + pEcorePipeHandleForBluetooth = ecore_pipe_add( + (Ecore_Pipe_Cb)MpVideoAppCtrlBluetoothCb, + (void *)pAppData); + + if (pEcorePipeHandleForSubTitle) { + ecore_pipe_del(pEcorePipeHandleForSubTitle); + pEcorePipeHandleForSubTitle = NULL; + } + pEcorePipeHandleForSubTitle = ecore_pipe_add( + (Ecore_Pipe_Cb)MpVideoAppCtrlUpdateSubtitleCb, + (void *)pAppData); + + if (pEcorePipeHandleForResumed) { + ecore_pipe_del(pEcorePipeHandleForResumed); + pEcorePipeHandleForResumed = NULL; + } + pEcorePipeHandleForResumed = ecore_pipe_add( + (Ecore_Pipe_Cb)MpVideoAppCtrlResumeByRewCb, + (void *)pAppData); + + if (pEcorePipeHandleForInterruped) { + ecore_pipe_del(pEcorePipeHandleForInterruped); + pEcorePipeHandleForInterruped = NULL; + } + pEcorePipeHandleForInterruped = ecore_pipe_add( + (Ecore_Pipe_Cb)MpVideoAppCtrlPauseByInterrupteCb, + (void *)pAppData); + +} + + + +/* + * External function + */ +bool MpVideoAppCtrlInit(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return FALSE; + } + + VideoLogInfo(""); + + MpVideoAppCtrlFuncInit(pAppData); + MpVideoSubtitleCtrlInit(pAppData); + MpVideoViewCtrlInit(pAppData); + + if (!MpUtilCheckCallStatus()) { + MpUtilNotifyPopUp(pAppData, _(MP_VPL_BODY_UNABLE_TO_PLAY_VIDEO_DURING_CALL), MpVideoAppCtrlExitCb); + return FALSE; + } + + if (!MpUtilCheckBatteryStatus()) { + MpUtilNotifyPopUp(pAppData, dgettext("sys_string", MP_COM_BODY_LOW_BATTERY), MpVideoAppCtrlExitCb); + return FALSE; + } + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + if (!MpUtilCheckLocalFileExist(pAppData->szMediaUri)) { + MpUtilNotifyPopUp(pAppData, "File not Exist", MpVideoAppCtrlExitCb); + return FALSE; + } + + memset(pAppData->szVideoTitle, 0, STR_LEN_MAX); + MpUtilGetTitleFromFilepath(pAppData->szMediaUri, pAppData->szVideoTitle); + MpVideoViewCtrlChangeTitle(pAppData); + } + + MpVideoAppCtrlPipeInit(pAppData); + + MpVideoAppCtrlStart(pAppData); + + return TRUE; +} + +bool MpVideoAppCtrlResetForRelaunching(VideoAppData *pAppData) +{ + if (!pAppData) { + VideoLogInfo("No exist appdata."); + return FALSE; + } + + VideoLogInfo(""); + + MpVideoAppCtrlStop(pAppData); + MpVideoCtrlMgrMediaDestroy(pAppData); + MpUtilDeletePopupHandle(); + MpVideoViewCtrlDestroy((void *)pAppData); + MpUtilMediaSvcDestoryVideoList(); + MpUtilMediaSvcFinishSession(); + MpUtilMediaSvcMtagIterateDestroyTagList(); + MpUtilMMCstatusNotiIgnore(); + MpUtilBatteryStatusNotiIgnore(); + MpVideoSubtitleCtrlDestroy(); + + nBufferingRate = 0; + nErrorCode = 0; + + pAppData->bIsMute = FALSE; + pAppData->nDuration = 0; + pAppData->nSetPosition = 0; + pAppData->nCurPosition = 0; + pAppData->nSubtitleDuration = 0; + pAppData->nBufferingPosition = 0; + pAppData->nVideoWidthResolution = 0; + pAppData->nVideoHeightResolution = 0; + + memset(pAppData->szSubtitle, 0, sizeof(char) * STR_LEN_MAX); + memset(pAppData->szVideoTitle, 0, sizeof(char) * STR_LEN_MAX); + memset(pAppData->szMediaUri, 0, sizeof(char) * STR_LEN_MAX); + memset(pAppData->szPreMediaUri, 0, sizeof(char) * STR_LEN_MAX); + memset(pAppData->szNextMediaUri, 0, sizeof(char) * STR_LEN_MAX); + memset(pAppData->szTagNameForVideoList, 0, sizeof(char) * STR_LEN_MAX); + + pAppData->nPrePlayerState = MP_PLAYER_STATE_CLEAR; + pAppData->nCurPlayerState = MP_PLAYER_STATE_CLEAR; + pAppData->nLaunchingAppType = MP_LAUNCH_APP_DEFAULT; + pAppData->nVideoSortType = MP_MEDIA_SORT_BY_NONE; + pAppData->nVideoListType = MP_VIDEO_LIST_TYPE_FOLDER; + pAppData->nCurPlayerType = MP_STREAMING_PLAYER; + + memset(pAppData->szProxyAddress, 0, sizeof(char) * STR_LEN_MAX); + memset(pAppData->szUserAgent, 0, sizeof(char) * STR_LEN_MAX); + memset(pAppData->szCookie, 0, sizeof(char) * STR_LEN_MAX); + + MpUtilResetForRelaunching(); + + return TRUE; +} + +bool MpVideoAppCtrlIsTopView(void* pUserData) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData."); + return FALSE; + } + + VideoLogInfo(""); + + return MpVideoViewCtrlIsTopView(pUserData); +} + +bool MpVideoAppCtrlIsExistPlayerHandle(void) +{ + VideoLogInfo(""); + + return MpVideoCtrlMgrIsExistPlayerHandle(); +} diff --git a/src/mp-video-ctrl-mgr.c b/src/mp-video-ctrl-mgr.c new file mode 100755 index 0000000..fd27f2c --- /dev/null +++ b/src/mp-video-ctrl-mgr.c @@ -0,0 +1,362 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "video-player.h" +#include "mp-video-ctrl-mgr.h" +#include "mp-video-player-mgr.h" +#include "mp-video-type-define.h" + +bool MpVideoCtrlMgrMediaCreate(char *szMediaURI, void *pMmfPlayerCallback, + void *pOverlayXid, char* szSubtitleUri, void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return FALSE; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + VideoLogInfo(""); + VideoLogInfo("XID : %d", *(int *)pOverlayXid); + + if (!MpPlayerMgrCreate(szMediaURI)) { + VideoLogInfo("[ERR] Fail to create player handle."); + return FALSE; + } + + if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + + MpUtilGetUserAgent(pAppData); + + if (!MpPlayerMgrSetUseragentForStreaming(pAppData->szUserAgent)) { + VideoLogInfo("[ERR] Fail to set useragent."); + return FALSE; + } + + if (!MpPlayerMgrSetProxAddressForStreaming + (pAppData->szProxyAddress)) { + VideoLogInfo("[ERR] Fail to set proxy address."); + return FALSE; + } + + if (!MpPlayerMgrSetCookieForStreaming(pAppData->szCookie)) { + VideoLogInfo("[ERR] Fail to set Cookie."); + return FALSE; + } + } + + if (szSubtitleUri && strlen((char*)szSubtitleUri) > 0) { + VideoLogInfo("Subtitle URI : %s", szSubtitleUri); + + if (!MpPlayerMgrSetSubtitle(szSubtitleUri)) { + VideoLogInfo("Fail to set subtitle uri."); + } + } else { + VideoLogInfo("No exist subtitle uri."); + } + + if (!MpPlayerMgrRealize()) { + VideoLogInfo("[ERR] Fail relization."); + return FALSE; + } + + if (!MpPlayerMgrSetSoundPriority()) { + VideoLogInfo("[ERR] Fail to set sound priority."); + return FALSE; + } + + if (!MpPlayerMgrSetOverlayXid(pOverlayXid)) { + VideoLogInfo("[ERR] Fail to set overlay window."); + return FALSE; + } + + MpPlayerMgrSetMessageCallback(pMmfPlayerCallback, pAppData); + + pAppData->nCurPlayerState = MP_PLAYER_STATE_CLEAR; + + return TRUE; +} + +void MpVideoCtrlMgrMediaDestroy(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo(" Already destroy player handle."); + return; + } + + if (!MpPlayerMgrUnrealize()) { + VideoLogInfo("[ERR] Fail to unrealize player handle."); + return; + } + + if (!MpPlayerMgrDestroy()) { + VideoLogInfo("[ERR] Fail to destroy player handle."); + return; + } + + pAppData->nCurPlayerState = MP_PLAYER_STATE_CLEAR; +} + +bool MpVideoCtrlMgrMediaPlay(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return FALSE; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + VideoLogInfo(""); + + if (!MpPlayerMgrPlay()) { + VideoLogInfo("[ERR] Fail to play multimedia player."); + return FALSE; + } + + pAppData->nCurPlayerState = MP_PLAYER_STATE_PLAY; + + return TRUE; +} + +void MpVideoCtrlMgrMediaStop(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR] Player handle is destroyed."); + return; + } + + if (!MpPlayerMgrStop()) { + VideoLogInfo("[ERR] Fail to stop multimedia player."); + return; + } + + pAppData->nCurPlayerState = MP_PLAYER_STATE_STOP; +} + +void MpVideoCtrlMgrMediaPause(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + VideoLogInfo(""); + + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_STOP) { + VideoLogInfo + ("It is not possible to pause when player state is stop."); + return; + } + + if (!MpPlayerMgrPause()) { + VideoLogInfo("[ERR] Fail to pause multimedia player."); + return; + } + + pAppData->nCurPlayerState = MP_PLAYER_STATE_PAUSE; +} + +void MpVideoCtrlMgrMediaResume(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + VideoLogInfo(""); + + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_STOP) { + VideoLogInfo + ("It is not possible to resume when player state is stop."); + return; + } + + if (!MpPlayerMgrResume()) { + VideoLogInfo("[ERR] Fail to resume multimedia player."); + return; + } + + pAppData->nCurPlayerState = MP_PLAYER_STATE_RESUME; +} + +void MpVideoCtrlMgrSetOverlayXid(void *pXid) +{ + VideoLogInfo(" XID:%d", *((int *)pXid)); + + if (!MpPlayerMgrSetOverlayXid(pXid)) { + VideoLogInfo("[ERR] Fail to set overlay window."); + return; + } +} + +void MpVideoCtrlMgrSetPosition(int nSetPosition) +{ + VideoLogInfo(""); + + VideoLogInfo("Set position - %d", nSetPosition); + + if (nSetPosition > -1) { + MpPlayerMgrSetPosition(nSetPosition); + } +} + +int MpVideoCtrlMgrGetPosition(void) +{ + return MpPlayerMgrGetPosition(); +} + +int MpVideoCtrlMgrGetDuration(void) +{ + VideoLogInfo(""); + + int nDuration = 0; + + nDuration = MpPlayerMgrGetPdduration(); + + VideoLogInfo(" content duration : %d ms", nDuration); + + return nDuration; +} + +void MpVideoCtrlMgrSetROI(void *pUserData, int nOverlayX, int nOverlayY, + int nOverlayWidth, int nOverlayHeight) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return; + } + + VideoLogInfo(" ROI - X:%d, Y:%d, W:%d, H:%d,", nOverlayX, nOverlayY, + nOverlayWidth, nOverlayHeight); + + if (!MpPlayerMgrSetRatioVideoScreenSize(DISPLAY_METHOD_CUSTOM_ROI)) { + VideoLogInfo("[ERR] Fail to set ROI screen."); + return; + } + + if (!MpPlayerMgrSetDisplayArea + (nOverlayX, nOverlayY, nOverlayWidth, nOverlayHeight)) { + VideoLogInfo("[ERR] Fail to set overlay display area for ROI."); + return; + } +} + +int MpVideoCtrlMgrGetVideoWidthResolution(void) +{ + VideoLogInfo(""); + + int nVideoWidthResolution = MpPlayerMgrGetVideoWidthResolution(); + + VideoLogInfo("Video width resolution : %d", nVideoWidthResolution); + + return nVideoWidthResolution; +} + +int MpVideoCtrlMgrGetVideoHeightResolution(void) +{ + VideoLogInfo(""); + + int nVideoHeightResolution = MpPlayerMgrGetVideoHeightResolution(); + + VideoLogInfo("Video height resolution : %d", nVideoHeightResolution); + + return nVideoHeightResolution; +} + +void MpVideoCtrlMgrSetRatioVideoScreen(void *pUserData, int nRatioScreenSize) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return; + } + + VideoLogInfo(""); + + MpPlayerMgrSetRatioVideoScreenSize(nRatioScreenSize); +} + +void MpVideoCtrlMgrSetVerticalOverlayPos(int nOverlayY) +{ + VideoLogInfo(""); + + if (nOverlayY < 0) { + VideoLogInfo("[ERR]"); + return; + } + + VideoLogInfo("Overlay Y position : %d", nOverlayY); + + if (!MpPlayerMgrSetVerticalOverlayPos(nOverlayY)) { + VideoLogInfo("[ERR]"); + } +} + +void MpVideoCtrlMgrSetMute(bool bMuteEnable) +{ + VideoLogInfo(""); + + MpPlayerMgrSetMute(bMuteEnable); +} + +bool MpVideoCtrlMgrGetMuteState(void) +{ + VideoLogInfo(""); + + return MpPlayerMgrGetMute(); +} + +int MpVideoCtrlMgrGetBufferingPosition(void) +{ + return MpPlayerMgrGetBufferingPosition(); +} + +bool MpVideoCtrlMgrIsExistPlayerHandle(void) +{ + VideoLogInfo(""); + + return MpPlayerMgrIsActive(); +} diff --git a/src/mp-video-display-view.c b/src/mp-video-display-view.c new file mode 100755 index 0000000..f306308 --- /dev/null +++ b/src/mp-video-display-view.c @@ -0,0 +1,1222 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "video-player.h" +#include "mp-video-display-view.h" +#include "mp-video-progressbar.h" +#include "mp-video-type-define.h" +#include "mp-video-value-define.h" +#include "mp-util-media-service.h" +#include "mp-video-string-define.h" +#include "mp-video-subtitle-ctrl.h" +#include "mp-video-sound-path-ctrl.h" + +#define MUTE_POPUP_INTERVAL_TIME 3.0 +#define CTRL_PANEL_SHOW_TIME 5.0 +#define DOUBLE_CLICK_TIME 0.2 +#define MP_VIDEO_SUBTITLE_X_RATIO_LANDSCAPE 0.1 +#define MP_VIDEO_SUBTITLE_Y_RATIO_LANDSCAPE 0.15 +#define MP_VIDEO_SUBTITLE_W_RATIO_LANDSCAPE 0.8 +#define MP_VIDEO_SUBTITLE_H_RATIO_LANDSCAPE 0.2 +#define MP_VIDEO_SUBTITLE_Y_RATIO_LANDSCAPE_WITHOUT_UI 0.47 +#define MP_VIDEO_SUBTITLE_X_RATIO_PORTRAIT 0.1 +#define MP_VIDEO_SUBTITLE_Y_RATIO_PORTRAIT 0.5 +#define MP_VIDEO_SUBTITLE_W_RATIO_PORTRAIT 0.8 +#define MP_VIDEO_SUBTITLE_H_RATIO_PORTRAIT 0.2 +#define MP_VIDEO_SPEED_2X_SEEK_TIME 1000 +#define MP_VIDEO_SPEED_3X_SEEK_TIME 3000 +#define MP_VIDEO_SPEED_4X_SEEK_TIME 5000 +#define MP_VIDEO_SPEED_5X_SEEK_TIME 7000 + + +typedef enum +{ + MP_PLAYING_SPEED_NOTHING = 0, + MP_PLAYING_SPEED_FF, + MP_PLAYING_SPEED_REW, +}MpVideoDisplayViewSpeedModeType; + + +static Evas_Object *pNaviFrameHandle = NULL; +static Evas_Object *pDisplayViewNaviControlBar = NULL; +static Evas_Object *pDisplayViewLayout = NULL; +static Evas_Object *pDisplayViewPanelEdj = NULL; +static Evas_Object *pDisplayViewCtrlEdj = NULL; +static Evas_Object *pDisplayViewSubtitleEdj = NULL; +static Evas_Object *pDisplayViewOptionEdj = NULL; +static Evas_Object *pDisplaySoundpathButton = NULL; + +//static Ecore_Timer *pVolLongPressTimer = NULL; +//static Ecore_Timer *pMutePopupShowTimer = NULL; +static Ecore_Timer *pCtrlPanelHideTimer = NULL; +static Ecore_Timer *pSpeedPressTimer = NULL; +static Ecore_Timer *pSubtitleTimer = NULL; + +static Elm_Object_Item *pNaviFrameItemForDisplayerView = NULL; +static Ecore_Event_Handler *pMouseEventHandler = NULL; + +//static bool bIsVolumeLongPress = FALSE; +//static bool bIsVolumePopupShow = FALSE; +static bool bSwitchDisplayViewUI = TRUE; +static int nScreensizeStatus = MP_DISPLAY_METHOD_LETTER_BOX; +static int nCountCalledSpeedPlaying = 0; + +static int nSpeedMode = MP_PLAYING_SPEED_NOTHING; + + + + +/* + * When the video display view is hieded by others view(favorite/info/etc), + * passing click event of mouse up in video display view. + */ +static VideoDisplayViewState nDisplayViewState = MP_DISPLAY_VIEW_STATE_UNACTIVATE; + + +/* + * Callback function. + */ + +static void MpVideoDisplayViewWarningPopupCb(void *pUserData, Evas_Object *pObject, void *pEventInfo) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return; + } + + VideoLogInfo(""); + + MpUtilDeletePopupHandle(); +} + +static void MpVideoDisplayViewSoundPathCb(void *pUserData, Evas_Object *pObject, void *pEventInfo) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData"); + return; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (MpVideoSoundpathIsConnectOtherSoundpath()) { + VideoLogInfo("Connect BT or earjack."); + MpVideoSoundpathShow(pUserData); + } else { + MpUtilNotifyPopUp(pAppData, "Soundpath is connected with speaker only.", MpVideoDisplayViewWarningPopupCb); + } +} + +static void MpVideoDisplayViewPressOptionScreenSizeCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!strcmp(szEmission, SIGNAL_OPTION_SCREEN_SIZE_NORMAL)) { + VideoLogInfo("Screen size : Normal"); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetScreenSize(pAppData, MP_DISPLAY_METHOD_LETTER_BOX); + nScreensizeStatus = MP_DISPLAY_METHOD_LETTER_BOX; + } else if (!strcmp(szEmission, SIGNAL_OPTION_SCREEN_SIZE_EXPAND)) { + VideoLogInfo("Screen size : Expand"); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetScreenSize(pAppData, MP_DISPLAY_METHOD_CROPPED_FULL); + nScreensizeStatus = MP_DISPLAY_METHOD_CROPPED_FULL; + } else { + VideoLogInfo("Screen size : Nothing"); + nScreensizeStatus = MP_DISPLAY_METHOD_LETTER_BOX; + } +} + +static void MpVideoDisplayViewPressPauseButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!strcmp(szEmission, SIGNAL_CONTROL_PLAY_PAUSE_PRESS)) { + VideoLogInfo("Press Pause button."); + + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME || + pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData); + } + } +} + +static void MpVideoDisplayViewPressResumeButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!strcmp(szEmission, SIGNAL_CONTROL_PLAY_RESUME_PRESS)) { + VideoLogInfo("Press Resume/Play button."); + + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PAUSE) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume + (pAppData); + } + } +} + +static Eina_Bool MpVideoDisplayViewSpeedLongPressCb(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return EINA_FALSE; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + int nSeekPos = 0; + + ++nCountCalledSpeedPlaying; + switch (nCountCalledSpeedPlaying) { + case MP_PLAYING_SPEED_NORMAL: nSeekPos = 0; break; + case MP_PLAYING_SPEED_2X: nSeekPos = MP_VIDEO_SPEED_2X_SEEK_TIME; break; + case MP_PLAYING_SPEED_3X: nSeekPos = MP_VIDEO_SPEED_3X_SEEK_TIME; break; + case MP_PLAYING_SPEED_4X: nSeekPos = MP_VIDEO_SPEED_4X_SEEK_TIME; break; + case MP_PLAYING_SPEED_5X: nSeekPos = MP_VIDEO_SPEED_5X_SEEK_TIME; break; + } + + if (nCountCalledSpeedPlaying > MP_PLAYING_SPEED_5X) { + nSeekPos = MP_VIDEO_SPEED_5X_SEEK_TIME; + } + + VideoLogInfo("nSeekPos : %d", nSeekPos); + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData); + + if (nSpeedMode == MP_PLAYING_SPEED_FF) { + nSeekPos = pAppData->nCurPosition + nSeekPos; + } else if (nSpeedMode == MP_PLAYING_SPEED_REW) { + nSeekPos = pAppData->nCurPosition - nSeekPos; + } + + VideoLogInfo("pAppData->nCurPosition : %d, nSeekPos : %d", pAppData->nCurPosition, nSeekPos); + + if (0 >= nSeekPos || pAppData->nDuration <= nSeekPos) { + if (pSpeedPressTimer) { + ecore_timer_del(pSpeedPressTimer); + pSpeedPressTimer = NULL; + } + nCountCalledSpeedPlaying = 0; + return EINA_FALSE; + } + + pAppData->nSetPosition = nSeekPos; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData); + + return EINA_TRUE; +} + +static void MpVideoDisplayViewFFDownButtonCb(void *pUserData, + Evas_Object *pObject, + const char *szEmission, + const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!strcmp(szEmission, SIGNAL_CONTROL_NORMAL_FF_BUTTON_DOWN)) { + VideoLogInfo("Press FF down button."); + if (pCtrlPanelHideTimer) { + ecore_timer_del(pCtrlPanelHideTimer); + pCtrlPanelHideTimer = NULL; + } + + if (pSpeedPressTimer) { + ecore_timer_del(pSpeedPressTimer); + pSpeedPressTimer = NULL; + } + + nCountCalledSpeedPlaying = 0; + + nSpeedMode = MP_PLAYING_SPEED_FF; + pSpeedPressTimer = ecore_timer_add(LONG_PRESS_INTERVAL, MpVideoDisplayViewSpeedLongPressCb, (void *)pAppData); + } +} + +static void MpVideoDisplayViewFFUpButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!strcmp(szEmission, SIGNAL_CONTROL_NORMAL_FF_BUTTON_UP)) { + if (nCountCalledSpeedPlaying == MP_PLAYING_SPEED_NORMAL) { + VideoLogInfo("Press FF up button."); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlShowLayout(pAppData); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPlayNextMedia(pAppData); + } + } + + if(strlen(pAppData->szNextMediaUri) > 0) { + VideoLogInfo("Next File : %s", pAppData->szNextMediaUri); + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_FF_MODE_EXTEND, "*"); + } + else { + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_FF_MODE_NORMAL, "*"); + } + if(strlen(pAppData->szPreMediaUri) > 0) { + VideoLogInfo("Prev File : %s", pAppData->szPreMediaUri); + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_REW_MODE_EXTEND, "*"); + } + else { + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_REW_MODE_NORMAL, "*"); + } + + if (pSpeedPressTimer) { + ecore_timer_del(pSpeedPressTimer); + pSpeedPressTimer = NULL; + } + + nCountCalledSpeedPlaying = 0; +} + +static void MpVideoDisplayViewRewDownButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!strcmp(szEmission, SIGNAL_CONTROL_NORMAL_REW_BUTTON_DOWN)) { + VideoLogInfo("Press Rewind donw button."); + + if (pCtrlPanelHideTimer) { + ecore_timer_del(pCtrlPanelHideTimer); + pCtrlPanelHideTimer = NULL; + } + + if (pSpeedPressTimer) { + ecore_timer_del(pSpeedPressTimer); + pSpeedPressTimer = NULL; + } + + nCountCalledSpeedPlaying = 0; + + nSpeedMode = MP_PLAYING_SPEED_REW; + pSpeedPressTimer = ecore_timer_add(LONG_PRESS_INTERVAL, MpVideoDisplayViewSpeedLongPressCb, (void *)pAppData); + } +} + +static void MpVideoDisplayViewRewUpButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!strcmp(szEmission, SIGNAL_CONTROL_NORMAL_REW_BUTTON_UP)) { + if (nCountCalledSpeedPlaying == MP_PLAYING_SPEED_NORMAL) { + VideoLogInfo("Press Rewind up button."); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlShowLayout(pAppData); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPlayPreMedia(pAppData); + } + } + if(strlen(pAppData->szNextMediaUri) > 0) { + VideoLogInfo("Next File : %s", pAppData->szNextMediaUri); + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_FF_MODE_EXTEND, "*"); + } + else { + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_FF_MODE_NORMAL, "*"); + } + if(strlen(pAppData->szPreMediaUri) > 0) { + VideoLogInfo("Prev File : %s", pAppData->szPreMediaUri); + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_REW_MODE_EXTEND, "*"); + } + else { + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_REW_MODE_NORMAL, "*"); + } + + if (pSpeedPressTimer) { + ecore_timer_del(pSpeedPressTimer); + pSpeedPressTimer = NULL; + } + + nCountCalledSpeedPlaying = 0; +} + +/* +static Eina_Bool MpVideoDisplayViewVolPopupCb(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return EINA_FALSE; + } + + if (pMutePopupShowTimer) { + ecore_timer_del(pMutePopupShowTimer); + pMutePopupShowTimer = NULL; + } + + bIsVolumePopupShow = FALSE; + edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_MUTE_HIDE, "*"); + + return EINA_FALSE; +} + +static Eina_Bool MpVideoDisplayViewVolLongPressCb(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return EINA_FALSE; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pVolLongPressTimer) { + ecore_timer_del(pVolLongPressTimer); + pVolLongPressTimer = NULL; + } + + bIsVolumeLongPress = TRUE; + + if (pAppData->bIsMute == FALSE) { + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_VOL_BUTTON_MUTE, "*"); + edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_MUTE_SHOW, "*"); + + pMutePopupShowTimer = ecore_timer_add(MUTE_POPUP_INTERVAL_TIME, MpVideoDisplayViewVolPopupCb, (void *)pAppData); + bIsVolumePopupShow = TRUE; + pAppData->bIsMute = TRUE; + } else { + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_VOL_BUTTON_UNMUTE, "*"); + edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_MUTE_HIDE, "*"); + bIsVolumePopupShow = FALSE; + pAppData->bIsMute = FALSE; + } + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetMute(pAppData); + + return EINA_FALSE; +} +*/ + +static void MpVideoDisplayViewBackButtonDownCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + edje_object_signal_callback_del(pDisplayViewCtrlEdj, SIGNAL_CONTROL_BACK_BUTTON_DOWN, SIGNAL_CONTROL_PART_BACK_BUTTON, (void *)MpVideoDisplayViewBackButtonDownCb); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pAppData->nLaunchingAppType == MP_LAUNCH_APP_GALLERY ) { + if (pAppData->nCurPosition >= 0 ) { + MpUtilMediaSvcSaveLastPlayedTime(pAppData->szMediaUri, pAppData->nCurPosition); + } else { + VideoLogInfo("Invalid Plaing time or duration time."); + } + } + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStopByAppPause(pAppData); + + MpVideoDisplayViewPop(pDisplayViewNaviControlBar, pUserData); + + edje_object_signal_callback_add(pDisplayViewCtrlEdj, SIGNAL_CONTROL_BACK_BUTTON_DOWN, SIGNAL_CONTROL_PART_BACK_BUTTON, (void *)MpVideoDisplayViewBackButtonDownCb, (void *)pAppData); +} + + + +static void MpVideoDisplayViewVolumeButtonDownCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } +/* + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pVolLongPressTimer) { + ecore_timer_del(pVolLongPressTimer); + pVolLongPressTimer = NULL; + } + + bIsVolumeLongPress = FALSE; + pVolLongPressTimer = ecore_timer_add(LONG_PRESS_INTERVAL, + MpVideoDisplayViewVolLongPressCb, + (void *)pAppData); +*/ +} + +static void MpVideoDisplayViewVolumeButtonUpCb(void *pUserData, + Evas_Object *pObject, + const char *szEmission, + const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + syspopup_launch("volume", NULL); + +/* + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pVolLongPressTimer) { + ecore_timer_del(pVolLongPressTimer); + pVolLongPressTimer = NULL; + } + + if (bIsVolumeLongPress) { + return; + } + + if (pAppData->bIsMute == TRUE) { + if (bIsVolumePopupShow) { + ecore_timer_del(pMutePopupShowTimer); + } + + pMutePopupShowTimer = + ecore_timer_add(MUTE_POPUP_INTERVAL_TIME, + MpVideoDisplayViewVolPopupCb, + (void *)pAppData); + + edje_object_signal_emit(_EDJ(pDisplayViewLayout), + SIGNAL_MAIN_MUTE_SHOW, "*"); + + bIsVolumePopupShow = TRUE; + } else { + syspopup_launch("volume", NULL); + } +*/ +} + +static void MpVideoDisplayViewMainScreenTouchCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + if (nDisplayViewState == MP_DISPLAY_VIEW_STATE_UNACTIVATE) { + VideoLogInfo("MP_DISPLAY_VIEW_STATE_UNACTIVATE"); + return; + } + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (bSwitchDisplayViewUI) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlHideLayout(pAppData); + } +} + +static Eina_Bool MpVideoDisplayViewCtrlPanelHideCb(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR] No Exist pUserData."); + return EINA_FALSE; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pCtrlPanelHideTimer) { + ecore_timer_del(pCtrlPanelHideTimer); + pCtrlPanelHideTimer = NULL; + } + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlHideLayout(pAppData); + + return EINA_FALSE; +} + +static Eina_Bool MpVideoDisplayViewMouseUpCb(void *pUserData, int nType, void *pEvent) +{ + if (nDisplayViewState == MP_DISPLAY_VIEW_STATE_UNACTIVATE) { + VideoLogInfo("MP_DISPLAY_VIEW_STATE_UNACTIVATE"); + return ECORE_CALLBACK_PASS_ON; + } + + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR] No Exist pUserData."); + return ECORE_CALLBACK_PASS_ON; + } + + if (!pEvent) { + VideoLogInfo("[ERR] No exist pEvent."); + return ECORE_CALLBACK_PASS_ON; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!bSwitchDisplayViewUI) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlShowLayout(pAppData); + } else { + if (pCtrlPanelHideTimer) { + ecore_timer_del(pCtrlPanelHideTimer); + pCtrlPanelHideTimer = ecore_timer_add(CTRL_PANEL_SHOW_TIME, MpVideoDisplayViewCtrlPanelHideCb, pUserData); + } + } + return ECORE_CALLBACK_PASS_ON; +} + +static void MpVideoDisplayViewChangedEarjackCb(void *pNode, void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoLogInfo(""); + + MpVideoSoundpathHide(); + MpUtilDeletePopupHandle(); + + if (MpUtilIsConnectEarjack()) { + VideoLogInfo("Connect earjack."); + if (pDisplaySoundpathButton) { + elm_object_item_part_content_set(pNaviFrameItemForDisplayerView, "title_left_btn", pDisplaySoundpathButton); + } else { + pDisplaySoundpathButton = MpUtilCreateButtonIcon(pNaviFrameHandle, VIDEO_HEAD_ICON_SOUNDPATH, FALSE, FALSE, pUserData, "video/naviframe/title/default", (void*)MpVideoDisplayViewSoundPathCb); + elm_object_item_part_content_set(pNaviFrameItemForDisplayerView, "title_left_btn", pDisplaySoundpathButton); + } + } else { + VideoLogInfo("Disconnect earjack."); + + if (pDisplaySoundpathButton) { + evas_object_del(pDisplaySoundpathButton); + pDisplaySoundpathButton = NULL; + } + + elm_object_item_part_content_unset(pNaviFrameItemForDisplayerView, "title_left_btn"); + } +} + +static Eina_Bool MpVideoDisplayViewSubtitleDurationCb(void* pUserData) +{ + VideoLogInfo(""); + + edje_object_part_text_set(pDisplayViewSubtitleEdj, SUBTITLE_TEXT, ""); + + if(pSubtitleTimer) + { + ecore_timer_del(pSubtitleTimer); + pSubtitleTimer = NULL; + } + + return EINA_FALSE; +} + +/* + * Internal function + */ + +void MpVideoDisplayViewInitKeyMouse(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pMouseEventHandler) { + ecore_event_handler_del(pMouseEventHandler); + pMouseEventHandler = NULL; + } + + pMouseEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, MpVideoDisplayViewMouseUpCb, pAppData); +} + +void MpVideoDisplayViewInitLayout(void *pUserData, int nLaunchingApp, void* pShowInfoViewCb) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + pDisplayViewLayout = elm_layout_add(pNaviFrameHandle); + if (pDisplayViewLayout) { + Evas_Object *pTmpProgressbarEdj = NULL; + Evas *pMainWindowEvas = evas_object_evas_get(pAppData->pMainWindow); + + elm_layout_file_set(pDisplayViewLayout, VIDEO_PLAYER_MAIN_EDJ, MAIN_EDJ_GROUP); + + pDisplayViewOptionEdj = MpUtilLoadEdjFile(pMainWindowEvas, VIDEO_PLAYER_OPTION_BUTTON_EDJ, OPTION_EDJ_GROUP); + elm_object_part_content_set(pDisplayViewLayout, SWALLOW_MAIN_OPTION_BUTTON, pDisplayViewOptionEdj); + + pDisplayViewCtrlEdj = MpUtilLoadEdjFile(pMainWindowEvas, VIDEO_PLAYER_CONTROL_EDJ, CONTROL_EDJ_GROUP); + pDisplayViewPanelEdj = MpUtilLoadEdjFile(pMainWindowEvas, VIDEO_PLAYER_PANEL_EDJ, PANEL_EDJ_GROUP); + + edje_object_part_swallow(pDisplayViewPanelEdj, SWALLOW_PANEL_CONTROL, pDisplayViewCtrlEdj); + + pTmpProgressbarEdj = (Evas_Object *)MpVideoProgressbarInit(pAppData); + if (pTmpProgressbarEdj) { + edje_object_part_swallow(pDisplayViewPanelEdj, SWALLOW_PANEL_PROGRESS_BAR, pTmpProgressbarEdj); + } else { + VideoLogInfo("Progressbar edj handle is null."); + } + + elm_object_part_content_set(pDisplayViewLayout, SWALLOW_MAIN_CONTROL, pDisplayViewPanelEdj); + + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_MODE_NORMAL, "*"); + + if(strlen(pAppData->szPreMediaUri) > 0) { + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_REW_MODE_EXTEND, "*"); + VideoLogInfo("Prev File : %s", pAppData->szPreMediaUri); + } + else { + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_REW_MODE_NORMAL, "*"); + } + + if(strlen(pAppData->szNextMediaUri) > 0) { + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_FF_MODE_EXTEND, "*"); + VideoLogInfo("Next File : %s", pAppData->szNextMediaUri); + } + else { + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_FF_MODE_NORMAL, "*"); + } + + + if (nScreensizeStatus == MP_DISPLAY_METHOD_LETTER_BOX) { + VideoLogInfo("nScreensizeStatus : MP_DISPLAY_METHOD_LETTER_BOX"); + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_SCREENSIZE_BUTTON_NORMAL, "*"); + } else if (nScreensizeStatus == MP_DISPLAY_METHOD_CROPPED_FULL) { + VideoLogInfo("nScreensizeStatus : MP_DISPLAY_METHOD_CROPPED_FULL"); + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_SCREENSIZE_BUTTON_EXPAND, "*"); + } else { + VideoLogInfo("nScreensizeStatus : MP_DISPLAY_METHOD_LETTER_BOX"); + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_SCREENSIZE_BUTTON_NORMAL, "*"); + } + + edje_object_signal_callback_add(pDisplayViewOptionEdj, + SIGNAL_OPTION_SCREEN_SIZE_NORMAL, + SIGNAL_OPTION_PART_SCREEN_SIZE, + (void *)MpVideoDisplayViewPressOptionScreenSizeCb, (void *)pAppData); + + edje_object_signal_callback_add(pDisplayViewOptionEdj, + SIGNAL_OPTION_SCREEN_SIZE_EXPAND, + SIGNAL_OPTION_PART_SCREEN_SIZE, + (void *)MpVideoDisplayViewPressOptionScreenSizeCb, (void *)pAppData); + + edje_object_signal_callback_add(pDisplayViewOptionEdj, + SIGNAL_OPTION_DETAIL_DOWN, + SIGNAL_OPTION_PART_DETAIL, + (void *)pShowInfoViewCb, (void *)pAppData); + + edje_object_signal_callback_add(pDisplayViewCtrlEdj, + SIGNAL_CONTROL_PLAY_PAUSE_PRESS, + SIGNAL_CONTROL_PART_PLAY_BUTTON, + (void *)MpVideoDisplayViewPressPauseButtonCb, (void *)pAppData); + + edje_object_signal_callback_add(pDisplayViewCtrlEdj, + SIGNAL_CONTROL_PLAY_RESUME_PRESS, + SIGNAL_CONTROL_PART_PLAY_BUTTON, + (void *)MpVideoDisplayViewPressResumeButtonCb, (void *)pAppData); + + edje_object_signal_callback_add(pDisplayViewCtrlEdj, + SIGNAL_CONTROL_NORMAL_FF_BUTTON_DOWN, + SIGNAL_CONTROL_PART_FF_BUTTON, + (void *)MpVideoDisplayViewFFDownButtonCb, (void *)pAppData); + + edje_object_signal_callback_add(pDisplayViewCtrlEdj, + SIGNAL_CONTROL_NORMAL_FF_BUTTON_UP, + SIGNAL_CONTROL_PART_FF_BUTTON, + (void *)MpVideoDisplayViewFFUpButtonCb, (void *)pAppData); + + edje_object_signal_callback_add(pDisplayViewCtrlEdj, + SIGNAL_CONTROL_NORMAL_REW_BUTTON_DOWN, + SIGNAL_CONTROL_PART_REW_BUTTON, + (void *)MpVideoDisplayViewRewDownButtonCb, (void *)pAppData); + + edje_object_signal_callback_add(pDisplayViewCtrlEdj, + SIGNAL_CONTROL_NORMAL_REW_BUTTON_UP, + SIGNAL_CONTROL_PART_REW_BUTTON, + (void *)MpVideoDisplayViewRewUpButtonCb, (void *)pAppData); + + edje_object_signal_callback_add(pDisplayViewCtrlEdj, + SIGNAL_CONTROL_BACK_BUTTON_DOWN, + SIGNAL_CONTROL_PART_BACK_BUTTON, + (void *)MpVideoDisplayViewBackButtonDownCb, (void *)pAppData); + + edje_object_signal_callback_add(pDisplayViewCtrlEdj, + SIGNAL_CONTROL_VOL_BUTTON_DOWN, + SIGNAL_CONTROL_PART_VOL_BUTTON, + (void *)MpVideoDisplayViewVolumeButtonDownCb, (void *)pAppData); + + edje_object_signal_callback_add(pDisplayViewCtrlEdj, + SIGNAL_CONTROL_VOL_BUTTON_UP, + SIGNAL_CONTROL_PART_VOL_BUTTON, + (void *)MpVideoDisplayViewVolumeButtonUpCb, (void *)pAppData); + + edje_object_signal_callback_add(_EDJ(pDisplayViewLayout), + SIGNAL_MAIN_SCREEN_TOUCH_PRESS, + SIGNAL_MAIN_SCREEN_TOUCH_TOGGLE, + (void *)MpVideoDisplayViewMainScreenTouchCb, (void *)pAppData); + + MpUtilRegisteEarjackCbFunc((void *)MpVideoDisplayViewChangedEarjackCb, pUserData); + } +} + +void MpVideoDisplayViewInitSubTitle(void* pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData"); + return; + } + + VideoLogInfo(""); + + if (!MpVideoSubtitleCtrlIsExistSubtitle()) { + VideoLogInfo("No exist subtitle."); + return; + } + + VideoAppData* pAppData = (VideoAppData*)pUserData; + + Evas* pMainWindowEvas = evas_object_evas_get(pAppData->pMainWindow); + + pDisplayViewSubtitleEdj = MpUtilLoadEdjFile(pMainWindowEvas, VIDEO_PLAYER_SUBTITLE_EDJ, SUBTITLE_EDJ_GROUP); + + edje_object_part_text_set(pDisplayViewSubtitleEdj, SUBTITLE_TEXT, ""); +} + +void MpVideoDisplayViewInit(void *pUserData, int nLaunchingApp, void* pShowInfoViewCb) +{ + VideoLogInfo(""); + + if (!pNaviFrameHandle|| !pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + MpVideoDisplayViewInitKeyMouse(pUserData); + MpVideoDisplayViewInitLayout(pUserData, nLaunchingApp, pShowInfoViewCb); + MpVideoDisplayViewInitSubTitle(pUserData); +} + + +/* + * External function + */ +void MpVideoDisplayViewPush(void *pNaviFrame, void *pShowInfoViewCb, int nLaunchingApp, void *pUserData) +{ + if (!pNaviFrame || !pShowInfoViewCb || !pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoLogInfo(""); + + pNaviFrameHandle = pNaviFrame; + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + MpVideoDisplayViewInit(pUserData, nLaunchingApp, pShowInfoViewCb); + + pNaviFrameItemForDisplayerView = elm_naviframe_item_push(pNaviFrameHandle, pAppData->szVideoTitle, NULL, NULL, pDisplayViewLayout, "video/1line"); + + if (MpVideoSoundpathIsConnectOtherSoundpath()) { + pDisplaySoundpathButton = MpUtilCreateButtonIcon(pNaviFrameHandle, VIDEO_HEAD_ICON_SOUNDPATH, FALSE, FALSE, pUserData, "video/naviframe/title/default", (void*)MpVideoDisplayViewSoundPathCb); + elm_object_item_part_content_set(pNaviFrameItemForDisplayerView, "title_left_btn", pDisplaySoundpathButton); + } + + MpVideoDisplayViewShowControlPanel(pUserData); +} + +void MpVideoDisplayViewPop(void *pNaviFrame, void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + elm_win_lower(pAppData->pMainWindow); +} + +void MpVideoDisplayViewDestroy(void *pUserData) +{ + VideoLogInfo(""); + + MpVideoDisplayViewHideControlPanel(pUserData); + MpVideoProgressbarDestroy(); + + pNaviFrameHandle = NULL; + + if (pMouseEventHandler) { + ecore_event_handler_del(pMouseEventHandler); + pMouseEventHandler = NULL; + } + + if (pDisplayViewPanelEdj) { + evas_object_del(pDisplayViewPanelEdj); + pDisplayViewPanelEdj = NULL; + } + + if (pDisplayViewCtrlEdj) { + evas_object_del(pDisplayViewCtrlEdj); + pDisplayViewCtrlEdj = NULL; + } + + if (pDisplayViewOptionEdj) { + evas_object_del(pDisplayViewOptionEdj); + pDisplayViewOptionEdj = NULL; + } + +// if (pVolLongPressTimer) { +// ecore_timer_del(pVolLongPressTimer); +// pVolLongPressTimer = NULL; +// } + +// if (pMutePopupShowTimer) { +// ecore_timer_del(pMutePopupShowTimer); +// pMutePopupShowTimer = NULL; +// } + + if (pCtrlPanelHideTimer) { + ecore_timer_del(pCtrlPanelHideTimer); + pCtrlPanelHideTimer = NULL; + } + + if (pDisplayViewNaviControlBar) { + evas_object_del(pDisplayViewNaviControlBar); + pDisplayViewNaviControlBar = NULL; + } + + if (pDisplayViewLayout) { + evas_object_del(pDisplayViewLayout); + pDisplayViewLayout = NULL; + } + + if (pSubtitleTimer) { + ecore_timer_del(pSubtitleTimer); + pSubtitleTimer = NULL; + } + + if (pDisplayViewSubtitleEdj) { + evas_object_del(pDisplayViewSubtitleEdj); + pDisplayViewSubtitleEdj = NULL; + } + + if (pDisplaySoundpathButton) { + evas_object_del(pDisplaySoundpathButton); + pDisplaySoundpathButton = NULL; + } + + if (pSpeedPressTimer) { + ecore_timer_del(pSpeedPressTimer); + pSpeedPressTimer = NULL; + } + + +// bIsVolumeLongPress = FALSE; +// bIsVolumePopupShow = FALSE; + + nCountCalledSpeedPlaying = 0; + nSpeedMode = MP_PLAYING_SPEED_NOTHING; + + bSwitchDisplayViewUI = TRUE; + nDisplayViewState = MP_DISPLAY_VIEW_STATE_UNACTIVATE; + nScreensizeStatus = MP_DISPLAY_METHOD_LETTER_BOX; +} + +void MpVideoDisplayViewInitAfterBeginOfStream(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetScreenSize(pAppData, nScreensizeStatus); + + MpVideoProgressbarBeginOfStream((void *)pAppData); + + if (pAppData->nDuration > 1) { + char szDurationTime[PLAY_TIME_LENGTH] = { 0 }; + + snprintf(szDurationTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, PLAY_TIME_ARGS(pAppData->nDuration / 1000)); + + MpVideoProgressbarUpdateDurationTime(szDurationTime); + } + + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_PLAY_RESUME, "*"); +} + +void MpVideoDisplayViewUpdatePauseKey(void) +{ + VideoLogInfo(""); + + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_PLAY_PAUSE, "*"); +} + +void MpVideoDisplayViewUpdateResumeKey(void) +{ + VideoLogInfo(""); + + edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_PLAY_RESUME, "*"); +} + +void MpVideoDisplayViewShowControlPanel(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + if (!pDisplayViewPanelEdj) { + VideoLogInfo("No exist play control panel edc."); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + bSwitchDisplayViewUI = TRUE; + + evas_object_show(pDisplayViewPanelEdj); + + if (pCtrlPanelHideTimer) { + ecore_timer_del(pCtrlPanelHideTimer); + pCtrlPanelHideTimer = NULL; + } + + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PAUSE) { + } else { + pCtrlPanelHideTimer = ecore_timer_add(CTRL_PANEL_SHOW_TIME, MpVideoDisplayViewCtrlPanelHideCb, pUserData); + } + + MpVideoDisplayViewActivate(); +} + +void MpVideoDisplayViewHideControlPanel(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + if (!pDisplayViewPanelEdj) { + VideoLogInfo("No exist play control panel edc."); + return; + } + + bSwitchDisplayViewUI = FALSE; + + evas_object_hide(pDisplayViewPanelEdj); + + if (pCtrlPanelHideTimer) { + ecore_timer_del(pCtrlPanelHideTimer); + pCtrlPanelHideTimer = NULL; + } +} + +void MpVideoDisplayViewActivate(void) +{ + VideoLogInfo(""); + + nDisplayViewState = MP_DISPLAY_VIEW_STATE_ACTIVATE; +} + +void MpVideoDisplayViewUnactivate(void) +{ + VideoLogInfo(""); + + nDisplayViewState = MP_DISPLAY_VIEW_STATE_UNACTIVATE; +} + +void MpVideoDisplayViewHideSoundpath(void) +{ + VideoLogInfo(""); + + MpVideoSoundpathHide(); +} + +void MpVideoDisplayViewChangeNaviFrameTitle(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + Elm_Object_Item *pNaviFrameItemForDisplayerView = elm_naviframe_top_item_get(pNaviFrameHandle); + + if (pNaviFrameItemForDisplayerView != NULL) { + VideoLogInfo("%s", pAppData->szVideoTitle); + elm_object_item_text_set(pNaviFrameItemForDisplayerView, pAppData->szVideoTitle); + } +} + +void MpVideoDisplayViewUpdateSubtitle(double nDuration, char* szSubtitleString) +{ + VideoLogInfo(""); + + if (!szSubtitleString) { + VideoLogInfo("No Exist szSubtitleString pointer."); + return; + } + + if (nDuration <= 0) { + VideoLogInfo("No Exist Duration time."); + return; + } + + VideoLogInfo("Subtitle Data: %s", szSubtitleString); + VideoLogInfo("Subtitle Duration : %f", nDuration); + + edje_object_part_text_set(pDisplayViewSubtitleEdj, SUBTITLE_TEXT, szSubtitleString); + + if (pSubtitleTimer) { + ecore_timer_del(pSubtitleTimer); + pSubtitleTimer = NULL; + } + + pSubtitleTimer = ecore_timer_add(nDuration, MpVideoDisplayViewSubtitleDurationCb, NULL); +} + +bool MpVideoDisplayViewIsTopView(void) +{ + VideoLogInfo(""); + + Evas_Object *pTmpContents = NULL; + Elm_Object_Item *pTmpItem = NULL; + + if (!pNaviFrameHandle) { + VideoLogInfo("[ERR] No exist naviframe handle."); + return FALSE; + } + + pTmpItem = elm_naviframe_top_item_get(pNaviFrameHandle); + pTmpContents = elm_object_item_content_get(pTmpItem); + if (pTmpContents) { + if (pTmpContents == pDisplayViewLayout) { + VideoLogInfo("Video display view is staing in top view."); + return TRUE; + } else { + VideoLogInfo("Video display view is not staied in top view."); + return FALSE; + } + } else { + VideoLogInfo("[ERR] No exist naviframe top item."); + return FALSE; + } + + return FALSE; +} + +void MpVideoDisplayViewShowNocontentImage(void) +{ + VideoLogInfo(""); + + if (pDisplayViewLayout) { + edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_NOCONTENTS_SHOW, "*"); + } +} + +void MpVideoDisplayViewHideNocontentImage(void) +{ + VideoLogInfo(""); + + if (pDisplayViewLayout) { + edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_NOCONTENTS_HIDE, "*"); + } +} + +void MpVideoDisplayViewResetProgressBar(void *pUserData) +{ + VideoLogInfo(""); + + if (pDisplayViewLayout) { + MpVideoProgressbarReset(pUserData); + } +} \ No newline at end of file diff --git a/src/mp-video-info-ctrl.c b/src/mp-video-info-ctrl.c new file mode 100755 index 0000000..7062a56 --- /dev/null +++ b/src/mp-video-info-ctrl.c @@ -0,0 +1,360 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "video-player.h" +#include "mp-video-info-ctrl.h" + +enum VIDEO_PLAYER_FILE_SIZE_TYPE +{ + SIZE_BYTE = 0, + SIZE_KB, + SIZE_MB, + SIZE_GB +}; + +bool MpVideoInfoCtrlGetGPS(char *szUriPath, double *nLongtitude, double *nLatitude) +{ + if (!szUriPath) { + VideoLogInfo("[ERR] No exist szUriPath."); + return FALSE; + } + + VideoLogInfo(""); + + MMHandleType st_Tag = (MMHandleType) NULL; + + int nRet = -1; + char *szTmp = NULL; + double nGpsValue = 0.0; + + *nLatitude = 0.0; + *nLongtitude = 0.0; + + nRet = mm_file_create_tag_attrs(&st_Tag, szUriPath); + if (!st_Tag) { + VideoLogInfo("[ERR] : %s", szUriPath); + return FALSE; + } + + nRet = mm_file_get_attrs(st_Tag, &szTmp, MM_FILE_TAG_LATIDUE, &nGpsValue, NULL); + if (nRet == 0) { + VideoLogInfo("Latitude : %f", nGpsValue); + if (nGpsValue != 0.0) { + *nLatitude = nGpsValue; + } + } else if (szTmp) { + VideoLogInfo("[ERR] - %s", szTmp); + free(szTmp); + szTmp = NULL; + mm_file_destroy_tag_attrs(st_Tag); + + return FALSE; + } + + nGpsValue = 0.0; + + nRet = mm_file_get_attrs(st_Tag, &szTmp, MM_FILE_TAG_LONGITUDE, &nGpsValue, NULL); + if (nRet == 0) { + VideoLogInfo("Longitude: %f", nGpsValue); + if (nGpsValue != 0.0) { + *nLongtitude = nGpsValue; + } + } else if (szTmp) { + VideoLogInfo("[ERR] - %s", szTmp); + free(szTmp); + szTmp = NULL; + mm_file_destroy_tag_attrs(st_Tag); + + return FALSE; + } + + mm_file_destroy_tag_attrs(st_Tag); + + return TRUE; +} + +bool MpVideoInfoCtrlGetResolution(char *szWidthResolution, char *szHeightResolution, void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return FALSE; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetVideoResolution(pAppData); + + if (pAppData->nVideoWidthResolution > 0 && pAppData->nVideoHeightResolution > 0) { + snprintf(szWidthResolution, STR_LEN_MAX, "%d", pAppData->nVideoWidthResolution); + snprintf(szHeightResolution, STR_LEN_MAX, "%d", pAppData->nVideoHeightResolution); + } else { + return FALSE; + } + + return TRUE; +} + +static char *MpVideoInfoCtrlConvertingString(const char *szLocale, const char *szCustomSkeleton, const char *szTimezone, UDate st_Date) +{ +#define UG_ICU_ARR_LENGTH 256 + + // Copy a byte string encoded in the default codepage to a ustring. + // Copies at most n characters. The result will be null terminated if the length of src is less than n. + // Performs a host byte to UChar conversion. + + UChar ucustomSkeleton[UG_ICU_ARR_LENGTH] = {0,}; + + if (u_uastrncpy(ucustomSkeleton, szCustomSkeleton, UG_ICU_ARR_LENGTH) == NULL) { + VideoLogInfo("u_uastrncpy() error."); + return NULL; + } + + UChar utimezone[UG_ICU_ARR_LENGTH] = {0,}; + + if (u_uastrncpy(utimezone, szTimezone, UG_ICU_ARR_LENGTH) == NULL) { + VideoLogInfo("u_uastrncpy() error."); + return NULL; + } + + UErrorCode status = U_ZERO_ERROR; + UDateTimePatternGenerator *generator; + UDateFormat *formatter; + + UChar bestPattern[UG_ICU_ARR_LENGTH] = {0,}; + UChar formatted[UG_ICU_ARR_LENGTH] = {0,}; + char formattedString[UG_ICU_ARR_LENGTH] = {0,}; + int32_t bestPatternLength, formattedLength; + + ucal_setDefaultTimeZone(utimezone , &status); + + if (U_FAILURE(status)) { + VideoLogInfo("ucal_setDefaultTimeZone() is failed."); + return NULL; + } + + uloc_setDefault(getenv("LC_TIME"), &status); + + if (U_FAILURE(status)) { + VideoLogInfo("ucal_setDefaultTimeZone() is failed."); + return NULL; + } + + generator = udatpg_open(szLocale, &status); + if (generator == NULL) { + return NULL; + } + + bestPatternLength = udatpg_getBestPattern(generator, ucustomSkeleton, u_strlen(ucustomSkeleton), bestPattern, UG_ICU_ARR_LENGTH, &status); + if (bestPatternLength <= 0) { + return NULL; + } + + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, szLocale, NULL, -1, bestPattern, -1, &status); + if (formatter == 0) { + return NULL; + } + + formattedLength = udat_format(formatter, st_Date, formatted, UG_ICU_ARR_LENGTH, NULL, &status); + if (formattedLength <= 0) { + return NULL; + } + + u_austrcpy(formattedString, formatted); + udatpg_close(generator); + udat_close(formatter); + + if (strlen(formattedString) == 0) { + return NULL; + } + + return strdup(formattedString); +} + +static char* MpVideoInfoCtrlGetDateOfFile(time_t mtime) +{ +#define UG_DATE_FORMAT_12 "yMMMdhms" +#define UG_DATE_FORMAT_24 "yMMMdHms" + + VideoLogInfo(""); + + char* szSkeleton = NULL; + + enum appcore_time_format nTimeformat; + + int nRet = appcore_get_timeformat(&nTimeformat); + if (nRet == -1) { + VideoLogInfo("Cannot get timeformat."); + nTimeformat = APPCORE_TIME_FORMAT_12; + } + + if (nTimeformat == APPCORE_TIME_FORMAT_12) { + szSkeleton = UG_DATE_FORMAT_12; + } else if(nTimeformat == APPCORE_TIME_FORMAT_24) { + szSkeleton = UG_DATE_FORMAT_24; + } else { + VideoLogInfo("Invalid time format : %d", nTimeformat); + szSkeleton = UG_DATE_FORMAT_12; // Default value. + } + + char *szLocale = vconf_get_str(VCONFKEY_REGIONFORMAT); // eg en_US.UTF-8 + if (szLocale == NULL) { + VideoLogInfo("Cannot get region format."); + szLocale = "en_US.UTF-8"; // Default value. + } + + char *szTimezone = NULL; + szTimezone = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID); // eg Asia/Seoul + if (szTimezone == NULL) { + VideoLogInfo("Cannot get time zone."); + return strdup("N/A"); + } + + VideoLogInfo("Locale : %s TimeZone : %s TimeFormat : %s", szLocale, szSkeleton, szTimezone); + + char* szDatestr = NULL; + szDatestr = MpVideoInfoCtrlConvertingString(szLocale, szSkeleton, szTimezone, (UDate)mtime * 1000); + if(!szDatestr) { + VideoLogInfo("Cannot get time string."); + return strdup("N/A"); + } + + VideoLogInfo("ICU Date : %s", szDatestr); + + return szDatestr; +} + +char* MpVideoInfoCtrlGetFileExtension(char *szPath) +{ + if (!szPath) { + VideoLogInfo("Cannot get file extension. path is NULL"); + return strdup("Unknown"); + } + + char *szExt = NULL; + szExt = strrchr(szPath, '.'); + + if ((szExt != NULL) && ((szExt+1) != NULL)) { + return strdup(szExt + 1); + } + + return strdup("Unknown"); +} + +char* MpVideoInfoCtrlGetFileSize(size_t size) +{ + VideoLogInfo(""); + +#define FILE_SIZE_LEN_MAX 64 +#define BASIC_SIZE 1024 //used for file size check + + int nCount = 0; + + unsigned long int lsize = (unsigned long int)size; + + char *pTmp = (char *)calloc(1, sizeof(char) * FILE_SIZE_LEN_MAX + 1); + if (pTmp == NULL) { + return NULL; + } + + while (size >= (BASIC_SIZE)) { + lsize = size; + size /= BASIC_SIZE; + nCount++; + } + + float remain = ((float)lsize/BASIC_SIZE) - size; + + if (nCount == SIZE_BYTE) { + snprintf(pTmp, FILE_SIZE_LEN_MAX,"%zu B", size); + } else if (nCount == SIZE_KB) { + snprintf(pTmp, FILE_SIZE_LEN_MAX,"%zu KB", size); + } else if (nCount == SIZE_MB) { + snprintf(pTmp, FILE_SIZE_LEN_MAX,"%.1f MB", size+remain); + } else if(nCount == SIZE_GB) { + snprintf(pTmp, FILE_SIZE_LEN_MAX,"%.1f GB", size+remain); + } + + VideoLogInfo("Size = %lu, OrigSize=%zu", lsize, size); + + return pTmp; +} + +bool MpVideoInfoCtrlGetFileInfo(char *szUriPath, char *szFileDate, int nFileDateSize, char *szFileExtension, int nFileExtensionSize, char *szFileSize, int nFilesizeSize) +{ + if (!szUriPath) { + VideoLogInfo("[ERR] No exist szUriPath."); + return FALSE; + } + + VideoLogInfo(""); + + struct stat statbuf; + + if (stat(szUriPath, &statbuf) == -1) { + return FALSE; + } + + memset(szFileDate, 0, nFileDateSize); + memset(szFileExtension, 0, nFileExtensionSize); + memset(szFileSize, 0, nFilesizeSize); + + char *szTmpDateOfFile = MpVideoInfoCtrlGetDateOfFile(statbuf.st_mtime); + char *szTmpFileExtension = MpVideoInfoCtrlGetFileExtension(szUriPath); + char *szTmpFileSize = MpVideoInfoCtrlGetFileSize(statbuf.st_size); + + if (szTmpDateOfFile) { + VideoLogInfo("szTmpDateOfFile : %s", szTmpDateOfFile); + strncpy(szFileDate, szTmpDateOfFile, nFileDateSize); + free(szTmpDateOfFile); + } + + if (szTmpFileExtension) { + VideoLogInfo("szTmpFileExtension : %s", szTmpFileExtension); + strncpy(szFileExtension, szTmpFileExtension, nFileExtensionSize); + free(szTmpFileExtension); + } + + if (szTmpFileSize) { + VideoLogInfo("szTmpFileSize : %s", szTmpFileSize); + strncpy(szFileSize, szTmpFileSize, nFilesizeSize); + free(szTmpFileSize); + } + + return TRUE; +} diff --git a/src/mp-video-player-mgr.c b/src/mp-video-player-mgr.c new file mode 100755 index 0000000..9fadbd7 --- /dev/null +++ b/src/mp-video-player-mgr.c @@ -0,0 +1,993 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include +#include +#include + +#include "mp-video-log.h" +#include "mp-video-player-mgr.h" + +#define MAX_PATH_LEN 2048 + +static int nAntiShock = 0; +static MMHandleType playerHandle = 0; + +bool MpPlayerMgrIsActive(void) +{ + return playerHandle ? true : false; +} + +void MpPlayerMgrSetMessageCallback(MMMessageCallback Callback, void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return; + } + + if (mm_player_set_message_callback(playerHandle, Callback, pUserData) != + MM_ERROR_NONE) { + VideoLogInfo("[ERR]"); + return; + } +} + +bool MpPlayerMgrSetAudioCallback(mm_player_audio_stream_callback CallBack, + void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return false; + } + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + if (mm_player_set_audio_stream_callback + (playerHandle, CallBack, pUserData) != MM_ERROR_NONE) { + VideoLogInfo("[ERR]"); + return false; + } + + return true; +} + +bool MpPlayerMgrCreate(const char *szPath) +{ + VideoLogInfo(""); + + if (!szPath) { + VideoLogInfo("[ERR] Not correct Meida URI."); + return false; + } + + int nPathLength = strlen(szPath); + int nErr = MM_ERROR_NONE; + char *pErrName = NULL; + + VideoLogInfo(" Media path (%s)", szPath); + + if (nPathLength > 0 && nPathLength < MAX_PATH_LEN) { + nErr = mm_player_create(&playerHandle); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo + ("[ERR] Fail to create player handle. (MMF Error code : %x)", + nErr); + return false; + } + + nErr = + mm_player_set_attribute(playerHandle, &pErrName, + "profile_uri", szPath, + strlen(szPath), NULL); + + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] (%x):: Fail to set attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + } else { + VideoLogInfo("[ERR] File path is too long."); + return false; + } + + if (nAntiShock) { + nErr = mm_player_set_attribute(playerHandle, &pErrName, + "sound_fadeup", 1, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] (%x):: Fail to set attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + nAntiShock = 0; + } else { + nErr = mm_player_set_attribute(playerHandle, &pErrName, + "sound_fadeup", 0, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] (%x):: Fail to set attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + nAntiShock = 1; + } + + nErr = mm_player_set_attribute(playerHandle, &pErrName, + "sound_volume_type", + MM_SOUND_VOLUME_TYPE_MEDIA, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] (%x):: Fail to set attribute ", nErr, + pErrName); + free(pErrName); + return false; + } + + return true; +} + +bool MpPlayerMgrDestroy(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = mm_player_destroy(playerHandle); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x", nErr); + return false; + } + + playerHandle = 0; + + return true; +} + +bool MpPlayerMgrRealize(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = mm_player_realize(playerHandle); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x", nErr); + return false; + } + + return true; +} + +bool MpPlayerMgrUnrealize(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = mm_player_unrealize(playerHandle); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x", nErr); + return false; + } + + return true; +} + +bool MpPlayerMgrPlay(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = mm_player_start(playerHandle); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x", nErr); + return false; + } + + return true; +} + +bool MpPlayerMgrStop(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = mm_player_stop(playerHandle); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x", nErr); + return false; + } + + return true; +} + +bool MpPlayerMgrResume(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + char *pErrName = NULL; + int nErr = MM_ERROR_NONE; + + if (nAntiShock) { + nErr = mm_player_set_attribute(playerHandle, &pErrName, + "sound_fadeup", 1, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo + ("[ERR] Error code : 0x%x - Fail to set attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + nAntiShock = 0; + } else { + nErr = mm_player_set_attribute(playerHandle, &pErrName, + "sound_fadeup", 0, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo + ("[ERR] Error code : 0x%x - Fail to set attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + nAntiShock = 0; + } + + nErr = mm_player_resume(playerHandle); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x", nErr); + return false; + } + + return true; +} + +bool MpPlayerMgrPause(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = mm_player_pause(playerHandle); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x", nErr); + return false; + } + + return true; +} + +int MpPlayerMgrGetPosition(void) +{ + if (!MpPlayerMgrIsActive()) { + return 0; + } + + int nPos = 0; + int nErr = 0; + + nErr = mm_player_get_position(playerHandle, MM_PLAYER_POS_FORMAT_TIME, + &nPos); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x ", nErr); + return 0; + } + + return nPos; +} + +void MpPlayerMgrSetPosition(unsigned int nPos) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return; + } + + VideoLogInfo("Set position - %d", nPos); + + int nErr = 0; + + nErr = mm_player_set_position(playerHandle, MM_PLAYER_POS_FORMAT_TIME, + (int)nPos); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x ", nErr); + } +} + +bool MpPlayerMgrGetVisible(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = MM_ERROR_NONE; + int nVisible = 0; + char *pErrName = NULL; + + nErr = + mm_player_get_attribute(playerHandle, &pErrName, "display_visible", + &nVisible, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to get attribute.", + nErr, pErrName); + free(pErrName); + return false; + } + + return (bool) nVisible; +} + +void MpPlayerMgrSetVisible(bool bEnabled) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return; + } + + if (MpPlayerMgrGetVisible() == bEnabled) { + VideoLogInfo("[ERR]"); + return; + } + + int nErr = MM_ERROR_NONE; + char *pErrName = NULL; + + nErr = + mm_player_set_attribute(playerHandle, &pErrName, "display_visible", + (int)bEnabled, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to set attribute ", + nErr, pErrName); + free(pErrName); + } +} + +void MpPlayerMgrSetMute(bool bMuteEnable) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return; + } + + if (mm_player_set_mute(playerHandle, (int)bMuteEnable) != MM_ERROR_NONE) { + VideoLogInfo("[ERR]"); + } +} + +bool MpPlayerMgrGetMute(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return FALSE; + } + + bool bIsMute = FALSE; + + if (mm_player_get_mute(playerHandle, (int *)&bIsMute) != MM_ERROR_NONE) { + VideoLogInfo("[ERR]"); + return FALSE; + } + + return bIsMute; +} + +bool MpPlayerMgrSetBtHeadset(bool bEnable, char *szAddress) +{ + VideoLogInfo(""); + + VideoLogInfo("bt headset enable(%d)", bEnable); + VideoLogInfo("============================================"); + VideoLogInfo("bluetooth headset enable(%d), addr(%s)", bEnable, + szAddress); + VideoLogInfo("============================================"); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + MMBluetoothType BluetoothParam; + memset(&BluetoothParam, 0, sizeof(MMBluetoothType)); + + if (bEnable) { + BluetoothParam.mode = 1; + + if (szAddress) { + strncpy(BluetoothParam.addr, szAddress, + BT_ADDR_LEN - 1); + } else { + VideoLogInfo("[ERR]"); + return false; + } + + VideoLogInfo("address : %s", szAddress); + } + + return true; +} + +int MpPlayerMgrGetStreamingType(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = MM_ERROR_NONE; + char *pErrName = NULL; + int streaming_type = STREAMING_SERVICE_NONE; + + nErr = + mm_player_get_attribute(playerHandle, &pErrName, "streaming_type", + &streaming_type, NULL); + + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to get attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + return (int)streaming_type; +} + +void MpPlayerMgrSetProgressiveDownload(int nFileSize) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return; + } + + int nErr = MM_ERROR_NONE; + char *pErrName = NULL; + + nErr = mm_player_set_attribute(playerHandle, &pErrName, "pd_enable", 1, + "pd_full_content_size", nFileSize, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to set attribute ", + nErr, pErrName); + free(pErrName); + } +} + +void MpPlayerMgrSetDownloadComplete(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return; + } + + int nErr = MM_ERROR_NONE; + char *pErrName = NULL; + + nErr = + mm_player_set_attribute(playerHandle, &pErrName, "pd_down_complete", + 1, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to set attribute ", + nErr, pErrName); + free(pErrName); + } +} + +void MpPlayerMgrSetProgressTimerInterval(int nInterval) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return; + } + + char *pErrName = NULL; + int nErr = MM_ERROR_NONE; + + nErr = mm_player_set_attribute(playerHandle, &pErrName, + "profile_progress_interval", nInterval, + NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to set attribute ", + nErr, pErrName); + free(pErrName); + } +} + +int MpPlayerMgrGetPdduration(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nDuration = -1; + char *pErrName = NULL; + int nErr = MM_ERROR_NONE; + + nErr = + mm_player_get_attribute(playerHandle, &pErrName, "content_duration", + &nDuration, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to get attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + return nDuration; +} + +int MpPlayerMgrGetDuration(char *szFilePath) +{ + VideoLogInfo("%s", szFilePath); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nDuration = -1; + char *pErrName = NULL; + int nErr = MM_ERROR_NONE; + + nErr = + mm_player_get_attribute(playerHandle, &pErrName, "content_duration", + &nDuration, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to get attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + return nDuration; +} + +bool MpPlayerMgrSetRatioVideoScreenSize(MpPlayerMgrDisplayMethod ScreenSize) +{ + VideoLogInfo("Screen size : %d", ScreenSize); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + char *pErrName = NULL; + int nErr = MM_ERROR_NONE; + + nErr = + mm_player_set_attribute(playerHandle, &pErrName, "display_method", + ScreenSize, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to set attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + return true; +} + +bool MpPlayerMgrSetOverlayXid(void *pOverlayXid) +{ + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + if (!pOverlayXid) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = MM_ERROR_NONE; + char *pErrName = NULL; + + VideoLogInfo("XID : %d", *((int *)pOverlayXid)); + + nErr = + mm_player_set_attribute(playerHandle, &pErrName, "display_overlay", + pOverlayXid, sizeof(int), + "display_rotation", + MM_DISPLAY_ROTATION_NONE, NULL); + + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to set attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + return true; +} + +bool MpPlayerMgrSetSoundPriority(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + char *pErrName = NULL; + int nErr = MM_ERROR_NONE; + + nErr = mm_player_set_attribute(playerHandle, &pErrName, + "sound_volume_type", + MM_SOUND_VOLUME_TYPE_MEDIA, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo + ("[ERR] Error code : 0x%x - Fail to set attribute ", nErr, + pErrName); + free(pErrName); + return false; + } + + return true; +} + +int MpPlayerMgrGetVideoWidthResolution(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + char *pErrName = NULL; + int nWidth = 0; + int nErr = MM_ERROR_NONE; + + nErr = mm_player_get_attribute(playerHandle, &pErrName, + "content_video_width", &nWidth, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to get attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + return nWidth; +} + +int MpPlayerMgrGetVideoHeightResolution(void) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + char *pErrName = NULL; + int nHeight = 0; + int nErr = MM_ERROR_NONE; + + nErr = mm_player_get_attribute(playerHandle, &pErrName, + "content_video_height", &nHeight, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to get attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + return nHeight; +} + +bool MpPlayerMgrSetSubtitleSilent(bool bSilent) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = mm_player_set_subtitle_silent(playerHandle, (int)bSilent); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - ", nErr); + return false; + } + + return true; +} + +bool MpPlayerMgrSetSubtitle(const char *szSubtitlePath) +{ + VideoLogInfo("%s", szSubtitlePath); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + if (!szSubtitlePath) { + VideoLogInfo("[ERR] subtitle path is null."); + return false; + } + + char *pErrName = NULL; + + int nErr = 0; + nErr = mm_player_set_attribute(playerHandle, &pErrName, "subtitle_uri", + (const char *)szSubtitlePath, + strlen(szSubtitlePath), NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to set attribute ", + nErr, pErrName); + free(pErrName); + return false; + } else { + VideoLogInfo("Success to set subtitle."); + } + + return true; +} + +int MpPlayerMgrSetBluetoothHeadset(char *szBlutoothAddress, int nMode) +{ + VideoLogInfo(""); + + return 1; +} + +int MpPlayerMgrSetDisplayArea(int nX, int nY, int nWidth, int nHeight) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + char *pErrName = NULL; + + int nErr = 0; + nErr = mm_player_set_attribute(playerHandle, &pErrName, "display_roi_x", + nX, "display_roi_y", nY, + "display_roi_width", nWidth, + "display_roi_height", nHeight, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to set attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + return true; +} + +int MpPlayerMgrSetVerticalOverlayPos(int nY) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + char *pErrName = NULL; + + int nErr = 0; + nErr = mm_player_set_attribute(playerHandle, &pErrName, "display_roi_y", + nY, NULL); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] Error code : 0x%x - Fail to set attribute ", + nErr, pErrName); + free(pErrName); + return false; + } + + return true; +} + +bool MpPlayerMgrSetUseragentForStreaming(const char *szUserAgent) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + if (!szUserAgent) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = MM_ERROR_NONE; + char *pErrName = NULL; + + if (strlen(szUserAgent) > 0) { + VideoLogInfo("User agent (%s)", szUserAgent); + nErr = mm_player_set_attribute(playerHandle, &pErrName, + "streaming_user_agent", + szUserAgent, strlen(szUserAgent), + NULL); + + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] (%x):: Fail to set attribute [%s]", + nErr, pErrName); + free(pErrName); + return false; + } + } else { + VideoLogInfo("No have useragnet value."); + return true; + } + + return true; +} + +bool MpPlayerMgrSetProxAddressForStreaming(const char *szProxyAddress) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + if (!szProxyAddress) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = MM_ERROR_NONE; + char *pErrName = NULL; + + if (strlen(szProxyAddress) > 0) { + VideoLogInfo("Proxy Setting (%s)", szProxyAddress); + nErr = mm_player_set_attribute(playerHandle, &pErrName, + "streaming_proxy", + szProxyAddress, + strlen(szProxyAddress), NULL); + + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] (%x):: Fail to set attribute [%s]", + nErr, pErrName); + free(pErrName); + return false; + } + } + return true; +} + +bool MpPlayerMgrSetCookieForStreaming(const char *szCookie) +{ + VideoLogInfo(""); + + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + if (!szCookie) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = MM_ERROR_NONE; + char *pErrName = NULL; + + if (strlen(szCookie) > 0) { + VideoLogInfo("Cookie (%s)", szCookie); + nErr = mm_player_set_attribute(playerHandle, &pErrName, + "streaming_cookie", szCookie, + strlen(szCookie), NULL); + + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR] (%x):: Fail to set attribute [%s]", + nErr, pErrName); + + if (pErrName) + free(pErrName); + + return false; + } + } else { + VideoLogInfo("No have useragnet value."); + return true; + } + + return true; +} + + +int MpPlayerMgrGetBufferingPosition(void) +{ + if (!MpPlayerMgrIsActive()) { + VideoLogInfo("[ERR]"); + return false; + } + + int nErr = MM_ERROR_NONE; + + int startPos = 0, stopPos = 0; + nErr = mm_player_get_buffer_position(playerHandle, + MM_PLAYER_POS_FORMAT_PERCENT, + &startPos, &stopPos); + if (nErr != MM_ERROR_NONE) { + VideoLogInfo("[ERR]"); + return -1; + } + + return stopPos; +} diff --git a/src/mp-video-progressbar.c b/src/mp-video-progressbar.c new file mode 100755 index 0000000..664b125 --- /dev/null +++ b/src/mp-video-progressbar.c @@ -0,0 +1,410 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include "mp-util.h" +#include "mp-video-log.h" +#include "video-player.h" +#include "mp-video-value-define.h" +#include "mp-video-progressbar.h" + +static Evas_Object *pProgressbarEdj = NULL; +Ecore_Timer *pProgressbarTimer = NULL; + +static bool bIsEventSkip = FALSE; +static bool bIsDrag = FALSE; +static int nDragPosition = 0; + +#define PROGRESS_BAR_TERM 40 + +/* + * Internal function + */ +static Eina_Bool MpVideoProgressbarUpdateValue(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist userdata."); + return EINA_TRUE; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + double nPlayedRatio = 0.0; + char szPlayingTime[PLAY_TIME_LENGTH] = { 0 }; + + nPlayedRatio = ((double)nDragPosition / (double)pAppData->nDuration); + + snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, + PLAY_TIME_ARGS(nDragPosition / 1000)); + + edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", + nPlayedRatio, 0.0); + + edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", + szPlayingTime); + + return EINA_TRUE; +} + +static void MpVideoProgressbarUpdateBufferingValue(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist userdata."); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + double buffering_ratio = 0.0; + pAppData-> + VideoAppCtrlCallbackFunc.VideoAppCtrlGetBufferingPosition(pAppData); + + buffering_ratio = ((double)pAppData->nBufferingPosition / (double)100); + + edje_object_part_drag_value_set(pProgressbarEdj, "progress.buffering", + buffering_ratio, 0.0); +} + +/* + * Callback function. + */ +static Eina_Bool MpVideoProgressbarTimerCb(void *pUserData) +{ + + if (!pUserData) { + VideoLogInfo("[ERR] No exist userdata."); + return EINA_TRUE; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pAppData->nDuration < 1) { + VideoLogInfo("Try to update duration time."); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlReqDurationTime(pAppData); + return EINA_TRUE; + } + + if (bIsDrag || bIsEventSkip) + return EINA_TRUE; + + double nPlayedRatio = 0.0; + char szPlayingTime[PLAY_TIME_LENGTH] = { 0 }; + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData); + + nPlayedRatio = ((double)pAppData->nCurPosition / (double)pAppData->nDuration); + snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, PLAY_TIME_ARGS(pAppData->nCurPosition / 1000)); + + edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", nPlayedRatio, 0.0); + edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", szPlayingTime); + + if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER ) + MpVideoProgressbarUpdateBufferingValue(pUserData); + + return EINA_TRUE; +} + +static void MpVideoProgressbarDownCb(void *pUserData, Evas * e, + Evas_Object *obj, void *event_info) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + if (!event_info) { + VideoLogInfo("[ERR]"); + return; + } + + if (bIsEventSkip) + return; + + VideoAppData *pAppData = (VideoAppData *)pUserData; + Evas_Event_Mouse_Up *ev = event_info; + Evas_Object *progressbar = obj; + int w = 0, current = 0; + double ratio = 0.0; + + bIsDrag = TRUE; + + evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL); + current = ev->canvas.x - PROGRESS_BAR_TERM; + if (current < 0) + current = 0; + else if (current > w) + current = w; + + ratio = (double)current / w; + + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY || + pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData); + pAppData->nPrePlayerState = MP_PLAYER_STATE_RESUME; + } + + nDragPosition = ratio * pAppData->nDuration; + + MpVideoProgressbarUpdateValue(pUserData); + +} + +static void MpVideoProgressbarUpCb(void *pUserData, Evas * e, Evas_Object *obj, + void *event_info) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + if (!event_info) { + VideoLogInfo("[ERR]"); + return; + } + + if (bIsEventSkip) + return; + + VideoAppData *pAppData = (VideoAppData *)pUserData; + Evas_Event_Mouse_Up *ev = event_info; + Evas_Object *progressbar = obj; + int w = 0, current = 0; + double ratio = 0.0; + + evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL); + current = ev->canvas.x - PROGRESS_BAR_TERM; + if (current < 0) + current = 0; + else if (current > w) + current = w; + + ratio = (double)current / w; + + pAppData->nSetPosition = (int)pAppData->nDuration * ratio; + + if (pAppData->nSetPosition > pAppData->nDuration) + pAppData->nSetPosition = pAppData->nDuration; + + if (pAppData->nSetPosition < 0) + pAppData->nSetPosition = 0; + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData); + + if (pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY || + pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData); + pAppData->nPrePlayerState = MP_PLAYER_STATE_PAUSE; + } + + bIsDrag = FALSE; +} + +static void MpVideoProgressbarMoveCb(void *pUserData, Evas * e, + Evas_Object *obj, void *event_info) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + if (!event_info) { + VideoLogInfo("[ERR]"); + return; + } + + if (bIsEventSkip) + return; + + VideoAppData *pAppData = (VideoAppData *)pUserData; + Evas_Event_Mouse_Up *ev = event_info; + Evas_Object *progressbar = obj; + int w = 0, current = 0; + double ratio = 0.0; + + evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL); + current = ev->canvas.x - PROGRESS_BAR_TERM; + if (current < 0) + current = 0; + else if (current > w) + current = w; + + ratio = (double)current / w; + nDragPosition = ratio * pAppData->nDuration; + + MpVideoProgressbarUpdateValue(pUserData); + +} + +/* + * External function + */ +void MpVideoProgressbarSetSkipEvent(bool bSkip) +{ + VideoLogInfo(""); + + bIsEventSkip = bSkip; +} + +void *MpVideoProgressbarGetEdjHandle(void) +{ + VideoLogInfo(""); + + if (pProgressbarEdj) { + return (void *)pProgressbarEdj; + } else { + VideoLogInfo("Progressbar edj handle is null."); + return NULL; + } +} + +void *MpVideoProgressbarInit(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return NULL; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + Evas *pMainWindowEvas = evas_object_evas_get(pAppData->pMainWindow); + + pProgressbarEdj = (Evas_Object *)MpUtilLoadEdjFile(pMainWindowEvas, + VIDEO_PLAYER_PROGRESS_EDJ, + PROGRESS_EDJ_GROUP); + + evas_object_event_callback_add(pProgressbarEdj, + EVAS_CALLBACK_MOUSE_DOWN, + MpVideoProgressbarDownCb, pAppData); + + evas_object_event_callback_add(pProgressbarEdj, + EVAS_CALLBACK_MOUSE_UP, + MpVideoProgressbarUpCb, pAppData); + + evas_object_event_callback_add(pProgressbarEdj, + EVAS_CALLBACK_MOUSE_MOVE, + MpVideoProgressbarMoveCb, pAppData); + + MpVideoProgressbarUpdateDurationTime("--:--:--"); + + return (void *)pProgressbarEdj; +} + +void MpVideoProgressbarDestroy(void) +{ + VideoLogInfo(""); + + if (pProgressbarEdj) { + evas_object_del(pProgressbarEdj); + pProgressbarEdj = NULL; + } + + if (pProgressbarTimer) { + ecore_timer_del(pProgressbarTimer); + pProgressbarTimer = NULL; + } + + bIsEventSkip = FALSE; + bIsDrag = FALSE; + nDragPosition = 0; +} + +void MpVideoProgressbarCreateTimer(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pProgressbarTimer) { + ecore_timer_del(pProgressbarTimer); + pProgressbarTimer = NULL; + } + + pProgressbarTimer = ecore_timer_add(0.3, MpVideoProgressbarTimerCb, (void *)pAppData); +} + +void MpVideoProgressbarDeleteTimer(void) +{ + VideoLogInfo(""); + + if (pProgressbarTimer) { + ecore_timer_del(pProgressbarTimer); + pProgressbarTimer = NULL; + } +} + +void MpVideoProgressbarUpdateDurationTime(char *szDurationTime) +{ + VideoLogInfo(""); + + if (!szDurationTime) { + VideoLogInfo("Fail to ser duration time"); + return; + } + + edje_object_part_text_set(pProgressbarEdj, "progress.txt.total", + szDurationTime); +} + +void MpVideoProgressbarBeginOfStream(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + MpVideoProgressbarDeleteTimer(); + + pAppData->nCurPosition = 0; + edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", 0.0, 0.0); + edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", "00:00:00"); + + MpVideoProgressbarCreateTimer(pUserData); +} + +void MpVideoProgressbarReset(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + MpVideoProgressbarDeleteTimer(); + + edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", 0.0, 0.0); + edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", "00:00:00"); +} + diff --git a/src/mp-video-sound-path-ctrl.c b/src/mp-video-sound-path-ctrl.c new file mode 100755 index 0000000..81fc7d9 --- /dev/null +++ b/src/mp-video-sound-path-ctrl.c @@ -0,0 +1,415 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "video-player.h" +#include "mp-video-type-define.h" +#include "mp-video-value-define.h" +#include "mp-video-string-define.h" +#include "mp-video-sound-path-ctrl.h" + +#define MP_VIDEO_SOUND_PATH_NUM 10 +#define MP_VIDEO_SOUND_PATH_SPEAKER "Speaker" +#define MP_VIDEO_SOUND_PATH_EARJACK "Headphones" + +static Evas_Object *pVideoSoundPathPopUpHandle = NULL; +static Evas_Object *pGroupRadio = NULL; +static Evas_Object *pGenList = NULL; + +static Elm_Genlist_Item_Class st_Itc; +static char szSoundPathItems[MP_VIDEO_SOUND_PATH_NUM][STR_LEN_MAX]; +static bool bIsConnectBluetooth = FALSE; +static bool bIsConnectEarjack = FALSE; + +void MpVideoSoundpathDeleteRadioButton(void) +{ + VideoLogInfo(""); + + if (pGroupRadio) { + evas_object_del(pGroupRadio); + pGroupRadio = NULL; + } +} + +void MpVideoSoundpathDeletePopupHandle(void) +{ + VideoLogInfo(""); + + int nCount = 0; + + for (nCount = 0; nCount < MP_VIDEO_SOUND_PATH_NUM; nCount++) { + memset(&szSoundPathItems[nCount][0], 0, + sizeof(char) * STR_LEN_MAX); + } + + MpVideoSoundpathDeleteRadioButton(); + + memset(&st_Itc, 0, sizeof(Elm_Genlist_Item_Class)); + + if (pGenList) { + evas_object_del(pGenList); + pGenList = NULL; + } + + if (pVideoSoundPathPopUpHandle) { + evas_object_del(pVideoSoundPathPopUpHandle); + pVideoSoundPathPopUpHandle = NULL; + } + + } + +static char *MpVideoSoundpathGetLabelOfGenlistItemCb(const void *pUserData, + Evas_Object *pObject, + const char *pPart) +{ + VideoLogInfo(""); + + int nIndex = (int)pUserData; + + if (!strcmp(pPart, "elm.text")) { + VideoLogInfo("Index : %d", nIndex); + return strdup(&szSoundPathItems[nIndex][0]); + } + + return NULL; +} + +static Evas_Object *MpVideoSoundpathGetIconOfGenlistItemCb(const void + *pUserData, + Evas_Object *pObject, + const char *pPart) +{ + VideoLogInfo(""); + + int nIndex = (int)pUserData; + Evas_Object *pTmpRadio = NULL; + + if (!strcmp(pPart, "elm.icon")) { + VideoLogInfo("Index : %d", nIndex); + pTmpRadio = elm_radio_add(pObject); + elm_radio_state_value_set(pTmpRadio, nIndex); + evas_object_show(pTmpRadio); + elm_radio_group_add(pTmpRadio, pGroupRadio); + } + + return pTmpRadio; +} + +static void MpVideoSoundpathSelectSoundPathItemCb(void *pUserData, + Evas_Object *pObject, + void *pEventInfo) +{ + if (pUserData == NULL) { + VideoLogInfo("[ERR]No have pUserData"); + return; + } + + VideoLogInfo(""); + + int nIndex = 0; + Elm_Object_Item *pItem = (Elm_Object_Item *) pEventInfo; + + if (pItem) { + nIndex = (int)elm_object_item_data_get(pItem); + VideoLogInfo("Select sound path : %s", szSoundPathItems[nIndex]); + + if (!strcmp(szSoundPathItems[nIndex], MP_VIDEO_SOUND_PATH_SPEAKER)) { + int nRet = 0; + + if (MpUtilIsConnectEarjack()) { + nRet = mm_sound_route_set_system_policy(SYSTEM_AUDIO_ROUTE_POLICY_HANDSET_ONLY); + } else { + nRet = mm_sound_route_set_system_policy(SYSTEM_AUDIO_ROUTE_POLICY_IGNORE_A2DP); + } + + elm_radio_value_set(pGroupRadio, MP_SOUND_PATH_SPEAKER); + } else if (!strcmp(szSoundPathItems[nIndex], MP_VIDEO_SOUND_PATH_EARJACK)) { + int nRet = mm_sound_route_set_system_policy(SYSTEM_AUDIO_ROUTE_POLICY_IGNORE_A2DP); + if (nRet != MM_ERROR_NONE) { + VideoLogInfo("[ERR] mm_sound_route_set_system_policy(0x%x)", nRet); + } else { + elm_radio_value_set(pGroupRadio, MP_SOUND_PATH_EARJACK); + } + } else { + int nRet = mm_sound_route_set_system_policy(SYSTEM_AUDIO_ROUTE_POLICY_DEFAULT); + if (nRet != MM_ERROR_NONE) { + VideoLogInfo("[ERR] mm_sound_route_set_system_policy(0x%x)", nRet); + } else { + elm_radio_value_set(pGroupRadio, MP_SOUND_PATH_BLUETOOTH); + } + } + } + + MpVideoSoundpathDeletePopupHandle(); +} + +static void MpVideoSoundpathPopupCb(void *pUserData, Evas_Object *pObject, + void *pEventInfo) +{ + VideoLogInfo(""); + + if (pUserData == NULL) { + VideoLogInfo("[ERR]No have pUserData"); + return; + } + + MpVideoSoundpathDeletePopupHandle(); +} + +void MpVideoSoundpathCurrentState(Evas_Object *pParent) +{ + VideoLogInfo(""); + + int nBluetoothConnect = 0; + char *szBluetoothName = NULL; + bIsConnectEarjack = FALSE; + bIsConnectBluetooth = FALSE; + + /* Speaker */ + strncpy(&szSoundPathItems[MP_SOUND_PATH_SPEAKER][0], MP_VIDEO_SOUND_PATH_SPEAKER, STR_LEN_MAX - 1); + + /* Check and Add earjack sound path. */ + if (MpUtilIsConnectEarjack()) { + VideoLogInfo("Connect earjack."); + bIsConnectEarjack = TRUE; + strncpy(&szSoundPathItems[MP_SOUND_PATH_EARJACK][0], MP_VIDEO_SOUND_PATH_EARJACK, STR_LEN_MAX - 1); + } else { + VideoLogInfo("No connect earjack."); + } + + /* Add bluetooth stereo sound path. */ + if (MM_ERROR_NONE != mm_sound_route_get_a2dp_status(&nBluetoothConnect, &szBluetoothName)) { + VideoLogInfo("[ERR] Fail to check bluetooth stereo sound path."); + } else { + if (nBluetoothConnect) { + VideoLogInfo("Connect szBluetoothName : %s", szBluetoothName); + bIsConnectBluetooth = TRUE; + strncpy(&szSoundPathItems[MP_SOUND_PATH_BLUETOOTH][0], szBluetoothName, STR_LEN_MAX - 1); + } else { + VideoLogInfo("Unactivate Bluetooth stereo A2DP."); + } + } +} + +void MpVideoSoundpathSetRadioButton(void) +{ + VideoLogInfo(""); + + int nBluetoothConnect = 0; + char *szBluetoothName = NULL; + system_audio_route_t nPolicy = 0; + + mm_sound_route_get_system_policy(&nPolicy); + + if (nPolicy == SYSTEM_AUDIO_ROUTE_POLICY_DEFAULT) { + VideoLogInfo("SYSTEM_AUDIO_ROUTE_POLICY_DEFAULT"); + + if (MM_ERROR_NONE != mm_sound_route_get_a2dp_status(&nBluetoothConnect, &szBluetoothName)) { + VideoLogInfo("[ERR] Fail to check bluetooth stereo sound path."); + } + + if (nBluetoothConnect) { + elm_radio_value_set(pGroupRadio, MP_SOUND_PATH_BLUETOOTH); + } else if (MpUtilIsConnectEarjack()) { + elm_radio_value_set(pGroupRadio, MP_SOUND_PATH_EARJACK); + } else { + elm_radio_value_set(pGroupRadio, MP_SOUND_PATH_SPEAKER); + } + } else if (nPolicy == SYSTEM_AUDIO_ROUTE_POLICY_IGNORE_A2DP) { + VideoLogInfo("SYSTEM_AUDIO_ROUTE_POLICY_IGNORE_A2DP"); + + if (MpUtilIsConnectEarjack()) { + elm_radio_value_set(pGroupRadio, MP_SOUND_PATH_EARJACK); + } else { + elm_radio_value_set(pGroupRadio, MP_SOUND_PATH_SPEAKER); + } + } else { + VideoLogInfo("SYSTEM_AUDIO_ROUTE_POLICY_HANDSET_ONLY"); + + elm_radio_value_set(pGroupRadio, MP_SOUND_PATH_SPEAKER); + } +} + +/* + * External function + */ +bool MpVideoSoundpathShow(void *pUserData) +{ + if (pUserData == NULL) { + VideoLogInfo("No have popup message or pAppData is null."); + return FALSE; + } + + VideoLogInfo(""); + + MpVideoSoundpathIsConnectOtherSoundpath(); + + if (!bIsConnectBluetooth && !bIsConnectEarjack) { + VideoLogInfo("Soundpath is only speaker."); + return FALSE; + } + + Evas_Object *pBox = NULL; + Evas_Object *pButton = NULL; + VideoAppData *pAppData = (VideoAppData *)pUserData; + + MpVideoSoundpathDeletePopupHandle(); + + pVideoSoundPathPopUpHandle = elm_popup_add(pAppData->pMainWindow); + + MpVideoSoundpathCurrentState(pVideoSoundPathPopUpHandle); + + elm_object_style_set(pVideoSoundPathPopUpHandle, "min_menustyle"); + elm_object_part_text_set(pVideoSoundPathPopUpHandle, "title,text", MP_VIDEO_SOUND_PATH); + evas_object_size_hint_weight_set(pVideoSoundPathPopUpHandle, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + pButton = elm_button_add(pVideoSoundPathPopUpHandle); + elm_object_text_set(pButton, dgettext(MP_SYS_STRING, MP_COM_BUTTON_CANCEL)); + elm_object_part_content_set(pVideoSoundPathPopUpHandle, "button1", pButton); + evas_object_smart_callback_add(pButton, "clicked", MpVideoSoundpathPopupCb, (void*)pAppData); + + /* Set item of Genlist. */ + st_Itc.item_style = "1text.1icon.3"; + st_Itc.func.text_get = (void *)MpVideoSoundpathGetLabelOfGenlistItemCb; + st_Itc.func.content_get = (void *)MpVideoSoundpathGetIconOfGenlistItemCb; + st_Itc.func.state_get = NULL; + st_Itc.func.del = NULL; + + /* Create genlist handle */ + pGenList = elm_genlist_add(pVideoSoundPathPopUpHandle); + evas_object_size_hint_weight_set(pGenList, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pGenList, EVAS_HINT_FILL, EVAS_HINT_FILL); + + pGroupRadio = elm_radio_add(pGenList); + + if (bIsConnectBluetooth) { + elm_genlist_item_append(pGenList, &st_Itc, (void *)MP_SOUND_PATH_BLUETOOTH, NULL, + ELM_GENLIST_ITEM_NONE, + MpVideoSoundpathSelectSoundPathItemCb, + pAppData); + } + + if (bIsConnectEarjack) { + elm_genlist_item_append(pGenList, &st_Itc, (void *)MP_SOUND_PATH_EARJACK, NULL, + ELM_GENLIST_ITEM_NONE, + MpVideoSoundpathSelectSoundPathItemCb, + pAppData); + } + + elm_genlist_item_append(pGenList, &st_Itc, (void *)MP_SOUND_PATH_SPEAKER, NULL, + ELM_GENLIST_ITEM_NONE, + MpVideoSoundpathSelectSoundPathItemCb, + pAppData); + + MpVideoSoundpathSetRadioButton(); + + pBox = elm_box_add(pVideoSoundPathPopUpHandle); + if (bIsConnectBluetooth && bIsConnectEarjack) { + evas_object_size_hint_min_set(pBox, 614 * elm_config_scale_get(), 338 * elm_config_scale_get()); + } else if(bIsConnectBluetooth || bIsConnectEarjack) { + evas_object_size_hint_min_set(pBox, 614 * elm_config_scale_get(), 225 * elm_config_scale_get()); + } else { + evas_object_size_hint_min_set(pBox, 614 * elm_config_scale_get(), 451 * elm_config_scale_get()); + } + elm_box_pack_end(pBox, pGenList); + elm_object_content_set(pVideoSoundPathPopUpHandle, pBox); + + evas_object_show(pGenList); + evas_object_show(pVideoSoundPathPopUpHandle); + + return TRUE; +} + +void MpVideoSoundpathHide(void) +{ + VideoLogInfo(""); + + MpVideoSoundpathDeletePopupHandle(); +} + +bool MpVideoSoundpathIsConnectOtherSoundpath(void) +{ + VideoLogInfo(""); + + int nBluetoothConnect = 0; + char *szBluetoothName = NULL; + + bIsConnectEarjack = FALSE; + bIsConnectBluetooth = FALSE; + + if (MpUtilIsConnectEarjack()) { + VideoLogInfo("Connect earjack."); + bIsConnectEarjack= TRUE; + return TRUE; + } + + mm_sound_route_get_a2dp_status(&nBluetoothConnect, &szBluetoothName); + if (nBluetoothConnect) { + VideoLogInfo("Connect bluetooth."); + bIsConnectBluetooth = TRUE; + return TRUE; + } + + VideoLogInfo("Only spaker."); + return FALSE; +} + +int MpVideoSoundpathGetCurrConnectedSoundpath(void) +{ + VideoLogInfo(""); + + int nBluetoothConnect = 0; + char *szBluetoothName = NULL; + system_audio_route_t nPolicy = 0; + + mm_sound_route_get_system_policy(&nPolicy); + + if (nPolicy == SYSTEM_AUDIO_ROUTE_POLICY_DEFAULT) { + VideoLogInfo("SYSTEM_AUDIO_ROUTE_POLICY_DEFAULT"); + + if (MM_ERROR_NONE != mm_sound_route_get_a2dp_status(&nBluetoothConnect, &szBluetoothName)) { + VideoLogInfo("[ERR] Fail to check bluetooth stereo sound path."); + } + + if (nBluetoothConnect) { + return MP_SOUND_PATH_BLUETOOTH; + } else if (MpUtilIsConnectEarjack()) { + return MP_SOUND_PATH_EARJACK; + } else { + return MP_SOUND_PATH_SPEAKER; + } + } else if (nPolicy == SYSTEM_AUDIO_ROUTE_POLICY_IGNORE_A2DP) { + VideoLogInfo("SYSTEM_AUDIO_ROUTE_POLICY_IGNORE_A2DP"); + + if (MpUtilIsConnectEarjack()) { + return MP_SOUND_PATH_EARJACK; + } else { + return MP_SOUND_PATH_SPEAKER; + } + } else { + VideoLogInfo("SYSTEM_AUDIO_ROUTE_POLICY_HANDSET_ONLY"); + + return MP_SOUND_PATH_SPEAKER; + } +} diff --git a/src/mp-video-streaming-ctrl.c b/src/mp-video-streaming-ctrl.c new file mode 100755 index 0000000..ff93885 --- /dev/null +++ b/src/mp-video-streaming-ctrl.c @@ -0,0 +1,640 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "video-player.h" +#include "mp-video-type-define.h" +#include "mp-video-string-define.h" +#include "mp-video-streaming-ctrl.h" + + +static char szNetworkProxy[STR_LEN_MAX] = {0}; +static char szNetworkIpAddress[STR_LEN_MAX] = {0}; +static MpNetworkType nNetworkStatus = MP_NETWORK_TYPE_OFF; +static MpNetworkWifiState nWifiState = MP_NETWORK_WIFI_OFF; +static MpNetworkCellularState nCellularState = MP_NETWORK_CELLULAR_NO_SERVICE; + +static Eina_Bool bIsInitCallbackFunc = FALSE; + + +/* + * Callback function. + */ + + + +static void MpVideoStreamingCtrlNetworkOnOffCb(keynode_t *pKeyNode,void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData || !pKeyNode) { + VideoLogInfo("User data is NULL."); + return; + } + + char *szkeyname = NULL; + + szkeyname = vconf_keynode_get_name(pKeyNode); + if (!strcmp(szkeyname, VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND)) { + switch(vconf_keynode_get_int(pKeyNode)) + { + case MP_NETWORK_CLOSE: + VideoLogInfo("MP_NETWORK_CLOSE"); + break; + + case MP_NETWORK_ON: + VideoLogInfo("MP_NETWORK_ON"); + break; + + default: + VideoLogInfo("UNKNOWN NETWORK CONFIG"); + break; + } + } else { + } +} + +static void MpVideoStreamingCtrlNetworkStatusCb(keynode_t *pKeyNode,void *pUserData) +{ + if (!pUserData || !pKeyNode) { + VideoLogInfo("User data is NULL."); + return; + } + + VideoLogInfo(""); + char *szkeyname = NULL; + + szkeyname = vconf_keynode_get_name(pKeyNode); + if (!strcmp(szkeyname, VCONFKEY_NETWORK_STATUS)) { + switch(vconf_keynode_get_int(pKeyNode)) + { + case VCONFKEY_NETWORK_OFF: + nNetworkStatus = MP_NETWORK_TYPE_OFF; + VideoLogInfo("MP_NETWORK_TYPE_OFF"); + break; + + case VCONFKEY_NETWORK_CELLULAR: + VideoLogInfo("MP_NETWORK_TYPE_CELLULAR"); + nNetworkStatus = MP_NETWORK_TYPE_CELLULAR; + break; + + case VCONFKEY_NETWORK_WIFI: + VideoLogInfo("MP_NETWORK_TYPE_WIFI"); + nNetworkStatus = MP_NETWORK_TYPE_WIFI; + break; + + default: + nNetworkStatus = MP_NETWORK_TYPE_OFF; + VideoLogInfo("UNKNOWN NETWORK STATE"); + break; + } + } +} + +static void MpVideoStreamingCtrlChangeIpCb(keynode_t *pKeyNode, void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData || !pKeyNode) { + VideoLogInfo("User data is NULL."); + return; + } + + char *szkeyname = NULL; + char *szTmp = NULL; + + memset(szNetworkIpAddress, 0, sizeof(char) * STR_LEN_MAX); + szkeyname = vconf_keynode_get_name(pKeyNode); + if(szkeyname == NULL) { + VideoLogInfo("key name value is NULL"); + return; + } + + if (!strcmp(szkeyname, VCONFKEY_NETWORK_IP)) { + szTmp = vconf_keynode_get_str(pKeyNode); + + if(szTmp == NULL) { + VideoLogInfo("node string value is NULL"); + return; + } + + strncpy(szNetworkIpAddress, szTmp, STR_LEN_MAX - 1); + + VideoLogInfo("Network ip address : %s", szNetworkIpAddress); + } + else { + VideoLogInfo("Invalid ip address."); + } +} + +static void MpVideoStreamingCtrlWiFiStateCb(keynode_t *pKeyNode, void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData || !pKeyNode) { + VideoLogInfo("User data is NULL."); + return; + } + + char *szkeyname = NULL; + + szkeyname = vconf_keynode_get_name(pKeyNode); + if (!strcmp(szkeyname, VCONFKEY_NETWORK_WIFI_STATE)) { + switch(vconf_keynode_get_int(pKeyNode)) + { + case VCONFKEY_NETWORK_WIFI_OFF: + nWifiState = MP_NETWORK_WIFI_OFF; + VideoLogInfo("MP_NETWORK_WIFI_OFF"); + break; + + case VCONFKEY_NETWORK_WIFI_NOT_CONNECTED: + nWifiState = MP_NETWORK_WIFI_NOT_CONNECTED; + VideoLogInfo("MP_NETWORK_WIFI_NOT_CONNECTED"); + break; + + case VCONFKEY_NETWORK_WIFI_CONNECTED: + nWifiState = MP_NETWORK_WIFI_CONNECTED; + VideoLogInfo("MP_NETWORK_WIFI_CONNECTED"); + nNetworkStatus = MP_NETWORK_TYPE_OFF; + break; + + default: + nWifiState = MP_NETWORK_WIFI_OFF; + VideoLogInfo("MP_NETWORK_WIFI_OFF - default"); + break; + } + } else { + nWifiState = MP_NETWORK_WIFI_OFF; + VideoLogInfo("MP_NETWORK_WIFI_OFF - invalid value"); + } +} + +static void MpVideoStreamingCtrlCellularStateCb(keynode_t *pKeyNode,void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData || !pKeyNode) { + VideoLogInfo("User data is NULL."); + return; + } + + char *szkeyname = NULL; + + szkeyname = vconf_keynode_get_name(pKeyNode); + if (!strcmp(szkeyname, VCONFKEY_NETWORK_CELLULAR_STATE)) { + switch(vconf_keynode_get_int(pKeyNode)) + { + case VCONFKEY_NETWORK_CELLULAR_ON: + nCellularState = MP_NETWORK_CELLULAR_ON; + VideoLogInfo("MP_NETWORK_CELLULAR_ON"); + break; + + case VCONFKEY_NETWORK_CELLULAR_3G_OPTION_OFF: + nCellularState = MP_NETWORK_CELLULAR_3G_OPTION_OFF; + VideoLogInfo("MP_NETWORK_CELLULAR_3G_OPTION_OFF"); + break; + + case VCONFKEY_NETWORK_CELLULAR_ROAMING_OFF: + nCellularState = MP_NETWORK_CELLULAR_ROAMING_OFF; + VideoLogInfo("MP_NETWORK_CELLULAR_ROAMING_OFF"); + break; + + case VCONFKEY_NETWORK_CELLULAR_FLIGHT_MODE: + nCellularState = MP_NETWORK_CELLULAR_FLIGHT_MODE; + VideoLogInfo("MP_NETWORK_CELLULAR_FLIGHT_MODE"); + break; + + case VCONFKEY_NETWORK_CELLULAR_NO_SERVICE : + nCellularState = MP_NETWORK_CELLULAR_NO_SERVICE; + VideoLogInfo("MP_NETWORK_CELLULAR_NO_SERVICE"); + break; + + default: + nCellularState = MP_NETWORK_CELLULAR_NO_SERVICE; + VideoLogInfo("MP_NETWORK_CELLULAR_NO_SERVICE - default"); + break; + } + } else { + nCellularState = MP_NETWORK_CELLULAR_NO_SERVICE; + VideoLogInfo("MP_NETWORK_CELLULAR_NO_SERVICE - invalid value"); + } +} + + +/* + * Internal function. + */ + +bool MpVideoStreamingCtrlSetNotifyNetworkOnOff(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return FALSE; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + int nRet = 0; + + nRet = vconf_notify_key_changed(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, + MpVideoStreamingCtrlNetworkOnOffCb, + (void*)pAppData); + + if (nRet < 0) { + VideoLogInfo("[ERR] Fail to set network on/off notification."); + return FALSE; + } + + return TRUE; +} + +bool MpVideoStreamingCtrlSetNotifyNetworkStatus(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return FALSE; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + int nRet = 0; + + nRet = vconf_notify_key_changed(VCONFKEY_NETWORK_STATUS, + MpVideoStreamingCtrlNetworkStatusCb, + (void*)pAppData); + + if (nRet < 0) { + VideoLogInfo("[ERR] Fail to set network status notification."); + return FALSE; + } + + return TRUE; +} + +bool MpVideoStreamingCtrlSetNotifyChangingIp(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return FALSE; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + int nRet = 0; + + nRet = vconf_notify_key_changed(VCONFKEY_NETWORK_IP, + MpVideoStreamingCtrlChangeIpCb, + (void*)pAppData); + + if (nRet < 0) { + VideoLogInfo("[ERR] Fail to set ip address changing notification."); + return FALSE; + } + + return TRUE; +} + +bool MpVideoStreamingCtrlSetNotifyWiFiState(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return FALSE; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + int nRet = 0; + + nRet = vconf_notify_key_changed(VCONFKEY_NETWORK_WIFI_STATE, + MpVideoStreamingCtrlWiFiStateCb, + (void*)pAppData); + + if (nRet < 0) { + VideoLogInfo("[ERR] Fail to set wifi state notification."); + return FALSE; + } + + return TRUE; +} + +bool MpVideoStreamingCtrlSetNotifyCellularState(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return FALSE; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + int nRet = 0; + + nRet = vconf_notify_key_changed(VCONFKEY_NETWORK_CELLULAR_STATE, + MpVideoStreamingCtrlCellularStateCb, + (void*)pAppData); + + if (nRet < 0) { + VideoLogInfo("[ERR] Fail to set cellular notification."); + return FALSE; + } + + return TRUE; +} + + +/* + * External function. + */ +bool MpVideoStreamingCtrlGetIpAddress(char* szRetIpAddress) +{ + VideoLogInfo(""); + + char *szTmp = NULL; + + szTmp = vconf_get_str(VCONFKEY_NETWORK_IP); + if (szTmp) { + memset(szNetworkIpAddress, 0, sizeof(char) * STR_LEN_MAX); + strncpy(szNetworkIpAddress, szTmp, STR_LEN_MAX - 1); + + memset(szRetIpAddress, 0, sizeof(char) * STR_LEN_MAX); + strncpy(szRetIpAddress, szTmp, STR_LEN_MAX - 1); + + VideoLogInfo("Current network ip address : %s", szNetworkIpAddress); + + if(szTmp) + free(szTmp); + + return TRUE; + } + + return FALSE; +} + +bool MpVideoStreamingCtrlGetProxy(char* szRetProxy) +{ + VideoLogInfo(""); + + char *szTmp = NULL; + + szTmp = vconf_get_str(VCONFKEY_NETWORK_PROXY); + if (szTmp) { + memset(szNetworkProxy, 0, sizeof(char) * STR_LEN_MAX); + strncpy(szNetworkProxy, szTmp, STR_LEN_MAX - 1); + + memset(szRetProxy, 0, sizeof(char) * STR_LEN_MAX); + strncpy(szRetProxy, szTmp, STR_LEN_MAX - 1); + + VideoLogInfo("Current network ip address : %s", szNetworkProxy); + + if(szTmp) + free(szTmp); + + return TRUE; + } + + return FALSE; +} + +bool MpVideoStreamingCtrlIsNetworkOn(void) +{ + VideoLogInfo(""); + + int ntmpCheckNetworkON = 0; + + if (!vconf_get_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, &ntmpCheckNetworkON)) { + switch(ntmpCheckNetworkON) + { + case MP_NETWORK_CLOSE: + VideoLogInfo("Network close."); + return FALSE; + + case MP_NETWORK_ON: + VideoLogInfo("Network on."); + return TRUE; + } + } else { + VideoLogInfo("Network close."); + } + + return FALSE; +} + +int MpVideoStreamingCtrlGetNetworkStatus(void) +{ + VideoLogInfo(""); + + int ntmpGetNetworkStatus = 0; + + if (!vconf_get_int(VCONFKEY_NETWORK_STATUS, &ntmpGetNetworkStatus)) { + switch(ntmpGetNetworkStatus) + { + case VCONFKEY_NETWORK_OFF: + nNetworkStatus = MP_NETWORK_TYPE_OFF; + VideoLogInfo("MP_NETWORK_TYPE_OFF"); + break; + + case VCONFKEY_NETWORK_CELLULAR: + nNetworkStatus = MP_NETWORK_TYPE_CELLULAR; + VideoLogInfo("MP_NETWORK_TYPE_CELLULAR"); + break; + + case VCONFKEY_NETWORK_WIFI: + nNetworkStatus = MP_NETWORK_TYPE_WIFI; + VideoLogInfo("MP_NETWORK_TYPE_WIFI"); + break; + + default: + nNetworkStatus = MP_NETWORK_TYPE_OFF; + VideoLogInfo("MP_NETWORK_TYPE_OFF - default"); + break; + } + } else { + nNetworkStatus = MP_NETWORK_TYPE_OFF; + VideoLogInfo("MP_NETWORK_TYPE_OFF - invalid value"); + } + + return nNetworkStatus; +} + +int MpVideoStreamingCtrlGetWifiState() +{ + VideoLogInfo(""); + + int ntmpGetWifiState = 0; + + if (!vconf_get_int(VCONFKEY_NETWORK_WIFI_STATE, &ntmpGetWifiState)) { + switch(ntmpGetWifiState) + { + case VCONFKEY_NETWORK_WIFI_OFF: + nWifiState = MP_NETWORK_WIFI_OFF; + VideoLogInfo("MP_NETWORK_WIFI_OFF"); + break; + + case VCONFKEY_NETWORK_WIFI_NOT_CONNECTED: + nWifiState = MP_NETWORK_WIFI_NOT_CONNECTED; + VideoLogInfo("MP_NETWORK_WIFI_NOT_CONNECTED"); + break; + + case VCONFKEY_NETWORK_WIFI_CONNECTED: + nWifiState = MP_NETWORK_WIFI_CONNECTED; + VideoLogInfo("MP_NETWORK_WIFI_CONNECTED"); + break; + + default: + nWifiState = MP_NETWORK_WIFI_OFF; + VideoLogInfo("MP_NETWORK_WIFI_OFF - default"); + break; + } + } else { + nWifiState = MP_NETWORK_WIFI_OFF; + VideoLogInfo("MP_NETWORK_WIFI_OFF - invalid value"); + } + + return nWifiState; + +} + +int MpVideoStreamingCtrlGetCellularState() +{ + VideoLogInfo(""); + + int ntmpGetCellularState = 0; + + if (!vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &ntmpGetCellularState)) { + switch(ntmpGetCellularState) + { + case VCONFKEY_NETWORK_CELLULAR_ON: + nCellularState = MP_NETWORK_CELLULAR_ON; + VideoLogInfo("MP_NETWORK_CELLULAR_ON"); + break; + + case VCONFKEY_NETWORK_CELLULAR_3G_OPTION_OFF: + nCellularState = MP_NETWORK_CELLULAR_3G_OPTION_OFF; + VideoLogInfo("MP_NETWORK_CELLULAR_3G_OPTION_OFF"); + break; + + case VCONFKEY_NETWORK_CELLULAR_ROAMING_OFF: + nCellularState = MP_NETWORK_CELLULAR_ROAMING_OFF; + VideoLogInfo("MP_NETWORK_CELLULAR_ROAMING_OFF"); + break; + + case VCONFKEY_NETWORK_CELLULAR_FLIGHT_MODE: + nCellularState = MP_NETWORK_CELLULAR_FLIGHT_MODE; + VideoLogInfo("MP_NETWORK_CELLULAR_FLIGHT_MODE"); + break; + + case VCONFKEY_NETWORK_CELLULAR_NO_SERVICE : + nCellularState = MP_NETWORK_CELLULAR_NO_SERVICE; + VideoLogInfo("MP_NETWORK_CELLULAR_NO_SERVICE"); + break; + + default: + nCellularState = MP_NETWORK_CELLULAR_NO_SERVICE; + VideoLogInfo("MP_NETWORK_CELLULAR_NO_SERVICE - default"); + break; + } + } else { + nCellularState = MP_NETWORK_CELLULAR_NO_SERVICE; + VideoLogInfo("MP_NETWORK_CELLULAR_NO_SERVICE - invalid value"); + } + + return nCellularState; +} + +void MpVideoStreamingCtrlDestroy(void *pUserData) +{ + VideoLogInfo(""); + +} + + + +bool MpVideoStreamingCtrlInit(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return FALSE; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + char szTmp[STR_LEN_MAX] = {0}; + bool bNetworkState = FALSE; + + if(bIsInitCallbackFunc == EINA_FALSE) { + MpVideoStreamingCtrlSetNotifyNetworkStatus(pUserData); + MpVideoStreamingCtrlSetNotifyChangingIp(pUserData); + MpVideoStreamingCtrlSetNotifyWiFiState(pUserData); + MpVideoStreamingCtrlSetNotifyCellularState(pUserData); + + bIsInitCallbackFunc = EINA_TRUE; + } + + switch(MpVideoStreamingCtrlGetNetworkStatus()) + { + case MP_NETWORK_TYPE_OFF: + VideoLogInfo("MP_NETWORK_TYPE_OFF"); + bNetworkState = FALSE; + break; + + case MP_NETWORK_TYPE_CELLULAR: + VideoLogInfo("MP_NETWORK_TYPE_CELLULAR"); + if(MpVideoStreamingCtrlGetCellularState() == MP_NETWORK_CELLULAR_ON) + bNetworkState = TRUE; + break; + + case MP_NETWORK_TYPE_WIFI: + VideoLogInfo("MP_NETWORK_TYPE_WIFI"); + if(MpVideoStreamingCtrlGetWifiState() == MP_NETWORK_WIFI_CONNECTED) + bNetworkState = TRUE; + break; + } + + if(bNetworkState) { + MpVideoStreamingCtrlGetIpAddress(szTmp); + VideoLogInfo("Current IP Address : %s", szTmp); + + memset(szTmp, 0, STR_LEN_MAX); + MpVideoStreamingCtrlGetProxy(szTmp); + VideoLogInfo("Current Proxy Address : %s", szTmp); + VideoLogInfo("Current Proxy Address : %s", szTmp); + + memset(pAppData->szProxyAddress, 0, STR_LEN_MAX); + strncpy(pAppData->szProxyAddress, szTmp, STR_LEN_MAX - 1); + } + + return bNetworkState; +} + + + diff --git a/src/mp-video-streaming-view.c b/src/mp-video-streaming-view.c new file mode 100755 index 0000000..0a4fd32 --- /dev/null +++ b/src/mp-video-streaming-view.c @@ -0,0 +1,904 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "video-player.h" +#include "mp-video-type-define.h" +#include "mp-video-value-define.h" +#include "mp-video-string-define.h" +#include "mp-video-progressbar.h" +#include "mp-video-animation-ctrl.h" +#include "mp-video-streaming-view.h" +#include "mp-video-sound-path-ctrl.h" + +#define MUTE_POPUP_INTERVAL_TIME 3.0 +#define CTRL_PANEL_SHOW_TIME 5.0 + +static Evas_Object *pNaviFrameHandle = NULL; +static Evas_Object *pStreamingViewNaviControlBar = NULL; +static Evas_Object *pBufferingAnimationHandle = NULL; + +static Evas_Object *pStreamingViewLayout = NULL; +static Evas_Object *pStreamingViewPanelEdj = NULL; +static Evas_Object *pStreamingViewCtrlEdj = NULL; +static Evas_Object *pStreamingViewHiddenPanelEdj = NULL; +static Evas_Object *pStreamingViewOptionEdj = NULL; + +//static Ecore_Timer *pStreamingViewVolLongPressTimer = NULL; +//static Ecore_Timer *pStreamingViewMutePopupShowTimer = NULL; +static Ecore_Timer *pStreamingViewCtrlPanelHideTimer = NULL; + +static Evas_Object *pStreamingSoundpathButton = NULL; +static Elm_Object_Item *pNaviFrameItemStreamingView = NULL; + +static Ecore_Event_Handler *pMouseEventHandler = NULL; + +//static bool bIsVolumeLongPressOfStreamingView = FALSE; +//static bool bIsVolumePopupShowOfStreamingView = FALSE; +static bool bSwitchStreamingViewUI = TRUE; +static bool bIsStreamingHightQuality = TRUE; +static bool bIsChangeResolution = FALSE; +static VideoStreamingViewState nStreamingViewState = MP_STREAMING_VIEW_STATE_UNACTIVATE; +static int nScreensizeStatus = MP_DISPLAY_METHOD_LETTER_BOX; + +/* + * Callback function. + */ +static void MpVideoStreamingViewWarningPopupCb(void *pUserData, Evas_Object *pObject, void *pEventInfo) +{ + if (!pUserData) { + VideoLogInfo("No exist pUserData"); + return; + } + + VideoLogInfo(""); + + MpUtilDeletePopupHandle(); +} + +static void MpVideoStreamingViewSoundPathCb(void *pUserData, Evas_Object *pObject, void *pEventInfo) +{ + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData"); + return; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (MpVideoSoundpathIsConnectOtherSoundpath()) { + VideoLogInfo("Connect BT or earjack."); + MpVideoSoundpathShow(pUserData); + } else { + MpUtilNotifyPopUp(pAppData, "Soundpath is connected with speaker only.", MpVideoStreamingViewWarningPopupCb); + } +} + +static void MpVideoStreamingViewPressPauseButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!strcmp(szEmission, SIGNAL_CONTROL_PLAY_PAUSE_PRESS)) { + VideoLogInfo("Press Pause button."); + + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME || pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData); + } + } +} + +static void MpVideoStreamingViewPressResumeButtonCb(void *pUserData, + Evas_Object *pObject, + const char *szEmission, + const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!strcmp(szEmission, SIGNAL_CONTROL_PLAY_RESUME_PRESS)) { + VideoLogInfo("Press Resume/Play button."); + + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PAUSE) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData); + } + } +} + +/* +static Eina_Bool MpVideoStreamingViewVolPopupCb(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return EINA_FALSE; + } + + if (pStreamingViewMutePopupShowTimer) { + ecore_timer_del(pStreamingViewMutePopupShowTimer); + pStreamingViewMutePopupShowTimer = NULL; + } + + bIsVolumePopupShowOfStreamingView = FALSE; + edje_object_signal_emit(_EDJ(pStreamingViewLayout), SIGNAL_MAIN_MUTE_HIDE, "*"); + + return EINA_FALSE; +} + +static Eina_Bool MpVideoStreamingViewVolLongPressCb(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return EINA_FALSE; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pStreamingViewVolLongPressTimer) { + ecore_timer_del(pStreamingViewVolLongPressTimer); + pStreamingViewVolLongPressTimer = NULL; + } + + bIsVolumeLongPressOfStreamingView = TRUE; + + if (pAppData->bIsMute == FALSE) { + edje_object_signal_emit(pStreamingViewCtrlEdj, SIGNAL_CONTROL_VOL_BUTTON_MUTE, "*"); + edje_object_signal_emit(_EDJ(pStreamingViewLayout), SIGNAL_MAIN_MUTE_SHOW, "*"); + + pStreamingViewMutePopupShowTimer = ecore_timer_add(MUTE_POPUP_INTERVAL_TIME, MpVideoStreamingViewVolPopupCb, (void *)pAppData); + bIsVolumePopupShowOfStreamingView = TRUE; + pAppData->bIsMute = TRUE; + } else { + edje_object_signal_emit(pStreamingViewCtrlEdj, SIGNAL_CONTROL_VOL_BUTTON_UNMUTE, "*"); + edje_object_signal_emit(_EDJ(pStreamingViewLayout), SIGNAL_MAIN_MUTE_HIDE, "*"); + + bIsVolumePopupShowOfStreamingView = FALSE; + pAppData->bIsMute = FALSE; + } + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetMute(pAppData); + + return EINA_FALSE; +} +*/ + +static void MpVideoStreamingViewBackButtonDownCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + edje_object_signal_callback_del(pStreamingViewCtrlEdj, SIGNAL_CONTROL_BACK_BUTTON_DOWN, SIGNAL_CONTROL_PART_BACK_BUTTON, (void *)MpVideoStreamingViewBackButtonDownCb); + + MpVideoStreamingViewPop(pNaviFrameHandle, pUserData); + + edje_object_signal_callback_add(pStreamingViewCtrlEdj, SIGNAL_CONTROL_BACK_BUTTON_DOWN, SIGNAL_CONTROL_PART_BACK_BUTTON, (void *)MpVideoStreamingViewBackButtonDownCb, pUserData); +} + +static void MpVideoStreamingViewVolumeButtonDownCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + +/* + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pStreamingViewVolLongPressTimer) { + ecore_timer_del(pStreamingViewVolLongPressTimer); + pStreamingViewVolLongPressTimer = NULL; + } + + bIsVolumeLongPressOfStreamingView = FALSE; + pStreamingViewVolLongPressTimer = ecore_timer_add(LONG_PRESS_INTERVAL, MpVideoStreamingViewVolLongPressCb, (void *)pAppData); +*/ +} + +static void MpVideoStreamingViewVolumeButtonUpCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + syspopup_launch("volume", NULL); + +/* + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pStreamingViewVolLongPressTimer) { + ecore_timer_del(pStreamingViewVolLongPressTimer); + pStreamingViewVolLongPressTimer = NULL; + } + + if (bIsVolumeLongPressOfStreamingView) { + return; + } + + if (pAppData->bIsMute == TRUE) { + if (bIsVolumePopupShowOfStreamingView) { + ecore_timer_del(pStreamingViewMutePopupShowTimer); + } + + pStreamingViewMutePopupShowTimer = ecore_timer_add(MUTE_POPUP_INTERVAL_TIME, MpVideoStreamingViewVolPopupCb, (void *)pAppData); + edje_object_signal_emit(_EDJ(pStreamingViewLayout), SIGNAL_MAIN_MUTE_SHOW, "*"); + bIsVolumePopupShowOfStreamingView = TRUE; + } else { + syspopup_launch("volume", NULL); + } +*/ +} + +static void MpVideoStreamingViewHqButtonDownCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } +} + +static void MpVideoStreamingViewHqButtonUpCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (bIsChangeResolution) + return; + + char *szURL = NULL; + szURL = MpUtilGetXMLQualityURL(); + if (szURL != NULL) { + VideoLogInfo("%s", szURL); + bIsChangeResolution = TRUE; + memset((void *)pAppData->szMediaUri, 0, STR_LEN_MAX); + strncpy(pAppData->szMediaUri, szURL, STR_LEN_MAX -1); + + if (szURL) + free(szURL); + + MpVideoProgressbarDeleteTimer(); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData); + pAppData->nSetPosition = pAppData->nCurPosition; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlReLaunching(pAppData); + + if (bIsStreamingHightQuality) { + bIsStreamingHightQuality = FALSE; + edje_object_signal_emit(pStreamingViewHiddenPanelEdj, SIGNAL_CONTROL_STREAMING_QUALITY_NORMAL, "*"); + } else { + bIsStreamingHightQuality = TRUE; + edje_object_signal_emit(pStreamingViewHiddenPanelEdj, SIGNAL_CONTROL_STREAMING_QUALITY_HIGH, "*"); + } + bIsChangeResolution = FALSE; + } +} + +static void MpVideoStreamingViewMainScreenTouchCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (MpVideoStreamingViewGetBufferingState()) { + VideoLogInfo("skip for Buffering"); + return; + } + + if (bSwitchStreamingViewUI) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlHideLayout(pAppData); + } +} + +static Eina_Bool MpVideoStreamingViewCtrlPanelHideCb(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR] No Exist pUserData."); + return EINA_FALSE; + } + + if (MpVideoStreamingViewGetBufferingState()) { + VideoLogInfo("skip for Buffering"); + return EINA_TRUE; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pStreamingViewCtrlPanelHideTimer) { + ecore_timer_del(pStreamingViewCtrlPanelHideTimer); + pStreamingViewCtrlPanelHideTimer = NULL; + } + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlHideLayout(pAppData); + + return EINA_FALSE; +} + +static Eina_Bool MpVideoStreamingViewMouseUpCb(void *pUserData, int nType, + void *pEvent) +{ + VideoLogInfo(""); + + if (nStreamingViewState == MP_STREAMING_VIEW_STATE_UNACTIVATE) { + VideoLogInfo(""); + return EINA_FALSE; + } + + if (!pUserData) { + VideoLogInfo("[ERR] No Exist pUserData."); + return EINA_FALSE; + } + + if (!pEvent) { + VideoLogInfo("[ERR] No exist pEvent."); + return EINA_FALSE; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!bSwitchStreamingViewUI) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlShowLayout(pAppData); + } else { + if (pStreamingViewCtrlPanelHideTimer) { + ecore_timer_del(pStreamingViewCtrlPanelHideTimer); + pStreamingViewCtrlPanelHideTimer = ecore_timer_add(CTRL_PANEL_SHOW_TIME, MpVideoStreamingViewCtrlPanelHideCb, pUserData); + } + } + + return EINA_FALSE; +} + +static void MpVideoStreamingViewChangedEarjackCb(void *pNode, void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoLogInfo(""); + + MpVideoSoundpathHide(); + MpUtilDeletePopupHandle(); + + if (MpUtilIsConnectEarjack()) { + VideoLogInfo("Connect earjack."); + if (pStreamingSoundpathButton) { + elm_object_item_part_content_set(pNaviFrameItemStreamingView, "title_left_btn", pStreamingSoundpathButton); + } else { + pStreamingSoundpathButton = MpUtilCreateButtonIcon(pNaviFrameHandle, VIDEO_HEAD_ICON_SOUNDPATH, FALSE, FALSE, pUserData, "video/naviframe/title/default", (void*)MpVideoStreamingViewSoundPathCb); + elm_object_item_part_content_set(pNaviFrameItemStreamingView, "title_left_btn", pStreamingSoundpathButton); + } + } else { + VideoLogInfo("Disconnect earjack."); + if (pStreamingSoundpathButton) { + evas_object_del(pStreamingSoundpathButton); + pStreamingSoundpathButton = NULL; + } + + elm_object_item_part_content_unset(pNaviFrameItemStreamingView, "title_left_btn"); + } + +} + +static void MpVideoStreamingViewPressOptionScreenSizeCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource) +{ + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (!strcmp(szEmission, SIGNAL_OPTION_SCREEN_SIZE_NORMAL)) { + VideoLogInfo("Screen size : Normal"); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetScreenSize(pAppData, MP_DISPLAY_METHOD_LETTER_BOX); + nScreensizeStatus = MP_DISPLAY_METHOD_LETTER_BOX; + } else if (!strcmp(szEmission, SIGNAL_OPTION_SCREEN_SIZE_EXPAND)) { + VideoLogInfo("Screen size : Expand"); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetScreenSize(pAppData, MP_DISPLAY_METHOD_CROPPED_FULL); + nScreensizeStatus = MP_DISPLAY_METHOD_CROPPED_FULL; + } else { + VideoLogInfo("Screen size : Nothing"); + nScreensizeStatus = MP_DISPLAY_METHOD_LETTER_BOX; + } +} + + +/* + * Internal function + */ +void MpVideoStreamingViewInitKeyMouse(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pMouseEventHandler) { + ecore_event_handler_del(pMouseEventHandler); + pMouseEventHandler = NULL; + } + + pMouseEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, MpVideoStreamingViewMouseUpCb, pAppData); +} + +void MpVideoStreamingViewInitLayout(void *pParent, void *pUserData, void *pShowInfoViewCb) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + pStreamingViewLayout = elm_layout_add(pParent); + if (pStreamingViewLayout) { + Evas_Object *pTmpProgressbarEdj = NULL; + Evas *pMainWindowEvas = evas_object_evas_get(pAppData->pMainWindow); + + elm_layout_file_set(pStreamingViewLayout, VIDEO_PLAYER_MAIN_EDJ, MAIN_EDJ_GROUP); + + pStreamingViewOptionEdj = MpUtilLoadEdjFile(pMainWindowEvas, VIDEO_PLAYER_OPTION_BUTTON_EDJ, OPTION_EDJ_GROUP); + elm_object_part_content_set(pStreamingViewLayout, SWALLOW_MAIN_OPTION_BUTTON, pStreamingViewOptionEdj); + edje_object_signal_emit(pStreamingViewOptionEdj, SIGNAL_OPTION_MODE_STREAMING, "*"); + + pStreamingViewCtrlEdj = MpUtilLoadEdjFile(pMainWindowEvas, VIDEO_PLAYER_CONTROL_EDJ, CONTROL_EDJ_GROUP); + pStreamingViewPanelEdj = MpUtilLoadEdjFile(pMainWindowEvas, VIDEO_PLAYER_PANEL_EDJ, PANEL_EDJ_GROUP); + pBufferingAnimationHandle = MpVideoAnimationCtrlInit(pMainWindowEvas); + + edje_object_part_swallow(pStreamingViewPanelEdj, SWALLOW_PANEL_CONTROL, pStreamingViewCtrlEdj); + elm_object_part_content_set(pStreamingViewLayout, SWALLOW_MAIN_ANIMATION, pBufferingAnimationHandle); + edje_object_signal_emit(_EDJ(pStreamingViewLayout), SIGNAL_MAIN_ANIMATION_SHOW, "*"); + + MpVideoAnimationCtrlShow(); + + pTmpProgressbarEdj = (Evas_Object *)MpVideoProgressbarInit(pAppData); + MpVideoProgressbarSetSkipEvent(TRUE); + if (pTmpProgressbarEdj) { + edje_object_part_swallow(pStreamingViewPanelEdj, SWALLOW_PANEL_PROGRESS_BAR, pTmpProgressbarEdj); + } else { + VideoLogInfo("Progressbar edj handle is null."); + } + + elm_object_part_content_set(pStreamingViewLayout, SWALLOW_MAIN_CONTROL, pStreamingViewPanelEdj); + + edje_object_signal_emit(pStreamingViewCtrlEdj, SIGNAL_CONTROL_MODE_STREAMING, "*"); + + pStreamingViewHiddenPanelEdj = MpUtilLoadEdjFile(pMainWindowEvas, VIDEO_PLAYER_HIDDEN_PANEL_EDJ, HIDDEN_PANEL_EDJ_GROUP); + if (pStreamingViewHiddenPanelEdj) { + elm_object_part_content_set(pStreamingViewLayout, SWALLOW_MAIN_HIDDEN_BUTTON, pStreamingViewHiddenPanelEdj); + edje_object_signal_emit(pStreamingViewHiddenPanelEdj, SIGNAL_HIDDEN_BUTTON_PANEL_SOUNDPATH_HIDE, "*"); + edje_object_signal_emit(pStreamingViewHiddenPanelEdj,SIGNAL_CONTROL_STREAMING_QUALITY_HIDE,"*"); + } + + + if (nScreensizeStatus == MP_DISPLAY_METHOD_LETTER_BOX) { + VideoLogInfo("nScreensizeStatus : MP_DISPLAY_METHOD_LETTER_BOX"); + edje_object_signal_emit(pStreamingViewCtrlEdj, SIGNAL_CONTROL_SCREENSIZE_BUTTON_NORMAL, "*"); + } else if (nScreensizeStatus == MP_DISPLAY_METHOD_CROPPED_FULL) { + VideoLogInfo("nScreensizeStatus : MP_DISPLAY_METHOD_CROPPED_FULL"); + edje_object_signal_emit(pStreamingViewCtrlEdj, SIGNAL_CONTROL_SCREENSIZE_BUTTON_EXPAND, "*"); + } else { + VideoLogInfo("nScreensizeStatus : MP_DISPLAY_METHOD_LETTER_BOX"); + edje_object_signal_emit(pStreamingViewCtrlEdj, SIGNAL_CONTROL_SCREENSIZE_BUTTON_NORMAL, "*"); + } + + edje_object_signal_callback_add(pStreamingViewOptionEdj, + SIGNAL_OPTION_SCREEN_SIZE_NORMAL, + SIGNAL_OPTION_PART_SCREEN_SIZE, + (void *)MpVideoStreamingViewPressOptionScreenSizeCb, (void *)pAppData); + + edje_object_signal_callback_add(pStreamingViewOptionEdj, + SIGNAL_OPTION_SCREEN_SIZE_EXPAND, + SIGNAL_OPTION_PART_SCREEN_SIZE, + (void *)MpVideoStreamingViewPressOptionScreenSizeCb, (void *)pAppData); + + edje_object_signal_callback_add(pStreamingViewOptionEdj, + SIGNAL_OPTION_DETAIL_DOWN, + SIGNAL_OPTION_PART_DETAIL, + (void *)pShowInfoViewCb, (void *)pAppData); + + edje_object_signal_callback_add(pStreamingViewCtrlEdj, + SIGNAL_CONTROL_PLAY_PAUSE_PRESS, + SIGNAL_CONTROL_PART_PLAY_BUTTON, + (void *)MpVideoStreamingViewPressPauseButtonCb, (void *)pAppData); + + edje_object_signal_callback_add(pStreamingViewCtrlEdj, + SIGNAL_CONTROL_PLAY_RESUME_PRESS, + SIGNAL_CONTROL_PART_PLAY_BUTTON, + (void *)MpVideoStreamingViewPressResumeButtonCb, (void *)pAppData); + + edje_object_signal_callback_add(pStreamingViewCtrlEdj, + SIGNAL_CONTROL_BACK_BUTTON_DOWN, + SIGNAL_CONTROL_PART_BACK_BUTTON, + (void *)MpVideoStreamingViewBackButtonDownCb, (void *)pAppData); + + edje_object_signal_callback_add(pStreamingViewCtrlEdj, + SIGNAL_CONTROL_VOL_BUTTON_DOWN, + SIGNAL_CONTROL_PART_VOL_BUTTON, + (void *)MpVideoStreamingViewVolumeButtonDownCb, (void *)pAppData); + + edje_object_signal_callback_add(pStreamingViewCtrlEdj, + SIGNAL_CONTROL_VOL_BUTTON_UP, + SIGNAL_CONTROL_PART_VOL_BUTTON, + (void *)MpVideoStreamingViewVolumeButtonUpCb, (void *)pAppData); + + edje_object_signal_callback_add(_EDJ(pStreamingViewLayout), + SIGNAL_MAIN_SCREEN_TOUCH_PRESS, + SIGNAL_MAIN_SCREEN_TOUCH_TOGGLE, + (void *)MpVideoStreamingViewMainScreenTouchCb, (void *)pAppData); + + edje_object_signal_callback_add(pStreamingViewHiddenPanelEdj, + SIGNAL_CONTROL_HQ_BUTTON_DOWN, + SIGNAL_CONTROL_PART_HQ_BUTTON, + (void *)MpVideoStreamingViewHqButtonDownCb, (void *)pAppData); + + edje_object_signal_callback_add(pStreamingViewHiddenPanelEdj, + SIGNAL_CONTROL_HQ_BUTTON_UP, + SIGNAL_CONTROL_PART_HQ_BUTTON, + (void *)MpVideoStreamingViewHqButtonUpCb, (void *)pAppData); + + if (MpUtilGetXMLItemCount() > 1) { + edje_object_signal_emit(pStreamingViewHiddenPanelEdj, SIGNAL_CONTROL_STREAMING_QUALITY_HIGH, "*"); + } + + MpUtilRegisteEarjackCbFunc((void *)MpVideoStreamingViewChangedEarjackCb, pUserData); + } +} + +void MpVideoStreamingViewInit(void *pUserData, void *pShowInfoViewCb) +{ + VideoLogInfo(""); + + if (!pNaviFrameHandle|| !pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + MpVideoStreamingViewInitKeyMouse(pUserData); + MpVideoStreamingViewInitLayout(pNaviFrameHandle, pUserData, pShowInfoViewCb); +} + + + +/* + * External function + */ +void MpVideoStreamingViewPush(void *pNaviFrame, void *pShowInfoViewCb, void *pUserData) +{ + VideoLogInfo(""); + + pNaviFrameHandle = pNaviFrame; + + MpVideoStreamingViewInit(pUserData, pShowInfoViewCb); + + pNaviFrameItemStreamingView = elm_naviframe_item_push(pNaviFrameHandle,MP_STREAMING_PLAYER_STR, NULL, NULL, pStreamingViewLayout, "video/1line"); + + if (MpVideoSoundpathIsConnectOtherSoundpath()) { + pStreamingSoundpathButton = MpUtilCreateButtonIcon(pNaviFrameHandle, VIDEO_HEAD_ICON_SOUNDPATH, FALSE, FALSE, pUserData, "video/naviframe/title/default", (void*)MpVideoStreamingViewSoundPathCb); + elm_object_item_part_content_set(pNaviFrameItemStreamingView, "title_left_btn", pStreamingSoundpathButton); + } + + MpVideoStreamingViewShowControlPanel(pUserData); +} + +void MpVideoStreamingViewPop(void *pNaviFrame, void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData); +} + +void MpVideoStreamingViewDestroy(void *pUserData) +{ + VideoLogInfo(""); + + MpVideoStreamingViewHideControlPanel(pUserData); + MpVideoProgressbarDestroy(); + MpVideoAnimationCtrlDestroy(); + + pNaviFrameHandle = NULL; + pBufferingAnimationHandle = NULL; + + if (pMouseEventHandler) { + ecore_event_handler_del(pMouseEventHandler); + pMouseEventHandler = NULL; + } + + if (pStreamingViewNaviControlBar) { + evas_object_del(pStreamingViewNaviControlBar); + pStreamingViewNaviControlBar = NULL; + } + + if (pStreamingViewLayout) { + evas_object_del(pStreamingViewLayout); + pStreamingViewLayout = NULL; + } + + if (pStreamingViewPanelEdj) { + evas_object_del(pStreamingViewPanelEdj); + pStreamingViewPanelEdj = NULL; + } + + if (pStreamingViewCtrlEdj) { + evas_object_del(pStreamingViewCtrlEdj); + pStreamingViewCtrlEdj = NULL; + } + +// if (pStreamingViewVolLongPressTimer) { +// ecore_timer_del(pStreamingViewVolLongPressTimer); +// pStreamingViewVolLongPressTimer = NULL; +// } + +// if (pStreamingViewMutePopupShowTimer) { +// ecore_timer_del(pStreamingViewMutePopupShowTimer); +// pStreamingViewMutePopupShowTimer = NULL; +// } + + if (pStreamingViewCtrlPanelHideTimer) { + ecore_timer_del(pStreamingViewCtrlPanelHideTimer); + pStreamingViewCtrlPanelHideTimer = NULL; + } + + if (pStreamingViewHiddenPanelEdj) { + evas_object_del(pStreamingViewHiddenPanelEdj); + pStreamingViewHiddenPanelEdj = NULL; + } + +// bIsVolumeLongPressOfStreamingView = FALSE; +// bIsVolumePopupShowOfStreamingView = FALSE; + + bSwitchStreamingViewUI = TRUE; + nStreamingViewState = MP_STREAMING_VIEW_STATE_UNACTIVATE; + + + bIsStreamingHightQuality = TRUE; + bIsChangeResolution = FALSE; +} + +void MpVideoStreamingViewInitAfterBeginOfStream(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + MpVideoProgressbarSetSkipEvent(FALSE); + MpVideoProgressbarBeginOfStream((void *)pAppData); + + if (pAppData->nDuration > 1) { + char szDurationTime[PLAY_TIME_LENGTH] = { 0 }; + snprintf(szDurationTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, + PLAY_TIME_ARGS(pAppData->nDuration / 1000)); + MpVideoProgressbarUpdateDurationTime(szDurationTime); + } + + MpVideoAnimationCtrlHide(); + edje_object_signal_emit(_EDJ(pStreamingViewLayout), + SIGNAL_MAIN_ANIMATION_HIDE, "*"); + + edje_object_signal_emit(pStreamingViewCtrlEdj, SIGNAL_CONTROL_PLAY_RESUME, "*"); +} + +void MpVideoStreamingViewUpdatePauseKey(void) +{ + VideoLogInfo(""); + + edje_object_signal_emit(pStreamingViewCtrlEdj, SIGNAL_CONTROL_PLAY_PAUSE, "*"); +} + +void MpVideoStreamingViewUpdateResumeKey(void) +{ + VideoLogInfo(""); + + edje_object_signal_emit(pStreamingViewCtrlEdj, SIGNAL_CONTROL_PLAY_RESUME, "*"); +} + +void MpVideoStreamingViewShowControlPanel(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + if (!pStreamingViewPanelEdj) { + VideoLogInfo("No exist play control panel edc."); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + bSwitchStreamingViewUI = TRUE; + + evas_object_show(pStreamingViewPanelEdj); + + if (MpUtilGetXMLItemCount() < 2) { + edje_object_signal_emit(pStreamingViewHiddenPanelEdj, SIGNAL_CONTROL_STREAMING_QUALITY_HIDE, "*"); + } + + if (pStreamingViewCtrlPanelHideTimer) { + ecore_timer_del(pStreamingViewCtrlPanelHideTimer); + pStreamingViewCtrlPanelHideTimer = NULL; + } + + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PAUSE) { + } else { + pStreamingViewCtrlPanelHideTimer = ecore_timer_add(CTRL_PANEL_SHOW_TIME, MpVideoStreamingViewCtrlPanelHideCb, pUserData); + } + + MpVideoStreamingViewActivate(); +} + +void MpVideoStreamingViewHideControlPanel(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + if (!pStreamingViewPanelEdj) { + VideoLogInfo("No exist play control panel edc."); + return; + } + + bSwitchStreamingViewUI = FALSE; + + evas_object_hide(pStreamingViewPanelEdj); + + if (pStreamingViewCtrlPanelHideTimer) { + ecore_timer_del(pStreamingViewCtrlPanelHideTimer); + pStreamingViewCtrlPanelHideTimer = NULL; + } +} + +void MpVideoStreamingViewActivate(void) +{ + VideoLogInfo(""); + + nStreamingViewState = MP_STREAMING_VIEW_STATE_ACTIVATE; +} + +void MpVideoStreamingViewUnactivate(void) +{ + VideoLogInfo(""); + + nStreamingViewState = MP_STREAMING_VIEW_STATE_UNACTIVATE; +} + +void MpVideoStreamingViewSetBufferingRate(int nSetBufferingRate) +{ + VideoLogInfo("nSetBufferingRate : %d", nSetBufferingRate); + + if (nSetBufferingRate > 95) { + MpVideoAnimationCtrlHide(); + MpVideoProgressbarSetSkipEvent(FALSE); + edje_object_signal_emit(_EDJ(pStreamingViewLayout), SIGNAL_MAIN_ANIMATION_HIDE, "*"); + } else { + MpVideoProgressbarSetSkipEvent(TRUE); + MpVideoAnimationCtrlShow(); + edje_object_signal_emit(_EDJ(pStreamingViewLayout), SIGNAL_MAIN_ANIMATION_SHOW, "*"); + + if(nSetBufferingRate >= 0) + MpVideoAnimationCtrlSetPercent(nSetBufferingRate); + } +} + +bool MpVideoStreamingViewGetBufferingState(void) +{ + VideoLogInfo(""); + + return MpVideoAnimationCtrlGetActiveState(); +} + +bool MpVideoStreamingViewIsTopView(void) +{ + VideoLogInfo(""); + + Evas_Object *pTmpContents = NULL; + Elm_Object_Item *pTmpItem = NULL; + + if (!pNaviFrameHandle) { + VideoLogInfo("[ERR] No exist naviframe handle."); + return FALSE; + } + + pTmpItem = elm_naviframe_top_item_get(pNaviFrameHandle); + pTmpContents = elm_object_item_content_get(pTmpItem); + if (pTmpContents) { + if (pTmpContents == pStreamingViewLayout) { + VideoLogInfo("Streaming display view is staing in top view."); + return TRUE; + } else { + VideoLogInfo("Streaming display view is not staied in top view."); + return FALSE; + } + } else { + VideoLogInfo("[ERR] No exist naviFrame top item."); + return FALSE; + } + + return FALSE; +} + + diff --git a/src/mp-video-subtitle-ctrl.c b/src/mp-video-subtitle-ctrl.c new file mode 100755 index 0000000..dbffafc --- /dev/null +++ b/src/mp-video-subtitle-ctrl.c @@ -0,0 +1,190 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include +#include +#include +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "video-player.h" +#include "mp-video-subtitle-ctrl.h" + +#define MP_VIDEO_SUBTITLE_MENU_NUM 2 +#define VCONFKEY_GALLERY_SUBTITLE_STATE "db/setting/gallery/subtitle_state" //boolean + +static int bSubtitleSettingState = FALSE; +static bool bExistSubtitleFile = FALSE; +static char szSubtitleFileUri[STR_LEN_MAX] = { 0 }; + +static char szSubTitleExtWildkey[MP_SUBTITLE_TYPE_MAX][STR_LEN_MAX] = { ".srt", ".sub", ".smi" }; + + +/* + * Internal function + */ +bool MpVideoSubtitleCtrlCheckSubtitleFile(char *szMediaUriPath) +{ + if (!bSubtitleSettingState) { + VideoLogInfo("Subtitle ."); + return FALSE; + } + + if (!szMediaUriPath) { + VideoLogInfo("No Exist szMediaUri."); + return FALSE; + } + + if (strlen(szMediaUriPath) < 1) { + VideoLogInfo("No Exist szMediaUri."); + return FALSE; + } + + VideoLogInfo(""); + + struct stat buf; + int nCount = 0; + int nStrLength = 0; + + bExistSubtitleFile = FALSE; + memset(szSubtitleFileUri, 0, STR_LEN_MAX); + + for (nCount = 0; nCount < MP_SUBTITLE_TYPE_MAX; nCount++) { + nStrLength = strcspn(szMediaUriPath, "."); + strncpy(szSubtitleFileUri, szMediaUriPath, nStrLength); + strcat(szSubtitleFileUri, szSubTitleExtWildkey[nCount]); + + if (!stat(szSubtitleFileUri, &buf)) { + VideoLogInfo("Success finding subtitle file. - %d", nCount); + bExistSubtitleFile = TRUE; + break; + } else { + memset(szSubtitleFileUri, 0, STR_LEN_MAX); + } + } + + if (!bExistSubtitleFile) { + VideoLogInfo("Fail finding subtitle file."); + } + + return bExistSubtitleFile; +} + +void MpVideoSubtitleCtrlClear(void) +{ + VideoLogInfo(""); + + bExistSubtitleFile = FALSE; + bSubtitleSettingState = FALSE; + + memset(szSubtitleFileUri, 0, STR_LEN_MAX); +} + +static void MpVideoSubtitleCtrlStateChangeCb(keynode_t *pKeyNode, void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("User data is NULL."); + return; + } + + VideoLogInfo(""); + + if (!vconf_get_bool(VCONFKEY_GALLERY_SUBTITLE_STATE, &bSubtitleSettingState)) { + if (!bSubtitleSettingState) { + VideoLogInfo("Subtitle OFF."); + } else { + VideoLogInfo("Subtitle ON."); + } + } else { + VideoLogInfo("Fail to get vconf - subtitle."); + } +} + +/* + * External function + */ +bool MpVideoSubtitleCtrlInit(void *pUserData) +{ + if (pUserData == NULL) { + VideoLogInfo("[ERR]No have pUserData"); + return FALSE; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + MpVideoSubtitleCtrlClear(); + + if (pAppData->nCurPlayerType != MP_VIDEO_PLAYER) { + VideoLogInfo("Current player type is not video player."); + return FALSE; + } + + if (!vconf_get_bool(VCONFKEY_GALLERY_SUBTITLE_STATE, &bSubtitleSettingState)) { + if (!bSubtitleSettingState) { + VideoLogInfo("Subtitle OFF."); + } else { + VideoLogInfo("Subtitle ON."); + } + } else { + VideoLogInfo("Fail to get vconf - subtitle."); + } + + if (vconf_notify_key_changed(VCONFKEY_GALLERY_SUBTITLE_STATE, MpVideoSubtitleCtrlStateChangeCb, pAppData)) { + VideoLogInfo("[ERR] Fail to resiste subtitle notification callback."); + } + + return MpVideoSubtitleCtrlCheckSubtitleFile(pAppData->szMediaUri); +} + +void MpVideoSubtitleCtrlDestroy(void) +{ + VideoLogInfo(""); + + MpVideoSubtitleCtrlClear(); +} + +bool MpVideoSubtitleCtrlIsExistSubtitle(void) +{ + VideoLogInfo(""); + + return bExistSubtitleFile; +} + +bool MpVideoSubtitleCtrlGetSubtitleUri(char *szSubtitleUri) +{ + VideoLogInfo(""); + + if (!MpVideoSubtitleCtrlIsExistSubtitle()) { + return FALSE; + } + + if (strlen(szSubtitleFileUri) < 1) { + VideoLogInfo("[ERR]No have szSubtitleFileUri"); + return FALSE; + } + + strncpy(szSubtitleUri, szSubtitleFileUri, STR_LEN_MAX -1); + + return TRUE; +} diff --git a/src/mp-video-view-ctrl.c b/src/mp-video-view-ctrl.c new file mode 100755 index 0000000..8f9d651 --- /dev/null +++ b/src/mp-video-view-ctrl.c @@ -0,0 +1,628 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include + +#include +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "mp-video-view-ctrl.h" +#include "mp-video-type-define.h" +#include "mp-util-media-service.h" +#include "mp-video-display-view.h" +#include "mp-video-string-define.h" +#include "mp-video-streaming-view.h" + +#define MULTIMEDIA_KEY_LONG_PRESS_INTERVAL 4.0 +#define DETAIL_POPUP_STR_LEN_MAX 20 + +static Evas_Object *pMainLayout = NULL; +static Evas_Object *pBackGround = NULL; +static Evas_Object *pNaviFrame = NULL; + +static Ecore_Event_Handler *pHWKeyEventDownHandler = NULL; +static Ecore_Event_Handler *pHWKeyEventUpHandler = NULL; + +static bool bIsKeyCancle = FALSE; + +/* + * Callback function. + */ +static void MpVideoViewCtrlInfoVideoPopupCb(void *pUserData, Evas_Object *pObject, void *pEventInfo) +{ + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoLogInfo(""); + + MpUtilDeletePopupHandle(); +} + +static void MpVideoViewCtrlInfoCb(void *pUserData, Evas_Object *pObject, + void *pEventInfo) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData); + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpUtilDetailPopup(pAppData, dgettext(MP_SYS_STRING, MP_COM_BODY_DETAILS), MpVideoViewCtrlInfoVideoPopupCb); + } +} + +static Eina_Bool MpVideoViewCtrlHardkeyUpCb(void *pUserData, int nType, + void *pEvent) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return EINA_FALSE; + } + + Ecore_Event_Key *pKeyEvent = (Ecore_Event_Key *) pEvent; + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + VideoLogInfo("Key down : %s", pKeyEvent->keyname); + + if (bIsKeyCancle) { + VideoLogInfo("KEY CANCLE."); + bIsKeyCancle = FALSE; + return EINA_FALSE; + } + + if (!strcmp(pKeyEvent->keyname, END_KEY)) { + VideoLogInfo("End key up"); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData); + } else if (!strcmp(pKeyEvent->keyname, HOME_KEY)) { + VideoLogInfo("Home key up"); +// if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { +// VideoLogInfo("Push Home key at Streaming player Player."); +// pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData); +// } else if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { +// VideoLogInfo("Push Home key at video player."); +// pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStopByAppPause(pAppData); +// } +// MpUtilDeletePopupHandle(); + } else if (!strcmp(pKeyEvent->keyname, POWER_KEY)) { + VideoLogInfo("Power key up"); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData); + } else if (!strcmp(pKeyEvent->keyname, PAUSE_KEY)) { + VideoLogInfo("Pause key up"); + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY || pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData); + } else if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PAUSE) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData); + } + } else if (!strcmp(pKeyEvent->keyname, PLAY_KEY)) { + VideoLogInfo("Play key up"); + if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY || pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData); + } else if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PAUSE) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData); + } + } else if (!strcmp(pKeyEvent->keyname, STOP_KEY)) { + VideoLogInfo("Stop key up"); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData); + } else if (!strcmp(pKeyEvent->keyname, NEXT_KEY)) { + VideoLogInfo("Next key up"); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPlayNextMedia(pAppData); + } else if (!strcmp(pKeyEvent->keyname, PREV_KEY)) { + VideoLogInfo("Prev key up"); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPlayPreMedia(pAppData); + } else if (!strcmp(pKeyEvent->keyname, FORWARD_KEY)) { + VideoLogInfo("Forward key up"); + } else if (!strcmp(pKeyEvent->keyname, REWIND_KEY)) { + VideoLogInfo("Rewind key up"); + } else { + } + + return EINA_FALSE; +} + +static Eina_Bool MpVideoViewCtrlHardkeyDownCb(void *pUserData, int nType, void *pEvent) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return EINA_FALSE; + } + + Ecore_Event_Key *pKeyEvent = (Ecore_Event_Key *) pEvent; + + VideoLogInfo("Key down : %s", pKeyEvent->keyname); + + if (!strcmp(pKeyEvent->keyname, END_KEY)) { + VideoLogInfo("Back(End) key"); + } else if (!strcmp(pKeyEvent->keyname, HOME_KEY)) { + VideoLogInfo("Home key"); + } else if (!strcmp(pKeyEvent->keyname, POWER_KEY)) { + VideoLogInfo("Power key Down"); + MpUtilLcdOffForPowerButton(); + } else if (!strcmp(pKeyEvent->keyname, PAUSE_KEY)) { + VideoLogInfo("Pause key down"); + } else if (!strcmp(pKeyEvent->keyname, PLAY_KEY)) { + VideoLogInfo("Play key down"); + } else if (!strcmp(pKeyEvent->keyname, STOP_KEY)) { + VideoLogInfo("Stop key down"); + } else if (!strcmp(pKeyEvent->keyname, NEXT_KEY)) { + VideoLogInfo("Next key down"); + } else if (!strcmp(pKeyEvent->keyname, PREV_KEY)) { + VideoLogInfo("Prev key down"); + } else if (!strcmp(pKeyEvent->keyname, FORWARD_KEY)) { + VideoLogInfo("Forward key down"); + } else if (!strcmp(pKeyEvent->keyname, REWIND_KEY)) { + VideoLogInfo("Rewind key down"); + } else if (!strcmp(pKeyEvent->keyname, KEY_CANCLE)) { + bIsKeyCancle = TRUE; + } + + return EINA_FALSE; +} + +/* + * Internal function. + */ +Evas_Object *MpVideoViewCtrlCreateBg(Evas_Object *pWindow) +{ + Evas_Object *pBg = elm_bg_add(pWindow); + evas_object_size_hint_weight_set(pBg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(pWindow, pBg); + evas_object_show(pBg); + + return pBg; +} + +static Evas_Object *MpVideoViewCtrlCreateMainLayout(Evas_Object *pParent, VideoPlayerType nPlayerType) +{ + VideoLogInfo(""); + + if (!pParent) { + VideoLogInfo("[ERR]"); + return NULL; + } + + if (pMainLayout) { + evas_object_del(pMainLayout); + pMainLayout = NULL; + } + + pMainLayout = elm_layout_add(pParent); + pBackGround = MpVideoViewCtrlCreateBg(pParent); + + elm_layout_theme_set(pMainLayout, "layout", "application", "default"); + + evas_object_size_hint_weight_set(pMainLayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + elm_win_resize_object_add(pParent, pMainLayout); + + elm_object_style_set(pBackGround, "transparent"); + + evas_object_show(pMainLayout); + + return pMainLayout; +} + +static Evas_Object *MpVideoViewCtrlCreateNaviFrame(Evas_Object *pParent, MpLaunchingAppType nLaunchingApp) +{ + VideoLogInfo(""); + + if (!pParent) { + VideoLogInfo("[ERR]"); + return NULL; + } + + if (pNaviFrame) { + evas_object_del(pNaviFrame); + pNaviFrame = NULL; + } + + pNaviFrame = elm_naviframe_add(pParent); + + elm_object_part_content_set(pParent, "elm.swallow.content", pNaviFrame); + + elm_naviframe_prev_btn_auto_pushed_set(pNaviFrame, EINA_FALSE); + + evas_object_show(pNaviFrame); + + return pNaviFrame; +} + +void MpVideoViewCtrlDestroyControlBar(VideoPlayerType nCurPlayerType) +{ + VideoLogInfo(""); +} + +void MpVideoViewCtrlInitVideoViews(VideoAppData *pAppData, MpLaunchingAppType nLaunchingApp, int nVideoViewSortType) +{ + VideoLogInfo(""); + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + + switch (nLaunchingApp) { + case MP_LAUNCH_APP_DEFAULT: + case MP_LAUNCH_APP_IMAGE_VIEWER: + case MP_LAUNCH_APP_SIMPLE_VIEW: + break; + + case MP_LAUNCH_APP_GALLERY: + if (pAppData->nVideoListType == MP_VIDEO_LIST_TYPE_FOLDER) { + MpUtilMediaSvcGetVideoFileListFromFolder(pAppData->szMediaUri, nVideoViewSortType); + } else if (pAppData->nVideoListType == MP_VIDEO_LIST_TYPE_ALL_FOLDER_GALLERY) { + MpUtilMediaSvcGetVideoFileListFromAllFolderOfGallery(nVideoViewSortType); + } else if (pAppData->nVideoListType == MP_VIDEO_LIST_TYPE_TAG_GALLERY) { + MpUtilMediaSvcGetVideoFileListByTagName(pAppData->szTagNameForVideoList); + } else if (pAppData->nVideoListType == MP_VIDEO_LIST_TYPE_FAVORITE) { + MpUtilMediaSvcGetVideoFileListFromFavorite(nVideoViewSortType); + } else { + break; + } + + MpUtilMediaSvcGetPreNextVideoUrl(pAppData->szMediaUri, pAppData->szPreMediaUri, pAppData->szNextMediaUri); + break; + + case MP_LAUNCH_APP_MAX: + default: + break; + } + + MpVideoDisplayViewPush((void *)pNaviFrame, (void *)MpVideoViewCtrlInfoCb, nLaunchingApp, (void *)pAppData); + } else if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + MpVideoStreamingViewPush((void *)pNaviFrame, (void *)MpVideoViewCtrlInfoCb, (void *)pAppData); + } +} + +void MpVideoViewCtrlShowNaviFrame(void) +{ + VideoLogInfo(""); + + if (pNaviFrame) { + evas_object_show(pNaviFrame); + } +} + +void MpVideoViewCtrlHideNaviFrame(void) +{ + VideoLogInfo(""); + + if (pNaviFrame) { + evas_object_hide(pNaviFrame); + } +} + +/* + * External function. + */ +bool MpVideoViewCtrlInit(VideoAppData *pAppData) +{ + VideoLogInfo(""); + + if (!pAppData) { + VideoLogInfo("[ERR]"); + return FALSE; + } + + if (pHWKeyEventDownHandler) { + ecore_event_handler_del(pHWKeyEventDownHandler); + pHWKeyEventDownHandler = NULL; + } + + if (pHWKeyEventUpHandler) { + ecore_event_handler_del(pHWKeyEventUpHandler); + pHWKeyEventUpHandler = NULL; + } + + pHWKeyEventDownHandler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, (void *)MpVideoViewCtrlHardkeyDownCb, (void *)pAppData); + pHWKeyEventUpHandler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, (void *)MpVideoViewCtrlHardkeyUpCb, (void *)pAppData); + elm_win_indicator_mode_set(pAppData->pMainWindow, ELM_WIN_INDICATOR_SHOW); + evas_object_color_set(pAppData->pMainWindow, 0, 0, 0, 0); + //elm_win_alpha_set(pAppData->pMainWindow, EINA_TRUE); + //elm_win_transparent_set(pAppData->pMainWindow, EINA_TRUE); + evas_object_move(pAppData->pMainWindow, 0, 0); + + MpVideoViewCtrlCreateMainLayout(pAppData->pMainWindow, pAppData->nCurPlayerType); + MpVideoViewCtrlCreateNaviFrame(pMainLayout, pAppData->nLaunchingAppType); + + MpVideoViewCtrlInitVideoViews(pAppData, pAppData->nLaunchingAppType, pAppData->nVideoSortType); + + return TRUE; +} + +void MpVideoViewCtrlDestroy(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + appcore_unset_rotation_cb(); + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpVideoDisplayViewDestroy(pUserData); + } else if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + MpVideoStreamingViewDestroy(pUserData); + } + + if (pHWKeyEventDownHandler) { + ecore_event_handler_del(pHWKeyEventDownHandler); + pHWKeyEventDownHandler = NULL; + } + + if (pHWKeyEventUpHandler) { + ecore_event_handler_del(pHWKeyEventUpHandler); + pHWKeyEventUpHandler = NULL; + } + + if (pMainLayout) { + evas_object_del(pMainLayout); + pMainLayout = NULL; + } + + if (pNaviFrame) { + evas_object_del(pNaviFrame); + pNaviFrame = NULL; + } + + if (pBackGround) { + evas_object_del(pBackGround); + pBackGround = NULL; + } + + bIsKeyCancle = FALSE; +} + +void MpVideoViewCtrlInitAfterBeginOfStream(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpVideoDisplayViewInitAfterBeginOfStream(pUserData); + } else if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + MpVideoStreamingViewInitAfterBeginOfStream(pUserData); + } +} + +void MpVideoViewCtrlPause(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpVideoDisplayViewUpdatePauseKey(); + } else if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + MpVideoStreamingViewUpdatePauseKey(); + } +} + +void MpVideoViewCtrlResume(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpVideoDisplayViewUpdateResumeKey(); + } else if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + MpVideoStreamingViewUpdateResumeKey(); + } +} + +void MpVideoViewShowLayout(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + elm_win_indicator_mode_set(pAppData->pMainWindow, ELM_WIN_INDICATOR_SHOW); + MpVideoViewCtrlShowNaviFrame(); + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpVideoDisplayViewActivate(); + MpVideoDisplayViewShowControlPanel(pUserData); + } else if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + MpVideoStreamingViewShowControlPanel(pUserData); + } +} + +void MpVideoViewHideLayout(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + elm_win_indicator_mode_set(pAppData->pMainWindow, ELM_WIN_INDICATOR_HIDE); + MpVideoViewCtrlHideNaviFrame(); + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpVideoDisplayViewHideControlPanel(pUserData); + } else if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + MpVideoStreamingViewHideControlPanel(pUserData); + } +} + +void MpVideoViewSetBufferingRateForStreamingView(int nSetBufferingRate, + void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + if(MpUtilCheckRTSPType(pAppData->szMediaUri)) { + if(nSetBufferingRate == 0) { + MpVideoStreamingViewSetBufferingRate(-1); + } + else { + MpVideoStreamingViewSetBufferingRate(nSetBufferingRate); + } + } + else { + if (nSetBufferingRate >= 0) { + MpVideoStreamingViewSetBufferingRate(nSetBufferingRate); + } + } + } +} + +void MpVideoViewHideSoundpath(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpVideoDisplayViewHideSoundpath(); + } +} + +void MpVideoViewCtrlChangeTitle(void *pUserData) +{ + VideoLogInfo(""); + if (!pUserData) { + VideoLogInfo("[ERR]"); + return; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + MpVideoDisplayViewChangeNaviFrameTitle(pUserData); + } +} + +void MpVideoViewCtrlUpdateSubtitle(double nDuration, + char* szSubtitleString) +{ + VideoLogInfo(""); + + if (!szSubtitleString) { + VideoLogInfo("No Exist szSubtitleString pointer."); + return; + } + + if (nDuration <= 0 ) { + VideoLogInfo("Duration time 0."); + return; + } + + MpVideoDisplayViewUpdateSubtitle(nDuration, szSubtitleString); +} + +bool MpVideoViewCtrlIsTopView(void *pUserData) +{ + if (!pUserData) { + VideoLogInfo("[ERR]"); + return FALSE; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + bool bIstopView = FALSE; + + if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + VideoLogInfo("VIDEO PLAYER"); + if (!MpVideoDisplayViewIsTopView()) { + VideoLogInfo(""); + return FALSE; + } + + return TRUE; + } else if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + VideoLogInfo("STREAMING PLAYER"); + bIstopView = MpVideoStreamingViewIsTopView(); + } + + return bIstopView; +} + +void MpVideoViewCtrlShowNocontentImage(void) +{ + VideoLogInfo(""); + + MpVideoDisplayViewShowNocontentImage(); +} + +void MpVideoViewCtrlHideNocontentImage(void) +{ + VideoLogInfo(""); + + MpVideoDisplayViewHideNocontentImage(); +} + +void MpVideoViewCtrlResetProgressBar(void *pUserData) +{ + MpVideoDisplayViewResetProgressBar(pUserData); +} \ No newline at end of file diff --git a/src/mp-xml-parser.c b/src/mp-xml-parser.c new file mode 100755 index 0000000..ec1242e --- /dev/null +++ b/src/mp-xml-parser.c @@ -0,0 +1,371 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include + +#include "mp-video-log.h" +#include "video-player.h" +#include "mp-xml-parser.h" + +#define MAX_YT_FORMAT 10 + +/* + * + * 1 : rtsp | video/3gpp | H.263 / AMR audio | + * 176 * 144 + * 2 : http | video/3gpp | MPEG4 / MPEG4 AAC / 22050 | + * 176 * 144 + * 3 : http | video/mp4| H.264 / AVC / MPEG4 AAC / 44100 | + * 480 * 270 / 480 * 360 + * 5 : http | application/x-shockwave-flash + * 6 : rtsp | video/3gpp | MPEG4 / AAC audio | + * 176 * 144 + * 9 : http | video/3gpp | MPEG4 / MPEG4 AAC | + * 320 * 240 + * 10 : rtsp | video/3gpp +*/ + +static bool bInitXML = false; +static bool _parse_url_with_format(const char *content, int length, int format, + char **streamer_url); + +void mp_xml_init() +{ + if (!bInitXML) { + xmlInitParser(); + bInitXML = true; + } + +} + +void mp_xml_destroy() +{ + if (bInitXML) + xmlCleanupParser(); +} + +unsigned int mp_read_xml_file(const char *file_name, char **data) +{ + unsigned int file_size = 0; + FILE *fp = fopen(file_name, "r"); + if (!fp) { + VideoLogInfo("file open failed!"); + return 0; + } + + fseek(fp, 0, SEEK_END); /* move to end */ + file_size = ftell(fp); + VideoLogInfo("file_size of xml = %d", file_size); + fseek(fp, 0, SEEK_SET); /* move to start */ + + *data = (char *)malloc(file_size); + if (*data == NULL) { + VideoLogInfo("memory allocation failed!"); + fclose(fp); + return 0; + } + + fread(*data, file_size, 1, fp); + fclose(fp); + + return file_size; +} + +/* 3: http | video/mp4 | H.264 / AVC / MPEG4 AAC / 44100 | +480 * 270 / 480 * 360 */ + +/* 9: http | video/3gpp | MPEG4 / MPEG4 AAC | +320 * 240 */ + +/* 2: http | video/3gpp | MPEG4 / MPEG4 AAC / 22050 | +176 * 144 */ + +/* 10: rtsp | video/3gpp */ + +/* 6: rtsp | video/3gpp | MPEG4 / AAC audio | +176 * 144 */ + +/* 1: rtsp | video/3gpp | H.263 / AMR audio | +176 * 144 */ + +int mp_get_xmlitem(const char *content, int length, MpXMLItemInfo * item, + int *nHttpCount, int *nRtspCount) +{ + int xml_order_of_format[MAX_YT_FORMAT] = { 3, + 9, + 2, + 10, + 6, + 1, + 0, + }; + + int index = 0; + char *url = NULL; + bool result = false; + int insert_item = 0; + int http_cnt = 0; + int rtsp_cnt = 0; + int item_cnt = 0; + while (xml_order_of_format[index] != 0) { + result = + _parse_url_with_format(content, length, + xml_order_of_format[index], &url); + if (result == false) + return -1; + + if (url != NULL) { + memcpy(item[item_cnt].szURL, url, strlen(url) + 1); + item[item_cnt].id = xml_order_of_format[index]; + if (xml_order_of_format[index] != 10 && + xml_order_of_format[index] != 6 && + xml_order_of_format[index] != 1) { + item[item_cnt].streaming_type = + MP_HTTP_STREAMING; + http_cnt++; + } else { + item[item_cnt].streaming_type = + MP_RTSP_STREAMING; + rtsp_cnt++; + } + + printf("[%d] : %s\n", item[item_cnt].id, + item[item_cnt].szURL); + if (url) { + free(url); + url = NULL; + } + insert_item++; + item_cnt++; + } + index++; + } + *nHttpCount = http_cnt; + *nRtspCount = rtsp_cnt; + return insert_item; +} + +bool mp_get_url_from_xml(const char *content, int length, char **streamer_url, + int mode) +{ + bool result = false; + int index = 1; + + /* disable http for field test. must remove comment later. + (request from yoserb.yi) */ + int wifi_order_of_format[MAX_YT_FORMAT] = { + 3, + 9, + 2, + 10, + 6, + 1, + 0, + }; + + int order_of_format[MAX_YT_FORMAT] = { + 9, + 10, + 2, + 6, + 1, + 0, + }; + + if (mode == _WIFI_MODE_) { + index = 0; + while (wifi_order_of_format[index] != 0) { + result = _parse_url_with_format(content, length, + wifi_order_of_format + [index], streamer_url); + if (result == false) + return false; + + if (*streamer_url != NULL) { + VideoLogInfo + ("success to parse url (yt_format = %d)", + wifi_order_of_format[index]); + return true; + } else { + VideoLogInfo("no url for yt_format %d", + wifi_order_of_format[index]); + index++; + } + } + + } else { + if (mode == _3G_MODE_) + index = 0; + + VideoLogInfo("mode: 0x%x, index: %d", mode, index); + while (order_of_format[index] != 0) { + result = _parse_url_with_format(content, length, + order_of_format[index], + streamer_url); + if (result == false) + return false; + + if (*streamer_url != NULL) { + VideoLogInfo + ("success to parse url (yt_format = %d)", + order_of_format[index]); + return true; + } else { + VideoLogInfo("no url for yt_format %d", + order_of_format[index]); + index++; + } + } + } + VideoLogInfo("can't find url to play!"); + return false; +} + +bool _parse_url_with_format(const char *content, int length, int format, + char **streamer_url) +{ + char video_url[1024] = "\0"; + xmlDocPtr doc = NULL; + xmlNode *current = NULL; + + doc = xmlReadMemory(content, length, NULL, NULL, 0); + if (doc == NULL) { + VideoLogInfo("Failed to parse document\n"); + xmlFreeDoc(doc); + xmlMemoryDump(); + + return false; + } + + xmlChar *url, *yt_format; + current = xmlDocGetRootElement(doc); + current = current->xmlChildrenNode; + while (current != NULL) { + if ((!xmlStrcmp(current->name, (const xmlChar *)"group"))) { + xmlNodePtr current_group = current->xmlChildrenNode; + while (current_group != NULL) { + if (!xmlStrcmp(current_group->name, + (const xmlChar *)"content")) { + yt_format = xmlGetProp(current_group, + (const xmlChar *) + "format"); + if (yt_format != NULL && format == + atoi((char *)yt_format)) { + url = + xmlGetProp(current_group, + (const xmlChar *) + "url"); + strncpy(video_url, + (const char *)url, + sizeof(video_url) - 1); + xmlFree(url); + xmlFree(yt_format); + break; + } + xmlFree(yt_format); + } + current_group = current_group->next; + } + break; + } + current = current->next; + } + + xmlFreeDoc(doc); + xmlMemoryDump(); + + if (strlen(video_url)) { + *streamer_url = (char *)calloc(1, strlen(video_url) + 1); + memcpy(*streamer_url, video_url, strlen(video_url) + 1); + } + + return true; +} + +char *mp_get_title_from_xml(const char *path) +{ + char *content = NULL; + unsigned int length = 0; + + if (!path) + return NULL; + + if (!g_str_has_suffix(path, ".xml")) + return NULL; + + length = mp_read_xml_file(path, &content); + if (length == 0 || content == NULL) { + free(content); + return NULL; + } + + char title[1024] = "\0"; + xmlDocPtr doc = NULL; + xmlNode *current = NULL; + + doc = xmlReadMemory(content, length, NULL, NULL, 0); + if (doc == NULL) { + VideoLogInfo("Failed to parse document\n"); + xmlFreeDoc(doc); + xmlMemoryDump(); + + return NULL; + } + + xmlChar *xml_title = NULL; + current = xmlDocGetRootElement(doc); + current = current->xmlChildrenNode; + while (current != NULL) { + if ((!xmlStrcmp(current->name, (const xmlChar *)"group"))) { + xmlNodePtr current_group = current->xmlChildrenNode; + while (current_group != NULL) { + if (!xmlStrcmp + (current_group->name, + (const xmlChar *)"title")) { + xml_title = + xmlNodeGetContent(current_group); + if (xml_title) { + strncpy(title, + (const char *)xml_title, + sizeof(title) - 1); + VideoLogInfo("xml_title=%x ", + xml_title); + xmlFree(xml_title); + } + break; + } + current_group = current_group->next; + } + break; + } + current = current->next; + } + + xmlFreeDoc(doc); + xmlMemoryDump(); + + free(content); + + if (strlen(title)) + return strdup(title); + else + return NULL; + +} diff --git a/src/video-player.c b/src/video-player.c new file mode 100755 index 0000000..1911cb2 --- /dev/null +++ b/src/video-player.c @@ -0,0 +1,296 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include + +#include +#include + +#include "mp-util.h" +#include "mp-video-log.h" +#include "video-player.h" +#include "mp-video-app-ctrl.h" +#include "mp-util-media-service.h" +#include "mp-video-string-define.h" + +static bool bIsForeground = FALSE; + +static int app_init(void *pUserData); +static int app_exit(void *pUserData); +static int app_reset(bundle *pBundle, void *pUserData); +static int app_pause(void *pUserData); +static int app_resume(void *pUserData); + +static int app_init(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return 0; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + appcore_set_i18n(PACKAGE, LOCALEDIR); + elm_theme_extension_add(NULL, VIDEO_CUSTOM_THEME); + + MpUtilInitSession(); + MpUtilVolumeTypeSet(); + + MpUtilLanguageInit(pAppData); + return 0; +} + +static int app_reset(bundle *pBundle, void *pUserData) +{ + VideoLogInfo(""); + + if (bIsForeground) { + VideoLogInfo("Defence overlap launching."); + return 0; + } else { + bIsForeground = TRUE; + } + + if (!pBundle) { + VideoLogInfo("[ERR] No exist pBundle."); + return 0; + } + + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return 0; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + if (strlen(pAppData->szMediaUri) > 0) { + MpVideoAppCtrlResetForRelaunching(pAppData); + } + + if (pAppData->pMainWindow == NULL) { + VideoLogInfo("Create main window."); + pAppData->pMainWindow = (Evas_Object *)MpUtilCreateMainWindow(PACKAGE); + } + + MpUtilSetKeyGrab(HOME_KEY, KEY_GRAB_SHARED); + MpUtilMediaSvcInitSession(); + + if (bundle_get_count(pBundle) < 1) { + VideoLogInfo("UI gadget bundle value should > 0"); + return 0; + } + + if (MpUtilCheckLaunchingByMime(pBundle, pAppData->szMediaUri)) { + VideoLogInfo("=== SETTING VIDEO TYPE ==="); + VideoLogInfo("Launching by mime. Path : %s", + pAppData->szMediaUri); + pAppData->nCurPlayerType = MP_VIDEO_PLAYER; + } else { + if(!MpUtilGetURIFromBundle(pBundle, pAppData)) + { + if(!MpUtilGetURIFromAUL(pBundle, pAppData)) + { + VideoLogInfo("[ERR] Fail to get URI path from AUL."); + return 0; + } + } + + if (MpUtilIsXMLUrl(pAppData->szMediaUri)) { + if (!MpUtilParsingXML(pAppData->szMediaUri, pAppData)) { + VideoLogInfo("[ERR] Fail to get streaming URI path from XML."); + return 0; + } + } else { + if (!MpUtilCheckVideoURI(pAppData)) { + VideoLogInfo("[ERR] Fail to get video/streaming URI path."); + return 0; + } + if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + MpUtilGetCookieFromBundle(pBundle, pAppData); + } + } + } + + if (!MpUtilMMCstatusNoti(pAppData)) { + VideoLogInfo("[ERR] Fail to set MMC notification."); + return 0; + } + + if (!MpUtilBatteryStatusNoti(pAppData)) { + VideoLogInfo("[ERR] Fail to set Battery notification."); + return 0; + } + + pAppData->nLaunchingAppType = (MpLaunchingAppType) MpUtilCheckLaunchingByOtherApp(pBundle, MP_VIDEO_LAUNCHING_BY_APP_KEY); + pAppData->nVideoSortType = (MpMediaSortType) MpUtilCheckSortType(pBundle, MP_VIDEO_SORT_TYPE_KEY); + pAppData->nVideoListType = (MpVideoListType) MpUtilCheckListType(pBundle, MP_VIDEO_LIST_TYPE_KEY); + pAppData->nSetPosition = MpUtilCheckStartPositionTime(pBundle, MP_VIDEO_START_POS_TIME_KEY); + + if (pAppData->nVideoListType == MP_VIDEO_LIST_TYPE_TAG_GALLERY) { + MpUtilGetTagNameOfGallery(pBundle, MP_VIDEO_TAG_NAME_KEY, pAppData->szTagNameForVideoList); + VideoLogInfo("Gallery tag name : %s", pAppData->szTagNameForVideoList); + } + + MpUtilVolumeTypeSet(); + pm_lock_state(LCD_NORMAL, GOTO_STATE_NOW, 0); + + MpVideoAppCtrlInit(pAppData); + + evas_object_show(pAppData->pMainWindow); + elm_win_activate(pAppData->pMainWindow); + + return 0; +} + +static int app_exit(void *pUserData) +{ + VideoLogInfo(""); + + if (!pUserData) { + VideoLogInfo("[ERR] No exist pUserData."); + return 0; + } + + pm_unlock_state(LCD_NORMAL, GOTO_STATE_NOW); + + MpUtilSetKeyUngrab(HOME_KEY); + MpUtilMultimediaKeyUngrab(); + MpUtilMMCstatusNotiIgnore(); + MpUtilBatteryStatusNotiIgnore(); + MpUtilVolumeTypeUnset(); + MpUtilFinishSession(); + MpUtilDeletePopupHandle(); + MpUtilMediaSvcMtagIterateDestroyTagList(); + MpUtilMediaSvcDestoryVideoList(); + MpUtilMediaSvcFinishSession(); + MpUtilDestroyXML(); + + bIsForeground = FALSE; + + return 0; +} + +static int app_pause(void *pUserData) +{ + if(!pUserData) + { + VideoLogInfo("Not exist pUserData."); + return 0; + } + + VideoLogInfo(""); + + VideoAppData *pAppData = (VideoAppData *)pUserData; + +/* + if (!MpVideoAppCtrlIsTopView(pUserData)) { + VideoLogInfo("Overlay is not staied in top."); + } else { + if (MpVideoAppCtrlIsExistPlayerHandle()) { + pAppData->nPrePlayerState = pAppData->nCurPlayerState; + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData); + } + } +*/ + if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER) { + VideoLogInfo("Push Home key at Streaming player Player."); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData); + } else if (pAppData->nCurPlayerType == MP_VIDEO_PLAYER) { + VideoLogInfo("Push Home key at video player."); + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStopByAppPause(pAppData); + } + MpUtilDeletePopupHandle(); + + MpUtilVolumeTypeUnset(); + + elm_win_indicator_mode_set(pAppData->pMainWindow, ELM_WIN_INDICATOR_SHOW); + + bIsForeground = FALSE; + + return 0; +} + +static int app_resume(void *pUserData) +{ + if(!pUserData) + { + VideoLogInfo("Not exist pUserData."); + return 0; + } + + VideoLogInfo(""); + + if (bIsForeground) { + VideoLogInfo("Defence overlap launching."); + return 0; + } + + if (!MpVideoAppCtrlIsTopView(pUserData)) { + VideoLogInfo("Overlay is not staied in top."); + return 0; + } + + VideoAppData *pAppData = (VideoAppData *)pUserData; + + MpUtilVolumeTypeSet(); + + elm_win_indicator_mode_set(pAppData->pMainWindow, ELM_WIN_INDICATOR_SHOW); + + if (MpVideoAppCtrlIsExistPlayerHandle()) { + if (pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME || pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY) { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData); + } + } else { + pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStartByAppResume(pAppData); + } + + bIsForeground = TRUE; + + return 0; +} + +int main(int argc, char *argv[]) +{ + struct timeval TimeVal; + gettimeofday(&TimeVal, NULL); + + VideoLogInfo("======================================================"); + VideoLogInfo(" Measuring exec() launching time - %ld:%ldus", + TimeVal.tv_sec, TimeVal.tv_usec); + VideoLogInfo("======================================================"); + + VideoAppData pAppData; + memset(&pAppData, 0, sizeof(VideoAppData)); + + struct appcore_ops ops = { + .create = app_init, + .terminate = app_exit, + .pause = app_pause, + .resume = app_resume, + .reset = app_reset, + .data = (void *)&pAppData, + }; + + if (appcore_efl_main(PACKAGE, &argc, &argv, &ops) == -1) + return -1; + + return 0; +} -- 2.7.4