Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/news-android.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastPlaybackService.java')
-rw-r--r--News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastPlaybackService.java298
1 files changed, 298 insertions, 0 deletions
diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastPlaybackService.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastPlaybackService.java
new file mode 100644
index 00000000..61c935ff
--- /dev/null
+++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastPlaybackService.java
@@ -0,0 +1,298 @@
+package de.luhmer.owncloudnewsreader.services;
+
+import android.app.Service;
+import android.content.Intent;
+import android.media.MediaPlayer;
+import android.os.Handler;
+import android.os.IBinder;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.View;
+
+import java.io.IOException;
+
+import de.greenrobot.event.EventBus;
+import de.luhmer.owncloudnewsreader.R;
+import de.luhmer.owncloudnewsreader.events.podcast.NewPodcastPlaybackListener;
+import de.luhmer.owncloudnewsreader.events.podcast.OpenPodcastEvent;
+import de.luhmer.owncloudnewsreader.events.podcast.RegisterVideoOutput;
+import de.luhmer.owncloudnewsreader.events.podcast.TogglePlayerStateEvent;
+import de.luhmer.owncloudnewsreader.events.podcast.UpdatePodcastStatusEvent;
+import de.luhmer.owncloudnewsreader.events.podcast.WindPodcast;
+import de.luhmer.owncloudnewsreader.view.PodcastNotification;
+
+public class PodcastPlaybackService extends Service {
+
+ private static final String TAG = "PodcastPlaybackService";
+ PodcastNotification podcastNotification;
+
+ @Override
+ public void onCreate() {
+ podcastNotification = new PodcastNotification(this);
+
+ mediaTitle = getString(R.string.no_podcast_selected);
+
+ super.onCreate();
+ }
+
+ public PodcastPlaybackService() {
+ mMediaPlayer = new MediaPlayer();
+ mHandler = new Handler();
+ eventBus = EventBus.getDefault();
+
+ eventBus.register(this);
+
+ mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
+ @Override
+ public void onPrepared(MediaPlayer mediaPlayer) {
+ play();
+ isPreparing = false;
+ canCallGetDuration = true;
+ }
+ });
+
+ mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
+ @Override
+ public void onCompletion(MediaPlayer mediaPlayer) {
+ pause();//Send the over signal
+ }
+ });
+
+
+ eventBus.post(new PodcastPlaybackServiceStarted());
+
+ mHandler.postDelayed(mUpdateTimeTask, 0);
+
+ //openFile("/sdcard/Music/#Musik/Finest Tunes/Netsky - Running Low (Ft. Beth Ditto).mp3");
+ }
+
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ return Service.START_STICKY;
+ //return super.onStartCommand(intent, flags, startId);
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ //throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+
+ private EventBus eventBus;
+ private Handler mHandler;
+ private MediaPlayer mMediaPlayer;
+ private String mediaTitle;
+ View parentResizableView;
+
+ public static final int delay = 500; //In milliseconds
+
+ private boolean canCallGetDuration = false;//Otherwise the player would call getDuration all the time without loading a media file
+ private boolean isPreparing = false;
+ private boolean isVideoFile = false;
+
+ public void openFile(String pathToFile, String mediaTitle) {
+ try {
+ if(mMediaPlayer.isPlaying())
+ pause();
+
+ this.mediaTitle = mediaTitle;
+
+ isPreparing = true;
+ mHandler.postDelayed(mUpdateTimeTask, 0);
+
+ mMediaPlayer.reset();
+ mMediaPlayer.setDataSource(pathToFile);
+ mMediaPlayer.prepareAsync();
+ } catch (IOException e) {
+ e.printStackTrace();
+ isPreparing = false;
+ }
+ }
+
+ /**
+ * Background Runnable thread
+ * */
+ private Runnable mUpdateTimeTask = new Runnable() {
+ public void run() {
+ sendMediaStatus();
+
+ mHandler.postDelayed(this, delay);
+ }
+ };
+
+ public void onEvent(TogglePlayerStateEvent event) {
+ if(mMediaPlayer.isPlaying()) {
+ pause();
+ } else {
+ play();
+ }
+ }
+
+ public void onEvent(WindPodcast event) {
+ if(mMediaPlayer != null) {
+ double totalDuration = mMediaPlayer.getDuration();
+ int position = (int)((totalDuration / 100d) * event.toPositionInPercent);
+ mMediaPlayer.seekTo(position);
+ }
+ }
+
+ public void onEventBackgroundThread(OpenPodcastEvent event) {
+ this.isVideoFile = event.isVideoFile;
+ openFile(event.pathToFile, event.mediaTitle);
+ }
+
+ public void onEvent(RegisterVideoOutput videoOutput) {
+ if(mMediaPlayer != null) {
+ if(videoOutput.surfaceView == null) {
+ mMediaPlayer.setDisplay(null);
+ Log.d(TAG, "Disable Screen output!");
+
+ mMediaPlayer.setScreenOnWhilePlaying(false);
+ } else {
+ if(videoOutput.surfaceView.getHolder() != mSurfaceHolder) {
+ parentResizableView = videoOutput.parentResizableView;
+
+ videoOutput.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!");
+ }
+ }
+ }
+ }
+
+ public void onEvent(NewPodcastPlaybackListener newListener) {
+ sendMediaStatus();
+ }
+
+
+
+
+ public void play() {
+ try {
+ int progress = mMediaPlayer.getCurrentPosition() / mMediaPlayer.getDuration();
+ if (progress >= 1) {
+ mMediaPlayer.seekTo(0);
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+
+ mMediaPlayer.start();
+
+ mHandler.removeCallbacks(mUpdateTimeTask);
+ mHandler.postDelayed(mUpdateTimeTask, 0);
+
+ populateVideo();
+ }
+
+ 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 pause() {
+ if(mMediaPlayer.isPlaying())
+ mMediaPlayer.pause();
+
+ mHandler.removeCallbacks(mUpdateTimeTask);
+ sendMediaStatus();
+ }
+
+ public void sendMediaStatus() {
+ long totalDuration = 0;
+ long currentDuration = 0;
+ if(!isPreparing && canCallGetDuration) {
+ totalDuration = mMediaPlayer.getDuration();
+ currentDuration = mMediaPlayer.getCurrentPosition();
+ }
+
+ /*
+ // Displaying Total Duration time
+ songTotalDurationLabel.setText(""+utils.milliSecondsToTimer(totalDuration));
+ // Displaying time completed playing
+ songCurrentDurationLabel.setText(""+utils.milliSecondsToTimer(currentDuration));
+
+ // Updating progress bar
+ int progress = (int)(utils.getProgressPercentage(currentDuration, totalDuration));
+ //Log.d("Progress", ""+progress);
+ songProgressBar.setProgress(progress);
+ */
+
+ UpdatePodcastStatusEvent audioPodcastEvent = new UpdatePodcastStatusEvent(currentDuration, totalDuration, mMediaPlayer.isPlaying(), mediaTitle, isPreparing, canCallGetDuration, isVideoFile);
+ eventBus.post(audioPodcastEvent);
+ }
+
+
+ public class PodcastPlaybackServiceStarted {
+
+ }
+
+ /*
+ public class VideoAvailableState {
+ public VideoAvailableState(boolean isVideoAvailable) {
+ this.isVideoAvailable = isVideoAvailable;
+ }
+
+ public boolean isVideoAvailable;
+ }
+ */
+
+
+
+ int mSurfaceWidth;
+ int mSurfaceHeight;
+ SurfaceHolder mSurfaceHolder;
+ SurfaceHolder.Callback mSHCallback = new SurfaceHolder.Callback()
+ {
+ public void surfaceChanged(SurfaceHolder holder, int format, int surfaceWidth, int surfaceHeight)
+ {
+ mSurfaceWidth = surfaceWidth;
+ mSurfaceHeight = surfaceHeight;
+
+ //populateVideo();
+
+ //Log.d(TAG, "surfaceChanged");
+
+ /*
+ if (!isPreparing && mVideoWidth == w && mVideoHeight == h) {
+ if (mSeekWhenPrepared != 0) {
+ mMediaPlayer.seekTo(mSeekWhenPrepared);
+ }
+ mMediaPlayer.start();
+ if (mMediaController != null) {
+ mMediaController.show();
+ }
+ }
+ */
+ }
+
+ public void surfaceCreated(SurfaceHolder holder)
+ {
+ mSurfaceHolder = holder;
+ mMediaPlayer.setDisplay(mSurfaceHolder);
+
+ mMediaPlayer.setScreenOnWhilePlaying(true);
+
+ Log.d(TAG, "surfaceCreated");
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder)
+ {
+ Log.d(TAG, "surfaceDestroyed");
+ }
+ };
+
+
+}