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 /src/com/android/gallery3d/app/MoviePlayer.java | |
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
Diffstat (limited to 'src/com/android/gallery3d/app/MoviePlayer.java')
-rw-r--r-- | src/com/android/gallery3d/app/MoviePlayer.java | 112 |
1 files changed, 108 insertions, 4 deletions
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 { |