Trying to prevent crash seen on PlayStore probably due to friend.getPhoneNumersWithLabel() being called in IO dispatched coroutine
This commit is contained in:
parent
3d7733c86a
commit
61134352e9
3 changed files with 22 additions and 24 deletions
|
@ -43,7 +43,6 @@ import org.linphone.core.Friend
|
||||||
import org.linphone.core.GlobalState
|
import org.linphone.core.GlobalState
|
||||||
import org.linphone.core.SubscribePolicy
|
import org.linphone.core.SubscribePolicy
|
||||||
import org.linphone.core.tools.Log
|
import org.linphone.core.tools.Log
|
||||||
import org.linphone.utils.LinphoneUtils
|
|
||||||
import org.linphone.utils.PhoneNumberUtils
|
import org.linphone.utils.PhoneNumberUtils
|
||||||
|
|
||||||
class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
|
class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
|
||||||
|
@ -102,6 +101,7 @@ class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
try {
|
try {
|
||||||
// Cursor can be null now that we are on a different dispatcher according to Crashlytics
|
// 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()) {
|
while (cursor != null && !cursor.isClosed && cursor.moveToNext()) {
|
||||||
try {
|
try {
|
||||||
val id: String =
|
val id: String =
|
||||||
|
@ -143,6 +143,9 @@ class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
|
||||||
friend.incSubscribePolicy = SubscribePolicy.SPDeny
|
friend.incSubscribePolicy = SubscribePolicy.SPDeny
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!friendsPhoneNumbers.containsKey(id)) {
|
||||||
|
friendsPhoneNumbers[id] = arrayListOf()
|
||||||
|
}
|
||||||
when (mime) {
|
when (mime) {
|
||||||
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> {
|
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> {
|
||||||
val label = PhoneNumberUtils.addressBookLabelTypeToVcardParamString(
|
val label = PhoneNumberUtils.addressBookLabelTypeToVcardParamString(
|
||||||
|
@ -161,21 +164,15 @@ class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (number != null) {
|
if (number != null) {
|
||||||
var duplicate = false
|
if (
|
||||||
for (pn in friend.phoneNumbersWithLabel) {
|
friendsPhoneNumbers[id].orEmpty().find {
|
||||||
if (pn.label == label && LinphoneUtils.arePhoneNumberWeakEqual(
|
PhoneNumberUtils.arePhoneNumberWeakEqual(it, number)
|
||||||
pn.phoneNumber,
|
} == null
|
||||||
number
|
) {
|
||||||
)
|
|
||||||
) {
|
|
||||||
duplicate = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!duplicate) {
|
|
||||||
val phoneNumber = Factory.instance()
|
val phoneNumber = Factory.instance()
|
||||||
.createFriendPhoneNumber(number, label)
|
.createFriendPhoneNumber(number, label)
|
||||||
friend.addPhoneNumberWithLabel(phoneNumber)
|
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")
|
Log.e("[Contacts Loader] Exception: $e")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
friendsPhoneNumbers.clear()
|
||||||
|
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
if (core.globalState == GlobalState.Shutdown || core.globalState == GlobalState.Off) {
|
if (core.globalState == GlobalState.Shutdown || core.globalState == GlobalState.Off) {
|
||||||
|
|
|
@ -200,16 +200,5 @@ class LinphoneUtils {
|
||||||
remoteSipUri.clean()
|
remoteSipUri.clean()
|
||||||
return "${localSipUri.asStringUriOnly()}~${remoteSipUri.asStringUriOnly()}"
|
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(")", "")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,5 +127,16 @@ class PhoneNumberUtils {
|
||||||
}
|
}
|
||||||
return null
|
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(")", "")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue