From 3fc19e10fcb7ae726cb88b6af069e0ceaa92caeb Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 2 Feb 2026 11:56:12 +0100 Subject: [PATCH] Fixed telecom manager feature availability check --- .../org/linphone/compatibility/Api28Compatibility.kt | 10 ++++++++++ .../org/linphone/compatibility/Api33Compatibility.kt | 11 +++++++++++ .../java/org/linphone/compatibility/Compatibility.kt | 9 +++++++++ .../main/java/org/linphone/telecom/TelecomManager.kt | 5 +++-- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/linphone/compatibility/Api28Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api28Compatibility.kt index 5fd108926..e58cc0625 100644 --- a/app/src/main/java/org/linphone/compatibility/Api28Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api28Compatibility.kt @@ -23,6 +23,8 @@ import android.app.Activity import android.app.Notification import android.app.PictureInPictureParams import android.app.Service +import android.content.Context +import android.content.pm.PackageManager import android.net.Uri import android.provider.MediaStore import org.linphone.core.tools.Log @@ -74,5 +76,13 @@ class Api28Compatibility { else -> Uri.EMPTY } } + + fun hasTelecomManagerFeature(context: Context): Boolean { + val hasFeature = context.packageManager.hasSystemFeature( + PackageManager.FEATURE_CONNECTION_SERVICE + ) + Log.i("$TAG Feature [${PackageManager.FEATURE_CONNECTION_SERVICE}] is [${if (hasFeature) "available" else "not available"}]") + return hasFeature + } } } diff --git a/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt index 57f228df2..4f2c91070 100644 --- a/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt @@ -24,10 +24,13 @@ import android.content.Context import android.content.pm.PackageManager import android.os.Build import androidx.annotation.RequiresApi +import org.linphone.core.tools.Log @RequiresApi(Build.VERSION_CODES.TIRAMISU) class Api33Compatibility { companion object { + private const val TAG = "[API 33 Compatibility]" + fun getAllRequiredPermissionsArray(): Array { return arrayOf( Manifest.permission.POST_NOTIFICATIONS, @@ -42,5 +45,13 @@ class Api33Compatibility { Manifest.permission.POST_NOTIFICATIONS ) == PackageManager.PERMISSION_GRANTED } + + fun hasTelecomManagerFeature(context: Context): Boolean { + val hasFeature = context.packageManager.hasSystemFeature( + PackageManager.FEATURE_TELECOM + ) + Log.i("$TAG Feature [${PackageManager.FEATURE_TELECOM}] is [${if (hasFeature) "available" else "not available"}]") + return hasFeature + } } } diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Compatibility.kt index 153dcf00f..d78de5911 100644 --- a/app/src/main/java/org/linphone/compatibility/Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Compatibility.kt @@ -97,6 +97,15 @@ class Compatibility { ) } + fun hasTelecomManagerFeature(context: Context): Boolean { + if (Version.sdkAboveOrEqual(Version.API33_ANDROID_13_TIRAMISU)) { + return Api33Compatibility.hasTelecomManagerFeature(context) + } else if (Version.sdkAboveOrEqual(Version.API26_O_80)) { + return Api28Compatibility.hasTelecomManagerFeature(context) + } + return false + } + fun hasFullScreenIntentPermission(context: Context): Boolean { if (Version.sdkAboveOrEqual(Version.API34_ANDROID_14_UPSIDE_DOWN_CAKE)) { return Api34Compatibility.hasFullScreenIntentPermission(context) diff --git a/app/src/main/java/org/linphone/telecom/TelecomManager.kt b/app/src/main/java/org/linphone/telecom/TelecomManager.kt index 881f113dc..09cab3d99 100644 --- a/app/src/main/java/org/linphone/telecom/TelecomManager.kt +++ b/app/src/main/java/org/linphone/telecom/TelecomManager.kt @@ -36,6 +36,7 @@ import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log import org.linphone.utils.LinphoneUtils import androidx.core.net.toUri +import org.linphone.compatibility.Compatibility class TelecomManager @WorkerThread @@ -69,13 +70,13 @@ class TelecomManager } } - private val hasTelecomFeature = context.packageManager.hasSystemFeature("android.software.telecom") + private val hasTelecomFeature = Compatibility.hasTelecomManagerFeature(context) private var currentlyFollowedCalls: Int = 0 init { Log.i( - "$TAG android.software.telecom feature is [${if (hasTelecomFeature) "available" else "not available"}]" + "$TAG Feature is [${if (hasTelecomFeature) "available" else "not available"}]" ) try { callsManager.registerAppWithTelecom(