diff options
Diffstat (limited to 'src/de/podfetcher/activity/MediaplayerActivity.java')
-rw-r--r-- | src/de/podfetcher/activity/MediaplayerActivity.java | 211 |
1 files changed, 129 insertions, 82 deletions
diff --git a/src/de/podfetcher/activity/MediaplayerActivity.java b/src/de/podfetcher/activity/MediaplayerActivity.java index 24dc29acc..f5aaab455 100644 --- a/src/de/podfetcher/activity/MediaplayerActivity.java +++ b/src/de/podfetcher/activity/MediaplayerActivity.java @@ -6,6 +6,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; +import android.content.SharedPreferences; import android.media.MediaPlayer; import android.os.AsyncTask; import android.os.Bundle; @@ -22,7 +23,9 @@ import android.widget.TextView; import com.actionbarsherlock.app.SherlockActivity; import com.actionbarsherlock.view.Menu; +import de.podfetcher.PodcastApp; import de.podfetcher.R; +import de.podfetcher.feed.FeedManager; import de.podfetcher.feed.FeedMedia; import de.podfetcher.service.PlaybackService; import de.podfetcher.service.PlayerStatus; @@ -30,16 +33,18 @@ import de.podfetcher.util.Converter; public class MediaplayerActivity extends SherlockActivity { private final String TAG = "MediaplayerActivity"; - - private static final int DEFAULT_SEEK_DELTA = 30000; // Seek-Delta to use when using FF or Rev Buttons - + + private static final int DEFAULT_SEEK_DELTA = 30000; // Seek-Delta to use + // when using FF or + // Rev Buttons + private PlaybackService playbackService; private MediaPositionObserver positionObserver; - + private FeedMedia media; private PlayerStatus status; - - + private FeedManager manager; + // Widgets private ImageView imgvCover; private TextView txtvStatus; @@ -49,7 +54,7 @@ public class MediaplayerActivity extends SherlockActivity { private ImageButton butPlay; private ImageButton butRev; private ImageButton butFF; - + @Override protected void onStop() { super.onStop(); @@ -66,15 +71,13 @@ public class MediaplayerActivity extends SherlockActivity { // TODO Auto-generated method stub return super.onCreateOptionsMenu(menu); } - - @Override protected void onResume() { super.onResume(); Log.d(TAG, "Resuming Activity"); bindToService(); - registerReceiver(statusUpdate, new IntentFilter(PlaybackService.ACTION_PLAYER_STATUS_CHANGED)); + } @Override @@ -82,22 +85,47 @@ public class MediaplayerActivity extends SherlockActivity { super.onCreate(savedInstanceState); Log.d(TAG, "Creating Activity"); this.setContentView(R.layout.mediaplayer_activity); - + manager = FeedManager.getInstance(); setupGUI(); bindToService(); - registerReceiver(statusUpdate, new IntentFilter(PlaybackService.ACTION_PLAYER_STATUS_CHANGED)); } - + private void bindToService() { - if(!bindService(new Intent(this, PlaybackService.class), mConnection, 0)) { - status = PlayerStatus.STOPPED; - handleStatus(); + Intent serviceIntent = new Intent(this, PlaybackService.class); + boolean bound = false; + if (!PlaybackService.isRunning) { + Log.d(TAG, "Trying to restore last played media"); + SharedPreferences prefs = getApplicationContext() + .getSharedPreferences(PodcastApp.PREF_NAME, 0); + long mediaId = prefs.getLong(PlaybackService.PREF_LAST_PLAYED_ID, + -1); + long feedId = prefs.getLong( + PlaybackService.PREF_LAST_PLAYED_FEED_ID, -1); + if (mediaId != -1 && feedId != -1) { + serviceIntent.putExtra(PlaybackService.EXTRA_FEED_ID, feedId); + serviceIntent.putExtra(PlaybackService.EXTRA_MEDIA_ID, mediaId); + serviceIntent.putExtra( + PlaybackService.EXTRA_START_WHEN_PREPARED, false); + serviceIntent.putExtra(PlaybackService.EXTRA_SHOULD_STREAM, + prefs.getBoolean(PlaybackService.PREF_LAST_IS_STREAM, + true)); + startService(serviceIntent); + bound = bindService(serviceIntent, mConnection, + Context.BIND_AUTO_CREATE); + } else { + Log.d(TAG, "No last played media found"); + status = PlayerStatus.STOPPED; + handleStatus(); + } + } else { + bound = bindService(serviceIntent, mConnection, 0); } + Log.d(TAG, "Result for service binding: " + bound); } - + private void handleStatus() { switch (status) { - + case ERROR: setStatusMsg(R.string.player_error_msg, View.VISIBLE); handleError(); @@ -120,51 +148,73 @@ public class MediaplayerActivity extends SherlockActivity { case PREPARING: setStatusMsg(R.string.player_preparing_msg, View.VISIBLE); break; + case STOPPED: + setStatusMsg(R.string.player_stopped_msg, View.VISIBLE); + imgvCover.setImageBitmap(null); + break; + case PREPARED: + loadMediaInfo(); + setStatusMsg(R.string.player_ready_msg, View.VISIBLE); + butPlay.setImageResource(android.R.drawable.ic_media_play); } } - + private void setStatusMsg(int resId, int visibility) { - if(visibility == View.VISIBLE) { + if (visibility == View.VISIBLE) { txtvStatus.setText(resId); } txtvStatus.setVisibility(visibility); } - + private void setupPositionObserver() { - if (positionObserver == null) { + if (positionObserver == null || positionObserver.isCancelled()) { positionObserver = new MediaPositionObserver() { @Override - protected void onProgressUpdate(Integer... values) { - super.onProgressUpdate(values); - txtvPosition.setText( - Converter.getDurationStringLong(values[0])); - - float progress = ((float) values[0]) / getDuration(); - sbPosition.setProgress((int) (progress * 100)); + protected void onProgressUpdate(Void... v) { + super.onProgressUpdate(); + txtvPosition.setText(Converter + .getDurationStringLong(playbackService.getPlayer() + .getCurrentPosition())); + + updateProgressbarPosition(); } - + }; positionObserver.execute(playbackService.getPlayer()); } } - + + private void updateProgressbarPosition() { + MediaPlayer player = playbackService.getPlayer(); + float progress = ((float) player.getCurrentPosition()) + / player.getDuration(); + sbPosition.setProgress((int) (progress * sbPosition.getMax())); + } + private void loadMediaInfo() { if (media != null) { MediaPlayer player = playbackService.getPlayer(); - + getSupportActionBar().setSubtitle(media.getItem().getTitle()); - getSupportActionBar().setTitle( - media.getItem().getFeed().getTitle()); - - imgvCover.setImageBitmap( - media.getItem().getFeed().getImage().getImageBitmap()); - - txtvPosition.setText(Converter.getDurationStringLong((player.getCurrentPosition()))); - txtvLength.setText(Converter.getDurationStringLong(player.getDuration())); + getSupportActionBar() + .setTitle(media.getItem().getFeed().getTitle()); + + imgvCover.setImageBitmap(media.getItem().getFeed().getImage() + .getImageBitmap()); + + txtvPosition.setText(Converter.getDurationStringLong((player + .getCurrentPosition()))); + txtvLength.setText(Converter.getDurationStringLong(player + .getDuration())); + if (playbackService != null) { + updateProgressbarPosition(); + } else { + sbPosition.setProgress(0); + } } } - + private void setupGUI() { imgvCover = (ImageView) findViewById(R.id.imgvCover); txtvPosition = (TextView) findViewById(R.id.txtvPosition); @@ -174,22 +224,23 @@ public class MediaplayerActivity extends SherlockActivity { butPlay = (ImageButton) findViewById(R.id.butPlay); butRev = (ImageButton) findViewById(R.id.butRev); butFF = (ImageButton) findViewById(R.id.butFF); - + sbPosition.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { int duration; float prog; - + @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { prog = progress / 100.0f; duration = playbackService.getPlayer().getDuration(); - txtvPosition.setText(Converter.getDurationStringLong((int) (prog * duration))); + txtvPosition.setText(Converter + .getDurationStringLong((int) (prog * duration))); } - + } - + @Override public void onStartTrackingTouch(SeekBar seekBar) { // interrupt position Observer, restart later @@ -198,25 +249,26 @@ public class MediaplayerActivity extends SherlockActivity { positionObserver = null; } } - + @Override public void onStopTrackingTouch(SeekBar seekBar) { playbackService.seek((int) (prog * duration)); setupPositionObserver(); } }); - + butPlay.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (status == PlayerStatus.PLAYING) { playbackService.pause(); - } else if (status == PlayerStatus.PAUSED) { + } else if (status == PlayerStatus.PAUSED + || status == PlayerStatus.PREPARED) { playbackService.play(); } - } + } }); - + butFF.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -225,7 +277,7 @@ public class MediaplayerActivity extends SherlockActivity { } } }); - + butRev.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -235,17 +287,19 @@ public class MediaplayerActivity extends SherlockActivity { } }); } - - + private void handleError() { // TODO implement } - + private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { - playbackService = ((PlaybackService.LocalBinder)service).getService(); + playbackService = ((PlaybackService.LocalBinder) service) + .getService(); status = playbackService.getStatus(); media = playbackService.getMedia(); + registerReceiver(statusUpdate, new IntentFilter( + PlaybackService.ACTION_PLAYER_STATUS_CHANGED)); handleStatus(); Log.d(TAG, "Connection to Service established"); } @@ -254,55 +308,48 @@ public class MediaplayerActivity extends SherlockActivity { public void onServiceDisconnected(ComponentName name) { playbackService = null; Log.d(TAG, "Disconnected from Service"); - + } }; - + private BroadcastReceiver statusUpdate = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - Log.d(TAG, "Received statusUpdate Intent."); + Log.d(TAG, "Received statusUpdate Intent."); status = playbackService.getStatus(); handleStatus(); } }; - + /** Refreshes the current position of the media file that is playing. */ - public class MediaPositionObserver extends AsyncTask<MediaPlayer, Integer, Boolean> { - + public class MediaPositionObserver extends + AsyncTask<MediaPlayer, Void, Void> { + private static final int WAITING_INTERVALL = 1000; private MediaPlayer player; - private int duration; - + @Override - protected void onCancelled(Boolean result) { + protected void onCancelled() { Log.d(TAG, "Task was cancelled"); } - + @Override - protected Boolean doInBackground(MediaPlayer... p) { + protected Void doInBackground(MediaPlayer... p) { Log.d(TAG, "Background Task started"); player = p[0]; - duration = player.getDuration(); - - while(player.isPlaying() && !isCancelled()) { + + while (player.isPlaying() && !isCancelled()) { try { Thread.sleep(WAITING_INTERVALL); - } catch(InterruptedException e) { - Log.d(TAG, "Thread was interrupted while waiting. Finishing now"); - return false; + } catch (InterruptedException e) { + Log.d(TAG, + "Thread was interrupted while waiting. Finishing now"); } - publishProgress(player.getCurrentPosition()); + publishProgress(); } Log.d(TAG, "Background Task finished"); - return true; - } - - public int getDuration() { - return duration; + return null; } } - - - + } |