Workaround phone number labels not stored in vCards because they don't match the RFC
This commit is contained in:
parent
a31381632f
commit
c1f542cbf5
3 changed files with 73 additions and 9 deletions
|
@ -37,6 +37,7 @@ import org.linphone.core.*
|
||||||
import org.linphone.core.tools.Log
|
import org.linphone.core.tools.Log
|
||||||
import org.linphone.utils.Event
|
import org.linphone.utils.Event
|
||||||
import org.linphone.utils.LinphoneUtils
|
import org.linphone.utils.LinphoneUtils
|
||||||
|
import org.linphone.utils.PhoneNumberUtils
|
||||||
|
|
||||||
class ContactViewModelFactory(private val friend: Friend) :
|
class ContactViewModelFactory(private val friend: Friend) :
|
||||||
ViewModelProvider.NewInstanceFactory() {
|
ViewModelProvider.NewInstanceFactory() {
|
||||||
|
@ -213,7 +214,8 @@ class ContactViewModel(friend: Friend, async: Boolean = false) : MessageNotifier
|
||||||
address?.displayName = displayName.value.orEmpty()
|
address?.displayName = displayName.value.orEmpty()
|
||||||
val isMe = if (address != null) coreContext.core.defaultAccount?.params?.identityAddress?.weakEqual(address) ?: false else false
|
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 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)
|
list.add(noa)
|
||||||
}
|
}
|
||||||
numbersAndAddresses.postValue(list)
|
numbersAndAddresses.postValue(list)
|
||||||
|
|
|
@ -43,6 +43,7 @@ import org.linphone.core.Friend
|
||||||
import org.linphone.core.GlobalState
|
import org.linphone.core.GlobalState
|
||||||
import org.linphone.core.tools.Log
|
import org.linphone.core.tools.Log
|
||||||
import org.linphone.utils.LinphoneUtils
|
import org.linphone.utils.LinphoneUtils
|
||||||
|
import org.linphone.utils.PhoneNumberUtils
|
||||||
|
|
||||||
class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
|
class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -139,12 +140,10 @@ class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
|
||||||
|
|
||||||
when (mime) {
|
when (mime) {
|
||||||
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> {
|
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> {
|
||||||
val typeLabel =
|
val label = PhoneNumberUtils.addressBookLabelTypeToVcardParamString(
|
||||||
ContactsContract.CommonDataKinds.Phone.getTypeLabel(
|
data2?.toInt() ?: ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM,
|
||||||
loader.context.resources,
|
data3
|
||||||
data2?.toInt() ?: 0,
|
)
|
||||||
data3
|
|
||||||
).toString()
|
|
||||||
|
|
||||||
val number =
|
val number =
|
||||||
if (corePreferences.preferNormalizedPhoneNumbersFromAddressBook ||
|
if (corePreferences.preferNormalizedPhoneNumbersFromAddressBook ||
|
||||||
|
@ -155,10 +154,11 @@ class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
|
||||||
} else {
|
} else {
|
||||||
data1
|
data1
|
||||||
}
|
}
|
||||||
|
|
||||||
if (number != null) {
|
if (number != null) {
|
||||||
var duplicate = false
|
var duplicate = false
|
||||||
for (pn in friend.phoneNumbersWithLabel) {
|
for (pn in friend.phoneNumbersWithLabel) {
|
||||||
if (pn.label == typeLabel && LinphoneUtils.arePhoneNumberWeakEqual(
|
if (pn.label == label && LinphoneUtils.arePhoneNumberWeakEqual(
|
||||||
pn.phoneNumber,
|
pn.phoneNumber,
|
||||||
number
|
number
|
||||||
)
|
)
|
||||||
|
@ -169,7 +169,7 @@ class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
|
||||||
}
|
}
|
||||||
if (!duplicate) {
|
if (!duplicate) {
|
||||||
val phoneNumber = Factory.instance()
|
val phoneNumber = Factory.instance()
|
||||||
.createFriendPhoneNumber(number, typeLabel)
|
.createFriendPhoneNumber(number, label)
|
||||||
friend.addPhoneNumberWithLabel(phoneNumber)
|
friend.addPhoneNumberWithLabel(phoneNumber)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,8 @@ package org.linphone.utils
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.res.Resources
|
||||||
|
import android.provider.ContactsContract
|
||||||
import android.telephony.TelephonyManager
|
import android.telephony.TelephonyManager
|
||||||
import org.linphone.core.DialPlan
|
import org.linphone.core.DialPlan
|
||||||
import org.linphone.core.Factory
|
import org.linphone.core.Factory
|
||||||
|
@ -59,6 +61,66 @@ class PhoneNumberUtils {
|
||||||
return null
|
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? {
|
private fun getDialPlanFromCountryCode(countryCode: String): DialPlan? {
|
||||||
for (c in Factory.instance().dialPlans) {
|
for (c in Factory.instance().dialPlans) {
|
||||||
if (countryCode.equals(c.isoCountryCode, ignoreCase = true)) return c
|
if (countryCode.equals(c.isoCountryCode, ignoreCase = true)) return c
|
||||||
|
|
Loading…
Reference in a new issue