package com.oreilly.demo.android.pa.audioplayer;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class AudioPlayer extends Activity implements OnSeekBarChangeListener, Runnable, OnCompletionListener {
public static final String AUDIOFILEURI = "AudioFileUri";
public static final String AUDIOFILEPATH = "AudioFilePath";
private int state = 3; // 0 - stop, 1 - play, 2 - pause, 3 - pre state
private MediaPlayer mediaplayer;
private Uri mediaReference;
private String mediaFilePath;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getIntent() != null) {
if(getIntent().hasExtra(AUDIOFILEURI))
mediaReference = getIntent().getParcelableExtra(AUDIOFILEURI);
else if(getIntent().hasExtra(AUDIOFILEPATH))
mediaFilePath = getIntent().getStringExtra(AUDIOFILEPATH);
}
setUpView();
initializeMediaPlayer();
}
@Override
public void onDestroy() {
super.onDestroy();
state = 0;
stopPlayer();
mediaplayer.release();
}
/////////////////////
// Set up the view //
/////////////////////
private void setUpView() {
setContentView(R.layout.audioplayer);
findViewById(R.id.seek).setVisibility(View.VISIBLE);
ImageButton playpauseButton = (ImageButton) findViewById(R.id.playpause);
playpauseButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
switch(state) {
case 1: setState(2); break; // is playing, set to pause
case 0: // is stopped, set to play
case 3: // is in pre state, set to play
case 2: setState(1); break; // is paused, set to play
}
}
});
ImageButton stopButton = (ImageButton) findViewById(R.id.stop);
stopButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
setState(0);
}
});
SeekBar seek = (SeekBar) findViewById(R.id.seek);
seek.setOnSeekBarChangeListener(this);
seek.setProgress(0);
}
private void setState(int state) {
int previousState = this.state;
this.state = state;
ImageButton playpauseButton = (ImageButton) findViewById(R.id.playpause);
switch(state) {
case 0:
playpauseButton.setImageResource(R.drawable.play);
stopPlayer();
break;
case 1:
playpauseButton.setImageResource(R.drawable.pause);
playPlayer(previousState);
break;
case 2:
playpauseButton.setImageResource(R.drawable.play);
pausePlayer();
break;
default: break;
}
}
//////////////////////////////
// SeekBar Listener methods //
//////////////////////////////
private int seekbarprogress = 0;
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(fromUser) {
seekbarprogress = progress;
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
seekbarprogress = 0;
if(state == 1) pausePlayer();
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaplayer.seekTo(seekbarprogress * 100);
if(state == 1) playPlayer(2);
seekbarprogress = 0;
}
private void resetSeekBar() {
int duration = mediaplayer.getDuration();
SeekBar seek = (SeekBar) findViewById(R.id.seek);
seek.setMax(duration/100);
seek.setProgress(0);
}
private final Handler seekbarHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
SeekBar seek = (SeekBar) findViewById(R.id.seek);
seek.setProgress(msg.what);
}
};
@Override
public void run() {
try {
while(state > 0) {
Thread.sleep(100); // 10th of a second
if(seekbarprogress == 0) seekbarHandler.sendEmptyMessage(mediaplayer.getCurrentPosition()/100);
}
} catch (Exception e) {}
}
/////////////////////////////////
// MediaPlayer related methods //
/////////////////////////////////
private void initializeMediaPlayer() {
try {
if(mediaReference == null && mediaFilePath == null) {
mediaplayer = MediaPlayer.create(this, R.raw.example);
mediaplayer.setOnCompletionListener(this);
} else {
mediaplayer = new MediaPlayer();
if(mediaReference != null) mediaplayer.setDataSource(this, mediaReference);
else mediaplayer.setDataSource(mediaFilePath);
mediaplayer.prepare();
}
setState(3);
resetSeekBar();
(new Thread(this)).start();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onCompletion(MediaPlayer mp) {
setState(0);
}
private void playPlayer(int previousState) {
if(previousState == 0) {
try {
mediaplayer.prepare();
} catch (Exception e) {
e.printStackTrace();
}
resetSeekBar();
(new Thread(this)).start();
}
mediaplayer.start();
}
private void stopPlayer() {
try { mediaplayer.stop(); } catch (Throwable t) {}
try { mediaplayer.reset(); } catch (Throwable t) {}
initializeMediaPlayer();
}
private void pausePlayer() {
mediaplayer.pause();
}
}