package info.guardianproject.securereaderinterface.views; import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnPreparedListener; import android.net.Uri; import android.os.Message; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.FrameLayout; import android.widget.MediaController; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.VideoView; import info.guardianproject.securereaderinterface.models.OnMediaOrientationListener; import info.guardianproject.securereaderinterface.R; public class VideoMediaContentView extends FrameLayout implements OnErrorListener, OnPreparedListener, OnCompletionListener, OnSeekBarChangeListener { private VideoView mVideoView; private MediaController mMediaController; private MediaPlayer mMP; private View mControllerView; private View mViewLoading; private View mBtnPlay; private View mBtnPause; private SeekBar mSeekbar; private boolean mIsTrackingThumb; private OnMediaOrientationListener mOrientationListener; public VideoMediaContentView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initView(context); } public VideoMediaContentView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public VideoMediaContentView(Context context) { super(context); initView(context); } private void initView(Context context) { View.inflate(context, R.layout.video_view, this); mVideoView = (VideoView) findViewById(R.id.content); mViewLoading = findViewById(R.id.frameLoading); mControllerView = LayoutInflater.from(getContext()).inflate(R.layout.video_view_controller, this, false); if (!isInEditMode()) { mViewLoading.setVisibility(View.INVISIBLE); mMediaController = new InternalMediaController(getContext()); mMediaController.setAnchorView(mVideoView); mVideoView.setMediaController(mMediaController); mVideoView.setOnErrorListener(this); mVideoView.setOnPreparedListener(this); mVideoView.setOnCompletionListener(this); } View btnCollapse = mControllerView.findViewById(R.id.btnCollapse); btnCollapse.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ((Activity) v.getContext()).finish(); } }); mBtnPlay = mControllerView.findViewById(R.id.btnPlay); mBtnPlay.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mVideoView.start(); mBtnPlay.setVisibility(View.INVISIBLE); mBtnPause.setVisibility(View.VISIBLE); } }); mBtnPause = mControllerView.findViewById(R.id.btnPause); mBtnPause.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mVideoView.pause(); mBtnPlay.setVisibility(View.VISIBLE); mBtnPause.setVisibility(View.INVISIBLE); } }); mSeekbar = (SeekBar) mControllerView.findViewById(R.id.seekbar); } public void setContentUri(Uri uri) { mVideoView.setVideoURI(uri); mViewLoading.setVisibility(View.VISIBLE); } /** * Sets a listener that will be notified when media has been downloaded and * it is known whether this media is in landscape or portrait mode. * * @param listener */ public void setOnMediaOrientationListener(OnMediaOrientationListener listener) { this.mOrientationListener = listener; } private class InternalMediaController extends MediaController { public InternalMediaController(Context context) { super(context); } @Override public void setAnchorView(View view) { super.setAnchorView(view); this.removeAllViews(); addView(mControllerView); } } public MediaPlayer getMediaPlayer() { return mMP; } @Override public void onPrepared(final MediaPlayer mp) { if (mOrientationListener != null) { boolean isPortrait = mp.getVideoHeight() > mp.getVideoWidth(); mOrientationListener.onMediaOrientation(this, isPortrait ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } mMP = mp; mViewLoading.setVisibility(View.GONE); mp.start(); mBtnPlay.setVisibility(View.INVISIBLE); mBtnPause.setVisibility(View.VISIBLE); mMediaController.show(); mSeekbar.setOnSeekBarChangeListener(this); mSeekbar.setMax(mp.getDuration()); new Thread(new Runnable() { @Override public void run() { try { while (mp != null && mp.getCurrentPosition() < mp.getDuration()) { if (!mIsTrackingThumb) mSeekbar.setProgress(mp.getCurrentPosition()); Message msg = new Message(); int millis = mp.getCurrentPosition(); msg.obj = millis / 1000; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } }).start(); } @Override public boolean onError(MediaPlayer mp, int what, int extra) { // TODO - show error mViewLoading.setVisibility(View.GONE); mBtnPlay.setVisibility(View.VISIBLE); mBtnPause.setVisibility(View.INVISIBLE); return false; } @Override public void onCompletion(MediaPlayer mp) { mBtnPlay.setVisibility(View.VISIBLE); mBtnPause.setVisibility(View.INVISIBLE); mVideoView.seekTo(0); mSeekbar.setProgress(0); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (mIsTrackingThumb) mMediaController.show(); } @Override public void onStartTrackingTouch(SeekBar seekBar) { mIsTrackingThumb = true; } @Override public void onStopTrackingTouch(SeekBar seekBar) { if (getMediaPlayer() != null) getMediaPlayer().seekTo(seekBar.getProgress()); mIsTrackingThumb = false; } }