Coverage Summary for Class: AudioFocusManager (com.vsevolodganin.clicktrack.player)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
AudioFocusManager |
0%
(0/1)
|
0%
(0/5)
|
0%
(0/5)
|
0%
(0/24)
|
0%
(0/82)
|
package com.vsevolodganin.clicktrack.player
import android.media.AudioManager
import android.media.AudioManager.AUDIOFOCUS_GAIN
import android.media.AudioManager.AUDIOFOCUS_LOSS
import androidx.media.AudioAttributesCompat
import androidx.media.AudioFocusRequestCompat
import androidx.media.AudioManagerCompat
import com.vsevolodganin.clicktrack.di.component.PlayerServiceScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import me.tatarka.inject.annotations.Inject
@PlayerServiceScope
@Inject
class AudioFocusManager(
private val audioManager: AudioManager,
) {
private val hasFocus = MutableStateFlow(false)
private val focusRequest = AudioFocusRequestCompat.Builder(AudioManagerCompat.AUDIOFOCUS_GAIN)
.setAudioAttributes(
AudioAttributesCompat.Builder()
.setUsage(AudioAttributesCompat.USAGE_MEDIA)
.setContentType(AudioAttributesCompat.CONTENT_TYPE_SONIFICATION)
.build(),
)
.setWillPauseWhenDucked(false)
.setOnAudioFocusChangeListener { focusChange ->
when (focusChange) {
AUDIOFOCUS_GAIN -> {
hasFocus.tryEmit(true)
}
AUDIOFOCUS_LOSS -> {
hasFocus.tryEmit(false)
}
}
}
.build()
fun hasFocus(): StateFlow<Boolean> = hasFocus
fun requestAudioFocus(): Boolean {
return when (AudioManagerCompat.requestAudioFocus(audioManager, focusRequest)) {
AudioManager.AUDIOFOCUS_REQUEST_GRANTED -> true
else -> false
}.also {
hasFocus.value = it
}
}
fun releaseAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
hasFocus.value = false
}
}