Added call transfer capability.
This commit is contained in:
@@ -695,7 +695,7 @@ class BaresipService: Service() {
|
||||
.setContentIntent(pi)
|
||||
.setDefaults(Notification.DEFAULT_SOUND)
|
||||
.setAutoCancel(true)
|
||||
.setContentTitle(getString(R.string.transfer_request))
|
||||
.setContentTitle(getString(R.string.transfer_request_to))
|
||||
.setContentText(target)
|
||||
if (Build.VERSION.SDK_INT < 26) {
|
||||
nb.setVibrate(LongArray(0))
|
||||
@@ -757,7 +757,7 @@ class BaresipService: Service() {
|
||||
"transfer failed" -> {
|
||||
Log.d(LOG_TAG, "AoR $aor hanging up call $callp with ${ev[1]}")
|
||||
Api.ua_hangup(uap, callp, 0, "")
|
||||
return
|
||||
if (!Utils.isVisible()) return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,6 +39,10 @@ class Call(val callp: String, val ua: UserAgent, val peerURI: String, val dir: S
|
||||
return call_unhold(callp)
|
||||
}
|
||||
|
||||
fun transfer(uri: String): Int {
|
||||
return call_transfer(callp, uri)
|
||||
}
|
||||
|
||||
fun sendDigit(digit: Char): Int {
|
||||
return call_send_digit(callp, digit)
|
||||
}
|
||||
@@ -66,6 +70,7 @@ class Call(val callp: String, val ua: UserAgent, val peerURI: String, val dir: S
|
||||
private external fun call_connect(callp: String, peer_uri: String): Int
|
||||
private external fun call_hold(callp: String): Int
|
||||
private external fun call_unhold(callp: String): Int
|
||||
private external fun call_transfer(callp: String, peer_uri: String): Int
|
||||
private external fun call_send_digit(callp: String, digit: Char): Int
|
||||
private external fun call_notify_sipfrag(callp: String, code: Int, reason: String)
|
||||
private external fun call_start_audio(callp: String)
|
||||
|
||||
@@ -36,6 +36,7 @@ class MainActivity : AppCompatActivity() {
|
||||
internal lateinit var answerButton: ImageButton
|
||||
internal lateinit var rejectButton: ImageButton
|
||||
internal lateinit var holdButton: ImageButton
|
||||
internal lateinit var transferButton: ImageButton
|
||||
internal lateinit var voicemailButton: ImageButton
|
||||
internal lateinit var contactsButton: ImageButton
|
||||
internal lateinit var messagesButton: ImageButton
|
||||
@@ -82,6 +83,7 @@ class MainActivity : AppCompatActivity() {
|
||||
answerButton = findViewById(R.id.answerButton) as ImageButton
|
||||
rejectButton = findViewById(R.id.rejectButton) as ImageButton
|
||||
holdButton = findViewById(R.id.holdButton) as ImageButton
|
||||
transferButton = findViewById(R.id.transferButton) as ImageButton
|
||||
dtmf = findViewById(R.id.dtmf) as EditText
|
||||
infoButton = findViewById(R.id.info) as ImageButton
|
||||
voicemailButton = findViewById(R.id.voicemailButton) as ImageButton
|
||||
@@ -329,6 +331,11 @@ class MainActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
transferButton.setOnClickListener {
|
||||
val ua = UserAgent.uas()[aorSpinner.selectedItemPosition]
|
||||
callTransfer(Call.uaCalls(ua, "")[0])
|
||||
}
|
||||
|
||||
infoButton.setOnClickListener {
|
||||
val ua = UserAgent.uas()[aorSpinner.selectedItemPosition]
|
||||
val calls = Call.uaCalls(ua, "")
|
||||
@@ -748,12 +755,12 @@ class MainActivity : AppCompatActivity() {
|
||||
return
|
||||
}
|
||||
val titleView = View.inflate(this, R.layout.alert_title, null) as TextView
|
||||
titleView.text = getString(R.string.transfer)
|
||||
titleView.text = getString(R.string.transfer_request)
|
||||
val target = Utils.friendlyUri(ContactsActivity.contactName(ev[1]),
|
||||
Utils.aorDomain(aor))
|
||||
with (AlertDialog.Builder(this)) {
|
||||
setCustomTitle(titleView)
|
||||
setMessage(String.format(getString(R.string.transfer_query),
|
||||
setMessage(String.format(getString(R.string.transfer_request_query),
|
||||
target))
|
||||
setPositiveButton(getString(R.string.yes)) { dialog, _ ->
|
||||
if (call in Call.calls())
|
||||
@@ -782,6 +789,11 @@ class MainActivity : AppCompatActivity() {
|
||||
call(ua, ev[1], "transferring")
|
||||
showCall(ua)
|
||||
}
|
||||
"transfer failed" -> {
|
||||
Toast.makeText(applicationContext,
|
||||
"${getString(R.string.transfer_failed)}: ${ev[1].trim()}",
|
||||
Toast.LENGTH_LONG).show()
|
||||
}
|
||||
"call closed" -> {
|
||||
if (aor == aorSpinner.tag) {
|
||||
callUri.inputType = InputType.TYPE_CLASS_TEXT +
|
||||
@@ -1031,6 +1043,45 @@ class MainActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun callTransfer(call: Call) {
|
||||
val layout = LayoutInflater.from(this)
|
||||
.inflate(R.layout.call_transfer_dialog, findViewById(android.R.id.content) as ViewGroup,
|
||||
false)
|
||||
val titleView = layout.findViewById(R.id.title) as TextView
|
||||
titleView.text = getString(R.string.call_transfer)
|
||||
val transferUri = layout.findViewById(R.id.transferUri) as AutoCompleteTextView
|
||||
transferUri.setAdapter(ArrayAdapter(this, android.R.layout.select_dialog_item,
|
||||
Contact.contacts().map { Contact -> Contact.name }))
|
||||
transferUri.threshold = 2
|
||||
with (AlertDialog.Builder(this)) {
|
||||
setView(layout)
|
||||
setPositiveButton(R.string.transfer) { dialog, _ ->
|
||||
dialog.dismiss()
|
||||
val uriText = transferUri.text.toString().trim()
|
||||
if (uriText.length > 0) {
|
||||
var uri = ContactsActivity.findContactURI(uriText)
|
||||
if (!uri.startsWith("sip:")) {
|
||||
uri = "sip:$uri"
|
||||
if (!uri.contains("@")) {
|
||||
val aor = call.ua.account.aor
|
||||
val host = aor.substring(aor.indexOf("@") + 1)
|
||||
uri = "$uri@$host"
|
||||
}
|
||||
}
|
||||
if (!Utils.checkSipUri(uri))
|
||||
Utils.alertView(applicationContext, getString(R.string.notice),
|
||||
String.format(getString(R.string.invalid_sip_uri), uri))
|
||||
else
|
||||
call.transfer(uri)
|
||||
}
|
||||
}
|
||||
setNegativeButton(android.R.string.cancel) { dialog, _ ->
|
||||
dialog.cancel()
|
||||
}
|
||||
show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun askPassword(title: String, ua: UserAgent? = null) {
|
||||
val layout = LayoutInflater.from(this)
|
||||
.inflate(R.layout.password_dialog, findViewById(android.R.id.content) as ViewGroup,
|
||||
@@ -1303,6 +1354,7 @@ class MainActivity : AppCompatActivity() {
|
||||
answerButton.visibility = View.INVISIBLE
|
||||
rejectButton.visibility = View.INVISIBLE
|
||||
holdButton.visibility = View.INVISIBLE
|
||||
transferButton.visibility = View.INVISIBLE
|
||||
dtmf.visibility = View.INVISIBLE
|
||||
dialpadButton.isEnabled = true
|
||||
infoButton.visibility = View.INVISIBLE
|
||||
@@ -1334,6 +1386,7 @@ class MainActivity : AppCompatActivity() {
|
||||
answerButton.visibility = View.INVISIBLE
|
||||
rejectButton.visibility = View.INVISIBLE
|
||||
holdButton.visibility = View.INVISIBLE
|
||||
transferButton.visibility = View.INVISIBLE
|
||||
dtmf.visibility = View.INVISIBLE
|
||||
dialpadButton.isEnabled = false
|
||||
infoButton.visibility = View.INVISIBLE
|
||||
@@ -1347,6 +1400,7 @@ class MainActivity : AppCompatActivity() {
|
||||
rejectButton.visibility = View.VISIBLE
|
||||
rejectButton.isEnabled = true
|
||||
holdButton.visibility = View.INVISIBLE
|
||||
transferButton.visibility = View.INVISIBLE
|
||||
dtmf.visibility = View.INVISIBLE
|
||||
dialpadButton.isEnabled = false
|
||||
infoButton.visibility = View.INVISIBLE
|
||||
@@ -1370,6 +1424,7 @@ class MainActivity : AppCompatActivity() {
|
||||
holdButton.setImageResource(R.drawable.pause)
|
||||
}
|
||||
holdButton.visibility = View.VISIBLE
|
||||
transferButton.visibility = View.VISIBLE
|
||||
dtmf.visibility = View.VISIBLE
|
||||
dtmf.isEnabled = true
|
||||
dtmf.requestFocus()
|
||||
|
||||
Reference in New Issue
Block a user