Changes to show & use the 'apply prefix for calls & chat'

This commit is contained in:
Sylvain Berfini 2022-07-18 13:36:37 +02:00
parent e0bc94d62d
commit 1c7886ffb7
14 changed files with 31 additions and 22 deletions

View file

@ -361,7 +361,7 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin
} }
} }
val address = coreContext.core.interpretUrl(addressToCall) val address = coreContext.core.interpretUrl(addressToCall, LinphoneUtils.applyInternationalPrefix())
if (address != null) { if (address != null) {
addressToCall = address.asStringUriOnly() addressToCall = address.asStringUriOnly()
} }
@ -460,7 +460,7 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin
val localAddress = val localAddress =
coreContext.core.defaultAccount?.params?.identityAddress?.asStringUriOnly() coreContext.core.defaultAccount?.params?.identityAddress?.asStringUriOnly()
val peerAddress = coreContext.core.interpretUrl(addressToIM)?.asStringUriOnly() val peerAddress = coreContext.core.interpretUrl(addressToIM, LinphoneUtils.applyInternationalPrefix())?.asStringUriOnly()
Log.i("[Main Activity] Navigating to chat room with local [$localAddress] and peer [$peerAddress] addresses") Log.i("[Main Activity] Navigating to chat room with local [$localAddress] and peer [$peerAddress] addresses")
navigateToChatRoom(localAddress, peerAddress) navigateToChatRoom(localAddress, peerAddress)
} else { } else {

View file

@ -72,7 +72,7 @@ class ChatRoomCreationViewModel : ContactsSelectionViewModel() {
val defaultAccount = coreContext.core.defaultAccount val defaultAccount = coreContext.core.defaultAccount
var room: ChatRoom? var room: ChatRoom?
val address = searchResult.address ?: coreContext.core.interpretUrl(searchResult.phoneNumber ?: "") val address = searchResult.address ?: coreContext.core.interpretUrl(searchResult.phoneNumber ?: "", LinphoneUtils.applyInternationalPrefix())
if (address == null) { if (address == null) {
Log.e("[Chat Room Creation] Can't get a valid address from search result $searchResult") Log.e("[Chat Room Creation] Can't get a valid address from search result $searchResult")
onMessageToNotifyEvent.value = Event(R.string.chat_room_creation_failed_snack) onMessageToNotifyEvent.value = Event(R.string.chat_room_creation_failed_snack)

View file

@ -79,7 +79,7 @@ class ConferenceWaitingRoomFragment : GenericFragment<ConferenceWaitingRoomFragm
it.consume { callParams -> it.consume { callParams ->
val conferenceUri = arguments?.getString("Address") val conferenceUri = arguments?.getString("Address")
if (conferenceUri != null) { if (conferenceUri != null) {
val conferenceAddress = coreContext.core.interpretUrl(conferenceUri) val conferenceAddress = coreContext.core.interpretUrl(conferenceUri, false)
if (conferenceAddress != null) { if (conferenceAddress != null) {
Log.i("[Conference Waiting Room] Calling conference SIP URI: ${conferenceAddress.asStringUriOnly()}") Log.i("[Conference Waiting Room] Calling conference SIP URI: ${conferenceAddress.asStringUriOnly()}")
coreContext.startCall(conferenceAddress, callParams) coreContext.startCall(conferenceAddress, callParams)

View file

@ -130,7 +130,7 @@ class ContactEditorViewModel(val c: Friend?) : ViewModel(), ContactDataInterface
val sipAddress = address.newValue.value.orEmpty() val sipAddress = address.newValue.value.orEmpty()
if (sipAddress.isEmpty()) continue if (sipAddress.isEmpty()) continue
val parsed = coreContext.core.interpretUrl(sipAddress) val parsed = coreContext.core.interpretUrl(sipAddress, false)
if (parsed != null) contact.addAddress(parsed) if (parsed != null) contact.addAddress(parsed)
} }

View file

@ -215,7 +215,7 @@ class ContactViewModel(friend: Friend, async: Boolean = false) : MessageNotifier
val presenceModel = friend.getPresenceModelForUriOrTel(number) val presenceModel = friend.getPresenceModelForUriOrTel(number)
val hasPresence = presenceModel != null && presenceModel.basicStatus == PresenceBasicStatus.Open val hasPresence = presenceModel != null && presenceModel.basicStatus == PresenceBasicStatus.Open
val contactAddress = presenceModel?.contact ?: number val contactAddress = presenceModel?.contact ?: number
val address = coreContext.core.interpretUrl(contactAddress) val address = coreContext.core.interpretUrl(contactAddress, false)
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 = LinphoneUtils.isLimeAvailable() && !isMe && friend.getPresenceModelForUriOrTel(number)?.hasCapability(FriendCapability.LimeX3Dh) ?: false val secureChatAllowed = LinphoneUtils.isLimeAvailable() && !isMe && friend.getPresenceModelForUriOrTel(number)?.hasCapability(FriendCapability.LimeX3Dh) ?: false

View file

@ -420,7 +420,7 @@ class AccountSettingsViewModel(val account: Account) : GenericSettingsViewModel(
val audioVideoConferenceFactoryUriListener = object : SettingListenerStub() { val audioVideoConferenceFactoryUriListener = object : SettingListenerStub() {
override fun onTextValueChanged(newValue: String) { override fun onTextValueChanged(newValue: String) {
val params = account.params.clone() val params = account.params.clone()
val uri = coreContext.core.interpretUrl(newValue) val uri = coreContext.core.interpretUrl(newValue, false)
Log.i("[Account Settings] Forcing audio/video conference factory on proxy config ${params.identityAddress?.asString()} to value: $newValue") Log.i("[Account Settings] Forcing audio/video conference factory on proxy config ${params.identityAddress?.asString()} to value: $newValue")
params.audioVideoConferenceFactoryAddress = uri params.audioVideoConferenceFactoryAddress = uri
account.params = params account.params = params

View file

@ -166,7 +166,7 @@ class Api26Compatibility {
val info: String val info: String
val remoteContact = call.remoteContact val remoteContact = call.remoteContact
val conferenceAddress = if (remoteContact != null) coreContext.core.interpretUrl(remoteContact) else null val conferenceAddress = if (remoteContact != null) coreContext.core.interpretUrl(remoteContact, false) else null
val conferenceInfo = if (conferenceAddress != null) coreContext.core.findConferenceInformationFromUri(conferenceAddress) else null val conferenceInfo = if (conferenceAddress != null) coreContext.core.findConferenceInformationFromUri(conferenceAddress) else null
if (conferenceInfo == null) { if (conferenceInfo == null) {
Log.i("[Notifications Manager] No conference info found for remote contact address $remoteContact") Log.i("[Notifications Manager] No conference info found for remote contact address $remoteContact")

View file

@ -52,7 +52,7 @@ class Api31Compatibility {
notificationsManager: NotificationsManager notificationsManager: NotificationsManager
): Notification { ): Notification {
val remoteContact = call.remoteContact val remoteContact = call.remoteContact
val conferenceAddress = if (remoteContact != null) coreContext.core.interpretUrl(remoteContact) else null val conferenceAddress = if (remoteContact != null) coreContext.core.interpretUrl(remoteContact, false) else null
val conferenceInfo = if (conferenceAddress != null) coreContext.core.findConferenceInformationFromUri(conferenceAddress) else null val conferenceInfo = if (conferenceAddress != null) coreContext.core.findConferenceInformationFromUri(conferenceAddress) else null
if (conferenceInfo != null) { if (conferenceInfo != null) {
Log.i("[Notifications Manager] Displaying incoming group call notification with subject ${conferenceInfo.subject} and remote contact address $remoteContact") Log.i("[Notifications Manager] Displaying incoming group call notification with subject ${conferenceInfo.subject} and remote contact address $remoteContact")

View file

@ -55,7 +55,7 @@ class XiaomiCompatibility {
val info: String val info: String
val remoteContact = call.remoteContact val remoteContact = call.remoteContact
val conferenceAddress = if (remoteContact != null) coreContext.core.interpretUrl(remoteContact) else null val conferenceAddress = if (remoteContact != null) coreContext.core.interpretUrl(remoteContact, false) else null
val conferenceInfo = if (conferenceAddress != null) coreContext.core.findConferenceInformationFromUri(conferenceAddress) else null val conferenceInfo = if (conferenceAddress != null) coreContext.core.findConferenceInformationFromUri(conferenceAddress) else null
if (conferenceInfo == null) { if (conferenceInfo == null) {
Log.i("[Notifications Manager] No conference info found for remote contact address $remoteContact") Log.i("[Notifications Manager] No conference info found for remote contact address $remoteContact")

View file

@ -180,7 +180,7 @@ class ContactLoader : LoaderManager.LoaderCallbacks<Cursor> {
} }
linphoneMime, ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE -> { linphoneMime, ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE -> {
if (data1 == null) continue if (data1 == null) continue
val address = core.interpretUrl(data1) ?: continue val address = core.interpretUrl(data1, true) ?: continue
if ( if (
friendsAddresses.find { friendsAddresses.find {
it.weakEqual(address) it.weakEqual(address)

View file

@ -414,7 +414,7 @@ class CoreContext(
// Ensure audio/video conference factory URI is set on sip.linphone.org proxy configs // Ensure audio/video conference factory URI is set on sip.linphone.org proxy configs
if (account.params.audioVideoConferenceFactoryAddress == null) { if (account.params.audioVideoConferenceFactoryAddress == null) {
val uri = corePreferences.audioVideoConferenceServerUri val uri = corePreferences.audioVideoConferenceServerUri
val address = core.interpretUrl(uri) val address = core.interpretUrl(uri, false)
if (address != null) { if (address != null) {
Log.i("[Context] Setting audio/video conference factory on proxy config ${params.identityAddress?.asString()} to default value: $uri") Log.i("[Context] Setting audio/video conference factory on proxy config ${params.identityAddress?.asString()} to default value: $uri")
params.audioVideoConferenceFactoryAddress = address params.audioVideoConferenceFactoryAddress = address
@ -483,7 +483,7 @@ class CoreContext(
if (isLinphoneAccount) { if (isLinphoneAccount) {
core.config.setString("sip", "rls_uri", corePreferences.defaultRlsUri) core.config.setString("sip", "rls_uri", corePreferences.defaultRlsUri)
val rlsAddress = core.interpretUrl(corePreferences.defaultRlsUri) val rlsAddress = core.interpretUrl(corePreferences.defaultRlsUri, false)
if (rlsAddress != null) { if (rlsAddress != null) {
for (friendList in core.friendsLists) { for (friendList in core.friendsLists) {
friendList.rlsAddress = rlsAddress friendList.rlsAddress = rlsAddress
@ -596,7 +596,7 @@ class CoreContext(
fun declineCall(call: Call) { fun declineCall(call: Call) {
val voiceMailUri = corePreferences.voiceMailUri val voiceMailUri = corePreferences.voiceMailUri
if (voiceMailUri != null && corePreferences.redirectDeclinedCallToVoiceMail) { if (voiceMailUri != null && corePreferences.redirectDeclinedCallToVoiceMail) {
val voiceMailAddress = core.interpretUrl(voiceMailUri) val voiceMailAddress = core.interpretUrl(voiceMailUri, false)
if (voiceMailAddress != null) { if (voiceMailAddress != null) {
Log.i("[Context] Redirecting call $call to voice mail URI: $voiceMailUri") Log.i("[Context] Redirecting call $call to voice mail URI: $voiceMailUri")
call.redirectTo(voiceMailAddress) call.redirectTo(voiceMailAddress)
@ -617,7 +617,7 @@ class CoreContext(
if (currentCall == null) { if (currentCall == null) {
Log.e("[Context] Couldn't find a call to transfer") Log.e("[Context] Couldn't find a call to transfer")
} else { } else {
val address = core.interpretUrl(addressToCall) val address = core.interpretUrl(addressToCall, LinphoneUtils.applyInternationalPrefix())
if (address != null) { if (address != null) {
Log.i("[Context] Transferring current call to $addressToCall") Log.i("[Context] Transferring current call to $addressToCall")
currentCall.transferTo(address) currentCall.transferTo(address)
@ -638,7 +638,7 @@ class CoreContext(
} }
} }
val address: Address? = core.interpretUrl(stringAddress) val address: Address? = core.interpretUrl(stringAddress, LinphoneUtils.applyInternationalPrefix())
if (address == null) { if (address == null) {
Log.e("[Context] Failed to parse $stringAddress, abort outgoing call") Log.e("[Context] Failed to parse $stringAddress, abort outgoing call")
callErrorMessageResourceId.value = Event(context.getString(R.string.call_error_network_unreachable)) callErrorMessageResourceId.value = Event(context.getString(R.string.call_error_network_unreachable))

View file

@ -53,7 +53,7 @@ class NotificationBroadcastReceiver : BroadcastReceiver() {
} }
val core: Core = coreContext.core val core: Core = coreContext.core
val remoteAddress = core.interpretUrl(remoteSipAddress) val remoteAddress = core.interpretUrl(remoteSipAddress, false)
if (remoteAddress == null) { if (remoteAddress == null) {
Log.e("[Notification Broadcast Receiver] Couldn't interpret remote address $remoteSipAddress") Log.e("[Notification Broadcast Receiver] Couldn't interpret remote address $remoteSipAddress")
return return
@ -64,7 +64,7 @@ class NotificationBroadcastReceiver : BroadcastReceiver() {
Log.e("[Notification Broadcast Receiver] Local identity is null for notification id $notificationId") Log.e("[Notification Broadcast Receiver] Local identity is null for notification id $notificationId")
return return
} }
val localAddress = core.interpretUrl(localIdentity) val localAddress = core.interpretUrl(localIdentity, false)
if (localAddress == null) { if (localAddress == null) {
Log.e("[Notification Broadcast Receiver] Couldn't interpret local address $localIdentity") Log.e("[Notification Broadcast Receiver] Couldn't interpret local address $localIdentity")
return return
@ -107,7 +107,7 @@ class NotificationBroadcastReceiver : BroadcastReceiver() {
val core: Core = coreContext.core val core: Core = coreContext.core
val remoteAddress = core.interpretUrl(remoteSipAddress) val remoteAddress = core.interpretUrl(remoteSipAddress, false)
val call = if (remoteAddress != null) core.getCallByRemoteAddress2(remoteAddress) else null val call = if (remoteAddress != null) core.getCallByRemoteAddress2(remoteAddress) else null
if (call == null) { if (call == null) {
Log.e("[Notification Broadcast Receiver] Couldn't find call from remote address $remoteSipAddress") Log.e("[Notification Broadcast Receiver] Couldn't find call from remote address $remoteSipAddress")

View file

@ -78,7 +78,7 @@ class LinphoneUtils {
val remoteContact = call.remoteContact val remoteContact = call.remoteContact
val conferenceAddress = if (call.dir == Call.Dir.Incoming) { val conferenceAddress = if (call.dir == Call.Dir.Incoming) {
if (remoteContact != null) if (remoteContact != null)
coreContext.core.interpretUrl(remoteContact) coreContext.core.interpretUrl(remoteContact, false)
else else
null null
} else { } else {
@ -234,5 +234,15 @@ class LinphoneUtils {
return list return list
} }
fun applyInternationalPrefix(): Boolean {
val account = coreContext.core.defaultAccount
if (account != null) {
val params = account.params
return params.useInternationalPrefixForCallsAndChats
}
return true // Legacy behavior
}
} }
} }

View file

@ -225,8 +225,7 @@
linphone:title="@{@string/account_settings_apply_prefix_for_calls_title}" linphone:title="@{@string/account_settings_apply_prefix_for_calls_title}"
linphone:subtitle="@{@string/account_settings_apply_prefix_for_calls_summary}" linphone:subtitle="@{@string/account_settings_apply_prefix_for_calls_summary}"
linphone:listener="@{viewModel.dialPrefixListener}" linphone:listener="@{viewModel.dialPrefixListener}"
linphone:checked="@={viewModel.dialPrefix}" linphone:checked="@={viewModel.dialPrefix}"/>
android:visibility="gone"/>
<include <include
layout="@layout/settings_widget_switch" layout="@layout/settings_widget_switch"