in azure-communication-ui/calling/src/main/java/com/azure/android/communication/ui/calling/presentation/manager/AudioFocusManager.kt [90:144]
suspend fun start() {
if (telecomManagerOptions != null) {
// audio focus is not needed for telecom manager
return
}
if (audioFocusHandler?.getAudioFocus() == false) {
store.dispatch(AudioSessionAction.AudioFocusRejected())
}
audioFocusHandler?.onFocusChange = {
// Todo: AudioFocus can be resumed as well (e.g. transient is temporary, we will get back.
// I.e. like how spotify can continue playing after a call is done.
if (it == AudioManager.AUDIOFOCUS_LOSS ||
it == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT ||
it == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
) {
store.dispatch(AudioSessionAction.AudioFocusInterrupted())
}
}
store.getStateFlow().collect {
if (previousAudioFocusStatus != it.audioSessionState.audioFocusStatus) {
previousAudioFocusStatus = it.audioSessionState.audioFocusStatus
if (it.audioSessionState.audioFocusStatus == AudioFocusStatus.REQUESTING) {
val mode = audioFocusHandler?.getMode()
if (mode != MODE_NORMAL && it.audioSessionState.audioFocusStatus == AudioFocusStatus.REQUESTING) {
store.dispatch(AudioSessionAction.AudioFocusRejected())
} else {
isAudioFocused = audioFocusHandler?.getAudioFocus() == true
if (!isAudioFocused) {
store.dispatch(AudioSessionAction.AudioFocusRejected())
} else {
store.dispatch(AudioSessionAction.AudioFocusApproved())
}
}
} else if (it.audioSessionState.audioFocusStatus == AudioFocusStatus.APPROVED) {
store.dispatch(AudioSessionAction.AudioFocusApproved())
}
} else if (previousCallState != it.callState.callingStatus) {
previousCallState = it.callState.callingStatus
if (it.callState.callingStatus == CallingStatus.CONNECTED) {
isAudioFocused = audioFocusHandler?.getAudioFocus() == true
if (!isAudioFocused) {
store.dispatch(AudioSessionAction.AudioFocusRejected())
} else {
store.dispatch(AudioSessionAction.AudioFocusApproved())
}
} else if (it.callState.callingStatus == CallingStatus.DISCONNECTING) {
if (isAudioFocused) {
isAudioFocused = audioFocusHandler?.releaseAudioFocus() == false
}
}
}
}
}