From 278595a5a9a4383b7c3960770899c3f15b239d66 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Thu, 16 Jul 2026 15:25:15 +0300 Subject: [PATCH] Use baresip's missed call notification also for missed mobile calls Added caller's contact name (is available) to Connection Service connection --- .../kotlin/com/tutpro/baresip/BaresipService.kt | 8 ++++++-- .../kotlin/com/tutpro/baresip/CallsScreen.kt | 16 +--------------- .../com/tutpro/baresip/ConnectionService.kt | 13 +++++++++++++ app/src/main/kotlin/com/tutpro/baresip/Utils.kt | 13 +++++++++++++ 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index 1890ae6b..d6ba200c 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -2276,8 +2276,7 @@ class BaresipService: Service() { history.add() if (call.dir == "in" && call.startTime == null && !call.rejected) { call.ua.account.missedCalls = true - if (!call.ua.account.isMobile) - showMissedCallNotification(uap, call.peerUri, call.ua.account.aor) + showMissedCallNotification(uap, call.peerUri, call.ua.account.aor) } } synchronized(calls) { @@ -3095,6 +3094,11 @@ class BaresipService: Service() { } private fun showMissedCallNotification(uap: Long, peerUri: String, aor: String) { + Utils.cancelMissedCallsNotification(this) + Handler(Looper.getMainLooper()).postDelayed({ + Utils.cancelMissedCallsNotification(this) + }, 1000) + val piFlags = PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT val caller = Utils.friendlyUri(this, peerUri, Account.ofAor(aor)!!) val intent = Intent(this, MainActivity::class.java) diff --git a/app/src/main/kotlin/com/tutpro/baresip/CallsScreen.kt b/app/src/main/kotlin/com/tutpro/baresip/CallsScreen.kt index cb795737..6fd4e09a 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/CallsScreen.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/CallsScreen.kt @@ -1,9 +1,7 @@ package com.tutpro.baresip -import android.annotation.SuppressLint import android.content.Context import android.content.Intent -import android.telecom.TelecomManager import androidx.activity.compose.BackHandler import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background @@ -104,7 +102,7 @@ private fun CallsScreen(navController: NavController, viewModel: ViewModel, aor: LaunchedEffect(ua, refreshTrigger) { if (ua.account.isMobile) - clearSystemMissedCalls(ctx) + Utils.cancelMissedCallsNotification(ctx) callHistory.value = loadCallHistory(aor) isHistoryLoaded = true } @@ -599,15 +597,3 @@ fun callTint(direction: Int): Int { } } -@SuppressLint("MissingPermission") -private fun clearSystemMissedCalls(ctx: Context) { - val telecom = ctx.getSystemService(TelecomManager::class.java) - try { - telecom.cancelMissedCallsNotification() - Log.d(TAG, "cancelMissedCallsNotification() succeeded") - } catch (e: SecurityException) { - Log.w(TAG, "Cannot clear missed call notification: $e") - } catch (e: Exception) { - Log.e(TAG, "Unexpected failure clearing missed call notification", e) - } -} diff --git a/app/src/main/kotlin/com/tutpro/baresip/ConnectionService.kt b/app/src/main/kotlin/com/tutpro/baresip/ConnectionService.kt index e6318928..91d91210 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ConnectionService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ConnectionService.kt @@ -80,6 +80,10 @@ class ConnectionService : ConnectionService() { val ua = UserAgent.ofUap(uap) if (ua != null) { + val contactName = Utils.friendlyUri(this, peerUri, ua.account) + if (contactName != peerUri) + connection.setCallerDisplayName(contactName, TelecomManager.PRESENTATION_ALLOWED) + connection.setRinging() if (ua.account.answerMode == Api.ANSWERMODE_AUTO) { Log.d(TAG, "Auto-answering call $callp") @@ -126,6 +130,15 @@ class ConnectionService : ConnectionService() { pendingOutgoingConnection = connection connection.setAddress(request?.address, TelecomManager.PRESENTATION_ALLOWED) + + val ua = UserAgent.ofUap(uap) + if (ua != null) { + val address = request?.address?.toString() ?: "" + val contactName = Utils.friendlyUri(this, address, ua.account) + if (contactName != address) + connection.setCallerDisplayName(contactName, TelecomManager.PRESENTATION_ALLOWED) + } + connection.connectionCapabilities = Connection.CAPABILITY_SUPPORT_HOLD or Connection.CAPABILITY_HOLD or Connection.CAPABILITY_MERGE_CONFERENCE or diff --git a/app/src/main/kotlin/com/tutpro/baresip/Utils.kt b/app/src/main/kotlin/com/tutpro/baresip/Utils.kt index 7c229705..267a098f 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Utils.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Utils.kt @@ -1368,6 +1368,19 @@ object Utils { return file } + @SuppressLint("MissingPermission") + fun cancelMissedCallsNotification(ctx: Context) { + val telecom = ctx.getSystemService(TelecomManager::class.java) + try { + telecom.cancelMissedCallsNotification() + Log.d(TAG, "cancelMissedCallsNotification() succeeded") + } catch (e: SecurityException) { + Log.w(TAG, "Cannot clear missed call notification: $e") + } catch (e: Exception) { + Log.e(TAG, "Unexpected failure clearing missed call notification", e) + } + } + @RequiresApi(29) fun pstnAccountHandle(ctx: Context): PhoneAccountHandle? { val roleManager = ctx.getSystemService(ROLE_SERVICE) as RoleManager