diff options
author | Likai Ding <likaid@codeaurora.org> | 2013-08-19 15:04:18 +0800 |
---|---|---|
committer | Xiaojing Zhang <zhangx@codeaurora.org> | 2014-11-04 20:37:50 -0800 |
commit | 85963d969c149b9ba5e5681524e520b8b8afba08 (patch) | |
tree | 42fa492e598b3a6e39e7a6cd3b55b735bf201070 | |
parent | cecd51ead6cace89db4506df96b7419502f64b61 (diff) | |
download | android_packages_apps_Gallery2-85963d969c149b9ba5e5681524e520b8b8afba08.tar.gz android_packages_apps_Gallery2-85963d969c149b9ba5e5681524e520b8b8afba08.tar.bz2 android_packages_apps_Gallery2-85963d969c149b9ba5e5681524e520b8b8afba08.zip |
Gallery2: support loop/single video play mode
This change allows a video to be played repeatedly. It also
introduces an extension framework.
Change-Id: I5566192f138c1f0fd889b85496dd27fbf2aed10d
CRs-Fixed: 507973
28 files changed, 437 insertions, 803 deletions
diff --git a/res/drawable-hdpi/ic_menu_loop.png b/res/drawable-hdpi/ic_menu_loop.png Binary files differindex add463382..add463382 100755..100644 --- a/res/drawable-hdpi/ic_menu_loop.png +++ b/res/drawable-hdpi/ic_menu_loop.png diff --git a/res/drawable-hdpi/ic_menu_unloop.png b/res/drawable-hdpi/ic_menu_unloop.png Binary files differindex 3140051d2..3140051d2 100755..100644 --- a/res/drawable-hdpi/ic_menu_unloop.png +++ b/res/drawable-hdpi/ic_menu_unloop.png diff --git a/res/drawable-mdpi/ic_menu_loop.png b/res/drawable-mdpi/ic_menu_loop.png Binary files differindex 688b2c564..688b2c564 100755..100644 --- a/res/drawable-mdpi/ic_menu_loop.png +++ b/res/drawable-mdpi/ic_menu_loop.png diff --git a/res/drawable-mdpi/ic_menu_unloop.png b/res/drawable-mdpi/ic_menu_unloop.png Binary files differindex e47496414..e47496414 100755..100644 --- a/res/drawable-mdpi/ic_menu_unloop.png +++ b/res/drawable-mdpi/ic_menu_unloop.png diff --git a/res/drawable-xhdpi/ic_menu_loop.png b/res/drawable-xhdpi/ic_menu_loop.png Binary files differindex e664915ce..e664915ce 100755..100644 --- a/res/drawable-xhdpi/ic_menu_loop.png +++ b/res/drawable-xhdpi/ic_menu_loop.png diff --git a/res/drawable-xhdpi/ic_menu_unloop.png b/res/drawable-xhdpi/ic_menu_unloop.png Binary files differindex 89d1da2bc..89d1da2bc 100755..100644 --- a/res/drawable-xhdpi/ic_menu_unloop.png +++ b/res/drawable-xhdpi/ic_menu_unloop.png diff --git a/res/values-zh-rCN/codeaurora_strings.xml b/res/values-zh-rCN/codeaurora_strings.xml new file mode 100644 index 000000000..9e9b535e7 --- /dev/null +++ b/res/values-zh-rCN/codeaurora_strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="loop">"循环"</string> + <string name="single">"单次"</string> +</resources> diff --git a/res/values-zh-rCN/qcom_strings.xml b/res/values-zh-rCN/qcom_strings.xml deleted file mode 100755 index 1d40e59ec..000000000 --- a/res/values-zh-rCN/qcom_strings.xml +++ /dev/null @@ -1,125 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Strings for step option settins --> - <string name="setp_option_name">步长</string> - <string name="step_option_desc">定制快进/快退步长</string> - <string name="setp_option_three_second">3秒</string> - <string name="setp_option_six_second">6秒</string> - - <string name="camera_print">"打印"</string> - <string name="no_way_to_print">"无可用打印文件的应用程序"</string> - <string name="printFile">"打印文件方式"</string> - <string name="no_storage_title">"无存储"</string> - <string name="no_storage_message">"请插入SD卡"</string> - <string name="load_image_fail">"加载图片失败"</string> - - <!--STRING TRANSLATION START [add for ICS porting streaming] --> - <string name="proxy_host">地址</string> - <string name="proxy_port">端口</string> - <string name="apn_settings">"接入点名称"</string> - <string name="rtsp_proxy_settings">"RTSP 代理设置"</string> - <string name="rtsp_proxy_settings_summary">"设置 RTSP 代理服务器的地址和端口"</string> - <string name="enable_rtsp_proxy">"启用 RTSP 代理"</string> - <string name="enable_rtsp_proxy_summary">"打开/关闭 RTSP 代理"</string> - <string name="http_proxy_settings">"HTTP 代理设置"</string> - <string name="http_proxy_settings_summary">"设置 HTTP 代理服务器的地址和端口"</string> - <string name="enable_http_proxy">"启用 HTTP 代理"</string> - <string name="enable_http_proxy_summary">"打开/关闭 HTTP 代理"</string> - <string name="apn_settings_summary">"当前SIM卡:%1$s\n当前接入点名称:%2$s"</string> - <string name="apn_settings_not_valid">"SIM卡数据连接已关闭,无法设置接入点名称"</string> - <string name="udp_port_settings">"RTP/RTCP 端口范围"</string> - <string name="udp_port_settings_summary">"设置最大最小端口号"</string> - <string name="max_udp_port">"最大端口号"</string> - <string name="min_udp_port">"最小端口号"</string> - <string name="server_timeout_title">"服务器超时"</string> - <string name="server_timeout_message">"是否重新连接服务器以播放该视频?"</string> - <string name="input_url">"输入 URL"</string> - <string name="streaming_settings">"流媒体设置"</string> - <string name="VideoView_info_text_video_not_supported">"这个视频不被支持。"</string> - <string name="VideoView_error_text_cannot_connect_retry">"连接失败,正在尝试第%1$d次重连..."</string> - <string name="stop">"停止"</string> - <string name="loop">"循环"</string> - <string name="single">"单次"</string> - <!--STRING TRANSLATION END [add for ICS porting streaming] --> - - <string name="bookmark_add">"添加书签"</string> - <string name="bookmark_display">"显示书签"</string> - <string name="bookmark_empty">"无书签"</string> - <string name="bookmark_exist">"已存在相同书签"</string> - <string name="bookmark_add_success">"添加书签成功"</string> - <string name="bookmark_list">"书签列表"</string> - <string name="bookmark_title">"标题"</string> - <string name="bookmark_location">"地址"</string> - <string name="http_buffer_size">"HTTP缓冲大小"</string> - <string name="http_buffer_size_summary">"设置HTTP缓冲大小 "</string> - <string name="http_buffer_size_text">"当前HTTP缓冲大小: %1$d(秒)"</string> - <string name="rtsp_buffer_size">"RTSP缓冲大小"</string> - <string name="rtsp_buffer_size_summary">"设置RTSP缓冲大小"</string> - <string name="rtsp_buffer_size_text">"当前RTSP缓冲大小: %1$d(秒)"</string> - <string name="buffer_size_tip">"有效值范围: %1$d - %2$d 秒"</string> - <string name="media_detail">"媒体详情"</string> - <string name="detail_title">"标题: %1$s"</string> - <string name="detail_copyright">"版权: %1$s"</string> - <string name="detail_session">"会话信息: %1$s"</string> - <string name="stereo">"立体声"</string> - <string name="single_track">"单声道"</string> - <string name="delete_all">"删除所有"</string> - <string name="default_title">"默认标题"</string> - <string name="next">"下一个"</string> - <string name="previous">"上一个"</string> - - <!--strings for MAV viewer(enhancement)--> - <string name="mav_firstRunTitle">"如何查看多视角图片"</string> - <string name="mav_firstRunText">"左右滑动以查看多视角图片"</string> - - <!-- strings for stereo 3D support --> - <string name="stereo3d_album_name">"3D 媒体"</string> - <string name="stereo3d_mode_switchto_2d">"切换到2D模式"</string> - <string name="stereo3d_mode_switchto_3d">"切换到3D模式"</string> - <string name="stereo3d_convert2d_dialog_title">"转换为2D"</string> - <string name="stereo3d_convert2d_dialog_text">"3D图片不支持\"<xliff:g id="operation">%s</xliff:g>\" 。图片会被转换为2D."</string> - <string name="stereo3d_convert2d_progress_text">"正在转换为2D..."</string> - <string name="stereo3d_pan_firstrun_title">"如何查看3D全景图片"</string> - <string name="stereo3d_pan_firstrun_text">"左右滑动以查看3D全景图片。"</string> - <string name="stereo3d_share_convert_text_single">"这是3D图片。若要继续分享,它会被转换成2D。"</string> - <string name="stereo3d_share_convert_text_multiple">"选中图片中包含3D图片。若要继续分享,它们会被转换成2D。"</string> - <string name="stereo3d_share_dialog_title">"以3D或2D分享"</string> - <string name="stereo3d_share_dialog_text_single">"这是3D图片。接收者可能无法正常浏览此图片。"</string> - <string name="stereo3d_share_dialog_text_multiple">"选中图片中包含3D图片。接收者可能无法正常浏览这些图片。"</string> - <string name="stereo3d_share_dialog_button_2d">"以2D分享"</string> - <string name="stereo3d_share_dialog_button_3d">"以3D分享"</string> - <string name="stereo3d_attach_dialog_title">"以3D添加附件"</string> - <string name="stereo3d_attach_dialog_button_2d">"以2D添加"</string> - <string name="stereo3d_attach_dialog_button_3d">"以3D添加"</string> - - <!-- strings for stereo wallpaper support --> - <string name="stereo3d_preview_title">"预览照片"</string> - <string name="stereo3d_preview_button_set">"设置"</string> - <string name="stereo3d_set_wallpaper_fail">"3D壁纸设置失败"</string> - - <!-- strings for Photo widget failure handling --> - <string name="widget_load_failed">"加载窗口小部件失败"</string> - - <!-- strings for background text shown on AlbumSetPage --> - <string name="albumset_empty_text">"没有相册。"</string> - <string name="rtp">RTP</string> - <string name="rtcp">RTCP</string> - <string name="min_port">最小端口:</string> - <string name="max_port">最大端口:</string> - <string name="buffer_size">缓存大小</string> - <string name="apn">优先接入点</string> - <string name="rtp_min_port">RTP最小端口</string> - <string name="rtp_max_port">RTP最大端口</string> - <string name="rtcp_min_port">RTCP最小端口</string> - <string name="rtcp_max_port">RTCP最大端口</string> - <string name="set_rtp_min_port">设置RTP最小端口</string> - <string name="set_rtp_max_port">设置RTP最大端口</string> - <string name="set_rtcp_min_port">设置RTCP最小端口</string> - <string name="set_rtcp_max_port">设置RTCP最大端口</string> - <string name="set_buffer_size">设置缓冲大小</string> - <string name="set_apn">选择接入优先点</string> - - <string name="media_controller_live">直播</string> - <string name="media_controller_playing">正在播放</string> - <string name="media_controller_connecting">正在连接...</string> -</resources> diff --git a/res/values-zh-rTW/codeaurora_strings.xml b/res/values-zh-rTW/codeaurora_strings.xml new file mode 100644 index 000000000..a25ec853a --- /dev/null +++ b/res/values-zh-rTW/codeaurora_strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="loop">"循環"</string> + <string name="single">"單次"</string> +</resources> diff --git a/res/values-zh-rTW/qcom_strings.xml b/res/values-zh-rTW/qcom_strings.xml deleted file mode 100755 index 5ba3a3751..000000000 --- a/res/values-zh-rTW/qcom_strings.xml +++ /dev/null @@ -1,107 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Strings for step option settins --> - <string name="setp_option_name">步長</string> - <string name="step_option_desc">定制快進/快退步長</string> - <string name="setp_option_three_second">3秒</string> - <string name="setp_option_six_second">>6秒</string> - <!-- Strings for BPP --> - <string name="camera_print">"列印"</string> - <string name="no_way_to_print">>"無可用列印檔案的應用程式"</string> - <string name="printFile">"列印檔案方式"</string> - - <string name="no_storage_title">無儲存裝置</string> - <string name="no_storage_message">請插入 SD 卡</string> - <string name="load_image_fail">無法載入影像</string> - - <!--STRING TRANSLATION START [add for ICS porting streaming] --> - <string name="proxy_host">主機</string> - <string name="proxy_port">連接埠</string> - <string name="apn_settings" msgid="9043423184895642077">"存取點名稱 (APN)"</string> - <string name="rtsp_proxy_settings">"RTSP Proxy 設定"</string> - <string name="rtsp_proxy_settings_summary">"設定並管理 RTSP Proxy 設定"</string> - <string name="enable_rtsp_proxy">"啟用 RTSP Proxy"</string> - <string name="enable_rtsp_proxy_summary">"啟用/停用 RTSP Proxy"</string> - <string name="http_proxy_settings">"HTTP Proxy 設定"</string> - <string name="http_proxy_settings_summary">"設定並管理 HTTP Proxy 設定"</string> - <string name="enable_http_proxy">"啟用 HTTP Proxy"</string> - <string name="enable_http_proxy_summary">"啟用/停用 HTTP Proxy"</string> - <string name="apn_settings_summary">"目前的 SIM 卡:%1$s\n目前的 APN:%2$s"</string> - <string name="apn_settings_not_valid">"已關閉 SIM 卡的資料連線,無法設定 APN"</string> - <string name="udp_port_settings">"RTP/RTCP 連接埠範圍"</string> - <string name="udp_port_settings_summary">"設定連接埠數量上限和下限"</string> - <string name="max_udp_port">"連接埠數量上限"</string> - <string name="min_udp_port">"連接埠數量下限"</string> - <string name="server_timeout_title">"伺服器逾時"</string> - <string name="server_timeout_message">"是否重新連線伺服器並播放視訊?"</string> - <string name="input_url">"輸入 URL"</string> - <string name="streaming_settings">"串流設定"</string> - <string name="VideoView_info_text_video_not_supported">"不支援此影片。"</string> - <string name="VideoView_error_text_cannot_connect_retry">"連線失敗,正在嘗試重新連線 %1$d..."</string> - <string name="stop">"停止"</string> - <string name="loop">"循環"</string> - <string name="single">"單次"</string> - <!--STRING TRANSLATION END [add for ICS porting streaming] --> - - <string name="bookmark_add">"添加書簽"</string> - <string name="bookmark_display">"顯示書簽"</string> - <string name="bookmark_empty">"無書簽"</string> - <string name="bookmark_exist">"已存在相同書簽"</string> - <string name="bookmark_add_success">"添加書簽成功"</string> - <string name="bookmark_list">"書簽列表"</string> - <string name="bookmark_title">"標題"</string> - <string name="bookmark_location">"位置"</string> - <string name="http_buffer_size">"HTTP緩衝大小"</string> - <string name="http_buffer_size_summary">"設置HTTP緩衝大小"</string> - <string name="http_buffer_size_text">"當前HTTP緩衝大小: %1$d(秒)"</string> - <string name="rtsp_buffer_size">"RTSP緩衝大小"</string> - <string name="rtsp_buffer_size_summary">"設置RTSP緩衝大小"</string> - <string name="rtsp_buffer_size_text">"當前RTSP緩衝大小: %1$d(秒)"</string> - <string name="buffer_size_tip">"有效值範圍: %1$d - %2$d 秒"</string> - <string name="media_detail">"媒體詳情"</string> - <string name="detail_title">"標題: %1$s"</string> - <string name="detail_copyright">"版權: %1$s"</string> - <string name="detail_session">"會話信息: %1$s"</string> - <string name="stereo">"立體聲"</string> - <string name="single_track">"單聲道"</string> - <string name="delete_all">"刪除所有"</string> - <string name="default_title">"默認標題"</string> - <string name="next">"下一個"</string> - <string name="previous">"上一個"</string> - - <!--strings for MAV viewer(enhancement)--> - <string name="mav_firstRunTitle">如何檢視多視角影像</string> - <string name="mav_firstRunText">左右滑動檢視多視角影像</string> - - <!-- strings for stereo 3D support --> - <string name="stereo3d_album_name">3D 媒體</string> - <string name="stereo3d_mode_switchto_2d">切換成 2D 模式</string> - <string name="stereo3d_mode_switchto_3d">切換成 3D 模式</string> - <string name="stereo3d_convert2d_dialog_title">轉換成 2D</string> - <string name="stereo3d_convert2d_dialog_text">\"<xliff:g id="operation">%s</xliff:g>\" 不支援 3D 影像。將轉換成 2D。</string> - <string name="stereo3d_convert2d_progress_text">正在轉換成 2D…</string> - <string name="stereo3d_pan_firstrun_title">如何檢視 3D 環景影像</string> - <string name="stereo3d_pan_firstrun_text">左右滑動檢視 3D 環景影像。</string> - <string name="stereo3d_share_convert_text_single">此為 3D 影像。若要繼續分享,會轉換成 2D。</string> - <string name="stereo3d_share_convert_text_multiple">選取的影像包含 3D 影像。若要繼續分享,會轉換成 2D。</string> - <string name="stereo3d_share_dialog_title">以 3D 或 2D 分享</string> - <string name="stereo3d_share_dialog_text_single">此為 3D 影像。收件者可能無法正常檢視。</string> - <string name="stereo3d_share_dialog_text_multiple">選取的影像包含 3D 影像。收件者可能無法正常檢視。</string> - <string name="stereo3d_share_dialog_button_2d">以 2D 分享</string> - <string name="stereo3d_share_dialog_button_3d">以 3D 分享</string> - <string name="stereo3d_attach_dialog_title">以 3D 或 2D 方式附加</string> - <string name="stereo3d_attach_dialog_button_2d">以 2D 方式附加</string> - <string name="stereo3d_attach_dialog_button_3d">以 3D 方式附加</string> - - <!-- strings for stereo wallpaper support --> - <string name="stereo3d_preview_title">預覽圖片</string> - <string name="stereo3d_preview_button_set">"設定"</string> - <string name="stereo3d_set_wallpaper_fail">3D 桌布設定失敗。</string> - - <!-- strings for Photo widget failure handling --> - <string name="widget_load_failed">無法載入小工具</string> - - <!--strings for Picture Quality Tool support --> - - -</resources> diff --git a/res/values/bool.xml b/res/values/bool.xml index 464842ab4..18aade1bb 100644..100755 --- a/res/values/bool.xml +++ b/res/values/bool.xml @@ -15,4 +15,5 @@ --> <resources> <bool name="show_action_bar_title">false</bool> + <bool name="loop">false</bool> </resources>
\ No newline at end of file diff --git a/res/values/codeaurora_strings.xml b/res/values/codeaurora_strings.xml new file mode 100644 index 000000000..e17c15492 --- /dev/null +++ b/res/values/codeaurora_strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="loop">"Loop"</string> + <string name="single">"Single"</string> +</resources> diff --git a/res/values/qcom_strings.xml b/res/values/qcom_strings.xml deleted file mode 100755 index c2314dc64..000000000 --- a/res/values/qcom_strings.xml +++ /dev/null @@ -1,148 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Strings for step option settins --> - <string name="setp_option_name">Step</string> - <string name="step_option_desc">Customize fast forward/backward step</string> - <string name="setp_option_three_second">3 seconds</string> - <string name="setp_option_six_second">6 seconds</string> - <!-- Strings for BPP --> - <string name="camera_print">Print</string> - <string name="no_way_to_print">No application available to print the file(s).</string> - <string name="printFile">Print file via</string> - - <!-- Title of no storage dialog --> - <string name="no_storage_title">No Storage</string> - - <!-- Message of no storage dialog --> - <string name="no_storage_message">Please insert an SD card</string> - - <!-- Toast for load image fail --> - <string name="load_image_fail">Failed to load image</string> - - <!--STRING TRANSLATION START [add for ICS porting streaming] --> - <string name="proxy_host">Host</string> - <string name="proxy_port">Port</string> - <string name="apn_settings">Access Point Names</string> - <string name="rtsp_proxy_settings">"RTSP Proxy Settings"</string> - <string name="rtsp_proxy_settings_summary">"Setup and manage RTSP proxy settings"</string> - <string name="enable_rtsp_proxy">"Enable RTSP proxy"</string> - <string name="enable_rtsp_proxy_summary">"Enable/Disable RTSP proxy"</string> - <string name="http_proxy_settings">"HTTP Proxy Settings"</string> - <string name="http_proxy_settings_summary">"Setup and manage HTTP proxy settings"</string> - <string name="enable_http_proxy">"Enable HTTP proxy"</string> - <string name="enable_http_proxy_summary">"Enable/Disable HTTP proxy"</string> - <string name="apn_settings_summary">"Current SIM: %1$s\nCurrent APN: %2$s"</string> - <string name="apn_settings_not_valid">"SIM's Data Connectivity is closed, cann't set APN"</string> - <string name="udp_port_settings">"RTP/RTCP Port Range"</string> - <string name="udp_port_settings_summary">"Set Max and Min Port Number"</string> - <string name="max_udp_port">"Max Port Number"</string> - <string name="min_udp_port">"Min Port Number"</string> - <string name="server_timeout_title">"Server Timeout"</string> - <string name="server_timeout_message">"Reconnect the server to play the video or not?"</string> - <string name="input_url">"Input URL"</string> - <string name="streaming_settings">"Streaming Settings"</string> - <string name="VideoView_info_text_video_not_supported">"This video is not supported."</string> - <string name="VideoView_error_text_cannot_connect_retry">"Connection failed, try to reconnect %1$d..."</string> - <string name="stop">"Stop"</string> - <string name="loop">"Loop"</string> - <string name="single">"Single"</string> - <!--STRING TRANSLATION END [add for ICS porting streaming] --> - - <string name="bookmark_add">"Add bookmark"</string> - <string name="bookmark_display">"Show bookmarks"</string> - <string name="bookmark_empty">"No bookmarks"</string> - <string name="bookmark_exist">"Same bookmark in history"</string> - <string name="bookmark_add_success">"Add bookmark success"</string> - <string name="bookmark_list">"Bookmarks"</string> - <string name="bookmark_title">"Title"</string> - <string name="bookmark_location">"Location"</string> - <string name="http_buffer_size">"HTTP buffer size"</string> - <string name="http_buffer_size_summary">"Set HTTP buffer size for streaming"</string> - <string name="http_buffer_size_text">"Current HTTP buffer size: %1$d(s)"</string> - <string name="rtsp_buffer_size">"RTSP buffer size"</string> - <string name="rtsp_buffer_size_summary">"Set RTSP buffer size for streaming"</string> - <string name="rtsp_buffer_size_text">"Current RTSP buffer size: %1$d(s)"</string> - <string name="buffer_size_tip">"Valid value range: %1$d - %2$d seconds"</string> - <string name="media_detail">"Media details"</string> - <string name="detail_title">"Title: %1$s"</string> - <string name="detail_copyright">"Copyright: %1$s"</string> - <string name="detail_session">"Session Info: %1$s"</string> - <string name="stereo">"Stereo"</string> - <string name="single_track">"Single track"</string> - <string name="delete_all">"Delete all"</string> - <string name="default_title">"Default title"</string> - <string name="next">"Next"</string> - <string name="previous">"Previous"</string> - - <!--strings for MAV viewer(enhancement)--> - <string name="mav_firstRunTitle">How to view multi-angle image</string> - <string name="mav_firstRunText">Swipe left or right to view multi-angle image</string> - - <!-- strings for stereo 3D support --> - <string name="stereo3d_album_name">3D media</string> - <string name="stereo3d_mode_switchto_2d">Switch to 2D mode</string> - <string name="stereo3d_mode_switchto_3d">Switch to 3D mode</string> - <string name="stereo3d_convert2d_dialog_title">Convert to 2D</string> - <string name="stereo3d_convert2d_dialog_text">\"<xliff:g id="operation">%s</xliff:g>\" is not supported for 3D image. It will be converted to 2D.</string> - <string name="stereo3d_convert2d_progress_text">Converting to 2D...</string> - <string name="stereo3d_pan_firstrun_title">How to view 3D panorama image</string> - <string name="stereo3d_pan_firstrun_text">Swipe left or right to view 3D panorama image.</string> - <string name="stereo3d_share_convert_text_single">This is 3D image. To continue sharing, it will be converted to 2D.</string> - <string name="stereo3d_share_convert_text_multiple">Selected images include 3D images. To continue sharing, they will be converted to 2D.</string> - <string name="stereo3d_share_dialog_title">Share as 3D or 2D</string> - <string name="stereo3d_share_dialog_text_single">This is 3D image. The recipient may not be able to view it properly.</string> - <string name="stereo3d_share_dialog_text_multiple">Selected images include 3D images. The recipient may not be able to view them properly.</string> - <string name="stereo3d_share_dialog_button_2d">Share as 2D</string> - <string name="stereo3d_share_dialog_button_3d">Share as 3D</string> - <string name="stereo3d_attach_dialog_title">Attach as 3D or 2D</string> - <string name="stereo3d_attach_dialog_button_2d">Attach as 2D</string> - <string name="stereo3d_attach_dialog_button_3d">Attach as 3D</string> - - <!-- strings for stereo wallpaper support --> - <string name="stereo3d_preview_title">Preview picture</string> - <string name="stereo3d_preview_button_set">Set</string> - <string name="stereo3d_set_wallpaper_fail">Set 3D wallpaper failed.</string> - - <!-- strings for Photo widget failure handling --> - <string name="widget_load_failed">Failed to load widget</string> - - <!--strings for Picture Quality Tool support --> - - <string name="pq_label" translatable="false">picture</string> - <string name="pq_save_text" translatable="false">PQ</string> - <string name="picture_quality" translatable="false">PQ</string> - <string name="number_zero" translatable="false">" 0"</string> - <string name="SkinTone" translatable="false">"Skin tone(Hue): 5"</string> - <string name="GrassTone" translatable="false">"Grass tone(Hue): 5"</string> - <string name="Sharpness" translatable="false">"Sharpness: 5"</string> - <string name="SkyTone" translatable="false">"Sky tone(Hue): 5"</string> - <string name="Color" translatable="false">"Global Sat.: 0"</string> - - <!-- strings for background text shown on AlbumSetPage --> - <string name="Sky_tone_Sat" translatable="false">"Sky tone(Sat): 0"</string> - <string name="Grass_tone_Sat" translatable="false">"Grass tone(Sat): 0"</string> - <string name="Skin_tone_Sat" translatable="false">"Skin tone(Sat): 0"</string> - <string name="SGS_number" translatable="false">"6"</string> - <string name="rtp">RTP</string> - <string name="rtcp">RTCP</string> - <string name="min_port">min port:</string> - <string name="max_port">max port:</string> - <string name="buffer_size">Buffer Size</string> - <string name="apn">Prefered APN</string> - <string name="rtp_min_port">Min port</string> - <string name="rtp_max_port">Max port</string> - <string name="rtcp_min_port">Min port</string> - <string name="rtcp_max_port">Max port</string> - <string name="set_rtp_min_port">Set min port</string> - <string name="set_rtp_max_port">Set max port</string> - <string name="set_rtcp_min_port">Set min port</string> - <string name="set_rtcp_max_port">Set max port</string> - <string name="set_buffer_size">Set buffer size</string> - <string name="set_apn">Select prefered apn</string> - <string name="setting">Settings</string> - - - <string name="media_controller_live">Live</string> - <string name="media_controller_playing">Playing</string> - <string name="media_controller_connecting">Connecting...</string> -</resources> diff --git a/src/com/android/gallery3d/app/MovieActivity.java b/src/com/android/gallery3d/app/MovieActivity.java index 30b12243f..5152e5b39 100644 --- a/src/com/android/gallery3d/app/MovieActivity.java +++ b/src/com/android/gallery3d/app/MovieActivity.java @@ -62,6 +62,10 @@ import com.android.gallery3d.R; import com.android.gallery3d.common.ApiHelper; import com.android.gallery3d.common.Utils; import com.android.gallery3d.ui.Knob; +import org.codeaurora.gallery3d.ext.IActivityHooker; +import org.codeaurora.gallery3d.ext.MovieItem; +import org.codeaurora.gallery3d.ext.IMovieItem; +import org.codeaurora.gallery3d.video.ExtensionHelper; /** * This activity plays a video from a specified URI. @@ -79,7 +83,6 @@ public class MovieActivity extends Activity { private MoviePlayer mPlayer; private boolean mFinishOnCompletion; private Uri mUri; - private boolean mTreatUpAsBack; private static final short BASSBOOST_MAX_STRENGTH = 1000; private static final short VIRTUALIZER_MAX_STRENGTH = 1000; @@ -100,6 +103,9 @@ public class MovieActivity extends Activity { private Knob mBassBoostKnob; private Knob mVirtualizerKnob; + private IMovieItem mMovieItem; + private IActivityHooker mMovieHooker; + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { @@ -153,11 +159,14 @@ public class MovieActivity extends Activity { setSystemUiVisibility(rootView); Intent intent = getIntent(); + + mMovieHooker = ExtensionHelper.getHooker(this); + initMovieInfo(intent); + initializeActionBar(intent); mFinishOnCompletion = intent.getBooleanExtra( MediaStore.EXTRA_FINISH_ON_COMPLETION, true); - mTreatUpAsBack = intent.getBooleanExtra(KEY_TREAT_UP_AS_BACK, false); - mPlayer = new MoviePlayer(rootView, this, intent.getData(), savedInstanceState, + mPlayer = new MoviePlayer(rootView, this, mMovieItem, savedInstanceState, !mFinishOnCompletion) { @Override public void onCompletion() { @@ -183,7 +192,10 @@ public class MovieActivity extends Activity { // We set the background in the theme to have the launching animation. // But for the performance (and battery), we remove the background here. win.setBackgroundDrawable(null); - + mMovieHooker.init(this, intent); + mMovieHooker.setParameter(null, mPlayer.getMoviePlayerExt()); + mMovieHooker.setParameter(null, mMovieItem); + mMovieHooker.setParameter(null, mPlayer.getVideoSurface()); // Determine available/supported effects final Descriptor[] effects = AudioEffect.queryEffects(); for (final Descriptor effect : effects) { @@ -299,6 +311,14 @@ public class MovieActivity extends Activity { return true; } }); + mMovieHooker.onCreateOptionsMenu(menu); + return true; + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + mMovieHooker.onPrepareOptionsMenu(menu); return true; } @@ -402,19 +422,16 @@ public class MovieActivity extends Activity { public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { - if (mTreatUpAsBack) { - finish(); - } else { - startActivity(new Intent(this, GalleryActivity.class)); - finish(); - } + // If click back up button, we will always finish current activity and + // back to previous one. + finish(); return true; } else if (id == R.id.action_share) { startActivity(Intent.createChooser(createShareIntent(), getString(R.string.share))); return true; } - return false; + return mMovieHooker.onOptionsItemSelected(item); } public void showHeadsetPlugToast() { @@ -494,4 +511,17 @@ public class MovieActivity extends Activity { return mPlayer.onKeyUp(keyCode, event) || super.onKeyUp(keyCode, event); } + + private boolean isSharable() { + String scheme = mUri.getScheme(); + return ContentResolver.SCHEME_FILE.equals(scheme) + || (ContentResolver.SCHEME_CONTENT.equals(scheme) && MediaStore.AUTHORITY + .equals(mUri.getAuthority())); + } + private void initMovieInfo(Intent intent) { + Uri original = intent.getData(); + String mimeType = intent.getType(); + mMovieItem = new MovieItem(original, mimeType, null); + mMovieItem.setOriginalUri(original); + } } diff --git a/src/com/android/gallery3d/app/MoviePlayer.java b/src/com/android/gallery3d/app/MoviePlayer.java index 962afeafb..09fd272ae 100644 --- a/src/com/android/gallery3d/app/MoviePlayer.java +++ b/src/com/android/gallery3d/app/MoviePlayer.java @@ -35,6 +35,7 @@ import android.os.Bundle; import android.os.Handler; import android.view.KeyEvent; import android.view.MotionEvent; +import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.widget.VideoView; @@ -44,6 +45,9 @@ import com.android.gallery3d.common.ApiHelper; import com.android.gallery3d.common.BlobCache; import com.android.gallery3d.util.CacheManager; import com.android.gallery3d.util.GalleryUtils; +import org.codeaurora.gallery3d.ext.IMoviePlayer; +import org.codeaurora.gallery3d.ext.IMovieItem; +import org.codeaurora.gallery3d.video.ExtensionHelper; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -75,6 +79,9 @@ public class MoviePlayer implements // Otherwise, we pause the player. private static final long RESUMEABLE_TIMEOUT = 3 * 60 * 1000; // 3 mins + public static final int STREAMING_LOCAL = 0; + private int mStreamingType = STREAMING_LOCAL; + private Context mContext; private final VideoView mVideoView; private final View mRootView; @@ -97,6 +104,24 @@ public class MoviePlayer implements private Virtualizer mVirtualizer; + private MoviePlayerExtension mPlayerExt = new MoviePlayerExtension(); + private boolean mCanReplay; + private TState mTState = TState.PLAYING; + private IMovieItem mMovieItem; + + private enum TState { + PLAYING, + PAUSED, + STOPED, + COMPELTED, + RETRY_ERROR + } + + interface Restorable { + void onRestoreInstanceState(Bundle icicle); + void onSaveInstanceState(Bundle outState); + } + private final Runnable mPlayingChecker = new Runnable() { @Override public void run() { @@ -117,18 +142,20 @@ public class MoviePlayer implements }; public MoviePlayer(View rootView, final MovieActivity movieActivity, - Uri videoUri, Bundle savedInstance, boolean canReplay) { + IMovieItem info, Bundle savedInstance, boolean canReplay) { mContext = movieActivity.getApplicationContext(); mRootView = rootView; mVideoView = (VideoView) rootView.findViewById(R.id.surface_view); mBookmarker = new Bookmarker(movieActivity); - mUri = videoUri; mController = new MovieControllerOverlay(mContext); ((ViewGroup)rootView).addView(mController.getView()); mController.setListener(this); mController.setCanReplay(canReplay); + init(info, canReplay); + mUri = mMovieItem.getUri(); + mVideoView.setOnErrorListener(this); mVideoView.setOnCompletionListener(this); mVideoView.setVideoURI(mUri); @@ -191,6 +218,7 @@ public class MoviePlayer implements mResumeableTime = savedInstance.getLong(KEY_RESUMEABLE_TIME, Long.MAX_VALUE); mVideoView.start(); mVideoView.suspend(); + onRestoreInstanceState(savedInstance); mHasPaused = true; } else { final Integer bookmark = mBookmarker.getBookmark(mUri); @@ -242,6 +270,7 @@ public class MoviePlayer implements public void onSaveInstanceState(Bundle outState) { outState.putInt(KEY_VIDEO_POSITION, mVideoPosition); outState.putLong(KEY_RESUMEABLE_TIME, mResumeableTime); + onSaveInstanceStateMore(outState); } private void showResumeDialog(Context context, final int bookmark) { @@ -332,6 +361,11 @@ public class MoviePlayer implements } mVideoView.start(); + //we may start video from stopVideo, + //this case, we should reset canReplay flag according canReplay and loop + boolean loop = mPlayerExt.getLoop(); + boolean canReplay = loop ? loop : mCanReplay; + mController.setCanReplay(canReplay); setProgress(); } @@ -358,8 +392,15 @@ public class MoviePlayer implements @Override public void onCompletion(MediaPlayer mp) { - mController.showEnded(); - onCompletion(); + if (mPlayerExt.getLoop()) { + onReplay(); + } else { //original logic + mTState = TState.COMPELTED; + if (mCanReplay) { + mController.showEnded(); + } + onCompletion(); + } } public void onCompletion() { @@ -459,6 +500,11 @@ public class MoviePlayer implements || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE; } + private void init(IMovieItem info, boolean canReplay) { + mCanReplay = canReplay; + mMovieItem = info; + } + // We want to pause when the headset is unplugged. private class AudioBecomingNoisyReceiver extends BroadcastReceiver { @@ -484,6 +530,64 @@ public class MoviePlayer implements public void setOnPreparedListener(MediaPlayer.OnPreparedListener listener) { mVideoView.setOnPreparedListener(listener); } + + public boolean isLocalFile() { + if (mStreamingType == STREAMING_LOCAL) { + return true; + } + return false; + } + + public IMoviePlayer getMoviePlayerExt() { + return mPlayerExt; + } + + public SurfaceView getVideoSurface() { + return mVideoView; + } + + private void onSaveInstanceStateMore(Bundle outState) { + + mPlayerExt.onSaveInstanceState(outState); + } + + private void onRestoreInstanceState(Bundle icicle) { + + mPlayerExt.onRestoreInstanceState(icicle); + } + + private class MoviePlayerExtension implements IMoviePlayer, Restorable { + + private static final String KEY_VIDEO_IS_LOOP = "video_is_loop"; + + private boolean mIsLoop; + + @Override + public boolean getLoop() { + return mIsLoop; + } + + @Override + public void setLoop(boolean loop) { + if (isLocalFile()) { + mIsLoop = loop; + mController.setCanReplay(loop); + } + } + + @Override + public void onRestoreInstanceState(Bundle icicle) { + mIsLoop = icicle.getBoolean(KEY_VIDEO_IS_LOOP, false); + if (mIsLoop) { + mController.setCanReplay(true); + } // else will get can replay from intent. + } + + @Override + public void onSaveInstanceState(Bundle outState) { + outState.putBoolean(KEY_VIDEO_IS_LOOP, mIsLoop); + } + }; } class Bookmarker { diff --git a/src/com/qcom/gallery3d/ext/IActivityHooker.java b/src/com/qcom/gallery3d/ext/IActivityHooker.java deleted file mode 100755 index 3be707c6d..000000000 --- a/src/com/qcom/gallery3d/ext/IActivityHooker.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.qcom.gallery3d.ext; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; - -/** - * Activity action hooker class. - * Host app's activity will call this hooker's functions in its lifecycle. - * For example: HostActivity.onCreate()-->hooker.onCreate(). - * But void init(Activity context, Intent intent) will be called before other functions. - * <br/> - * IActivityHooker objects may show menus, but we should give a unique menu id to every menus. - * Hooker can call getMenuActivityId(int) to get a global unique menu id to be used in menu.add(), - * and can call getMenuOriginalId(int) to get the original menu id. - * the example: - * class Hooker implements IActivityHooker { - * private static final int MENU_EXAMPLE = 1; - * @Override - * public boolean onCreateOptionsMenu(Menu menu) { - * super.onCreateOptionsMenu(menu); - * menu.add(0, getMenuActivityId(MENU_EXAMPLE), 0, android.R.string.ok); - * return true; - * } - * @Override - * public boolean onOptionsItemSelected(MenuItem item) { - * switch(getMenuOriginalId(item.getItemId())) { - * case MENU_EXAMPLE: - * //do something - * return true; - * default: - * return false; - * } - * } - * } - */ -public interface IActivityHooker { - /** - * Will be called in Host Activity.onCreate(Bundle savedInstanceState) - * @param savedInstanceState - */ - void onCreate(Bundle savedInstanceState); - /** - * Will be called in Host Activity.onStart() - */ - void onStart(); - /** - * Will be called in Host Activity.onStop() - */ - void onStop(); - /** - * Will be called in Host Activity.onPause() - */ - void onPause(); - /** - * Will be called in Host Activity.onResume() - */ - void onResume(); - /** - * Will be called in Host Activity.onDestroy() - */ - void onDestroy(); - /** - * Will be called in Host Activity.onCreateOptionsMenu(Menu menu) - * @param menu - * @return - */ - boolean onCreateOptionsMenu(Menu menu); - /** - * Will be called in Host Activity.onPrepareOptionsMenu(Menu menu) - * @param menu - * @return - */ - boolean onPrepareOptionsMenu(Menu menu); - /** - * Will be called in Host Activity.onOptionsItemSelected(MenuItem item) - * @param item - * @return - */ - boolean onOptionsItemSelected(MenuItem item); - - /** - * Should be called before any other functions. - * @param context - * @param intent - */ - void init(Activity context, Intent intent); - /** - * @return return activity set by init(Activity context, Intent intent) - */ - Activity getContext(); - /** - * @return return intent set by init(Activity context, Intent intent) - */ - Intent getIntent(); - /** - * IActivityHooker objects may show menus, but we should give a unique menu id to every menus. - * Hooker can call this function to get a global unique menu id to be used in menu.add() - * @param id - * @return - */ - int getMenuActivityId(int id); - /** - * When onOptionsItemSelected is called, we can get menu's id from parameter. - * You can get the original menu id by calling this function. - * @param id - * @return - */ - int getMenuOriginalId(int id); - /** - * Host activity will call this function to set parameter to hooker activity. - * @param key - * @param value - */ - void setParameter(String key, Object value); -} diff --git a/src/com/qcom/gallery3d/ext/IMoviePlayer.java b/src/com/qcom/gallery3d/ext/IMoviePlayer.java deleted file mode 100755 index 3a353639c..000000000 --- a/src/com/qcom/gallery3d/ext/IMoviePlayer.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.qcom.gallery3d.ext; - -public interface IMoviePlayer { - /** - * add new bookmark Uri. - */ - void addBookmark(); - /** - * start current item and stop playing video. - * @param item - */ - void startNextVideo(IMovieItem item); - /** - * Loop current video. - * @param loop - */ - void setLoop(boolean loop); - /** - * Loop current video or not - * @return - */ - boolean getLoop(); - /** - * Show video details. - */ - void showDetail(); - /** - * Can stop current video or not. - * @return - */ - boolean canStop(); - /** - * Stop current video. - */ - void stopVideo(); -} diff --git a/src/com/qcom/gallery3d/video/ExtensionHelper.java b/src/com/qcom/gallery3d/video/ExtensionHelper.java deleted file mode 100755 index ae667eeb5..000000000 --- a/src/com/qcom/gallery3d/video/ExtensionHelper.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.qcom.gallery3d.video; - -import android.content.Context; - -import com.android.gallery3d.app.MovieActivity; -import com.qcom.gallery3d.ext.ActivityHookerGroup; -import com.qcom.gallery3d.ext.IActivityHooker; -import com.qcom.gallery3d.ext.IMovieExtension; -import com.qcom.gallery3d.ext.IMovieStrategy; -import com.qcom.gallery3d.ext.MovieExtension; -import com.qcom.gallery3d.ext.MovieStrategy; -import com.qcom.gallery3d.ext.QcomLog; - -import java.util.ArrayList; -import java.util.List; - -public class ExtensionHelper { - private static final String TAG = "ExtensionHelper"; - private static final boolean LOG = true; - - private static List<IMovieExtension> sMovieExtensions; - private static void ensureMovieExtension(final Context context) { - if (sMovieExtensions == null) { - sMovieExtensions = new ArrayList<IMovieExtension>(); - sMovieExtensions.add(new MovieExtension(MovieExtension.CMCC_EXTENSION_FUNCTIONS)); - } - } - - public static IActivityHooker getHooker(final Context context) { - ensureMovieExtension(context); - final ActivityHookerGroup group = new ActivityHookerGroup(); - if (!(ExtensionHelper.getMovieStrategy(context).shouldEnableRewindAndForward())) { - group.addHooker(new StopVideoHooker());//add it for common feature. - } - group.addHooker(new LoopVideoHooker()); //add it for common feature. - - for (final IMovieExtension ext : sMovieExtensions) { //add common feature in host app - final List<Integer> list = ext.getFeatureList(); - if (list != null) { - for (int i = 0, size = list.size(); i < size; i++) { - final int feature = list.get(i); - switch(feature) { - case IMovieExtension.FEATURE_ENABLE_STOP: - //group.addHooker(new StopVideoHooker()); - break; - // case IMovieExtension.FEATURE_ENABLE_NOTIFICATION_PLUS: - // group.addHooker(new NotificationPlusHooker()); - // break; - case IMovieExtension.FEATURE_ENABLE_STREAMING: - group.addHooker(new StreamingHooker()); - break; - case IMovieExtension.FEATURE_ENABLE_BOOKMARK: - group.addHooker(new BookmarkHooker()); - break; - case IMovieExtension.FEATURE_ENABLE_VIDEO_LIST: - group.addHooker(new MovieListHooker()); - break; - case IMovieExtension.FEATURE_ENABLE_STEREO_AUDIO: - group.addHooker(new StereoAudioHooker()); - break; - case IMovieExtension.FEATURE_ENABLE_SETTINGS: - group.addHooker(new StepOptionSettingsHooker()); - break; - default: - break; - } - } - } - } - for (final IMovieExtension ext : sMovieExtensions) { //add other feature in plugin app - final IActivityHooker hooker = ext.getHooker(); - if (hooker != null) { - group.addHooker(hooker); - } - } - for (int i = 0, count = group.size(); i < count; i++) { - if (LOG) { - QcomLog.v(TAG, "getHooker() [" + i + "]=" + group.getHooker(i)); - } - } - return group; - } - - public static IMovieStrategy getMovieStrategy(final Context context) { - return new MovieStrategy(); - } - -} diff --git a/src/com/qcom/gallery3d/ext/ActivityHooker.java b/src/org/codeaurora/gallery3d/ext/ActivityHooker.java index 3d1999bc1..039c5a04e 100755..100644 --- a/src/com/qcom/gallery3d/ext/ActivityHooker.java +++ b/src/org/codeaurora/gallery3d/ext/ActivityHooker.java @@ -1,21 +1,23 @@ -package com.qcom.gallery3d.ext; +package org.codeaurora.gallery3d.ext; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; + /** * Default implemention class of IActivityHooker. */ public class ActivityHooker implements IActivityHooker { + private static final int MENU_MAX_NUMBER = 100; private static int sMenuId = 1; private int mMenuId; private static Object sMenuLock = new Object(); private Activity mContext; private Intent mIntent; - + public ActivityHooker() { synchronized (sMenuLock) { sMenuId++; @@ -32,13 +34,13 @@ public class ActivityHooker implements IActivityHooker { public int getMenuOriginalId(int id) { return id - mMenuId; } - + @Override public void init(Activity context, Intent intent) { mContext = context; mIntent = intent; } - + @Override public Activity getContext() { return mContext; @@ -48,34 +50,17 @@ public class ActivityHooker implements IActivityHooker { public Intent getIntent() { return mIntent; } - - @Override - public void onCreate(Bundle savedInstanceState) { - } - @Override - public void onStart() { - } - @Override - public void onResume() { - } - @Override - public void onPause() { - } - @Override - public void onStop() { - } - @Override - public void onDestroy() { - } - + @Override public boolean onCreateOptionsMenu(Menu menu) { return false; } + @Override public boolean onOptionsItemSelected(MenuItem item) { return false; } + @Override public boolean onPrepareOptionsMenu(Menu menu) { return false; diff --git a/src/com/qcom/gallery3d/ext/ActivityHookerGroup.java b/src/org/codeaurora/gallery3d/ext/ActivityHookerGroup.java index b1da185fd..2e24aa688 100755..100644 --- a/src/com/qcom/gallery3d/ext/ActivityHookerGroup.java +++ b/src/org/codeaurora/gallery3d/ext/ActivityHookerGroup.java @@ -1,4 +1,4 @@ -package com.qcom.gallery3d.ext; +package org.codeaurora.gallery3d.ext; import android.app.Activity; import android.content.Intent; @@ -9,85 +9,41 @@ import android.view.MenuItem; import java.util.ArrayList; /** - * The composite pattern class. - * It will deliver every action to its leaf hookers. + * The composite pattern class. It will deliver every action to its leaf + * hookers. */ public class ActivityHookerGroup extends ActivityHooker { private ArrayList<IActivityHooker> mHooks = new ArrayList<IActivityHooker>(); + /** * Add hooker to current group. + * * @param hooker * @return */ public boolean addHooker(IActivityHooker hooker) { return mHooks.add(hooker); } + /** * Remove hooker from current group. + * * @param hooker * @return */ public boolean removeHooker(IActivityHooker hooker) { return mHooks.remove(hooker); } - /** - * Hooker size of current group. - * @return - */ - public int size() { - return mHooks.size(); - } + /** * Get hooker of requested location. + * * @param index * @return */ public IActivityHooker getHooker(int index) { return mHooks.get(index); } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - for (IActivityHooker hook : mHooks) { - hook.onCreate(savedInstanceState); - } - } - @Override - public void onStart() { - super.onStart(); - for (IActivityHooker hook : mHooks) { - hook.onStart(); - } - } - @Override - public void onResume() { - super.onResume(); - for (IActivityHooker hook : mHooks) { - hook.onResume(); - } - } - @Override - public void onPause() { - super.onPause(); - for (IActivityHooker hook : mHooks) { - hook.onPause(); - } - } - @Override - public void onStop() { - super.onStop(); - for (IActivityHooker hook : mHooks) { - hook.onStop(); - } - } - @Override - public void onDestroy() { - super.onDestroy(); - for (IActivityHooker hook : mHooks) { - hook.onDestroy(); - } - } @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -101,6 +57,7 @@ public class ActivityHookerGroup extends ActivityHooker { } return handle; } + @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); @@ -113,6 +70,7 @@ public class ActivityHookerGroup extends ActivityHooker { } return handle; } + @Override public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); @@ -133,7 +91,7 @@ public class ActivityHookerGroup extends ActivityHooker { hook.setParameter(key, value); } } - + @Override public void init(Activity context, Intent intent) { super.init(context, intent); diff --git a/src/org/codeaurora/gallery3d/ext/IActivityHooker.java b/src/org/codeaurora/gallery3d/ext/IActivityHooker.java new file mode 100644 index 000000000..fa1b5c0a0 --- /dev/null +++ b/src/org/codeaurora/gallery3d/ext/IActivityHooker.java @@ -0,0 +1,99 @@ +package org.codeaurora.gallery3d.ext; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; + +/** + * Activity action hooker class. Host app's activity will call this hooker's + * functions in its lifecycle. For example: + * HostActivity.onCreate()-->hooker.onCreate(). But void init(Activity context, + * Intent intent) will be called before other functions. <br/> + * IActivityHooker objects may show menus, but we should give a unique menu id + * to every menus. Hooker can call getMenuActivityId(int) to get a global unique + * menu id to be used in menu.add(), and can call getMenuOriginalId(int) to get + * the original menu id. the example: class Hooker implements IActivityHooker { + * private static final int MENU_EXAMPLE = 1; + * + * @Override public boolean onCreateOptionsMenu(Menu menu) { + * super.onCreateOptionsMenu(menu); menu.add(0, + * getMenuActivityId(MENU_EXAMPLE), 0, android.R.string.ok); return + * true; } + * @Override public boolean onOptionsItemSelected(MenuItem item) { + * switch(getMenuOriginalId(item.getItemId())) { case MENU_EXAMPLE: + * //do something return true; default: return false; } } } + */ +public interface IActivityHooker { + + /** + * Will be called in Host Activity.onCreateOptionsMenu(Menu menu) + * + * @param menu + * @return + */ + boolean onCreateOptionsMenu(Menu menu); + + /** + * Will be called in Host Activity.onPrepareOptionsMenu(Menu menu) + * + * @param menu + * @return + */ + boolean onPrepareOptionsMenu(Menu menu); + + /** + * Will be called in Host Activity.onOptionsItemSelected(MenuItem item) + * + * @param item + * @return + */ + boolean onOptionsItemSelected(MenuItem item); + + /** + * Should be called before any other functions. + * + * @param context + * @param intent + */ + void init(Activity context, Intent intent); + + /** + * @return return activity set by init(Activity context, Intent intent) + */ + Activity getContext(); + + /** + * @return return intent set by init(Activity context, Intent intent) + */ + Intent getIntent(); + + /** + * IActivityHooker objects may show menus, but we should give a unique menu + * id to every menus. Hooker can call this function to get a global unique + * menu id to be used in menu.add() + * + * @param id + * @return + */ + int getMenuActivityId(int id); + + /** + * When onOptionsItemSelected is called, we can get menu's id from + * parameter. You can get the original menu id by calling this function. + * + * @param id + * @return + */ + int getMenuOriginalId(int id); + + /** + * Host activity will call this function to set parameter to hooker + * activity. + * + * @param key + * @param value + */ + void setParameter(String key, Object value); +} diff --git a/src/com/qcom/gallery3d/ext/IMovieItem.java b/src/org/codeaurora/gallery3d/ext/IMovieItem.java index 6c7f4dd20..dece4e803 100755..100644 --- a/src/com/qcom/gallery3d/ext/IMovieItem.java +++ b/src/org/codeaurora/gallery3d/ext/IMovieItem.java @@ -1,6 +1,7 @@ -package com.qcom.gallery3d.ext; +package org.codeaurora.gallery3d.ext; import android.net.Uri; + /** * Movie info class */ @@ -9,34 +10,39 @@ public interface IMovieItem { * @return movie Uri, it's may be not the original Uri. */ Uri getUri(); + /** - * * @return MIME type of video */ String getMimeType(); + /** - * * @return title of video */ String getTitle(); + /** - * * @return whether error occured or not. */ boolean getError(); /** * set title of video + * * @param title */ void setTitle(String title); + /** * set video Uri + * * @param uri */ void setUri(Uri uri); + /** * Set MIME type of video + * * @param mimeType */ void setMimeType(String mimeType); @@ -45,14 +51,16 @@ public interface IMovieItem { * Set error occured flag */ void setError(); + /** - * * @return return original Uri of video. */ Uri getOriginalUri(); + /** * Set video original Uri. + * * @param uri */ void setOriginalUri(Uri uri); -}
\ No newline at end of file +} diff --git a/src/org/codeaurora/gallery3d/ext/IMoviePlayer.java b/src/org/codeaurora/gallery3d/ext/IMoviePlayer.java new file mode 100644 index 000000000..9248ebdf4 --- /dev/null +++ b/src/org/codeaurora/gallery3d/ext/IMoviePlayer.java @@ -0,0 +1,17 @@ +package org.codeaurora.gallery3d.ext; + +public interface IMoviePlayer { + /** + * Loop current video. + * + * @param loop + */ + void setLoop(boolean loop); + + /** + * Loop current video or not + * + * @return + */ + boolean getLoop(); +} diff --git a/src/com/qcom/gallery3d/ext/MovieItem.java b/src/org/codeaurora/gallery3d/ext/MovieItem.java index 2da1c2628..c6d53d031 100755..100644 --- a/src/com/qcom/gallery3d/ext/MovieItem.java +++ b/src/org/codeaurora/gallery3d/ext/MovieItem.java @@ -1,4 +1,4 @@ -package com.qcom.gallery3d.ext; +package org.codeaurora.gallery3d.ext; import android.net.Uri; import android.provider.MediaStore; @@ -6,80 +6,80 @@ import android.provider.MediaStore; public class MovieItem implements IMovieItem { private static final String TAG = "MovieItem"; private static final boolean LOG = true; - + private Uri mUri; private String mMimeType; private String mTitle; private boolean mError; -// private int mStereoType; + // private int mStereoType; private Uri mOriginal; - + private static final int STREO_TYPE_2D = 1; - + public MovieItem(Uri uri, String mimeType, String title, int stereoType) { mUri = uri; mMimeType = mimeType; mTitle = title; -// mStereoType = stereoType; + // mStereoType = stereoType; mOriginal = uri; } - + public MovieItem(String uri, String mimeType, String title, int stereoType) { this(Uri.parse(uri), mimeType, title, stereoType); } - + public MovieItem(Uri uri, String mimeType, String title) { - this(uri, mimeType, title, STREO_TYPE_2D); + this(uri, mimeType, title, STREO_TYPE_2D); } - + public MovieItem(String uri, String mimeType, String title) { this(Uri.parse(uri), mimeType, title); } - + @Override public Uri getUri() { return mUri; } - + @Override public String getMimeType() { return mMimeType; } - + @Override public String getTitle() { return mTitle; } - + @Override public boolean getError() { return mError; } - -// @Override -// public int getStereoType() { -// return mStereoType; -// } - + + // @Override + // public int getStereoType() { + // return mStereoType; + // } + public void setTitle(String title) { mTitle = title; } - + @Override public void setUri(Uri uri) { mUri = uri; } - + @Override public void setMimeType(String mimeType) { mMimeType = mimeType; } - -// @Override -// public void setStereoType(int stereoType) { -// mStereoType = stereoType; -// } - + + // @Override + // public void setStereoType(int stereoType) { + // mStereoType = stereoType; + // } + @Override public void setError() { mError = true; @@ -94,22 +94,22 @@ public class MovieItem implements IMovieItem { public void setOriginalUri(Uri uri) { mOriginal = uri; } - + @Override public String toString() { return new StringBuilder().append("MovieItem(uri=") - .append(mUri) - .append(", mime=") - .append(mMimeType) - .append(", title=") - .append(mTitle) - .append(", error=") - .append(mError) -// .append(", support3D=") -// .append(mStereoType) - .append(", mOriginal=") - .append(mOriginal) - .append(")") - .toString(); + .append(mUri) + .append(", mime=") + .append(mMimeType) + .append(", title=") + .append(mTitle) + .append(", error=") + .append(mError) + // .append(", support3D=") + // .append(mStereoType) + .append(", mOriginal=") + .append(mOriginal) + .append(")") + .toString(); } -}
\ No newline at end of file +} diff --git a/src/com/qcom/gallery3d/ext/MovieUtils.java b/src/org/codeaurora/gallery3d/ext/MovieUtils.java index 16b7b6375..2846ab584 100755..100644 --- a/src/com/qcom/gallery3d/ext/MovieUtils.java +++ b/src/org/codeaurora/gallery3d/ext/MovieUtils.java @@ -1,6 +1,7 @@ -package com.qcom.gallery3d.ext; +package org.codeaurora.gallery3d.ext; import android.net.Uri; +import android.util.Log; import java.util.Locale; @@ -10,10 +11,13 @@ import java.util.Locale; public class MovieUtils { private static final String TAG = "MovieUtils"; private static final boolean LOG = true; - - private MovieUtils() {} + + private MovieUtils() { + } + /** - * Whether current video(Uri) is RTSP streaming or not. + * Whether current video(Uri) is RTSP streaming or not. + * * @param uri * @param mimeType * @return @@ -24,14 +28,16 @@ public class MovieUtils { if ("rtsp".equalsIgnoreCase(uri.getScheme())) { rtsp = true; } - } + } if (LOG) { - QcomLog.v(TAG, "isRtspStreaming(" + uri + ", " + mimeType + ") return " + rtsp); + Log.v(TAG, "isRtspStreaming(" + uri + ", " + mimeType + ") return " + rtsp); } return rtsp; } + /** * Whether current video(Uri) is HTTP streaming or not. + * * @param uri * @param mimeType * @return @@ -46,12 +52,14 @@ public class MovieUtils { } } if (LOG) { - QcomLog.v(TAG, "isHttpStreaming(" + uri + ", " + mimeType + ") return " + http); + Log.v(TAG, "isHttpStreaming(" + uri + ", " + mimeType + ") return " + http); } return http; } + /** * Whether current video(Uri) is live streaming or not. + * * @param uri * @param mimeType * @return @@ -66,13 +74,14 @@ public class MovieUtils { } } if (LOG) { - QcomLog.v(TAG, "isSdpStreaming(" + uri + ", " + mimeType + ") return " + sdp); + Log.v(TAG, "isSdpStreaming(" + uri + ", " + mimeType + ") return " + sdp); } return sdp; } - + /** * Whether current video(Uri) is local file or not. + * * @param uri * @param mimeType * @return @@ -82,7 +91,7 @@ public class MovieUtils { && !isRtspStreaming(uri, mimeType) && !isHttpStreaming(uri, mimeType)); if (LOG) { - QcomLog.v(TAG, "isLocalFile(" + uri + ", " + mimeType + ") return " + local); + Log.v(TAG, "isLocalFile(" + uri + ", " + mimeType + ") return " + local); } return local; } diff --git a/src/org/codeaurora/gallery3d/video/ExtensionHelper.java b/src/org/codeaurora/gallery3d/video/ExtensionHelper.java new file mode 100755 index 000000000..cef0f96d7 --- /dev/null +++ b/src/org/codeaurora/gallery3d/video/ExtensionHelper.java @@ -0,0 +1,27 @@ +package org.codeaurora.gallery3d.video; + +import android.content.Context; + +import com.android.gallery3d.app.MovieActivity; +import com.android.gallery3d.R; + +import org.codeaurora.gallery3d.ext.ActivityHookerGroup; +import org.codeaurora.gallery3d.ext.IActivityHooker; + +import java.util.ArrayList; +import java.util.List; + +public class ExtensionHelper { + + public static IActivityHooker getHooker(final Context context) { + + final ActivityHookerGroup group = new ActivityHookerGroup(); + boolean loop = context.getResources().getBoolean(R.bool.loop); + + if (loop == true) { + group.addHooker(new LoopVideoHooker()); // add it for common feature. + } + + return group; + } +} diff --git a/src/com/qcom/gallery3d/video/LoopVideoHooker.java b/src/org/codeaurora/gallery3d/video/LoopVideoHooker.java index 2b5380f5d..468e8a878 100755..100644 --- a/src/com/qcom/gallery3d/video/LoopVideoHooker.java +++ b/src/org/codeaurora/gallery3d/video/LoopVideoHooker.java @@ -1,49 +1,46 @@ -package com.qcom.gallery3d.video; +package org.codeaurora.gallery3d.video; import android.view.Menu; import android.view.MenuItem; import com.android.gallery3d.R; -import com.qcom.gallery3d.ext.MovieUtils; -import com.qcom.gallery3d.ext.QcomLog; +import org.codeaurora.gallery3d.ext.MovieUtils; public class LoopVideoHooker extends MovieHooker { + private static final String TAG = "LoopVideoHooker"; private static final boolean LOG = true; - private static final int MENU_LOOP = 1; - + private MenuItem mMenuLoopButton; - + @Override public boolean onCreateOptionsMenu(final Menu menu) { super.onCreateOptionsMenu(menu); mMenuLoopButton = menu.add(0, getMenuActivityId(MENU_LOOP), 0, R.string.loop); return true; } + @Override public boolean onPrepareOptionsMenu(final Menu menu) { super.onPrepareOptionsMenu(menu); updateLoop(); return true; } + @Override public boolean onOptionsItemSelected(final MenuItem item) { super.onOptionsItemSelected(item); - switch(getMenuOriginalId(item.getItemId())) { - case MENU_LOOP: - getPlayer().setLoop(!getPlayer().getLoop()); - updateLoop(); - return true; - default: - return false; + switch (getMenuOriginalId(item.getItemId())) { + case MENU_LOOP: + getPlayer().setLoop(!getPlayer().getLoop()); + return true; + default: + return false; } } - + private void updateLoop() { - if (LOG) { - QcomLog.v(TAG, "updateLoop() mLoopButton=" + mMenuLoopButton); - } if (mMenuLoopButton != null) { if (MovieUtils.isLocalFile(getMovieItem().getUri(), getMovieItem().getMimeType())) { mMenuLoopButton.setVisible(true); @@ -60,4 +57,4 @@ public class LoopVideoHooker extends MovieHooker { } } } -}
\ No newline at end of file +} diff --git a/src/com/qcom/gallery3d/video/MovieHooker.java b/src/org/codeaurora/gallery3d/video/MovieHooker.java index d5cbb347c..47e4bcee8 100755..100644 --- a/src/com/qcom/gallery3d/video/MovieHooker.java +++ b/src/org/codeaurora/gallery3d/video/MovieHooker.java @@ -1,21 +1,23 @@ -package com.qcom.gallery3d.video; +package org.codeaurora.gallery3d.video; -import com.qcom.gallery3d.ext.ActivityHooker; -import com.qcom.gallery3d.ext.IMovieItem; -import com.qcom.gallery3d.ext.IMoviePlayer; -import com.qcom.gallery3d.ext.QcomLog; +import android.util.Log; + +import org.codeaurora.gallery3d.ext.ActivityHooker; +import org.codeaurora.gallery3d.ext.IMovieItem; +import org.codeaurora.gallery3d.ext.IMoviePlayer; public class MovieHooker extends ActivityHooker { + private static final String TAG = "MovieHooker"; private static final boolean LOG = true; private IMovieItem mMovieItem; private IMoviePlayer mPlayer; - + @Override public void setParameter(final String key, final Object value) { super.setParameter(key, value); if (LOG) { - QcomLog.v(TAG, "setParameter(" + key + ", " + value + ")"); + Log.v(TAG, "setParameter(" + key + ", " + value + ")"); } if (value instanceof IMovieItem) { mMovieItem = (IMovieItem) value; @@ -25,14 +27,18 @@ public class MovieHooker extends ActivityHooker { onMoviePlayerChanged(mPlayer); } } - + public IMovieItem getMovieItem() { return mMovieItem; } + public IMoviePlayer getPlayer() { return mPlayer; } - - public void onMovieItemChanged(final IMovieItem item){} - public void onMoviePlayerChanged(final IMoviePlayer player){} + + public void onMovieItemChanged(final IMovieItem item) { + } + + public void onMoviePlayerChanged(final IMoviePlayer player) { + } } |