Call transfer improvements

This commit is contained in:
Juha Heinanen
2020-08-28 18:21:17 +03:00
parent 1bb84a9278
commit 797cac0c0f
4 changed files with 47 additions and 30 deletions

View File

@ -218,7 +218,7 @@ static void ua_event_handler(struct ua *ua, enum ua_event ev,
len = re_snprintf(event_buf, sizeof event_buf, "call transfer,%s", prm);
break;
case UA_EVENT_CALL_TRANSFER_FAILED:
len = re_snprintf(event_buf, sizeof event_buf, "transfer failed,%s", prm);
len = re_snprintf(event_buf, sizeof event_buf, "refer failed,%s", prm);
break;
case UA_EVENT_CALL_CLOSED:
play = mem_deref(play);

View File

@ -754,9 +754,15 @@ class BaresipService: Service() {
}
if (!Utils.isVisible()) return
}
"transfer failed" -> {
"refer failed" -> {
Log.d(LOG_TAG, "AoR $aor hanging up call $callp with ${ev[1]}")
Api.ua_hangup(uap, callp, 0, "")
val call = Call.ofCallp(callp)
if (call == null) {
Log.w(LOG_TAG, "Call $callp with failed refer is not found")
} else {
call.referTo = ""
}
if (!Utils.isVisible()) return
}
}

View File

@ -10,6 +10,7 @@ class Call(val callp: String, val ua: UserAgent, val peerURI: String, val dir: S
var security = 0
var zid = ""
var hasHistory = false
var referTo = ""
fun add() {
BaresipService.calls.add(this)
@ -39,7 +40,8 @@ class Call(val callp: String, val ua: UserAgent, val peerURI: String, val dir: S
return call_unhold(callp)
}
fun transfer(uri: String): Int {
fun refer(uri: String): Int {
referTo = uri
return call_transfer(callp, uri)
}

View File

@ -332,8 +332,7 @@ class MainActivity : AppCompatActivity() {
}
transferButton.setOnClickListener {
val ua = UserAgent.uas()[aorSpinner.selectedItemPosition]
callTransfer(Call.uaCalls(ua, "")[0])
callTransfer(UserAgent.uas()[aorSpinner.selectedItemPosition])
}
infoButton.setOnClickListener {
@ -765,7 +764,7 @@ class MainActivity : AppCompatActivity() {
setPositiveButton(getString(R.string.yes)) { dialog, _ ->
if (call in Call.calls())
Api.ua_hangup(uap, callp, 0, "")
call(ua, ev[1], "transferring")
call(ua, ev[1], "outgoing")
showCall(ua)
dialog.dismiss()
}
@ -786,10 +785,10 @@ class MainActivity : AppCompatActivity() {
}
if (call in Call.calls())
Api.ua_hangup(uap, callp, 0, "")
call(ua, ev[1], "transferring")
call(ua, ev[1], "outgoing")
showCall(ua)
}
"transfer failed" -> {
"refer failed" -> {
Toast.makeText(applicationContext,
"${getString(R.string.transfer_failed)}: ${ev[1].trim()}",
Toast.LENGTH_LONG).show()
@ -1043,7 +1042,7 @@ class MainActivity : AppCompatActivity() {
}
}
private fun callTransfer(call: Call) {
private fun callTransfer(ua: UserAgent) {
val layout = LayoutInflater.from(this)
.inflate(R.layout.call_transfer_dialog, findViewById(android.R.id.content) as ViewGroup,
false)
@ -1063,16 +1062,20 @@ class MainActivity : AppCompatActivity() {
if (!uri.startsWith("sip:")) {
uri = "sip:$uri"
if (!uri.contains("@")) {
val aor = call.ua.account.aor
val aor = ua.account.aor
val host = aor.substring(aor.indexOf("@") + 1)
uri = "$uri@$host"
}
}
if (!Utils.checkSipUri(uri))
Utils.alertView(applicationContext, getString(R.string.notice),
Utils.alertView(this@MainActivity, getString(R.string.notice),
String.format(getString(R.string.invalid_sip_uri), uri))
else
call.transfer(uri)
else {
if (Call.uaCalls(ua, "").size > 0) {
Call.uaCalls(ua, "")[0].refer(uri)
showCall(ua)
}
}
}
}
setNegativeButton(android.R.string.cancel) { dialog, _ ->
@ -1359,26 +1362,14 @@ class MainActivity : AppCompatActivity() {
dialpadButton.isEnabled = true
infoButton.visibility = View.INVISIBLE
} else {
val callsOut = Call.uaCalls(ua, "out")
val callsIn = Call.uaCalls(ua, "in")
val call: Call
if (callsOut.size > 0) {
call = callsOut[callsOut.size - 1]
if (call.status == "transferring")
callTitle.text = getString(R.string.transferring_call_to_dots)
else
callTitle.text = getString(R.string.outgoing_call_to_dots)
} else {
callTitle.text = getString(R.string.incoming_call_from_dots)
callUri.setAdapter(null)
call = callsIn[callsIn.size - 1]
}
callUri.setText(Utils.friendlyUri(ContactsActivity.contactName(call.peerURI),
Utils.aorDomain(ua.account.aor)))
val call = Call.uaCalls(ua, "")[0]
callUri.isFocusable = false
imm.hideSoftInputFromWindow(callUri.windowToken, 0)
when (call.status) {
"outgoing", "transferring" -> {
"outgoing" -> {
callTitle.text = getString(R.string.outgoing_call_to_dots)
callUri.setText(Utils.friendlyUri(ContactsActivity.contactName(call.peerURI),
Utils.aorDomain(ua.account.aor)))
securityButton.visibility = View.INVISIBLE
callButton.visibility = View.INVISIBLE
hangupButton.visibility = View.VISIBLE
@ -1392,6 +1383,10 @@ class MainActivity : AppCompatActivity() {
infoButton.visibility = View.INVISIBLE
}
"incoming" -> {
callTitle.text = getString(R.string.incoming_call_from_dots)
callUri.setText(Utils.friendlyUri(ContactsActivity.contactName(call.peerURI),
Utils.aorDomain(ua.account.aor)))
callUri.setAdapter(null)
securityButton.visibility = View.INVISIBLE
callButton.visibility = View.INVISIBLE
hangupButton.visibility = View.INVISIBLE
@ -1406,6 +1401,20 @@ class MainActivity : AppCompatActivity() {
infoButton.visibility = View.INVISIBLE
}
"connected" -> {
if (call.referTo != "") {
callTitle.text = getString(R.string.transferring_call_to_dots)
callUri.setText(Utils.friendlyUri(ContactsActivity.contactName(call.referTo),
Utils.aorDomain(ua.account.aor)))
transferButton.isEnabled = false
} else {
if (call.dir == "out")
callTitle.text = getString(R.string.outgoing_call_to_dots)
else
callTitle.text = getString(R.string.incoming_call_from_dots)
callUri.setText(Utils.friendlyUri(ContactsActivity.contactName(call.peerURI),
Utils.aorDomain(ua.account.aor)))
transferButton.isEnabled = true
}
if (ua.account.mediaEnc == "") {
securityButton.visibility = View.INVISIBLE
} else {