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
     }
 }