Index: third_party/android_media/java/src/org/chromium/third_party/android/media/MediaController.java |
diff --git a/third_party/android_media/java/src/org/chromium/third_party/android/media/MediaController.java b/third_party/android_media/java/src/org/chromium/third_party/android/media/MediaController.java |
index 1e6b23139e29aac2479bc255e5422593c3e3dd3e..3e76e0d810fa51d6445b9bcbfffdfeec646c1d5e 100644 |
--- a/third_party/android_media/java/src/org/chromium/third_party/android/media/MediaController.java |
+++ b/third_party/android_media/java/src/org/chromium/third_party/android/media/MediaController.java |
@@ -17,9 +17,7 @@ |
package org.chromium.third_party.android.media; |
import android.content.Context; |
-import android.support.v4.media.TransportController; |
-import android.support.v4.media.TransportMediator; |
-import android.support.v4.media.TransportStateListener; |
+import android.support.v4.media.session.PlaybackStateCompat; |
import android.util.AttributeSet; |
import android.view.LayoutInflater; |
import android.view.View; |
@@ -43,8 +41,49 @@ import java.util.Locale; |
* supportv4, with tiny bug fixes. |
*/ |
public class MediaController extends FrameLayout { |
+ /** |
+ * The interface that allows media controller to actually control media and provides some |
+ * essential metadata for the UI like the current position, duration, etc. |
+ */ |
+ public interface Delegate { |
+ /** |
+ * Called when the user wants to resume or start. |
+ */ |
+ void play(); |
+ |
+ /** |
+ * Called when the user wants to pause. |
+ */ |
+ void pause(); |
+ |
+ /** |
+ * Called when the user wants to seek. |
+ */ |
+ void seekTo(long pos); |
+ |
+ /** |
+ * @return the current media duration, in milliseconds. |
+ */ |
+ long getDuration(); |
+ |
+ /** |
+ * @return the current playback position, in milliseconds. |
+ */ |
+ long getPosition(); |
+ |
+ /** |
+ * @return if the media is currently playing. |
+ */ |
+ boolean isPlaying(); |
+ |
+ /** |
+ * @return a combination of {@link PlaybackStateCompat} flags defining what UI elements will |
+ * be available to the user. |
+ */ |
+ long getActionFlags(); |
+ } |
- private TransportController mController; |
+ private Delegate mDelegate; |
private Context mContext; |
private ViewGroup mProgressGroup; |
private SeekBar mProgressBar; |
@@ -62,17 +101,6 @@ public class MediaController extends FrameLayout { |
private ImageButton mNextButton; |
private ImageButton mPrevButton; |
- private TransportStateListener mStateListener = new TransportStateListener() { |
- @Override |
- public void onPlayingChanged(TransportController controller) { |
- updatePausePlay(); |
- } |
- @Override |
- public void onTransportControlsChanged(TransportController controller) { |
- updateButtons(); |
- } |
- }; |
- |
public MediaController(Context context, AttributeSet attrs) { |
super(context, attrs); |
mContext = context; |
@@ -93,35 +121,11 @@ public class MediaController extends FrameLayout { |
this(context, true); |
} |
- public void setMediaPlayer(TransportController controller) { |
- if (getWindowToken() != null) { |
- if (mController != null) { |
- mController.unregisterStateListener(mStateListener); |
- } |
- if (controller != null) { |
- controller.registerStateListener(mStateListener); |
- } |
- } |
- mController = controller; |
+ public void setDelegate(Delegate delegate) { |
+ mDelegate = delegate; |
updatePausePlay(); |
} |
- @Override |
- protected void onAttachedToWindow() { |
- super.onAttachedToWindow(); |
- if (mController != null) { |
- mController.registerStateListener(mStateListener); |
- } |
- } |
- |
- @Override |
- protected void onDetachedFromWindow() { |
- super.onDetachedFromWindow(); |
- if (mController != null) { |
- mController.unregisterStateListener(mStateListener); |
- } |
- } |
- |
private void initControllerView() { |
mPauseButton = (ImageButton) findViewById(R.id.pause); |
if (mPauseButton != null) { |
@@ -174,28 +178,29 @@ public class MediaController extends FrameLayout { |
* This requires the control interface to be a MediaPlayerControlExt |
*/ |
void updateButtons() { |
- int flags = mController.getTransportControlFlags(); |
+ if (mDelegate == null) return; |
+ |
+ long flags = mDelegate.getActionFlags(); |
boolean enabled = isEnabled(); |
if (mPauseButton != null) { |
- boolean needPlayPauseButton = (flags & TransportMediator.FLAG_KEY_MEDIA_PAUSE) != 0 || |
- (flags & TransportMediator.FLAG_KEY_MEDIA_PLAY) != 0; |
+ boolean needPlayPauseButton = (flags & PlaybackStateCompat.ACTION_PLAY) != 0 |
+ || (flags & PlaybackStateCompat.ACTION_PAUSE) != 0; |
mPauseButton.setEnabled(enabled && needPlayPauseButton); |
} |
if (mRewButton != null) { |
- mRewButton.setEnabled(enabled && |
- (flags & TransportMediator.FLAG_KEY_MEDIA_REWIND) != 0); |
+ mRewButton.setEnabled(enabled && (flags & PlaybackStateCompat.ACTION_REWIND) != 0); |
} |
if (mFfwdButton != null) { |
- mFfwdButton.setEnabled(enabled && |
- (flags & TransportMediator.FLAG_KEY_MEDIA_FAST_FORWARD) != 0); |
+ mFfwdButton.setEnabled( |
+ enabled && (flags & PlaybackStateCompat.ACTION_FAST_FORWARD) != 0); |
} |
if (mPrevButton != null) { |
- mShowPrev = (flags & TransportMediator.FLAG_KEY_MEDIA_PREVIOUS) != 0 |
- || mPrevListener != null; |
+ mShowPrev = |
+ (flags & PlaybackStateCompat.ACTION_SKIP_TO_NEXT) != 0 || mPrevListener != null; |
mPrevButton.setEnabled(enabled && mShowPrev); |
} |
if (mNextButton != null) { |
- mShowNext = (flags & TransportMediator.FLAG_KEY_MEDIA_NEXT) != 0 |
+ mShowNext = (flags & PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) != 0 |
|| mNextListener != null; |
mNextButton.setEnabled(enabled && mShowNext); |
} |
@@ -223,11 +228,10 @@ public class MediaController extends FrameLayout { |
} |
public long updateProgress() { |
- if (mController == null || mDragging) { |
- return 0; |
- } |
- long position = mController.getCurrentPosition(); |
- long duration = mController.getDuration(); |
+ if (mDelegate == null || mDragging) return 0; |
+ |
+ long position = mDelegate.getPosition(); |
+ long duration = mDelegate.getDuration(); |
if (duration <= 0) { |
// If there is no valid duration, hide the progress bar and time indicators. |
if (mProgressGroup != null) mProgressGroup.setVisibility(View.INVISIBLE); |
@@ -236,9 +240,7 @@ public class MediaController extends FrameLayout { |
// use long to avoid overflow |
long pos = 1000L * position / duration; |
mProgressBar.setProgress( (int) pos); |
- |
- int percent = mController.getBufferPercentage(); |
- mProgressBar.setSecondaryProgress(percent * 10); |
+ mProgressBar.setSecondaryProgress((int) pos); |
} |
if (mEndTime != null) |
@@ -257,10 +259,9 @@ public class MediaController extends FrameLayout { |
}; |
private void updatePausePlay() { |
- if (mPauseButton == null) |
- return; |
+ if (mDelegate == null || mPauseButton == null) return; |
- if (mController.isPlaying()) { |
+ if (mDelegate.isPlaying()) { |
mPauseButton.setImageResource(android.R.drawable.ic_media_pause); |
} else { |
mPauseButton.setImageResource(android.R.drawable.ic_media_play); |
@@ -268,10 +269,12 @@ public class MediaController extends FrameLayout { |
} |
private void doPauseResume() { |
- if (mController.isPlaying()) { |
- mController.pausePlaying(); |
+ if (mDelegate == null) return; |
+ |
+ if (mDelegate.isPlaying()) { |
+ mDelegate.pause(); |
} else { |
- mController.startPlaying(); |
+ mDelegate.play(); |
} |
updatePausePlay(); |
} |
@@ -295,15 +298,17 @@ public class MediaController extends FrameLayout { |
@Override |
public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) { |
+ if (mDelegate == null) return; |
+ |
if (!fromuser) { |
// We're not interested in programmatically generated changes to |
// the progress bar's position. |
return; |
} |
- long duration = mController.getDuration(); |
+ long duration = mDelegate.getDuration(); |
long newposition = (duration * progress) / 1000L; |
- mController.seekTo((int) newposition); |
+ mDelegate.seekTo(newposition); |
if (mCurrentTime != null) |
mCurrentTime.setText(stringForTime( (int) newposition)); |
} |
@@ -337,9 +342,11 @@ public class MediaController extends FrameLayout { |
private View.OnClickListener mRewListener = new View.OnClickListener() { |
@Override |
public void onClick(View v) { |
- long pos = mController.getCurrentPosition(); |
+ if (mDelegate == null) return; |
+ |
+ long pos = mDelegate.getPosition(); |
pos -= 5000; // milliseconds |
- mController.seekTo(pos); |
+ mDelegate.seekTo(pos); |
updateProgress(); |
} |
}; |
@@ -347,9 +354,11 @@ public class MediaController extends FrameLayout { |
private View.OnClickListener mFfwdListener = new View.OnClickListener() { |
@Override |
public void onClick(View v) { |
- long pos = mController.getCurrentPosition(); |
+ if (mDelegate == null) return; |
+ |
+ long pos = mDelegate.getPosition(); |
pos += 15000; // milliseconds |
- mController.seekTo(pos); |
+ mDelegate.seekTo(pos); |
updateProgress(); |
} |
}; |