summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLikai Ding <likaid@codeaurora.org>2013-08-14 14:27:58 +0800
committeremancebo <emancebo@cyngn.com>2014-09-04 10:40:17 -0700
commit76b5081f3e6d39c4466b213e4a71fd4b210a6559 (patch)
tree9c315bedc5065ca49cf292198987260fbdcd7fbc /src
parent2f15566fdc3dc524f3710715de9b004e2efcfae3 (diff)
downloadandroid_packages_apps_Gallery2-76b5081f3e6d39c4466b213e4a71fd4b210a6559.tar.gz
android_packages_apps_Gallery2-76b5081f3e6d39c4466b213e4a71fd4b210a6559.tar.bz2
android_packages_apps_Gallery2-76b5081f3e6d39c4466b213e4a71fd4b210a6559.zip
Gallery2: support loop/single video play mode
(cherry picked new files from commit id 990c6d43ea7c184846e19d41bef0d93aee4e581b) Change-Id: I0f55dfdfe812262804e7e45c99c7c9bbc5fb7503
Diffstat (limited to 'src')
-rwxr-xr-xsrc/com/qcom/gallery3d/ext/ActivityHooker.java87
-rwxr-xr-xsrc/com/qcom/gallery3d/ext/ActivityHookerGroup.java144
-rwxr-xr-xsrc/com/qcom/gallery3d/ext/IActivityHooker.java118
-rwxr-xr-xsrc/com/qcom/gallery3d/ext/IMovieItem.java58
-rwxr-xr-xsrc/com/qcom/gallery3d/ext/IMoviePlayer.java36
-rwxr-xr-xsrc/com/qcom/gallery3d/ext/MovieItem.java115
-rwxr-xr-xsrc/com/qcom/gallery3d/ext/MovieUtils.java89
-rwxr-xr-xsrc/com/qcom/gallery3d/video/ExtensionHelper.java88
-rwxr-xr-xsrc/com/qcom/gallery3d/video/LoopVideoHooker.java63
-rwxr-xr-xsrc/com/qcom/gallery3d/video/MovieHooker.java38
10 files changed, 836 insertions, 0 deletions
diff --git a/src/com/qcom/gallery3d/ext/ActivityHooker.java b/src/com/qcom/gallery3d/ext/ActivityHooker.java
new file mode 100755
index 000000000..3d1999bc1
--- /dev/null
+++ b/src/com/qcom/gallery3d/ext/ActivityHooker.java
@@ -0,0 +1,87 @@
+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;
+/**
+ * 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++;
+ mMenuId = sMenuId * MENU_MAX_NUMBER;
+ }
+ }
+
+ @Override
+ public int getMenuActivityId(int id) {
+ return mMenuId + id;
+ };
+
+ @Override
+ 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;
+ }
+
+ @Override
+ 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;
+ }
+
+ @Override
+ public void setParameter(String key, Object value) {
+ }
+}
diff --git a/src/com/qcom/gallery3d/ext/ActivityHookerGroup.java b/src/com/qcom/gallery3d/ext/ActivityHookerGroup.java
new file mode 100755
index 000000000..b1da185fd
--- /dev/null
+++ b/src/com/qcom/gallery3d/ext/ActivityHookerGroup.java
@@ -0,0 +1,144 @@
+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;
+
+import java.util.ArrayList;
+
+/**
+ * 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) {
+ super.onCreateOptionsMenu(menu);
+ boolean handle = false;
+ for (IActivityHooker hook : mHooks) {
+ boolean one = hook.onCreateOptionsMenu(menu);
+ if (!handle) {
+ handle = one;
+ }
+ }
+ return handle;
+ }
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ super.onPrepareOptionsMenu(menu);
+ boolean handle = false;
+ for (IActivityHooker hook : mHooks) {
+ boolean one = hook.onPrepareOptionsMenu(menu);
+ if (!handle) {
+ handle = one;
+ }
+ }
+ return handle;
+ }
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ super.onOptionsItemSelected(item);
+ boolean handle = false;
+ for (IActivityHooker hook : mHooks) {
+ boolean one = hook.onOptionsItemSelected(item);
+ if (!handle) {
+ handle = one;
+ }
+ }
+ return handle;
+ }
+
+ @Override
+ public void setParameter(String key, Object value) {
+ super.setParameter(key, value);
+ for (IActivityHooker hook : mHooks) {
+ hook.setParameter(key, value);
+ }
+ }
+
+ @Override
+ public void init(Activity context, Intent intent) {
+ super.init(context, intent);
+ for (IActivityHooker hook : mHooks) {
+ hook.init(context, intent);
+ }
+ }
+}
diff --git a/src/com/qcom/gallery3d/ext/IActivityHooker.java b/src/com/qcom/gallery3d/ext/IActivityHooker.java
new file mode 100755
index 000000000..3be707c6d
--- /dev/null
+++ b/src/com/qcom/gallery3d/ext/IActivityHooker.java
@@ -0,0 +1,118 @@
+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/IMovieItem.java b/src/com/qcom/gallery3d/ext/IMovieItem.java
new file mode 100755
index 000000000..6c7f4dd20
--- /dev/null
+++ b/src/com/qcom/gallery3d/ext/IMovieItem.java
@@ -0,0 +1,58 @@
+package com.qcom.gallery3d.ext;
+
+import android.net.Uri;
+/**
+ * Movie info class
+ */
+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);
+
+ /**
+ * 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/com/qcom/gallery3d/ext/IMoviePlayer.java b/src/com/qcom/gallery3d/ext/IMoviePlayer.java
new file mode 100755
index 000000000..3a353639c
--- /dev/null
+++ b/src/com/qcom/gallery3d/ext/IMoviePlayer.java
@@ -0,0 +1,36 @@
+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/ext/MovieItem.java b/src/com/qcom/gallery3d/ext/MovieItem.java
new file mode 100755
index 000000000..2da1c2628
--- /dev/null
+++ b/src/com/qcom/gallery3d/ext/MovieItem.java
@@ -0,0 +1,115 @@
+package com.qcom.gallery3d.ext;
+
+import android.net.Uri;
+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 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;
+ 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);
+ }
+
+ 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;
+// }
+
+ 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 setError() {
+ mError = true;
+ }
+
+ @Override
+ public Uri getOriginalUri() {
+ return mOriginal;
+ }
+
+ @Override
+ 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();
+ }
+} \ No newline at end of file
diff --git a/src/com/qcom/gallery3d/ext/MovieUtils.java b/src/com/qcom/gallery3d/ext/MovieUtils.java
new file mode 100755
index 000000000..16b7b6375
--- /dev/null
+++ b/src/com/qcom/gallery3d/ext/MovieUtils.java
@@ -0,0 +1,89 @@
+package com.qcom.gallery3d.ext;
+
+import android.net.Uri;
+
+import java.util.Locale;
+
+/**
+ * Util class for Movie functions. *
+ */
+public class MovieUtils {
+ private static final String TAG = "MovieUtils";
+ private static final boolean LOG = true;
+
+ private MovieUtils() {}
+ /**
+ * Whether current video(Uri) is RTSP streaming or not.
+ * @param uri
+ * @param mimeType
+ * @return
+ */
+ public static boolean isRtspStreaming(Uri uri, String mimeType) {
+ boolean rtsp = false;
+ if (uri != null) {
+ if ("rtsp".equalsIgnoreCase(uri.getScheme())) {
+ rtsp = true;
+ }
+ }
+ if (LOG) {
+ QcomLog.v(TAG, "isRtspStreaming(" + uri + ", " + mimeType + ") return " + rtsp);
+ }
+ return rtsp;
+ }
+ /**
+ * Whether current video(Uri) is HTTP streaming or not.
+ * @param uri
+ * @param mimeType
+ * @return
+ */
+ public static boolean isHttpStreaming(Uri uri, String mimeType) {
+ boolean http = false;
+ if (uri != null) {
+ if ("http".equalsIgnoreCase(uri.getScheme())) {
+ http = true;
+ } else if ("https".equalsIgnoreCase(uri.getScheme())) {
+ http = true;
+ }
+ }
+ if (LOG) {
+ QcomLog.v(TAG, "isHttpStreaming(" + uri + ", " + mimeType + ") return " + http);
+ }
+ return http;
+ }
+ /**
+ * Whether current video(Uri) is live streaming or not.
+ * @param uri
+ * @param mimeType
+ * @return
+ */
+ public static boolean isSdpStreaming(Uri uri, String mimeType) {
+ boolean sdp = false;
+ if (uri != null) {
+ if ("application/sdp".equals(mimeType)) {
+ sdp = true;
+ } else if (uri.toString().toLowerCase(Locale.ENGLISH).endsWith(".sdp")) {
+ sdp = true;
+ }
+ }
+ if (LOG) {
+ QcomLog.v(TAG, "isSdpStreaming(" + uri + ", " + mimeType + ") return " + sdp);
+ }
+ return sdp;
+ }
+
+ /**
+ * Whether current video(Uri) is local file or not.
+ * @param uri
+ * @param mimeType
+ * @return
+ */
+ public static boolean isLocalFile(Uri uri, String mimeType) {
+ boolean local = (!isSdpStreaming(uri, mimeType)
+ && !isRtspStreaming(uri, mimeType)
+ && !isHttpStreaming(uri, mimeType));
+ if (LOG) {
+ QcomLog.v(TAG, "isLocalFile(" + uri + ", " + mimeType + ") return " + local);
+ }
+ return local;
+ }
+}
diff --git a/src/com/qcom/gallery3d/video/ExtensionHelper.java b/src/com/qcom/gallery3d/video/ExtensionHelper.java
new file mode 100755
index 000000000..ae667eeb5
--- /dev/null
+++ b/src/com/qcom/gallery3d/video/ExtensionHelper.java
@@ -0,0 +1,88 @@
+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/video/LoopVideoHooker.java b/src/com/qcom/gallery3d/video/LoopVideoHooker.java
new file mode 100755
index 000000000..2b5380f5d
--- /dev/null
+++ b/src/com/qcom/gallery3d/video/LoopVideoHooker.java
@@ -0,0 +1,63 @@
+package com.qcom.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;
+
+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;
+ }
+ }
+
+ private void updateLoop() {
+ if (LOG) {
+ QcomLog.v(TAG, "updateLoop() mLoopButton=" + mMenuLoopButton);
+ }
+ if (mMenuLoopButton != null) {
+ if (MovieUtils.isLocalFile(getMovieItem().getUri(), getMovieItem().getMimeType())) {
+ mMenuLoopButton.setVisible(true);
+ } else {
+ mMenuLoopButton.setVisible(false);
+ }
+ final boolean newLoop = getPlayer().getLoop();
+ if (newLoop) {
+ mMenuLoopButton.setTitle(R.string.single);
+ mMenuLoopButton.setIcon(R.drawable.ic_menu_unloop);
+ } else {
+ mMenuLoopButton.setTitle(R.string.loop);
+ mMenuLoopButton.setIcon(R.drawable.ic_menu_loop);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/com/qcom/gallery3d/video/MovieHooker.java b/src/com/qcom/gallery3d/video/MovieHooker.java
new file mode 100755
index 000000000..d5cbb347c
--- /dev/null
+++ b/src/com/qcom/gallery3d/video/MovieHooker.java
@@ -0,0 +1,38 @@
+package com.qcom.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;
+
+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 + ")");
+ }
+ if (value instanceof IMovieItem) {
+ mMovieItem = (IMovieItem) value;
+ onMovieItemChanged(mMovieItem);
+ } else if (value instanceof IMoviePlayer) {
+ mPlayer = (IMoviePlayer) value;
+ onMoviePlayerChanged(mPlayer);
+ }
+ }
+
+ public IMovieItem getMovieItem() {
+ return mMovieItem;
+ }
+ public IMoviePlayer getPlayer() {
+ return mPlayer;
+ }
+
+ public void onMovieItemChanged(final IMovieItem item){}
+ public void onMoviePlayerChanged(final IMoviePlayer player){}
+}