mirror of
https://gitlab.linphone.org/BC/public/linphone-android.git
synced 2026-01-17 11:28:06 +00:00
Transfer a call via DTMF
This commit is contained in:
parent
be82bcfedf
commit
a7efacaeb6
4 changed files with 53 additions and 3 deletions
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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}"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue