Now requires Android 10 or newer to use Telecom Manager feature to prevent crash due to Android 9 OS bug

This commit is contained in:
Sylvain Berfini 2022-08-24 14:47:42 +02:00
parent 47aa8e3a12
commit 04e8c3566b
7 changed files with 21 additions and 10 deletions

View file

@ -103,7 +103,7 @@ class CallSettingsViewModel : GenericSettingsViewModel() {
val enableTelecomManagerEvent: MutableLiveData<Event<Boolean>> by lazy { val enableTelecomManagerEvent: MutableLiveData<Event<Boolean>> by lazy {
MutableLiveData<Event<Boolean>>() MutableLiveData<Event<Boolean>>()
} }
val api26OrHigher = MutableLiveData<Boolean>() val api29OrHigher = MutableLiveData<Boolean>()
val overlayListener = object : SettingListenerStub() { val overlayListener = object : SettingListenerStub() {
override fun onBoolValueChanged(newValue: Boolean) { override fun onBoolValueChanged(newValue: Boolean) {
@ -238,7 +238,7 @@ class CallSettingsViewModel : GenericSettingsViewModel() {
encryptionMandatory.value = core.isMediaEncryptionMandatory encryptionMandatory.value = core.isMediaEncryptionMandatory
useTelecomManager.value = prefs.useTelecomManager useTelecomManager.value = prefs.useTelecomManager
api26OrHigher.value = Version.sdkAboveOrEqual(Version.API26_O_80) api29OrHigher.value = Version.sdkAboveOrEqual(Version.API29_ANDROID_10)
overlay.value = prefs.showCallOverlay overlay.value = prefs.showCallOverlay
systemWideOverlay.value = prefs.systemWideCallOverlay systemWideOverlay.value = prefs.systemWideCallOverlay

View file

@ -341,11 +341,6 @@ 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 { fun getImeFlagsForSecureChatRoom(): Int {
return EditorInfo.IME_FLAG_NO_EXTRACT_UI or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING return EditorInfo.IME_FLAG_NO_EXTRACT_UI or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING
} }

View file

@ -56,6 +56,11 @@ class Api29Compatibility {
return granted return granted
} }
fun hasTelecomManagerPermission(context: Context): Boolean {
return Compatibility.hasPermission(context, Manifest.permission.READ_PHONE_STATE) &&
Compatibility.hasPermission(context, Manifest.permission.MANAGE_OWN_CALLS)
}
fun createMessageChannel( fun createMessageChannel(
context: Context, context: Context,
notificationManager: NotificationManagerCompat notificationManager: NotificationManagerCompat

View file

@ -84,8 +84,10 @@ class Compatibility {
fun hasTelecomManagerPermissions(context: Context): Boolean { fun hasTelecomManagerPermissions(context: Context): Boolean {
return if (Version.sdkAboveOrEqual(Version.API30_ANDROID_11)) { return if (Version.sdkAboveOrEqual(Version.API30_ANDROID_11)) {
Api30Compatibility.hasTelecomManagerPermission(context) Api30Compatibility.hasTelecomManagerPermission(context)
} else if (Version.sdkAboveOrEqual(Version.API29_ANDROID_10)) {
Api29Compatibility.hasTelecomManagerPermission(context)
} else { } else {
Api26Compatibility.hasTelecomManagerPermission(context) false
} }
} }

View file

@ -394,6 +394,15 @@ class CoreContext(
core.config.setBool("app", "conference_migration", true) core.config.setBool("app", "conference_migration", true)
} }
// Disable Telecom Manager on Android < 10 to prevent crash due to OS bug in Android 9
if (Version.sdkStrictlyBelow(Version.API29_ANDROID_10)) {
if (corePreferences.useTelecomManager) {
Log.w("[Context] Android < 10 detected, disabling telecom manager to prevent crash due to OS bug")
}
corePreferences.useTelecomManager = false
corePreferences.manuallyDisabledTelecomManager = true
}
initUserCertificates() initUserCertificates()
computeUserAgent() computeUserAgent()

View file

@ -41,7 +41,7 @@ import org.linphone.utils.LinphoneUtils
import org.linphone.utils.PermissionHelper import org.linphone.utils.PermissionHelper
import org.linphone.utils.SingletonHolder import org.linphone.utils.SingletonHolder
@TargetApi(26) @TargetApi(29)
class TelecomHelper private constructor(context: Context) { class TelecomHelper private constructor(context: Context) {
companion object : SingletonHolder<TelecomHelper, Context>(::TelecomHelper) companion object : SingletonHolder<TelecomHelper, Context>(::TelecomHelper)

View file

@ -104,7 +104,7 @@
layout="@layout/settings_widget_switch" layout="@layout/settings_widget_switch"
linphone:title="@{@string/call_settings_use_telecom_manager_title}" linphone:title="@{@string/call_settings_use_telecom_manager_title}"
linphone:subtitle="@{@string/call_settings_use_telecom_manager_summary}" linphone:subtitle="@{@string/call_settings_use_telecom_manager_summary}"
android:visibility="@{viewModel.api26OrHigher ? View.VISIBLE : View.GONE}" android:visibility="@{viewModel.api29OrHigher ? View.VISIBLE : View.GONE}"
linphone:listener="@{viewModel.useTelecomManagerListener}" linphone:listener="@{viewModel.useTelecomManagerListener}"
linphone:checked="@={viewModel.useTelecomManager}"/> linphone:checked="@={viewModel.useTelecomManager}"/>