Added call transfer capability.

This commit is contained in:
Juha Heinanen
2020-08-23 15:48:55 +03:00
parent 035f89c2ee
commit b1ff3ecc0e
8 changed files with 120 additions and 18 deletions
@@ -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()