diff --git a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt index 8a56fd898..0acc03410 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt @@ -37,6 +37,7 @@ import org.linphone.core.* import org.linphone.core.tools.Log import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils +import org.linphone.utils.PhoneNumberUtils class ContactViewModelFactory(private val friend: Friend) : ViewModelProvider.NewInstanceFactory() { @@ -213,7 +214,8 @@ class ContactViewModel(friend: Friend, async: Boolean = false) : MessageNotifier address?.displayName = displayName.value.orEmpty() val isMe = if (address != null) coreContext.core.defaultAccount?.params?.identityAddress?.weakEqual(address) ?: false else false val secureChatAllowed = !isMe && friend.getPresenceModelForUriOrTel(number)?.hasCapability(FriendCapability.LimeX3Dh) ?: false - val noa = ContactNumberOrAddressData(address, hasPresence, number, isSip = false, showSecureChat = secureChatAllowed, typeLabel = phoneNumber.label ?: "", listener = listener) + val label = PhoneNumberUtils.vcardParamStringToAddressBookLabel(coreContext.context.resources, phoneNumber.label ?: "") + val noa = ContactNumberOrAddressData(address, hasPresence, number, isSip = false, showSecureChat = secureChatAllowed, typeLabel = label, listener = listener) list.add(noa) } numbersAndAddresses.postValue(list) diff --git a/app/src/main/java/org/linphone/contact/ContactLoader.kt b/app/src/main/java/org/linphone/contact/ContactLoader.kt index 8a5a9d97d..3870980e3 100644 --- a/app/src/main/java/org/linphone/contact/ContactLoader.kt +++ b/app/src/main/java/org/linphone/contact/ContactLoader.kt @@ -43,6 +43,7 @@ import org.linphone.core.Friend import org.linphone.core.GlobalState import org.linphone.core.tools.Log import org.linphone.utils.LinphoneUtils +import org.linphone.utils.PhoneNumberUtils class ContactLoader : LoaderManager.LoaderCallbacks { companion object { @@ -139,12 +140,10 @@ class ContactLoader : LoaderManager.LoaderCallbacks { when (mime) { ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> { - val typeLabel = - ContactsContract.CommonDataKinds.Phone.getTypeLabel( - loader.context.resources, - data2?.toInt() ?: 0, - data3 - ).toString() + val label = PhoneNumberUtils.addressBookLabelTypeToVcardParamString( + data2?.toInt() ?: ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM, + data3 + ) val number = if (corePreferences.preferNormalizedPhoneNumbersFromAddressBook || @@ -155,10 +154,11 @@ class ContactLoader : LoaderManager.LoaderCallbacks { } else { data1 } + if (number != null) { var duplicate = false for (pn in friend.phoneNumbersWithLabel) { - if (pn.label == typeLabel && LinphoneUtils.arePhoneNumberWeakEqual( + if (pn.label == label && LinphoneUtils.arePhoneNumberWeakEqual( pn.phoneNumber, number ) @@ -169,7 +169,7 @@ class ContactLoader : LoaderManager.LoaderCallbacks { } if (!duplicate) { val phoneNumber = Factory.instance() - .createFriendPhoneNumber(number, typeLabel) + .createFriendPhoneNumber(number, label) friend.addPhoneNumberWithLabel(phoneNumber) } } diff --git a/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt b/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt index 4cf8f5866..4f2dda1c4 100644 --- a/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt +++ b/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt @@ -21,6 +21,8 @@ package org.linphone.utils import android.annotation.SuppressLint import android.content.Context +import android.content.res.Resources +import android.provider.ContactsContract import android.telephony.TelephonyManager import org.linphone.core.DialPlan import org.linphone.core.Factory @@ -59,6 +61,66 @@ class PhoneNumberUtils { return null } + fun addressBookLabelTypeToVcardParamString(type: Int, default: String?): String { + return when (type) { + ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT -> "assistant" + ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK -> "callback" + ContactsContract.CommonDataKinds.Phone.TYPE_CAR -> "car" + ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN -> "work,main" + ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME -> "home,fax" + ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK -> "work,fax" + ContactsContract.CommonDataKinds.Phone.TYPE_HOME -> "home" + ContactsContract.CommonDataKinds.Phone.TYPE_ISDN -> "isdn" + ContactsContract.CommonDataKinds.Phone.TYPE_MAIN -> "main" + ContactsContract.CommonDataKinds.Phone.TYPE_MMS -> "text" + ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE -> "cell" + ContactsContract.CommonDataKinds.Phone.TYPE_OTHER -> "other" + ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX -> "fax" + ContactsContract.CommonDataKinds.Phone.TYPE_PAGER -> "pager" + ContactsContract.CommonDataKinds.Phone.TYPE_RADIO -> "radio" + ContactsContract.CommonDataKinds.Phone.TYPE_TELEX -> "telex" + ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD -> "textphone" + ContactsContract.CommonDataKinds.Phone.TYPE_WORK -> "work" + ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE -> "work,cell" + ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER -> "work,pager" + ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM -> default ?: "custom" + else -> default ?: type.toString() + } + } + + fun vcardParamStringToAddressBookLabel(resources: Resources, label: String): String { + if (label.isEmpty()) return label + val type = labelToType(label) + return ContactsContract.CommonDataKinds.Phone.getTypeLabel(resources, type, label).toString() + } + + private fun labelToType(label: String): Int { + return when (label) { + "assistant" -> ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT + "callback" -> ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK + "car" -> ContactsContract.CommonDataKinds.Phone.TYPE_CAR + "work,main" -> ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN + "home,fax" -> ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME + "work,fax" -> ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK + "home" -> ContactsContract.CommonDataKinds.Phone.TYPE_HOME + "isdn" -> ContactsContract.CommonDataKinds.Phone.TYPE_ISDN + "main" -> ContactsContract.CommonDataKinds.Phone.TYPE_MAIN + "text" -> ContactsContract.CommonDataKinds.Phone.TYPE_MMS + "cell" -> ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE + "other" -> ContactsContract.CommonDataKinds.Phone.TYPE_OTHER + "fax" -> ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX + "pager" -> ContactsContract.CommonDataKinds.Phone.TYPE_PAGER + "radio" -> ContactsContract.CommonDataKinds.Phone.TYPE_RADIO + "telex" -> ContactsContract.CommonDataKinds.Phone.TYPE_TELEX + "textphone" -> ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD + "work" -> ContactsContract.CommonDataKinds.Phone.TYPE_WORK + "work,cell" -> ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE + "work,pager" -> ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER + "custom" -> ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM + else -> ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM + } + } + private fun getDialPlanFromCountryCode(countryCode: String): DialPlan? { for (c in Factory.instance().dialPlans) { if (countryCode.equals(c.isoCountryCode, ignoreCase = true)) return c