Loading android/app/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamHandler.java +4 −1 Original line number Diff line number Diff line Loading @@ -24,6 +24,8 @@ import android.media.AudioFocusRequest; import android.media.AudioManager; import android.media.AudioManager.OnAudioFocusChangeListener; import android.media.MediaPlayer; import android.media.session.PlaybackState; import android.os.Handler; import android.os.Message; import android.util.Log; Loading Loading @@ -225,7 +227,8 @@ public class A2dpSinkStreamHandler extends Handler { break; case DELAYED_PAUSE: if (mStreamAvailable && !inCallFromStreamingDevice()) { if (BluetoothMediaBrowserService.getPlaybackState() == PlaybackState.STATE_PLAYING && !inCallFromStreamingDevice()) { sendAvrcpPause(); mSentPause = true; mStreamAvailable = false; Loading android/app/src/com/android/bluetooth/avrcpcontroller/BluetoothMediaBrowserService.java +14 −0 Original line number Diff line number Diff line Loading @@ -176,6 +176,20 @@ public class BluetoothMediaBrowserService extends MediaBrowserService { } } /** * Get playback state */ public static synchronized int getPlaybackState() { if (sBluetoothMediaBrowserService != null) { PlaybackState currentPlaybackState = sBluetoothMediaBrowserService.mSession.getController().getPlaybackState(); if (currentPlaybackState != null) { return currentPlaybackState.getState(); } } return PlaybackState.STATE_ERROR; } /** * Get object for controlling playback */ Loading android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamHandlerTest.java +18 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,24 @@ public class A2dpSinkStreamHandlerTest { verify(mMockA2dpSink, times(1)).informAudioTrackGainNative(0); } @Test public void testFocusGainTransient() { // Focus was lost then regained. testSnkPlay(); mStreamHandler.handleMessage( mStreamHandler.obtainMessage(A2dpSinkStreamHandler.AUDIO_FOCUS_CHANGE, AudioManager.AUDIOFOCUS_LOSS_TRANSIENT)); mStreamHandler.handleMessage( mStreamHandler.obtainMessage(A2dpSinkStreamHandler.DELAYED_PAUSE)); mStreamHandler.handleMessage( mStreamHandler.obtainMessage(A2dpSinkStreamHandler.AUDIO_FOCUS_CHANGE, AudioManager.AUDIOFOCUS_GAIN)); verify(mMockAudioManager, times(0)).abandonAudioFocus(any()); verify(mMockA2dpSink, times(0)).informAudioFocusStateNative(0); verify(mMockA2dpSink, times(1)).informAudioTrackGainNative(0); verify(mMockA2dpSink, times(2)).informAudioTrackGainNative(1.0f); } @Test public void testFocusLost() { // Focus was lost permanently, expect streaming to stop. Loading Loading
android/app/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamHandler.java +4 −1 Original line number Diff line number Diff line Loading @@ -24,6 +24,8 @@ import android.media.AudioFocusRequest; import android.media.AudioManager; import android.media.AudioManager.OnAudioFocusChangeListener; import android.media.MediaPlayer; import android.media.session.PlaybackState; import android.os.Handler; import android.os.Message; import android.util.Log; Loading Loading @@ -225,7 +227,8 @@ public class A2dpSinkStreamHandler extends Handler { break; case DELAYED_PAUSE: if (mStreamAvailable && !inCallFromStreamingDevice()) { if (BluetoothMediaBrowserService.getPlaybackState() == PlaybackState.STATE_PLAYING && !inCallFromStreamingDevice()) { sendAvrcpPause(); mSentPause = true; mStreamAvailable = false; Loading
android/app/src/com/android/bluetooth/avrcpcontroller/BluetoothMediaBrowserService.java +14 −0 Original line number Diff line number Diff line Loading @@ -176,6 +176,20 @@ public class BluetoothMediaBrowserService extends MediaBrowserService { } } /** * Get playback state */ public static synchronized int getPlaybackState() { if (sBluetoothMediaBrowserService != null) { PlaybackState currentPlaybackState = sBluetoothMediaBrowserService.mSession.getController().getPlaybackState(); if (currentPlaybackState != null) { return currentPlaybackState.getState(); } } return PlaybackState.STATE_ERROR; } /** * Get object for controlling playback */ Loading
android/app/tests/unit/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamHandlerTest.java +18 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,24 @@ public class A2dpSinkStreamHandlerTest { verify(mMockA2dpSink, times(1)).informAudioTrackGainNative(0); } @Test public void testFocusGainTransient() { // Focus was lost then regained. testSnkPlay(); mStreamHandler.handleMessage( mStreamHandler.obtainMessage(A2dpSinkStreamHandler.AUDIO_FOCUS_CHANGE, AudioManager.AUDIOFOCUS_LOSS_TRANSIENT)); mStreamHandler.handleMessage( mStreamHandler.obtainMessage(A2dpSinkStreamHandler.DELAYED_PAUSE)); mStreamHandler.handleMessage( mStreamHandler.obtainMessage(A2dpSinkStreamHandler.AUDIO_FOCUS_CHANGE, AudioManager.AUDIOFOCUS_GAIN)); verify(mMockAudioManager, times(0)).abandonAudioFocus(any()); verify(mMockA2dpSink, times(0)).informAudioFocusStateNative(0); verify(mMockA2dpSink, times(1)).informAudioTrackGainNative(0); verify(mMockA2dpSink, times(2)).informAudioTrackGainNative(1.0f); } @Test public void testFocusLost() { // Focus was lost permanently, expect streaming to stop. Loading