常に表示する為の MediaController

android.widget.MediaController にがっかりしたので、
1パターンのコンストラクタしか書かなかったが、
常に表示できることを目的にした MediaController を書いてみた。

import java.io.IOException;
import java.util.Formatter;
import java.util.Locale;
import org.sample.R;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.TextView;
/**
 * MediaControllerAgent
 */

public class MediaControllerAgent{
   private ImageButton mRewImageButton;
   private ImageButton mPlayImageButton;
   private ImageButton mFfImageButton;
   private ImageButton mStopImageButton;
   private ProgressBar mProgress;
   TextView mTimeCurrentTextView;
   TextView mTimeTextView;
   static MediaPlayer mediaPlayer;
   boolean mIsPrepared = false;
   boolean mIsStoped = false;
   long mDuration;
   StringBuilder mFormatBuilder;
   Formatter mFormatter;
   int mCurrentBufferPercentage;
   boolean             mDragging;

   Handler mHandler = new Handler(){
      @Override
      public void handleMessage(Message msg){
         if (mediaPlayer.isPlaying()){
            int pos = setProgress();
            sendMessageDelayed(obtainMessage(1), 1000 - (pos % 1000));
         }
      }
   };

   public MediaControllerAgent(View container, MediaPlayer _mediaPlayer){
      mRewImageButton = (ImageButton)container.findViewById(R.id.rewImageButton);
      mPlayImageButton = (ImageButton)container.findViewById(R.id.playImageButton);
      mFfImageButton = (ImageButton)container.findViewById(R.id.ffImageButton);
      mStopImageButton = (ImageButton)container.findViewById(R.id.stopImageButton);

      mTimeCurrentTextView = (TextView)container.findViewById(R.id.time_currentTextView);
      mTimeTextView = (TextView)container.findViewById(R.id.timeTextView);
      mTimeCurrentTextView.setText("0:00");
      mTimeTextView.setText("0:00");
      mediaPlayer = _mediaPlayer;
      mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
         @Override
         public void onPrepared(MediaPlayer mp){
            mDuration = mp.getDuration();
            mTimeCurrentTextView.setText("0:00");
            mTimeTextView.setText(stringForTime(mDuration));
            mCurrentBufferPercentage = 0;
            mIsPrepared = true;
            setEnabled(true);
            start();
         }
      });
      mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener(){
         @Override
         public void onBufferingUpdate(MediaPlayer mp, int percent){
            mCurrentBufferPercentage = percent;
         }
      });

      mPlayImageButton.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            if (!mIsPrepared) return;
            if (mediaPlayer.isPlaying()){
               pause();
            }else{
               start();
            }
            updatePausePlay();
         }
      });
      mStopImageButton.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            stop();
         }
      });
      mProgress = (ProgressBar)container.findViewById(R.id.mediacontroller_progress);
      mProgress.setMax(1000);
      *1;
         }
         @Override
         public void onStopTrackingTouch(SeekBar bar){
            if (mIsStoped) return;
            setProgress();
            updatePausePlay();
            mHandler.removeMessages(1);
         }
      });
      mRewImageButton.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            int pos = mediaPlayer.getCurrentPosition();
            pos -= 5000; // milliseconds
            if (pos < 0) pos = 0;
            mediaPlayer.seekTo(pos);
            setProgress();
         }
      });
      mFfImageButton.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            int pos = mediaPlayer.getCurrentPosition();
            pos += 15000; // milliseconds
            if (pos >= mDuration) pos -= 1000;
            mediaPlayer.seekTo(pos);
            setProgress();
         }
      });
      // ボタン全て無効
      setEnabled(false);
      // 時間表示フォーマット
      mFormatBuilder = new StringBuilder();
      mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
   }
   public boolean isPlaying(){
      return mediaPlayer.isPlaying();
   }
   /**
    * 停止時の処理 override して使用することが目的
    */

   protected void onStoped(){
   }
   /*
    * 読み込み実行
    */

   public void play(String path) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException{
      mIsStoped = true;
      mIsPrepared = false;
      mediaPlayer.stop();
      mediaPlayer.seekTo(0);
      mProgress.setProgress(0);
      setEnabled(false);
      mTimeCurrentTextView.setText("0:00");
      mPlayImageButton.setImageResource(android.R.drawable.ic_media_play);
      mediaPlayer.setDataSource(path);
      mediaPlayer.prepare();
   }
   protected void start(){
      mIsStoped = false;
      mediaPlayer.start();
      setProgress();
      updatePausePlay();
      mHandler.sendEmptyMessage(1);
   }
   protected void stop(){
      mIsStoped = true;
      mIsPrepared = false;
      mediaPlayer.stop();
      mediaPlayer.seekTo(0);
      mProgress.setProgress(0);
      setEnabled(false);
      mTimeCurrentTextView.setText("0:00");
      mPlayImageButton.setImageResource(android.R.drawable.ic_media_play);
      // callback 停止処理
      onStoped();
   }
   protected void pause(){
      if (mediaPlayer.isPlaying()){
         mPlayImageButton.setImageResource(android.R.drawable.ic_media_pause);
      }else{
         mPlayImageButton.setImageResource(android.R.drawable.ic_media_play);
      }
      mediaPlayer.pause();
   }
   protected void updatePausePlay(){
      if (mediaPlayer.isPlaying()) {
         mPlayImageButton.setImageResource(android.R.drawable.ic_media_pause);
      }else {
         mPlayImageButton.setImageResource(android.R.drawable.ic_media_play);
      }
   }

   protected int setProgress(){
      int position = mediaPlayer.getCurrentPosition();
      int duration = mediaPlayer.getDuration();
      if (duration > 0) {
         long pos = 1000L * position / duration;
         mProgress.setProgress*2;
      mTimeCurrentTextView.setText(stringForTime(position));
      return position;
   }

   protected void setEnabled(boolean b){
      mPlayImageButton.setEnabled(b);
      mRewImageButton.setEnabled(b);
      mFfImageButton.setEnabled(b);
      mStopImageButton.setEnabled(b);
      mProgress.setEnabled(b);
   }
   // 時間表示フォーマット
   protected String stringForTime(long timeMs){
      int totalSeconds = (int)(timeMs / 1000);
      int seconds = totalSeconds % 60;
      int minutes = (totalSeconds / 60) % 60;
      int hours   = totalSeconds / 3600;
      mFormatBuilder.setLength(0);
      if (hours > 0){
         return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
      }
      return mFormatter.format("%02d:%02d", minutes, seconds).toString();
   }
}

*1:SeekBar)mProgress).setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
         @Override
         public void onStartTrackingTouch(SeekBar seekBar){
            mDragging = true;
            mHandler.removeMessages(1);
         }
         @Override
         public void onProgressChanged(SeekBar bar, int progress, boolean fromuser){
            if (!fromuser || mIsStoped) return;
            long duration = mediaPlayer.getDuration();
            long newposition = (duration * progress) / 1000L;
            mediaPlayer.seekTo((int)newposition);
            mTimeCurrentTextView.setText(stringForTime(newposition

*2:int)pos);
      }
      mProgress.setSecondaryProgress(mCurrentBufferPercentage * 10);
      mTimeTextView.setText(stringForTime(duration