Skip to content

Commit 14f16d9

Browse files
authored
fix: Change audioFocus dynamically (#1877)
Closes #1876
1 parent f777f51 commit 14f16d9

1 file changed

Lines changed: 20 additions & 5 deletions

File tree

  • packages/audioplayers_android/android/src/main/kotlin/xyz/luan/audioplayers/player

packages/audioplayers_android/android/src/main/kotlin/xyz/luan/audioplayers/player/FocusManager.kt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ class FocusManager(
1010
private val onGranted: () -> Unit,
1111
private val onLoss: (isTransient: Boolean) -> Unit,
1212
) {
13-
private val context: AudioContextAndroid
14-
get() = player.context
13+
private var context: AudioContextAndroid = player.context
1514

1615
// Listen also for focus changes, e.g. if interrupt playing with a phone call and resume afterward.
1716
private var audioFocusRequest: AudioFocusRequest? = null
@@ -20,7 +19,19 @@ class FocusManager(
2019
private var audioFocusChangeListener: AudioManager.OnAudioFocusChangeListener? = null
2120

2221
init {
23-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
22+
updateAudioFocusRequest()
23+
}
24+
25+
private fun hasAudioFocusRequest(): Boolean {
26+
return audioFocusRequest != null || audioFocusChangeListener != null
27+
}
28+
29+
private fun updateAudioFocusRequest() {
30+
if (context.audioFocus == AudioManager.AUDIOFOCUS_NONE) {
31+
// Mix sound with others
32+
audioFocusRequest = null
33+
audioFocusChangeListener = null
34+
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
2435
audioFocusRequest = AudioFocusRequest.Builder(context.audioFocus)
2536
.setAudioAttributes(context.buildAttributes())
2637
.setOnAudioFocusChangeListener { handleFocusResult(it) }
@@ -34,7 +45,11 @@ class FocusManager(
3445
get() = player.audioManager
3546

3647
fun maybeRequestAudioFocus() {
37-
if (context.audioFocus == AudioManager.AUDIOFOCUS_NONE) {
48+
if (context != player.context) {
49+
context = player.context
50+
updateAudioFocusRequest()
51+
}
52+
if (!hasAudioFocusRequest()) {
3853
onGranted()
3954
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
4055
val result = audioManager.requestAudioFocus(audioFocusRequest!!)
@@ -51,7 +66,7 @@ class FocusManager(
5166
}
5267

5368
fun handleStop() {
54-
if (context.audioFocus != AudioManager.AUDIOFOCUS_NONE) {
69+
if (hasAudioFocusRequest()) {
5570
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
5671
audioFocusRequest?.let { audioManager.abandonAudioFocusRequest(it) }
5772
} else {

0 commit comments

Comments
 (0)