Improved checking if there already is an active call

This commit is contained in:
Juha Heinanen
2026-04-02 09:30:18 +03:00
parent b0f4476672
commit 6ccf6f596e
3 changed files with 14 additions and 7 deletions

View File

@ -863,17 +863,15 @@ class BaresipService: Service() {
"incoming call" -> { "incoming call" -> {
val peerUri = ev[1] val peerUri = ev[1]
val bevent = ev[2].toLong() val bevent = ev[2].toLong()
val blockUnknown = ua.account.blockUnknown && Contact.contactName(peerUri) == peerUri val toastMsg = if (Call.isAnyCallActive(applicationContext))
val toastMsg = if (Call.inCall())
String.format(getString(R.string.call_auto_rejected), String.format(getString(R.string.call_auto_rejected),
Utils.friendlyUri(this, peerUri, ua.account)) Utils.friendlyUri(this, peerUri, ua.account))
else if (blockUnknown) else if (ua.account.blockUnknown && Contact.contactName(peerUri) == peerUri)
String.format(getString(R.string.call_blocked), String.format(getString(R.string.call_blocked),
Utils.friendlyUri(this, peerUri, ua.account)) Utils.friendlyUri(this, peerUri, ua.account))
else if (!Utils.checkPermissions(this, arrayOf(RECORD_AUDIO))) else if (!Utils.checkPermissions(this, arrayOf(RECORD_AUDIO)))
getString(R.string.no_calls) getString(R.string.no_calls)
else if (!requestAudioFocus(applicationContext)) else if (!requestAudioFocus(applicationContext))
// request fails if there is an active telephony call
getString(R.string.audio_focus_denied) getString(R.string.audio_focus_denied)
else else
"" ""
@ -882,7 +880,7 @@ class BaresipService: Service() {
Api.sip_treply(callp, 486, "Busy Here") Api.sip_treply(callp, 486, "Busy Here")
Api.bevent_stop(bevent) Api.bevent_stop(bevent)
toast(toastMsg) toast(toastMsg)
if (blockUnknown) { if (toastMsg.contains(getString(R.string.call_blocked))) {
if (ua.account.callHistory) if (ua.account.callHistory)
Blocked( Blocked(
ua.account.aor, ua.account.aor,

View File

@ -1,5 +1,7 @@
package com.tutpro.baresip package com.tutpro.baresip
import android.content.Context
import android.media.AudioManager
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@ -143,5 +145,12 @@ class Call(val callp: Long, val ua: UserAgent, val peerUri: String, val dir: Str
return BaresipService.calls.isNotEmpty() return BaresipService.calls.isNotEmpty()
} }
fun isAnyCallActive(ctx: Context): Boolean {
// Check SIP calls managed by baresip
if (inCall()) return true
// MODE_IN_CALL indicates a PSTN call is active
val am = ctx.getSystemService(Context.AUDIO_SERVICE) as AudioManager
return am.mode == AudioManager.MODE_IN_CALL
}
} }
} }

View File

@ -2037,10 +2037,10 @@ private fun makeCall(ctx: Context, viewModel: ViewModel, uriText: String, confer
alertMessage.value = String.format(ctx.getString(R.string.invalid_sip_or_tel_uri), uri) alertMessage.value = String.format(ctx.getString(R.string.invalid_sip_or_tel_uri), uri)
showAlert.value = true showAlert.value = true
} }
else if (Call.isAnyCallActive(ctx))
Toast.makeText(ctx, R.string.call_already_active, Toast.LENGTH_SHORT).show()
else if (!BaresipService.requestAudioFocus(ctx)) else if (!BaresipService.requestAudioFocus(ctx))
Toast.makeText(ctx, R.string.audio_focus_denied, Toast.LENGTH_SHORT).show() Toast.makeText(ctx, R.string.audio_focus_denied, Toast.LENGTH_SHORT).show()
else if (Call.calls().any { it.ua.account.aor != ua.account.aor })
Toast.makeText(ctx, R.string.call_already_active, Toast.LENGTH_SHORT).show()
else { else {
viewModel.dialerState.callButtonsEnabled.value = false viewModel.dialerState.callButtonsEnabled.value = false
if (Build.VERSION.SDK_INT < 31) { if (Build.VERSION.SDK_INT < 31) {