diff --git a/app/src/main/java/org/linphone/contact/ContactLoader.kt b/app/src/main/java/org/linphone/contact/ContactLoader.kt index 9baf4ec28..69cd0f4eb 100644 --- a/app/src/main/java/org/linphone/contact/ContactLoader.kt +++ b/app/src/main/java/org/linphone/contact/ContactLoader.kt @@ -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 { @@ -102,6 +101,7 @@ class ContactLoader : LoaderManager.LoaderCallbacks { withContext(Dispatchers.IO) { try { // Cursor can be null now that we are on a different dispatcher according to Crashlytics + val friendsPhoneNumbers = HashMap>() while (cursor != null && !cursor.isClosed && cursor.moveToNext()) { try { val id: String = @@ -143,6 +143,9 @@ class ContactLoader : LoaderManager.LoaderCallbacks { 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 { } 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 { Log.e("[Contacts Loader] Exception: $e") } } + friendsPhoneNumbers.clear() withContext(Dispatchers.Main) { if (core.globalState == GlobalState.Shutdown || core.globalState == GlobalState.Off) { diff --git a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt index ee98601da..1f629227e 100644 --- a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt +++ b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt @@ -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(")", "") - } } } diff --git a/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt b/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt index 4f2dda1c4..901c4b3c2 100644 --- a/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt +++ b/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt @@ -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(")", "") + } } }