import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.view.ViewGroup;
import android.webkit.MimeTypeMap;
import android.widget.ImageView;
-import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
import com.owncloud.android.operations.RemoveFileOperation;
import com.owncloud.android.ui.activity.FileDetailActivity;
import com.owncloud.android.ui.activity.FileDisplayActivity;
-import com.owncloud.android.ui.activity.TransferServiceGetter;
import com.owncloud.android.ui.fragment.ConfirmationDialogFragment;
import com.owncloud.android.ui.fragment.FileDetailFragment;
import com.owncloud.android.ui.fragment.FileFragment;
public static final String EXTRA_FILE = "FILE";
public static final String EXTRA_ACCOUNT = "ACCOUNT";
private static final String EXTRA_PLAY_POSITION = "PLAY_POSITION";
+ private static final String EXTRA_PLAYING = "PLAYING";
private View mView;
private OCFile mFile;
private RemoteOperation mLastRemoteOperation;
private MediaServiceBinder mMediaServiceBinder = null;
- //private MediaController mMediaController = null;
private MediaControlView mMediaController = null;
private MediaServiceConnection mMediaServiceConnection = null;
private VideoHelper mVideoHelper;
+ private boolean mAutoplay;
private static final String TAG = PreviewMediaFragment.class.getSimpleName();
mAccount = ocAccount;
mSavedPlaybackPosition = 0;
mStorageManager = null; // we need a context to init this; the container activity is not available yet at this moment
+ mAutoplay = true;
}
mAccount = null;
mSavedPlaybackPosition = 0;
mStorageManager = null;
+ mAutoplay = true;
}
mView = inflater.inflate(R.layout.file_preview, container, false);
mImagePreview = (ImageView)mView.findViewById(R.id.image_preview);
- mImagePreview.setOnTouchListener(this);
mVideoPreview = (VideoView)mView.findViewById(R.id.video_preview);
+ mVideoPreview.setOnTouchListener(this);
mMediaController = (MediaControlView)mView.findViewById(R.id.media_controller);
- //updateFileDetails(false);
return mView;
}
mFile = savedInstanceState.getParcelable(PreviewMediaFragment.EXTRA_FILE);
mAccount = savedInstanceState.getParcelable(PreviewMediaFragment.EXTRA_ACCOUNT);
mSavedPlaybackPosition = savedInstanceState.getInt(PreviewMediaFragment.EXTRA_PLAY_POSITION);
+ mAutoplay = savedInstanceState.getBoolean(PreviewMediaFragment.EXTRA_PLAYING);
}
if (mFile == null) {
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
-
outState.putParcelable(PreviewMediaFragment.EXTRA_FILE, mFile);
outState.putParcelable(PreviewMediaFragment.EXTRA_ACCOUNT, mAccount);
- if (mVideoPreview.isPlaying()) {
- outState.putInt(PreviewMediaFragment.EXTRA_PLAY_POSITION , mVideoPreview.getCurrentPosition());
+ if (mFile.isVideo()) {
+ mSavedPlaybackPosition = mVideoPreview.getCurrentPosition();
+ mAutoplay = mVideoPreview.isPlaying();
+ outState.putInt(PreviewMediaFragment.EXTRA_PLAY_POSITION , mSavedPlaybackPosition);
+ outState.putBoolean(PreviewMediaFragment.EXTRA_PLAYING , mAutoplay);
+ } else {
+ outState.putInt(PreviewMediaFragment.EXTRA_PLAY_POSITION , mMediaServiceBinder.getCurrentPosition());
+ outState.putBoolean(PreviewMediaFragment.EXTRA_PLAYING , mMediaServiceBinder.isPlaying());
}
}
// load the video file in the video player ; when done, VideoHelper#onPrepared() will be called
mVideoPreview.setVideoPath(mFile.getStoragePath());
-
- //mVideoPreview.setMediaController(mMediaController);
}
*/
@Override
public void onPrepared(MediaPlayer vp) {
+ Log.e(TAG, "onPrepared");
mVideoPreview.seekTo(mSavedPlaybackPosition);
- mVideoPreview.start();
+ if (mAutoplay) {
+ mVideoPreview.start();
+ }
mMediaController.setEnabled(true);
mMediaController.updatePausePlay();
- //mMediaController.show(MediaService.MEDIA_CONTROL_SHORT_LIFE);
}
*/
@Override
public void onCompletion(MediaPlayer mp) {
- // nothing, right now
+ Log.e(TAG, "completed");
+ if (mp != null) {
+ mVideoPreview.seekTo(0);
+ // next lines are necessary to work around undesired video loops
+ if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD) {
+ mVideoPreview.pause();
+
+ } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD_MR1) {
+ // mVideePreview.pause() is not enough
+
+ mMediaController.setEnabled(false);
+ mVideoPreview.stopPlayback();
+ mAutoplay = false;
+ mSavedPlaybackPosition = 0;
+ mVideoPreview.setVideoPath(mFile.getStoragePath());
+ }
+ } // else : called from onError()
+ mMediaController.updatePausePlay();
}
*/
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
- Log.e(TAG, "Error in video playback, what = " + what + ", extra = " + extra);
-
- /*
- if (mMediaController != null) {
- mMediaController.hide();
- }
- */
-
if (mVideoPreview.getWindowToken() != null) {
String message = MediaService.getMessageForMediaError(getActivity(), what, extra);
new AlertDialog.Builder(getActivity())
@Override
- public void onResume() {
- super.onResume();
- }
-
-
- @Override
- public void onPause() {
- super.onPause();
- }
-
-
- @Override
public void onStop() {
super.onStop();
+
if (mMediaServiceConnection != null) {
Log.d(TAG, "Unbinding from MediaService ...");
if (mMediaServiceBinder != null && mMediaController != null) {
- //mMediaServiceBinder.unregisterMediaController(mMediaController);
+ mMediaServiceBinder.unregisterMediaController(mMediaController);
}
getActivity().unbindService(mMediaServiceConnection);
mMediaServiceConnection = null;
mMediaServiceBinder = null;
- /*
- if (mMediaController != null) {
- mMediaController.hide();
- mMediaController = null;
- }
- */
}
}
@Override
- public void onDestroy() {
- super.onDestroy();
- }
-
-
- @Override
public boolean onTouch(View v, MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- if (v == mImagePreview &&
- mMediaServiceBinder != null && mFile.isAudio() && mMediaServiceBinder.isPlaying(mFile)) {
- toggleMediaController(MediaService.MEDIA_CONTROL_PERMANENT);
- return true;
-
- } else if (v == mVideoPreview) {
- toggleMediaController(MediaService.MEDIA_CONTROL_SHORT_LIFE);
- return true;
- }
+ if (event.getAction() == MotionEvent.ACTION_DOWN && v == mVideoPreview) {
+ startFullScreenVideo();
+ return true;
}
return false;
}
- private void toggleMediaController(int time) {
- /*
- if (mMediaController.isShowing()) {
- mMediaController.hide();
- } else {
- mMediaController.show(time);
- }
- */
+ private void startFullScreenVideo() {
+ Intent i = new Intent(getActivity(), PreviewVideoActivity.class);
+ i.putExtra(PreviewVideoActivity.EXTRA_ACCOUNT, mAccount);
+ i.putExtra(PreviewVideoActivity.EXTRA_FILE, mFile);
+ i.putExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, mVideoPreview.isPlaying());
+ mVideoPreview.pause();
+ i.putExtra(PreviewVideoActivity.EXTRA_START_POSITION, mVideoPreview.getCurrentPosition());
+ startActivityForResult(i, 0);
}
+
+ @Override
+ public void onActivityResult (int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (resultCode == Activity.RESULT_OK) {
+ mSavedPlaybackPosition = data.getExtras().getInt(PreviewVideoActivity.EXTRA_START_POSITION);
+ mAutoplay = data.getExtras().getBoolean(PreviewVideoActivity.EXTRA_AUTOPLAY);
+ }
+ }
+
private void playAudio() {
if (!mMediaServiceBinder.isPlaying(mFile)) {
Log.d(TAG, "starting playback of " + mFile.getStoragePath());
- mMediaServiceBinder.start(mAccount, mFile);
+ mMediaServiceBinder.start(mAccount, mFile, mAutoplay, mSavedPlaybackPosition);
} else {
- if (!mMediaServiceBinder.isPlaying()) {
+ if (!mMediaServiceBinder.isPlaying() && mAutoplay) {
mMediaServiceBinder.start();
+ mMediaController.updatePausePlay();
}
- /*
- if (!mMediaController.isShowing() && isVisible()) {
- //mMediaController.show(MediaService.MEDIA_CONTROL_PERMANENT);
- // TODO - fix strange bug; steps to trigger :
- // 1. remove the "isVisible()" control
- // 2. start the app and preview an audio file
- // 3. exit from the app (home button, for instance) while the audio file is still being played
- // 4. go to notification bar and click on the "ownCloud music app" notification
- // PUM!
- }
- */
}
}
Log.d(TAG, "Media service connected");
mMediaServiceBinder = (MediaServiceBinder) service;
if (mMediaServiceBinder != null) {
- /*
- if (mMediaController == null) {
- mMediaController = new MediaController(getSherlockActivity());
- }
- */
prepareMediaController();
playAudio(); // do not wait for the touch of nobody to play audio
}
}
}
-
+
private void prepareMediaController() {
- //mMediaServiceBinder.registerMediaController(mMediaController);
+ mMediaServiceBinder.registerMediaController(mMediaController);
if (mMediaController != null) {
mMediaController.setMediaPlayer(mMediaServiceBinder);
mMediaController.setEnabled(true);
if (component.equals(new ComponentName(getActivity(), MediaService.class))) {
Log.e(TAG, "Media service suddenly disconnected");
if (mMediaController != null) {
- //mMediaController.hide();
mMediaController.setMediaPlayer(null);
- //mMediaController = null;
} else {
Toast.makeText(getActivity(), "No media controller to release when disconnected from media service", Toast.LENGTH_SHORT).show();
}
}
private void stopPreview(boolean stopAudio) {
- if (mMediaController != null) {
- //mMediaController.hide();
- }
if (mFile.isAudio() && stopAudio) {
mMediaServiceBinder.pause();