package de.luhmer.owncloudnewsreader.services.podcast;
import android.content.Context;
import android.media.MediaPlayer;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;
import java.io.IOException;
import de.luhmer.owncloudnewsreader.model.MediaItem;
import de.luhmer.owncloudnewsreader.model.PodcastItem;
/**
* Created by david on 31.01.17.
*/
public class MediaPlayerPlaybackService extends PlaybackService {
private static final String TAG = MediaPlayerPlaybackService.class.getCanonicalName();
private MediaPlayer mMediaPlayer;
private View parentResizableView;
public MediaPlayerPlaybackService(final Context context, PodcastStatusListener podcastStatusListener, MediaItem mediaItem) {
super(context, podcastStatusListener, mediaItem);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i2) {
setStatus(Status.FAILED);
Toast.makeText(context, "Failed to open podcast", Toast.LENGTH_LONG).show();
return false;
}
});
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
setStatus(Status.PAUSED);
play();
}
});
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
pause();//Send the over signal
podcastCompleted();
}
});
try {
setStatus(Status.PREPARING);
mMediaPlayer.setDataSource(((PodcastItem) mediaItem).link);
mMediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
setStatus(Status.FAILED);
}
}
@Override
public void destroy() {
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.release();
}
@Override
public void play() {
try {
int progress = mMediaPlayer.getCurrentPosition() / mMediaPlayer.getDuration();
if (progress >= 1) {
mMediaPlayer.seekTo(0);
}
setStatus(Status.PLAYING);
} catch (Exception ex) {
ex.printStackTrace();
}
mMediaPlayer.start();
populateVideo();
}
@Override
public void pause() {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
}
setStatus(Status.PAUSED);
}
@Override
public void seekTo(double percent) {
double totalDuration = mMediaPlayer.getDuration();
int position = (int) ((totalDuration / 100d) * percent);
mMediaPlayer.seekTo(position);
}
@Override
public int getCurrentDuration() {
if (mMediaPlayer != null && isMediaLoaded()) {
return mMediaPlayer.getCurrentPosition();
}
return 0;
}
@Override
public int getTotalDuration() {
if (mMediaPlayer != null && isMediaLoaded()) {
return mMediaPlayer.getDuration();
}
return 0;
}
@Override
public VideoType getVideoType() {
return ((PodcastItem) getMediaItem()).isVideoPodcast ? VideoType.Video : VideoType.None;
}
private void populateVideo() {
double videoHeightRel = (double) mSurfaceWidth / (double) mMediaPlayer.getVideoWidth();
int videoHeight = (int) (mMediaPlayer.getVideoHeight() * videoHeightRel);
if (mSurfaceWidth != 0 && videoHeight != 0 && mSurfaceHolder != null) {
//mSurfaceHolder.setFixedSize(mSurfaceWidth, videoHeight);
parentResizableView.getLayoutParams().height = videoHeight;
parentResizableView.setLayoutParams(parentResizableView.getLayoutParams());
}
}
public void setVideoView(SurfaceView surfaceView, View parentResizableView) {
if (surfaceView == null) {
mMediaPlayer.setDisplay(null);
Log.d(TAG, "Disable Screen output!");
mMediaPlayer.setScreenOnWhilePlaying(false);
} else {
if (surfaceView.getHolder() != mSurfaceHolder) {
this.parentResizableView = parentResizableView;
surfaceView.getHolder().addCallback(mSHCallback);
//videoOutput.surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
populateVideo();
Log.d(TAG, "Enable Screen output!");
}
}
}
private int mSurfaceWidth;
private int mSurfaceHeight;
private SurfaceHolder mSurfaceHolder;
SurfaceHolder.Callback mSHCallback = new SurfaceHolder.Callback()
{
public void surfaceChanged(SurfaceHolder holder, int format, int surfaceWidth, int surfaceHeight)
{
mSurfaceWidth = surfaceWidth;
mSurfaceHeight = surfaceHeight;
}
public void surfaceCreated(SurfaceHolder holder)
{
mSurfaceHolder = holder;
mMediaPlayer.setDisplay(mSurfaceHolder); //TODO required
mMediaPlayer.setScreenOnWhilePlaying(true); //TODO required
Log.d(TAG, "surfaceCreated");
}
public void surfaceDestroyed(SurfaceHolder holder)
{
Log.d(TAG, "surfaceDestroyed");
}
};
}