Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 889453b8 authored by Michael Kolb's avatar Michael Kolb
Browse files

Handle audio focus in HTML5 audio

    Bug: 5416191

    Video will follow later

Change-Id: I51da05aa0e3c8c0f33151df84d84a65cb7003080
parent 41c95f36
Loading
Loading
Loading
Loading
+46 −8
Original line number Original line Diff line number Diff line
@@ -16,12 +16,9 @@


package android.webkit;
package android.webkit;


import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
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.Handler;
import android.os.Looper;
import android.os.Looper;
import android.os.Message;
import android.os.Message;
@@ -45,7 +42,8 @@ class HTML5Audio extends Handler
                            MediaPlayer.OnCompletionListener,
                            MediaPlayer.OnCompletionListener,
                            MediaPlayer.OnErrorListener,
                            MediaPlayer.OnErrorListener,
                            MediaPlayer.OnPreparedListener,
                            MediaPlayer.OnPreparedListener,
                            MediaPlayer.OnSeekCompleteListener {
                            MediaPlayer.OnSeekCompleteListener,
                            AudioManager.OnAudioFocusChangeListener {
    // Logging tag.
    // Logging tag.
    private static final String LOGTAG = "HTML5Audio";
    private static final String LOGTAG = "HTML5Audio";


@@ -69,6 +67,7 @@ class HTML5Audio extends Handler


    private String mUrl;
    private String mUrl;
    private boolean mAskToPlay = false;
    private boolean mAskToPlay = false;
    private Context mContext;


    // Timer thread -> UI thread
    // Timer thread -> UI thread
    private static final int TIMEUPDATE = 100;
    private static final int TIMEUPDATE = 100;
@@ -183,6 +182,7 @@ class HTML5Audio extends Handler
        // Save the native ptr
        // Save the native ptr
        mNativePointer = nativePtr;
        mNativePointer = nativePtr;
        resetMediaPlayer();
        resetMediaPlayer();
        mContext = webViewCore.getContext();
        mIsPrivateBrowsingEnabledGetter = new IsPrivateBrowsingEnabledGetter(
        mIsPrivateBrowsingEnabledGetter = new IsPrivateBrowsingEnabledGetter(
                webViewCore.getContext().getMainLooper(), webViewCore.getWebView());
                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() {
    private void play() {
        if ((mState >= ERROR && mState < PREPARED) && mUrl != null) {
        if ((mState >= ERROR && mState < PREPARED) && mUrl != null) {
            resetMediaPlayer();
            resetMediaPlayer();
@@ -241,10 +269,19 @@ class HTML5Audio extends Handler
        }
        }


        if (mState >= PREPARED) {
        if (mState >= PREPARED) {
            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();
                mMediaPlayer.start();
                mState = STARTED;
                mState = STARTED;
            }
            }
        }
        }
    }


    private void pause() {
    private void pause() {
        if (mState == STARTED) {
        if (mState == STARTED) {
@@ -276,4 +313,5 @@ class HTML5Audio extends Handler
    private native void nativeOnEnded(int nativePointer);
    private native void nativeOnEnded(int nativePointer);
    private native void nativeOnPrepared(int duration, int width, int height, int nativePointer);
    private native void nativeOnPrepared(int duration, int width, int height, int nativePointer);
    private native void nativeOnTimeupdate(int position, int nativePointer);
    private native void nativeOnTimeupdate(int position, int nativePointer);

}
}