Skip to content

Commit 8e8527b

Browse files
authored
Fix/audiofocus (#18)
* fix: Return focus to previous focus owner using same AudioFocusRequest * fix: Bump version * fix: Revert patch number and update changelog * fix: Rename test and supply matcher * fix: Correct formatting
1 parent 84bc982 commit 8e8527b

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
### 0.1.1
4+
5+
- Fixes bug that did not correctly abandon audio request after deactivate
6+
37
### 0.1.0
48

59
This release marks the first iteration of the AudioSwitch library: an Android audio management library for real-time communication apps.

audioswitch/src/main/java/com/twilio/audioswitch/selection/AudioDeviceManager.kt

+9-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
44
import android.content.Context
55
import android.content.pm.PackageManager
66
import android.media.AudioDeviceInfo
7+
import android.media.AudioFocusRequest
78
import android.media.AudioManager
89
import android.os.Build
910
import com.twilio.audioswitch.android.BuildWrapper
@@ -22,6 +23,7 @@ internal class AudioDeviceManager(
2223
private var savedAudioMode = 0
2324
private var savedIsMicrophoneMuted = false
2425
private var savedSpeakerphoneEnabled = false
26+
private var audioRequest: AudioFocusRequest? = null
2527

2628
fun hasEarpiece(): Boolean {
2729
val hasEarpiece = context.packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
@@ -54,7 +56,8 @@ internal class AudioDeviceManager(
5456
fun setAudioFocus() {
5557
// Request audio focus before making any device switch.
5658
if (build.getVersion() >= Build.VERSION_CODES.O) {
57-
audioManager.requestAudioFocus(audioFocusRequest.buildRequest())
59+
audioRequest = audioFocusRequest.buildRequest()
60+
audioRequest?.let { audioManager.requestAudioFocus(it) }
5861
} else {
5962
audioManager.requestAudioFocus(
6063
{},
@@ -93,6 +96,10 @@ internal class AudioDeviceManager(
9396
audioManager.mode = savedAudioMode
9497
mute(savedIsMicrophoneMuted)
9598
enableSpeakerphone(savedSpeakerphoneEnabled)
96-
audioManager.abandonAudioFocus(null)
99+
if (build.getVersion() >= Build.VERSION_CODES.O) {
100+
audioRequest?.let { audioManager.abandonAudioFocusRequest(it) }
101+
} else {
102+
audioManager.abandonAudioFocus { }
103+
}
97104
}
98105
}

audioswitch/src/test/java/com/twilio/audioswitch/selection/AudioDeviceSelectorTest.kt

+34
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,40 @@ class AudioDeviceSelectorTest {
298298
)
299299
}
300300

301+
@Test
302+
fun `deactivate should abandon audio focus using pre Android O method if api version is 26`() {
303+
whenever(buildWrapper.getVersion()).thenReturn(Build.VERSION_CODES.O)
304+
val audioFocusRequest = mock<AudioFocusRequest>()
305+
whenever(this.audioFocusRequest.buildRequest()).thenReturn(audioFocusRequest)
306+
audioDeviceSelector.start(audioDeviceChangeListener)
307+
audioDeviceSelector.activate()
308+
audioDeviceSelector.stop()
309+
310+
verify(audioManager).abandonAudioFocusRequest(audioFocusRequest)
311+
}
312+
313+
@Test
314+
fun `deactivate should abandon audio focus using pre Android O method if api version is 27`() {
315+
whenever(buildWrapper.getVersion()).thenReturn(Build.VERSION_CODES.O_MR1)
316+
val audioFocusRequest = mock<AudioFocusRequest>()
317+
whenever(this.audioFocusRequest.buildRequest()).thenReturn(audioFocusRequest)
318+
audioDeviceSelector.start(audioDeviceChangeListener)
319+
audioDeviceSelector.activate()
320+
audioDeviceSelector.stop()
321+
322+
verify(audioManager).abandonAudioFocusRequest(audioFocusRequest)
323+
}
324+
325+
@Test
326+
fun `deactivate should abandon audio focus using pre Android O method if api version is 25`() {
327+
whenever(buildWrapper.getVersion()).thenReturn(Build.VERSION_CODES.N_MR1)
328+
audioDeviceSelector.start(audioDeviceChangeListener)
329+
audioDeviceSelector.activate()
330+
audioDeviceSelector.stop()
331+
332+
verify(audioManager).abandonAudioFocus(isA())
333+
}
334+
301335
@Test
302336
fun `activate should enable audio routing to the earpiece`() {
303337
audioDeviceSelector.start(audioDeviceChangeListener)

0 commit comments

Comments
 (0)