Call transfer improvements
This commit is contained in:
@ -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);
|
len = re_snprintf(event_buf, sizeof event_buf, "call transfer,%s", prm);
|
||||||
break;
|
break;
|
||||||
case UA_EVENT_CALL_TRANSFER_FAILED:
|
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;
|
break;
|
||||||
case UA_EVENT_CALL_CLOSED:
|
case UA_EVENT_CALL_CLOSED:
|
||||||
play = mem_deref(play);
|
play = mem_deref(play);
|
||||||
|
|||||||
@ -754,9 +754,15 @@ class BaresipService: Service() {
|
|||||||
}
|
}
|
||||||
if (!Utils.isVisible()) return
|
if (!Utils.isVisible()) return
|
||||||
}
|
}
|
||||||
"transfer failed" -> {
|
"refer failed" -> {
|
||||||
Log.d(LOG_TAG, "AoR $aor hanging up call $callp with ${ev[1]}")
|
Log.d(LOG_TAG, "AoR $aor hanging up call $callp with ${ev[1]}")
|
||||||
Api.ua_hangup(uap, callp, 0, "")
|
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
|
if (!Utils.isVisible()) return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,6 +10,7 @@ class Call(val callp: String, val ua: UserAgent, val peerURI: String, val dir: S
|
|||||||
var security = 0
|
var security = 0
|
||||||
var zid = ""
|
var zid = ""
|
||||||
var hasHistory = false
|
var hasHistory = false
|
||||||
|
var referTo = ""
|
||||||
|
|
||||||
fun add() {
|
fun add() {
|
||||||
BaresipService.calls.add(this)
|
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)
|
return call_unhold(callp)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun transfer(uri: String): Int {
|
fun refer(uri: String): Int {
|
||||||
|
referTo = uri
|
||||||
return call_transfer(callp, uri)
|
return call_transfer(callp, uri)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -332,8 +332,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
transferButton.setOnClickListener {
|
transferButton.setOnClickListener {
|
||||||
val ua = UserAgent.uas()[aorSpinner.selectedItemPosition]
|
callTransfer(UserAgent.uas()[aorSpinner.selectedItemPosition])
|
||||||
callTransfer(Call.uaCalls(ua, "")[0])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
infoButton.setOnClickListener {
|
infoButton.setOnClickListener {
|
||||||
@ -765,7 +764,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
setPositiveButton(getString(R.string.yes)) { dialog, _ ->
|
setPositiveButton(getString(R.string.yes)) { dialog, _ ->
|
||||||
if (call in Call.calls())
|
if (call in Call.calls())
|
||||||
Api.ua_hangup(uap, callp, 0, "")
|
Api.ua_hangup(uap, callp, 0, "")
|
||||||
call(ua, ev[1], "transferring")
|
call(ua, ev[1], "outgoing")
|
||||||
showCall(ua)
|
showCall(ua)
|
||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
}
|
}
|
||||||
@ -786,10 +785,10 @@ class MainActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
if (call in Call.calls())
|
if (call in Call.calls())
|
||||||
Api.ua_hangup(uap, callp, 0, "")
|
Api.ua_hangup(uap, callp, 0, "")
|
||||||
call(ua, ev[1], "transferring")
|
call(ua, ev[1], "outgoing")
|
||||||
showCall(ua)
|
showCall(ua)
|
||||||
}
|
}
|
||||||
"transfer failed" -> {
|
"refer failed" -> {
|
||||||
Toast.makeText(applicationContext,
|
Toast.makeText(applicationContext,
|
||||||
"${getString(R.string.transfer_failed)}: ${ev[1].trim()}",
|
"${getString(R.string.transfer_failed)}: ${ev[1].trim()}",
|
||||||
Toast.LENGTH_LONG).show()
|
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)
|
val layout = LayoutInflater.from(this)
|
||||||
.inflate(R.layout.call_transfer_dialog, findViewById(android.R.id.content) as ViewGroup,
|
.inflate(R.layout.call_transfer_dialog, findViewById(android.R.id.content) as ViewGroup,
|
||||||
false)
|
false)
|
||||||
@ -1063,16 +1062,20 @@ class MainActivity : AppCompatActivity() {
|
|||||||
if (!uri.startsWith("sip:")) {
|
if (!uri.startsWith("sip:")) {
|
||||||
uri = "sip:$uri"
|
uri = "sip:$uri"
|
||||||
if (!uri.contains("@")) {
|
if (!uri.contains("@")) {
|
||||||
val aor = call.ua.account.aor
|
val aor = ua.account.aor
|
||||||
val host = aor.substring(aor.indexOf("@") + 1)
|
val host = aor.substring(aor.indexOf("@") + 1)
|
||||||
uri = "$uri@$host"
|
uri = "$uri@$host"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!Utils.checkSipUri(uri))
|
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))
|
String.format(getString(R.string.invalid_sip_uri), uri))
|
||||||
else
|
else {
|
||||||
call.transfer(uri)
|
if (Call.uaCalls(ua, "").size > 0) {
|
||||||
|
Call.uaCalls(ua, "")[0].refer(uri)
|
||||||
|
showCall(ua)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setNegativeButton(android.R.string.cancel) { dialog, _ ->
|
setNegativeButton(android.R.string.cancel) { dialog, _ ->
|
||||||
@ -1359,26 +1362,14 @@ class MainActivity : AppCompatActivity() {
|
|||||||
dialpadButton.isEnabled = true
|
dialpadButton.isEnabled = true
|
||||||
infoButton.visibility = View.INVISIBLE
|
infoButton.visibility = View.INVISIBLE
|
||||||
} else {
|
} else {
|
||||||
val callsOut = Call.uaCalls(ua, "out")
|
val call = Call.uaCalls(ua, "")[0]
|
||||||
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)))
|
|
||||||
callUri.isFocusable = false
|
callUri.isFocusable = false
|
||||||
imm.hideSoftInputFromWindow(callUri.windowToken, 0)
|
imm.hideSoftInputFromWindow(callUri.windowToken, 0)
|
||||||
when (call.status) {
|
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
|
securityButton.visibility = View.INVISIBLE
|
||||||
callButton.visibility = View.INVISIBLE
|
callButton.visibility = View.INVISIBLE
|
||||||
hangupButton.visibility = View.VISIBLE
|
hangupButton.visibility = View.VISIBLE
|
||||||
@ -1392,6 +1383,10 @@ class MainActivity : AppCompatActivity() {
|
|||||||
infoButton.visibility = View.INVISIBLE
|
infoButton.visibility = View.INVISIBLE
|
||||||
}
|
}
|
||||||
"incoming" -> {
|
"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
|
securityButton.visibility = View.INVISIBLE
|
||||||
callButton.visibility = View.INVISIBLE
|
callButton.visibility = View.INVISIBLE
|
||||||
hangupButton.visibility = View.INVISIBLE
|
hangupButton.visibility = View.INVISIBLE
|
||||||
@ -1406,6 +1401,20 @@ class MainActivity : AppCompatActivity() {
|
|||||||
infoButton.visibility = View.INVISIBLE
|
infoButton.visibility = View.INVISIBLE
|
||||||
}
|
}
|
||||||
"connected" -> {
|
"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 == "") {
|
if (ua.account.mediaEnc == "") {
|
||||||
securityButton.visibility = View.INVISIBLE
|
securityButton.visibility = View.INVISIBLE
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user