From c50acdf8bc4f176b6cb540094f48465f9d54e2c7 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 17 Feb 2026 17:21:34 +0100 Subject: [PATCH] Add log if foreground service fails to start + finish call activity in onResume if no more call to display --- .../compatibility/Api28Compatibility.kt | 4 +++- .../compatibility/Api34Compatibility.kt | 4 +++- .../linphone/compatibility/Compatibility.kt | 6 +++--- .../notifications/NotificationsManager.kt | 20 +++++++++++++++---- .../java/org/linphone/ui/call/CallActivity.kt | 5 +++++ 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/linphone/compatibility/Api28Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api28Compatibility.kt index e58cc0625..91e0b5cf7 100644 --- a/app/src/main/java/org/linphone/compatibility/Api28Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api28Compatibility.kt @@ -34,15 +34,17 @@ class Api28Compatibility { companion object { private const val TAG = "[API 28 Compatibility]" - fun startServiceForeground(service: Service, id: Int, notification: Notification) { + fun startServiceForeground(service: Service, id: Int, notification: Notification): Boolean { try { service.startForeground( id, notification ) + return true } catch (e: Exception) { Log.e("$TAG Can't start service as foreground! $e") } + return false } fun enterPipMode(activity: Activity): Boolean { diff --git a/app/src/main/java/org/linphone/compatibility/Api34Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api34Compatibility.kt index 17eed9de7..285340afa 100644 --- a/app/src/main/java/org/linphone/compatibility/Api34Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api34Compatibility.kt @@ -44,16 +44,18 @@ class Api34Compatibility { id: Int, notification: Notification, foregroundServiceType: Int - ) { + ): Boolean { try { service.startForeground( id, notification, foregroundServiceType ) + return true } catch (e: Exception) { Log.e("$TAG Can't start service as foreground! $e") } + return false } fun hasFullScreenIntentPermission(context: Context): Boolean { diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Compatibility.kt index ba3b4c732..3ed91c9a4 100644 --- a/app/src/main/java/org/linphone/compatibility/Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Compatibility.kt @@ -52,16 +52,16 @@ class Compatibility { id: Int, notification: Notification, foregroundServiceType: Int - ) { + ): Boolean { if (Version.sdkAboveOrEqual(Version.API34_ANDROID_14_UPSIDE_DOWN_CAKE)) { - Api34Compatibility.startServiceForeground( + return Api34Compatibility.startServiceForeground( service, id, notification, foregroundServiceType ) } else { - Api28Compatibility.startServiceForeground(service, id, notification) + return Api28Compatibility.startServiceForeground(service, id, notification) } } diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index 779bf9e4f..2b5e5ea81 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -805,12 +805,15 @@ class NotificationsManager Log.i( "$TAG Service found, starting it as foreground using notification ID [$INCOMING_CALL_ID] with type PHONE_CALL" ) - Compatibility.startServiceForeground( + val success = Compatibility.startServiceForeground( service, INCOMING_CALL_ID, notification, Compatibility.FOREGROUND_SERVICE_TYPE_PHONE_CALL ) + if (!success) { + Log.e("$TAG Failed to start incoming call foreground service!") + } notificationsMap[INCOMING_CALL_ID] = notification currentInCallServiceNotificationId = INCOMING_CALL_ID inCallServiceForegroundNotificationPublished = true @@ -926,12 +929,15 @@ class NotificationsManager Log.i( "$TAG Service found, starting it as foreground using notification ID [${notifiable.notificationId}] with type(s) [${foregroundServiceTypeMaskToString(mask)}]($mask)" ) - Compatibility.startServiceForeground( + val success = Compatibility.startServiceForeground( service, notifiable.notificationId, notification, mask ) + if (!success) { + Log.e("$TAG Failed to start call foreground service!") + } notificationsMap[notifiable.notificationId] = notification currentInCallServiceNotificationId = notifiable.notificationId inCallServiceForegroundNotificationPublished = true @@ -977,12 +983,15 @@ class NotificationsManager Log.i( "$TAG Service found, starting it as foreground using dummy notification ID [$DUMMY_NOTIF_ID]" ) - Compatibility.startServiceForeground( + val success = Compatibility.startServiceForeground( service, DUMMY_NOTIF_ID, notification, Compatibility.FOREGROUND_SERVICE_TYPE_PHONE_CALL ) + if (!success) { + Log.e("$TAG Failed to start dummy call foreground service!") + } notificationsMap[INCOMING_CALL_ID] = notification currentInCallServiceNotificationId = DUMMY_NOTIF_ID inCallServiceForegroundNotificationPublished = true @@ -1810,12 +1819,15 @@ class NotificationsManager Log.i( "$TAG Keep alive for third party accounts Service found, starting it as foreground using notification ID [$KEEP_ALIVE_FOR_THIRD_PARTY_ACCOUNTS_ID] with type [SPECIAL_USE]" ) - Compatibility.startServiceForeground( + val success = Compatibility.startServiceForeground( service, KEEP_ALIVE_FOR_THIRD_PARTY_ACCOUNTS_ID, notification, Compatibility.FOREGROUND_SERVICE_TYPE_SPECIAL_USE ) + if (!success) { + Log.e("$TAG Failed to start keep alive foreground service!") + } currentKeepAliveThirdPartyAccountsForegroundServiceNotificationId = KEEP_ALIVE_FOR_THIRD_PARTY_ACCOUNTS_ID } else { Log.w("$TAG Keep alive for third party accounts Service hasn't started yet...") diff --git a/app/src/main/java/org/linphone/ui/call/CallActivity.kt b/app/src/main/java/org/linphone/ui/call/CallActivity.kt index 56ff88922..f9491bfcf 100644 --- a/app/src/main/java/org/linphone/ui/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/ui/call/CallActivity.kt @@ -376,6 +376,11 @@ class CallActivity : GenericActivity() { if (::callViewModel.isInitialized) { callViewModel.pipMode.value = isInPipMode } + + if (callsViewModel.callsCount.value == 0) { + Log.w("$TAG Call activity is being resumed but no call was found, finishing activity") + finish() + } } override fun onPause() {