Use baresip's missed call notification also for missed mobile calls

Added caller's contact name (is available) to Connection Service connection
This commit is contained in:
Juha Heinanen
2026-07-16 15:25:15 +03:00
parent c7060583cc
commit 278595a5a9
4 changed files with 33 additions and 17 deletions

View File

@ -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)

View File

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

View File

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

View File

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