diff options
author | Michael Kolb <kolby@google.com> | 2011-10-07 15:07:29 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-10-07 15:07:29 -0700 |
commit | b762d1e5eaae9f04f1141feaa402e3f8939d28cc (patch) | |
tree | 9f7c75189b791b70261b213bf9b8a22e45fcfb4a | |
parent | 69f906e075753328e6da0b7f6f7638dd453092ed (diff) | |
parent | 889453b892d46b8ba1a3714e3fb1a4d94c7ea6a4 (diff) | |
download | frameworks_base-b762d1e5eaae9f04f1141feaa402e3f8939d28cc.zip frameworks_base-b762d1e5eaae9f04f1141feaa402e3f8939d28cc.tar.gz frameworks_base-b762d1e5eaae9f04f1141feaa402e3f8939d28cc.tar.bz2 |
Merge "Handle audio focus in HTML5 audio"
-rw-r--r-- | core/java/android/webkit/HTML5Audio.java | 54 |
1 files changed, 46 insertions, 8 deletions
diff --git a/core/java/android/webkit/HTML5Audio.java b/core/java/android/webkit/HTML5Audio.java index 3600d09..9fc48a1 100644 --- a/core/java/android/webkit/HTML5Audio.java +++ b/core/java/android/webkit/HTML5Audio.java @@ -16,12 +16,9 @@ package android.webkit; +import android.content.Context; +import android.media.AudioManager; import android.media.MediaPlayer; -import android.media.MediaPlayer.OnBufferingUpdateListener; -import android.media.MediaPlayer.OnCompletionListener; -import android.media.MediaPlayer.OnErrorListener; -import android.media.MediaPlayer.OnPreparedListener; -import android.media.MediaPlayer.OnSeekCompleteListener; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -45,7 +42,8 @@ class HTML5Audio extends Handler MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener, MediaPlayer.OnPreparedListener, - MediaPlayer.OnSeekCompleteListener { + MediaPlayer.OnSeekCompleteListener, + AudioManager.OnAudioFocusChangeListener { // Logging tag. private static final String LOGTAG = "HTML5Audio"; @@ -69,6 +67,7 @@ class HTML5Audio extends Handler private String mUrl; private boolean mAskToPlay = false; + private Context mContext; // Timer thread -> UI thread private static final int TIMEUPDATE = 100; @@ -183,6 +182,7 @@ class HTML5Audio extends Handler // Save the native ptr mNativePointer = nativePtr; resetMediaPlayer(); + mContext = webViewCore.getContext(); mIsPrivateBrowsingEnabledGetter = new IsPrivateBrowsingEnabledGetter( webViewCore.getContext().getMainLooper(), webViewCore.getWebView()); } @@ -233,6 +233,34 @@ class HTML5Audio extends Handler } } + @Override + public void onAudioFocusChange(int focusChange) { + switch (focusChange) { + case AudioManager.AUDIOFOCUS_GAIN: + // resume playback + if (mMediaPlayer == null) resetMediaPlayer(); + else if (!mMediaPlayer.isPlaying()) mMediaPlayer.start(); + mState = STARTED; + break; + + case AudioManager.AUDIOFOCUS_LOSS: + // Lost focus for an unbounded amount of time: stop playback and release media player + if (mMediaPlayer.isPlaying()) mMediaPlayer.stop(); + mMediaPlayer.release(); + mMediaPlayer = null; + break; + + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: + // Lost focus for a short time, but we have to stop + // playback. We don't release the media player because playback + // is likely to resume + if (mMediaPlayer.isPlaying()) mMediaPlayer.pause(); + break; + } + } + + private void play() { if ((mState >= ERROR && mState < PREPARED) && mUrl != null) { resetMediaPlayer(); @@ -241,8 +269,17 @@ class HTML5Audio extends Handler } if (mState >= PREPARED) { - mMediaPlayer.start(); - mState = STARTED; + AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); + int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, + AudioManager.AUDIOFOCUS_GAIN); + + if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + // could not get audio focus. + teardown(); + } else { + mMediaPlayer.start(); + mState = STARTED; + } } } @@ -276,4 +313,5 @@ class HTML5Audio extends Handler private native void nativeOnEnded(int nativePointer); private native void nativeOnPrepared(int duration, int width, int height, int nativePointer); private native void nativeOnTimeupdate(int position, int nativePointer); + } |