diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index 6a3466ab..7b28b296 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -470,7 +470,6 @@ class BaresipService: Service() { val callp = intent.getLongExtra("callp", 0L) stopRinging() stopMediaPlayer() - am.mode = MODE_IN_COMMUNICATION setCallVolume() proximitySensing(proximitySensing) Api.ua_answer(uap, callp, Api.VIDMODE_OFF) @@ -1393,13 +1392,14 @@ class BaresipService: Service() { am.mode = MODE_IN_COMMUNICATION executeCall() } else { - if (am.mode == MODE_IN_COMMUNICATION) { - Log.d(TAG, "Audio mode already in MODE_IN_COMMUNICATION") + val isAnyCallMode = am.mode == MODE_IN_COMMUNICATION || am.mode == AudioManager.MODE_IN_CALL + if (isAnyCallMode) { + Log.d(TAG, "Audio mode already in a call mode (${am.mode})") executeCall() } else { audioModeChangedListener = AudioManager.OnModeChangedListener { mode -> - if (mode == MODE_IN_COMMUNICATION) { - Log.d(TAG, "Audio mode changed to MODE_IN_COMMUNICATION") + if (mode == MODE_IN_COMMUNICATION || mode == AudioManager.MODE_IN_CALL) { + Log.d(TAG, "Audio mode changed to $mode") audioModeChangedListener?.let { am.removeOnModeChangedListener(it) audioModeChangedListener = null @@ -1918,25 +1918,33 @@ class BaresipService: Service() { } private fun ensureCommunicationMode() { - val targetMode = if (Call.inCall()) MODE_IN_COMMUNICATION else MODE_NORMAL val currentMode = am.mode + val isAnyCallMode = currentMode == MODE_IN_COMMUNICATION || currentMode == AudioManager.MODE_IN_CALL + val isSpeakerphoneOn = if (VERSION.SDK_INT >= 31) am.communicationDevice?.type == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER else { @Suppress("DEPRECATION") am.isSpeakerphoneOn } - if (targetMode == currentMode && (targetMode == MODE_NORMAL || isSpeakerphoneOn == speakerPhone)) { - Log.d(TAG, "ensureCommunicationMode: Already in $targetMode with correct speaker state, skipping.") + + if (Call.inCall() && isAnyCallMode) { + if (isSpeakerphoneOn == speakerPhone) { + Log.d(TAG, "Already in valid call mode ($currentMode) with correct speaker state.") + return + } + } else if (!Call.inCall() && currentMode == MODE_NORMAL) { return } - Log.d(TAG, "Scheduling ensureCommunicationMode ($targetMode) in 500ms") + + Log.d(TAG, "Scheduling ensureCommunicationMode (current: $currentMode) in 500ms") Handler(Looper.getMainLooper()).postDelayed({ if (Call.inCall()) { - if (am.mode != MODE_IN_COMMUNICATION) { + if (am.mode != MODE_IN_COMMUNICATION && am.mode != AudioManager.MODE_IN_CALL) { am.mode = MODE_IN_COMMUNICATION - Log.d(TAG, "Manual Mode Guard (SDK ${VERSION.SDK_INT}): Setting MODE_IN_COMMUNICATON") + Log.d(TAG, "Manual Mode Guard (SDK ${VERSION.SDK_INT}): Setting MODE_IN_COMMUNICATON from ${am.mode}") } + Utils.setSpeakerPhone(mainExecutor, am, speakerPhone) } else { if (am.mode != MODE_NORMAL) { am.mode = MODE_NORMAL diff --git a/app/src/main/kotlin/com/tutpro/baresip/Utils.kt b/app/src/main/kotlin/com/tutpro/baresip/Utils.kt index 48ccaf0c..8066c276 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Utils.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Utils.kt @@ -897,7 +897,7 @@ object Utils { } } - private fun setSpeakerPhone(executor: Executor, am: AudioManager, enable: Boolean) { + fun setSpeakerPhone(executor: Executor, am: AudioManager, enable: Boolean) { if (Build.VERSION.SDK_INT >= 31) { if (!enable) { Log.d(TAG, "Disabling speakerphone")