diff --git a/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt b/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt index f2606d932..64b576610 100644 --- a/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt @@ -254,11 +254,11 @@ class DialerFragment : SecureFragment() { if (corePreferences.manuallyDisabledTelecomManager) { Log.w("[Dialer] User has manually disabled Telecom Manager feature") } else { - if (PermissionHelper.get().hasTelecomManagerPermissions()) { + if (Compatibility.hasTelecomManagerPermissions(requireContext())) { enableTelecomManager() } else { Log.i("[Dialer] Asking for Telecom Manager permissions") - Compatibility.requestTelecomManagerPermission(requireActivity(), 1) + Compatibility.requestTelecomManagerPermissions(requireActivity(), 1) } } } else { diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/CallSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/CallSettingsFragment.kt index 5ba103442..23bd82639 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/CallSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/CallSettingsFragment.kt @@ -37,7 +37,6 @@ import org.linphone.databinding.SettingsCallFragmentBinding import org.linphone.mediastream.Version import org.linphone.telecom.TelecomHelper import org.linphone.utils.Event -import org.linphone.utils.PermissionHelper class CallSettingsFragment : GenericSettingFragment() { private lateinit var viewModel: CallSettingsViewModel @@ -93,8 +92,8 @@ class CallSettingsFragment : GenericSettingFragment viewLifecycleOwner, { it.consume { - if (!PermissionHelper.get().hasTelecomManagerPermissions()) { - Compatibility.requestTelecomManagerPermission(requireActivity(), 1) + if (!Compatibility.hasTelecomManagerPermissions(requireContext())) { + Compatibility.requestTelecomManagerPermissions(requireActivity(), 1) } else if (!TelecomHelper.exists()) { corePreferences.useTelecomManager = true Log.w("[Telecom Helper] Doesn't exists yet, creating it") diff --git a/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt index 78213b637..b75bf2c4f 100644 --- a/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt @@ -151,6 +151,11 @@ class Api26Compatibility { ) } + fun hasTelecomManagerPermission(context: Context): Boolean { + return Compatibility.hasPermission(context, Manifest.permission.READ_PHONE_STATE) && + Compatibility.hasPermission(context, Manifest.permission.MANAGE_OWN_CALLS) + } + fun getImeFlagsForSecureChatRoom(): Int { return EditorInfo.IME_FLAG_NO_EXTRACT_UI or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING } diff --git a/app/src/main/java/org/linphone/compatibility/Api30Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api30Compatibility.kt index a32a5b4db..70637bbd2 100644 --- a/app/src/main/java/org/linphone/compatibility/Api30Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api30Compatibility.kt @@ -50,12 +50,19 @@ class Api30Compatibility { activity.requestPermissions( arrayOf( Manifest.permission.READ_PHONE_NUMBERS, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.MANAGE_OWN_CALLS ), code ) } + fun hasTelecomManagerPermission(context: Context): Boolean { + return Compatibility.hasPermission(context, Manifest.permission.READ_PHONE_NUMBERS) && + Compatibility.hasPermission(context, Manifest.permission.READ_PHONE_STATE) && + Compatibility.hasPermission(context, Manifest.permission.MANAGE_OWN_CALLS) + } + fun removeChatRoomShortcut(context: Context, chatRoom: ChatRoom) { val shortcutManager = context.getSystemService(ShortcutManager::class.java) val id = LinphoneUtils.getChatRoomId(chatRoom.localAddress, chatRoom.peerAddress) diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Compatibility.kt index a38079a46..35f4e7922 100644 --- a/app/src/main/java/org/linphone/compatibility/Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Compatibility.kt @@ -65,7 +65,15 @@ class Compatibility { } // See https://developer.android.com/about/versions/11/privacy/permissions#phone-numbers - fun requestTelecomManagerPermission(activity: Activity, code: Int) { + fun hasTelecomManagerPermissions(context: Context): Boolean { + return if (Version.sdkAboveOrEqual(Version.API30_ANDROID_11)) { + Api30Compatibility.hasTelecomManagerPermission(context) + } else { + Api26Compatibility.hasTelecomManagerPermission(context) + } + } + + fun requestTelecomManagerPermissions(activity: Activity, code: Int) { if (Version.sdkAboveOrEqual(Version.API30_ANDROID_11)) { Api30Compatibility.requestTelecomManagerPermission(activity, code) } else { diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 383a47a90..4eaf53c46 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -312,9 +312,14 @@ class CoreContext(val context: Context, coreConfig: Config) { // CoreContext listener must be added first! if (Version.sdkAboveOrEqual(Version.API26_O_80) && corePreferences.useTelecomManager) { - Log.i("[Context] Creating TelecomHelper, disabling audio focus requests in AudioHelper") - core.config.setBool("audio", "android_disable_audio_focus_requests", true) - TelecomHelper.create(context) + if (Compatibility.hasTelecomManagerPermissions(context)) { + Log.i("[Context] Creating Telecom Helper, disabling audio focus requests in AudioHelper") + core.config.setBool("audio", "android_disable_audio_focus_requests", true) + TelecomHelper.create(context) + } else { + Log.w("[Context] Can't create Telecom Helper, permissions have been revoked") + corePreferences.useTelecomManager = false + } } if (isPush) { diff --git a/app/src/main/java/org/linphone/telecom/TelecomHelper.kt b/app/src/main/java/org/linphone/telecom/TelecomHelper.kt index dd08ff791..c2a29d759 100644 --- a/app/src/main/java/org/linphone/telecom/TelecomHelper.kt +++ b/app/src/main/java/org/linphone/telecom/TelecomHelper.kt @@ -30,6 +30,7 @@ import android.telecom.PhoneAccount import android.telecom.PhoneAccountHandle import android.telecom.TelecomManager import android.telecom.TelecomManager.* +import java.lang.Exception import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.contact.Contact @@ -159,9 +160,16 @@ class TelecomHelper private constructor(context: Context) { ComponentName(context, TelecomConnectionService::class.java), context.packageName ) - val identity = coreContext.core.defaultAccount?.params?.identityAddress?.asStringUriOnly() ?: "" + // Take care that identity may be parsed, otherwise Android OS may crash during startup + // and user will have to do a factory reset... + val identity = coreContext.core.defaultAccount?.params?.identityAddress?.asStringUriOnly() + ?: coreContext.core.createPrimaryContactParsed()?.asStringUriOnly() + ?: "sip:linphone.android@sip.linphone.org" + + val address = Uri.parse(identity) + ?: throw Exception("[Telecom Helper] Identity address for phone account is null!") val account = PhoneAccount.builder(accountHandle, context.getString(R.string.app_name)) - .setAddress(Uri.parse(identity)) + .setAddress(address) .setIcon(Icon.createWithResource(context, R.drawable.linphone_logo_tinted)) .setCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED) .setHighlightColor(context.getColor(R.color.primary_color)) diff --git a/app/src/main/java/org/linphone/utils/PermissionHelper.kt b/app/src/main/java/org/linphone/utils/PermissionHelper.kt index 40fad7073..3d28a3b42 100644 --- a/app/src/main/java/org/linphone/utils/PermissionHelper.kt +++ b/app/src/main/java/org/linphone/utils/PermissionHelper.kt @@ -21,8 +21,6 @@ package org.linphone.utils import android.Manifest import android.content.Context -import android.os.Build -import androidx.annotation.RequiresApi import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log @@ -75,10 +73,4 @@ class PermissionHelper private constructor(private val context: Context) { fun hasRecordAudioPermission(): Boolean { return hasPermission(Manifest.permission.RECORD_AUDIO) } - - @RequiresApi(Build.VERSION_CODES.O) - fun hasTelecomManagerPermissions(): Boolean { - return hasPermission(Manifest.permission.READ_PHONE_NUMBERS) && - hasPermission(Manifest.permission.MANAGE_OWN_CALLS) - } }