Transfer a call via DTMF

This commit is contained in:
Christophe Deschamps 2024-12-04 13:38:50 +01:00
parent be82bcfedf
commit a7efacaeb6
4 changed files with 53 additions and 3 deletions

View file

@ -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<Boolean>
) {
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)
}

View file

@ -83,6 +83,20 @@ class ContactViewModel(friend: Friend) : MessageNotifierViewModel(), ContactData
val hasLongTermPresence = MutableLiveData<Boolean>()
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)
}

View file

@ -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) {

View file

@ -99,6 +99,18 @@
android:background="@drawable/round_orange_button_background"
android:src="@drawable/call_start_default" />
<ImageView
android:onClick="@{() -> data.dtmfTransferTo()}"
android:enabled="@{data.address != null}"
android:contentDescription="@string/content_description_transfer_call"
android:visibility="@{data.dtmfTransferAllowed ? View.VISIBLE : View.GONE}"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="10dp"
android:padding="10dp"
android:background="@drawable/round_orange_button_background"
android:src="@drawable/call_transfer" />
<ImageView
android:onClick="@{() -> data.startChat(false)}"
android:enabled="@{data.address != null}"