override fun onAudioClientStateChange()

in amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/audio/DefaultAudioClientObserver.kt [85:180]


    override fun onAudioClientStateChange(newInternalAudioState: Int, newInternalAudioStatus: Int) {
        val newAudioStatus: MeetingSessionStatusCode? = toAudioStatus(newInternalAudioStatus)
        var newAudioState: SessionStateControllerAction = toAudioClientState(newInternalAudioState, newAudioStatus)

        if (newAudioStatus == null) {
            logger.warn(
                TAG,
                "AudioClient State raw value: $newInternalAudioState Unknown Status raw value: $newInternalAudioStatus"
            )
        } else {
            logger.info(TAG, "AudioClient State: $newAudioState Status: $newAudioStatus")
        }

        if (newAudioState == SessionStateControllerAction.Unknown) return
        if (newAudioState == currentAudioState && newAudioStatus == currentAudioStatus) return

        when (newAudioState) {
            SessionStateControllerAction.FinishConnecting -> {
                when (currentAudioState) {
                    SessionStateControllerAction.Connecting -> {
                        notifyStartSucceeded()
                        notifyAudioClientObserver { observer -> observer.onAudioSessionStarted(false) }
                    }
                    SessionStateControllerAction.Reconnecting -> {
                        meetingStatsCollector.incrementRetryCount()
                        eventAnalyticsController.pushHistory(
                            MeetingHistoryEventName.meetingReconnected
                        )
                        notifyStartSucceeded()
                        notifyAudioClientObserver {
                            observer -> observer.onAudioSessionStarted(true)
                            primaryMeetingPromotionObserver?.onPrimaryMeetingDemotion(MeetingSessionStatus(MeetingSessionStatusCode.AudioInternalServerError))
                                ?: run {
                                    logger.info(TAG, "Primary meeting demotion occurred from audio (on reconnect) but no primary meeting demotion callback is set")
                                }
                            primaryMeetingPromotionObserver = null
                        }
                    }
                    SessionStateControllerAction.FinishConnecting ->
                        when (newAudioStatus) {
                            MeetingSessionStatusCode.OK ->
                                if (currentAudioStatus == MeetingSessionStatusCode.NetworkBecamePoor) {
                                    notifyAudioClientObserver { observer -> observer.onConnectionRecovered() }
                                }
                            MeetingSessionStatusCode.NetworkBecamePoor ->
                                if (currentAudioStatus == MeetingSessionStatusCode.OK) {
                                    meetingStatsCollector.incrementPoorConnectionCount()
                                    notifyAudioClientObserver { observer -> observer.onConnectionBecamePoor() }
                                }
                            else -> Unit
                        }
                    else -> Unit
                }
            }
            SessionStateControllerAction.Reconnecting -> {
                if (currentAudioState == SessionStateControllerAction.FinishConnecting) {
                    notifyAudioClientObserver { observer -> observer.onAudioSessionDropped() }
                }
            }
            SessionStateControllerAction.FinishDisconnecting -> {
                when (currentAudioState) {
                    SessionStateControllerAction.Connecting,
                    SessionStateControllerAction.FinishConnecting -> {
                        if (shouldCloseAndNotifyEndMeeting(newAudioStatus)) {
                            handleAudioSessionEndedByServer(newAudioStatus)
                        }
                    }
                    SessionStateControllerAction.Reconnecting -> {
                        notifyAudioClientObserver { observer -> observer.onAudioSessionCancelledReconnect() }
                        if (shouldCloseAndNotifyEndMeeting(newAudioStatus)) {
                            handleAudioSessionEndedByServer(newAudioStatus)
                        }
                    }
                    else -> Unit
                }
            }
            SessionStateControllerAction.Fail -> {
                when (currentAudioState) {
                    SessionStateControllerAction.Connecting,
                    SessionStateControllerAction.FinishConnecting -> {
                        handleOnAudioSessionFailed(newAudioStatus)
                    }
                    SessionStateControllerAction.Reconnecting -> {
                        notifyAudioClientObserver { observer ->
                            observer.onAudioSessionCancelledReconnect()
                        }
                        handleOnAudioSessionFailed(newAudioStatus)
                    }
                    else -> Unit
                }
            }
            else -> Unit
        }
        currentAudioState = newAudioState
        currentAudioStatus = newAudioStatus
    }