From a7efacaeb64a5b5e44f98f3032fdd23434041098 Mon Sep 17 00:00:00 2001 From: Christophe Deschamps Date: Wed, 4 Dec 2024 13:38:50 +0100 Subject: [PATCH] Transfer a call via DTMF --- .../data/ContactNumberOrAddressData.kt | 11 ++++++- .../contact/viewmodels/ContactViewModel.kt | 30 +++++++++++++++++-- .../java/org/linphone/core/CorePreferences.kt | 3 ++ .../main/res/layout/contact_detail_cell.xml | 12 ++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/contact/data/ContactNumberOrAddressData.kt b/app/src/main/java/org/linphone/activities/main/contact/data/ContactNumberOrAddressData.kt index 93f709d5e..a1a77267c 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/data/ContactNumberOrAddressData.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/data/ContactNumberOrAddressData.kt @@ -19,6 +19,7 @@ */ package org.linphone.activities.main.contact.data +import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.core.Address @@ -29,7 +30,8 @@ class ContactNumberOrAddressData( val isSip: Boolean = true, val showSecureChat: Boolean = false, val typeLabel: String = "", - private val listener: ContactNumberOrAddressClickListener + private val listener: ContactNumberOrAddressClickListener, + val dtmfTransferAllowed: MutableLiveData ) { val showInvite = !hasPresence && !isSip && corePreferences.showContactInviteBySms @@ -50,6 +52,11 @@ class ContactNumberOrAddressData( fun smsInvite() { listener.onSmsInvite(displayedValue) } + + fun dtmfTransferTo() { + address ?: return + listener.transferViaDtmfTo(address.username!!) + } } interface ContactNumberOrAddressClickListener { @@ -58,4 +65,6 @@ interface ContactNumberOrAddressClickListener { fun onChat(address: Address, isSecured: Boolean) fun onSmsInvite(number: String) + + fun transferViaDtmfTo(username: String) } 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 68ac85ace..99fda599e 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 @@ -83,6 +83,20 @@ class ContactViewModel(friend: Friend) : MessageNotifierViewModel(), ContactData val hasLongTermPresence = MutableLiveData() + val dtmfTransferAllowed = MutableLiveData( + !corePreferences.transferDtmfCode.isEmpty() && coreContext.core.currentCall != null + ) + + private val coreListener: CoreListenerStub = object : CoreListenerStub() { + override fun onCallStateChanged( + core: Core, + call: Call, + state: Call.State?, + message: String + ) { + dtmfTransferAllowed.value = !corePreferences.transferDtmfCode.isEmpty() && coreContext.core.currentCall != null + } + } private val chatRoomListener = object : ChatRoomListenerStub() { override fun onStateChanged(chatRoom: ChatRoom, state: ChatRoom.State) { if (state == ChatRoom.State.Created) { @@ -138,6 +152,14 @@ class ContactViewModel(friend: Friend) : MessageNotifierViewModel(), ContactData override fun onSmsInvite(number: String) { sendSmsToEvent.value = Event(number) } + + override fun transferViaDtmfTo(username: String) { + val dtmfs = corePreferences.transferDtmfCode.replace("\${extension}", username) + coreContext.core.currentCall?.also { call -> + Log.i("Transferring call ${call.callLog.callId} via DTMFs: $dtmfs") + call.sendDtmfs(dtmfs) + } + } } init { @@ -154,9 +176,11 @@ class ContactViewModel(friend: Friend) : MessageNotifierViewModel(), ContactData presenceStatus.value = it.consolidatedPresence hasLongTermPresence.value = it.hasLongTermPresence() } + coreContext.core.addListener(coreListener) } override fun onCleared() { + coreContext.core.removeListener(coreListener) destroy() super.onCleared() } @@ -223,7 +247,8 @@ class ContactViewModel(friend: Friend) : MessageNotifierViewModel(), ContactData hasPresence, displayValue, showSecureChat = secureChatAllowed, - listener = listener + listener = listener, + dtmfTransferAllowed = dtmfTransferAllowed ) list.add(noa) } @@ -262,7 +287,8 @@ class ContactViewModel(friend: Friend) : MessageNotifierViewModel(), ContactData isSip = false, showSecureChat = secureChatAllowed, typeLabel = label, - listener = listener + listener = listener, + dtmfTransferAllowed = dtmfTransferAllowed ) list.add(noa) } diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index eba48e42a..9be10975a 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -274,6 +274,9 @@ class CorePreferences constructor(private val context: Context) { /* Call */ + val transferDtmfCode: String + get() = config.getString("app", "transfer_dtmf_code", "")!! + var sendEarlyMedia: Boolean get() = config.getBool("sip", "outgoing_calls_early_media", false) set(value) { diff --git a/app/src/main/res/layout/contact_detail_cell.xml b/app/src/main/res/layout/contact_detail_cell.xml index f07e7a3c3..35741fc92 100644 --- a/app/src/main/res/layout/contact_detail_cell.xml +++ b/app/src/main/res/layout/contact_detail_cell.xml @@ -99,6 +99,18 @@ android:background="@drawable/round_orange_button_background" android:src="@drawable/call_start_default" /> + +