Trying to prevent crash seen on PlayStore probably due to friend.getPhoneNumersWithLabel() being called in IO dispatched coroutine

This commit is contained in:
Sylvain Berfini 2022-05-31 14:31:51 +02:00
parent 3d7733c86a
commit 61134352e9
3 changed files with 22 additions and 24 deletions

View file

@ -43,7 +43,6 @@ import org.linphone.core.Friend
import org.linphone.core.GlobalState
import org.linphone.core.SubscribePolicy
import org.linphone.core.tools.Log
import org.linphone.utils.LinphoneUtils
import org.linphone.utils.PhoneNumberUtils
class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
@ -102,6 +101,7 @@ class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
withContext(Dispatchers.IO) {
try {
// Cursor can be null now that we are on a different dispatcher according to Crashlytics
val friendsPhoneNumbers = HashMap<String, List<String>>()
while (cursor != null && !cursor.isClosed && cursor.moveToNext()) {
try {
val id: String =
@ -143,6 +143,9 @@ class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
friend.incSubscribePolicy = SubscribePolicy.SPDeny
}
if (!friendsPhoneNumbers.containsKey(id)) {
friendsPhoneNumbers[id] = arrayListOf()
}
when (mime) {
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> {
val label = PhoneNumberUtils.addressBookLabelTypeToVcardParamString(
@ -161,21 +164,15 @@ class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
}
if (number != null) {
var duplicate = false
for (pn in friend.phoneNumbersWithLabel) {
if (pn.label == label && LinphoneUtils.arePhoneNumberWeakEqual(
pn.phoneNumber,
number
)
) {
duplicate = true
break
}
}
if (!duplicate) {
if (
friendsPhoneNumbers[id].orEmpty().find {
PhoneNumberUtils.arePhoneNumberWeakEqual(it, number)
} == null
) {
val phoneNumber = Factory.instance()
.createFriendPhoneNumber(number, label)
friend.addPhoneNumberWithLabel(phoneNumber)
friendsPhoneNumbers[id] = friendsPhoneNumbers[id].orEmpty().plus(number)
}
}
}
@ -202,6 +199,7 @@ class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
Log.e("[Contacts Loader] Exception: $e")
}
}
friendsPhoneNumbers.clear()
withContext(Dispatchers.Main) {
if (core.globalState == GlobalState.Shutdown || core.globalState == GlobalState.Off) {

View file

@ -200,16 +200,5 @@ class LinphoneUtils {
remoteSipUri.clean()
return "${localSipUri.asStringUriOnly()}~${remoteSipUri.asStringUriOnly()}"
}
fun arePhoneNumberWeakEqual(number1: String, number2: String): Boolean {
return trimPhoneNumber(number1) == trimPhoneNumber(number2)
}
private fun trimPhoneNumber(phoneNumber: String): String {
return phoneNumber.replace(" ", "")
.replace("-", "")
.replace("(", "")
.replace(")", "")
}
}
}

View file

@ -127,5 +127,16 @@ class PhoneNumberUtils {
}
return null
}
fun arePhoneNumberWeakEqual(number1: String, number2: String): Boolean {
return trimPhoneNumber(number1) == trimPhoneNumber(number2)
}
private fun trimPhoneNumber(phoneNumber: String): String {
return phoneNumber.replace(" ", "")
.replace("-", "")
.replace("(", "")
.replace(")", "")
}
}
}