suspend fun start()

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