/**
  * Disable pause or seek buttons if the stream cannot be paused or seeked. This requires the
  * control interface to be a MediaPlayerControlExt
  */
 private void disableUnsupportedButtons() {
   try {
     if (mPauseButton != null && !mPlayer.canPause()) {
       mPauseButton.setEnabled(false);
     }
     if (mRewButton != null && !mPlayer.canSeekBackward()) {
       mRewButton.setEnabled(false);
     }
     if (mFfwdButton != null && !mPlayer.canSeekForward()) {
       mFfwdButton.setEnabled(false);
     }
     // TODO What we really should do is add a canSeek to the MediaPlayerControl interface;
     // this scheme can break the case when applications want to allow seek through the
     // progress bar but disable forward/backward buttons.
     //
     // However, currently the flags SEEK_BACKWARD_AVAILABLE, SEEK_FORWARD_AVAILABLE,
     // and SEEK_AVAILABLE are all (un)set together; as such the aforementioned issue
     // shouldn't arise in existing applications.
     if (mProgress != null && !mPlayer.canSeekBackward() && !mPlayer.canSeekForward()) {
       mProgress.setEnabled(false);
     }
   } catch (IncompatibleClassChangeError ex) {
     // We were given an old version of the interface, that doesn't have
     // the canPause/canSeekXYZ methods. This is OK, it just means we
     // assume the media can be paused and seeked, and so we don't disable
     // the buttons.
   }
 }
示例#2
0
  /** @hide */
  protected int setProgress() {
    if (mPlayer == null || mDragging) {
      return 0;
    }
    int position = mPlayer.getCurrentPosition();
    int duration = mPlayer.getDuration();
    /// M: add log for seldom ALPS01020394. @{
    MmsLog.d(
        "MmsMediaController", "setProgress, position: " + position + ", duration: " + duration);
    /// @}
    if (mProgress != null) {
      if (duration > 0) {
        // use long to avoid overflow
        long pos = 1000L * position / duration;
        mProgress.setProgress((int) pos);
      }
      int percent = mPlayer.getBufferPercentage();
      mProgress.setSecondaryProgress(percent * 10);
    }

    if (mEndTime != null) mEndTime.setText(stringForTime(duration));
    if (mCurrentTime != null) mCurrentTime.setText(stringForTime(position));

    // If duration is short, refresh every 100ms
    if (duration < 10000) {
      return 900;
    }
    return position;
  }
  @Override
  public boolean dispatchKeyEvent(KeyEvent event) {
    int keyCode = event.getKeyCode();
    if (event.getRepeatCount() == 0
        && event.isDown()
        && (keyCode == KeyEvent.KEYCODE_HEADSETHOOK
            || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE
            || keyCode == KeyEvent.KEYCODE_SPACE)) {
      doPauseResume();
      show(sDefaultTimeout);
      if (mPauseButton != null) {
        mPauseButton.requestFocus();
      }
      return true;
    } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP) {
      if (mPlayer.isPlaying()) {
        mPlayer.pause();
        updatePausePlay();
      }
      return true;
    } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
      // don't show the controls for volume adjustment
      return super.dispatchKeyEvent(event);
    } else if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU) {
      hide();

      return true;
    } else {
      show(sDefaultTimeout);
    }
    return super.dispatchKeyEvent(event);
  }
示例#4
0
 /** @hide */
 protected void doPauseResume() {
   if (mPlayer.isPlaying()) {
     mPlayer.pause();
   } else {
     mPlayer.start();
   }
   updatePausePlay();
 }
示例#5
0
        public void onClick(View v) {
          int pos = mPlayer.getCurrentPosition();
          pos += 15000; // milliseconds
          mPlayer.seekTo(pos);
          setProgress();

          show(sDefaultTimeout);
        }
        public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) {
          if (!fromuser) {
            // We're not interested in programmatically generated changes to
            // the progress bar's position.
            return;
          }

          long duration = mPlayer.getDuration();
          long newposition = (duration * progress) / 1000L;
          mPlayer.seekTo((int) newposition);
          if (mCurrentTime != null) mCurrentTime.setText(stringForTime((int) newposition));
        }
 public void onProgressChanged(SeekBar bar, int progress, boolean fromtouch) {
   if (fromtouch) {
     mDragging = true;
     long newposition = (duration * progress) / 1000L;
     mPlayer.seekTo((int) newposition);
     if (mCurrentTime != null) mCurrentTime.setText(stringForTime((int) newposition));
   }
 }
  @Override
  public boolean dispatchKeyEvent(KeyEvent event) {
    int keyCode = event.getKeyCode();
    final boolean uniqueDown =
        event.getRepeatCount() == 0 && event.getAction() == KeyEvent.ACTION_DOWN;
    if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK
        || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE
        || keyCode == KeyEvent.KEYCODE_SPACE) {
      if (uniqueDown) {
        doPauseResume();
        show(sDefaultTimeout);
        if (mPauseButton != null) {
          mPauseButton.requestFocus();
        }
      }
      return true;
    } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) {
      if (uniqueDown && !mPlayer.isPlaying()) {
        mPlayer.start();
        updatePausePlay();
        show(sDefaultTimeout);
      }
      return true;
    } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) {
      if (uniqueDown && mPlayer.isPlaying()) {
        mPlayer.pause();
        updatePausePlay();
        show(sDefaultTimeout);
      }
      return true;
    } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
        || keyCode == KeyEvent.KEYCODE_VOLUME_UP
        || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE
        || keyCode == KeyEvent.KEYCODE_CAMERA) {
      // don't show the controls for volume adjustment
      return super.dispatchKeyEvent(event);
    } else if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU) {
      if (uniqueDown) {
        hide();
      }
      return true;
    }

    show(sDefaultTimeout);
    return super.dispatchKeyEvent(event);
  }
  private void updatePausePlay() {
    if (mRoot == null || mPauseButton == null) return;

    if (mPlayer.isPlaying()) {
      mPauseButton.setImageResource(com.android.internal.R.drawable.ic_media_pause);
    } else {
      mPauseButton.setImageResource(com.android.internal.R.drawable.ic_media_play);
    }
  }
示例#10
0
 /**
  * Disable pause or seek buttons if the stream cannot be paused or seeked. This requires the
  * control interface to be a MediaPlayerControlExt
  *
  * @hide
  */
 protected void disableUnsupportedButtons() {
   try {
     if (mPauseButton != null && !mPlayer.canPause()) {
       mPauseButton.setEnabled(false);
     }
     if (mRewButton != null && !mPlayer.canSeekBackward()) {
       mRewButton.setEnabled(false);
     }
     if (mFfwdButton != null && !mPlayer.canSeekForward()) {
       mFfwdButton.setEnabled(false);
     }
   } catch (IncompatibleClassChangeError ex) {
     // We were given an old version of the interface, that doesn't have
     // the canPause/canSeekXYZ methods. This is OK, it just means we
     // assume the media can be paused and seeked, and so we don't disable
     // the buttons.
   }
 }
示例#11
0
        public void onStopTrackingTouch(SeekBar bar) {
          if (!mInstantSeeking) mPlayer.seekTo((mDuration * bar.getProgress()) / 1000);

          show(sDefaultTimeout);
          mHandler.removeMessages(SHOW_PROGRESS);
          mAM.setStreamMute(AudioManager.STREAM_MUSIC, false);
          mDragging = false;
          mHandler.sendEmptyMessageDelayed(SHOW_PROGRESS, 1000);
        }
示例#12
0
  /** @hide */
  protected void updatePausePlay() {
    if (mRoot == null || mPauseButton == null) return;

    if (mPlayer.isPlaying()) {
      mPauseButton.setImageResource(R.drawable.ic_media_pause);
    } else {
      mPauseButton.setImageResource(R.drawable.ic_media_play);
    }
  }
示例#13
0
        @Override
        public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) {
          if (!fromuser) return;

          long newposition = (mDuration * progress) / 1000;
          String time = StringUtils.generateTime(newposition);
          if (mInstantSeeking) mPlayer.seekTo(newposition);
          if (mInfoView != null) mInfoView.setText(time);
          if (mCurrentTime != null) mCurrentTime.setText(time);
        }
示例#14
0
        public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) {
          if (!fromuser) {
            // We're not interested in programmatically generated changes to
            // the progress bar's position.
            return;
          }

          duration = mPlayer.getDuration();
          newposition = (duration * progress) / 1000L;
          // Implement Trackball event
          if (!mDragging) {
            mPlayer.seekTo((int) newposition);
            setProgress();
            updatePausePlay();
            show(sDefaultTimeout);
            mHandler.sendEmptyMessage(SHOW_PROGRESS);
          }
          if (mCurrentTime != null) mCurrentTime.setText(stringForTime((int) newposition));
        }
示例#15
0
        public void onStopTrackingTouch(SeekBar bar) {
          mDragging = false;
          mPlayer.seekTo((int) newposition);
          setProgress();
          updatePausePlay();
          show(sDefaultTimeout);

          // Ensure that progress is properly updated in the future,
          // the call to show() does not guarantee this because it is a
          // no-op if we are already showing.
          mHandler.sendEmptyMessage(SHOW_PROGRESS);
        }
  private void updatePausePlay() {
    if (mRoot == null) return;

    ImageButton button = (ImageButton) mRoot.findViewById(com.android.internal.R.id.pause);
    if (button == null) return;

    if (mPlayer.isPlaying()) {
      button.setImageResource(com.android.internal.R.drawable.ic_media_pause);
    } else {
      button.setImageResource(com.android.internal.R.drawable.ic_media_play);
    }
  }
示例#17
0
  private void updatePausePlay() {
    if (mRoot == null || mPauseButton == null) return;

    if (mPlayer.isPlaying())
      mPauseButton.setImageResource(
          getResources()
              .getIdentifier("mediacontroller_pause", "drawable", mContext.getPackageName()));
    else
      mPauseButton.setImageResource(
          getResources()
              .getIdentifier("mediacontroller_play", "drawable", mContext.getPackageName()));
  }
示例#18
0
  private long setProgress() {
    if (mPlayer == null || mDragging) return 0;

    long position = mPlayer.getCurrentPosition();
    long duration = mPlayer.getDuration();
    if (mProgress != null) {
      if (duration > 0) {
        long pos = 1000L * position / duration;
        mProgress.setProgress((int) pos);
      }
      int percent = mPlayer.getBufferPercentage();
      mProgress.setSecondaryProgress(percent * 10);
    }

    mDuration = duration;

    if (mEndTime != null) mEndTime.setText(generateTime(mDuration));
    if (mCurrentTime != null) mCurrentTime.setText(generateTime(position));

    return position;
  }
  private int setProgress() {
    if (mPlayer == null || mDragging) {
      return 0;
    }
    int position = mPlayer.getCurrentPosition();
    int duration = mPlayer.getDuration();
    if (mProgress != null) {
      if (duration > 0) {
        // use long to avoid overflow
        long pos = 1000L * position / duration;
        mProgress.setProgress((int) pos);
      }
      int percent = mPlayer.getBufferPercentage();
      mProgress.setSecondaryProgress(percent * 10);
    }

    if (mEndTime != null) mEndTime.setText(stringForTime(duration));
    if (mCurrentTime != null) mCurrentTime.setText(stringForTime(position));

    return position;
  }
示例#20
0
 @Override
 public void onStopTrackingTouch(SeekBar bar) {
   if (!mInstantSeeking) mPlayer.seekTo((mDuration * bar.getProgress()) / 1000);
   if (mInfoView != null) {
     mInfoView.setText("");
     mInfoView.setVisibility(View.GONE);
   }
   show(sDefaultTimeout);
   mHandler.removeMessages(SHOW_PROGRESS);
   mAM.setStreamMute(AudioManager.STREAM_MUSIC, false);
   mDragging = false;
   mHandler.sendEmptyMessageDelayed(SHOW_PROGRESS, 1000);
 }
示例#21
0
 @Override
 public void handleMessage(Message msg) {
   int pos;
   switch (msg.what) {
     case FADE_OUT:
       hide();
       break;
     case SHOW_PROGRESS:
       pos = setProgress();
       if (!mDragging && mShowing && mPlayer.isPlaying()) {
         msg = obtainMessage(SHOW_PROGRESS);
         sendMessageDelayed(msg, 1000 - (pos % 1000));
       }
       break;
   }
 }
示例#22
0
 private void doPauseResume() {
   if (mPlayer.isPlaying()) mPlayer.pause();
   else mPlayer.start();
   updatePausePlay();
 }
 public void onStartTrackingTouch(SeekBar bar) {
   show(3600000);
   duration = mPlayer.getDuration();
 }
示例#24
0
 private void disableUnsupportedButtons() {
   try {
     if (mPauseButton != null && !mPlayer.canPause()) mPauseButton.setEnabled(false);
   } catch (IncompatibleClassChangeError ex) {
   }
 }
示例#25
0
  private void updatePausePlay() {
    if (mRoot == null || mPauseButton == null) return;

    if (mPlayer.isPlaying()) mPauseButton.setImageResource(IC_MEDIA_PAUSE_ID);
    else mPauseButton.setImageResource(IC_MEDIA_PLAY_ID);
  }