diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index ca1dde7b..f1bf7868 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -545,18 +545,15 @@ class BaresipService: Service() { } "Call Answer" -> { - val uap = intent!!.getLongExtra("uap", 0L) - val callp = intent.getLongExtra("callp", 0L) + val callp = intent!!.getLongExtra("callp", 0L) + val call = Call.ofCallp(callp) stopRinging() stopMediaPlayer() setCallVolume() proximitySensing(proximitySensing) - if (telecom) - Api.ua_answer(uap, callp, Api.VIDMODE_OFF) - else { - Api.ua_answer(uap, callp, Api.VIDMODE_OFF) + call?.answer() + if (!telecom) ensureCommunicationMode() - } } "Call Reject" -> { @@ -569,20 +566,15 @@ class BaresipService: Service() { val aor = call.ua.account.aor Log.d(TAG, "Aor $aor rejected incoming call $callp from $peerUri") call.rejected = true - Api.ua_hangup(call.ua.uap, callp, 486, "Rejected") + call.reject() } } "Call Hangup" -> { val callp = intent!!.getLongExtra("callp", 0L) Log.d(TAG, "onStartCommand Hangup action for $callp") - val connection = ConnectionService.connections[callp] - if (connection != null) { - connection.onDisconnect() // This calls Api.ua_hangup(..., 0, "") - } else { - val call = Call.ofCallp(callp) - if (call != null) Api.ua_hangup(call.ua.uap, callp, 0, "") - } + val call = Call.ofCallp(callp) + call?.hangup(0, "") } "Transfer Deny" -> { @@ -1798,6 +1790,8 @@ class BaresipService: Service() { calls.find { it.callp == call.hashCode().toLong() }?.let { if (it.status.value != newStatus) { it.status.value = newStatus + if (newStatus == "connected") + it.startTime = GregorianCalendar() postServiceEvent(ServiceEvent( "call update", arrayListOf(it.ua.uap, it.callp), @@ -1820,7 +1814,23 @@ class BaresipService: Service() { fun handleExternalCallRemoved(telecomCall: android.telecom.Call) { val callp = telecomCall.hashCode().toLong() - calls.removeAll { it.callp == callp } + val call = calls.find { it.callp == callp } + if (call != null) { + if (call.ua.account.callHistory) { + val history = CallHistoryNew(call.ua.account.aor, call.peerUri, call.dir) + history.stopTime = GregorianCalendar() + history.startTime = call.startTime + history.rejected = call.rejected + history.add() + if (call.dir == "in" && call.startTime == null && !call.rejected) + call.ua.account.missedCalls = true + } + calls.remove(call) + } + if (!Call.inCall()) { + proximitySensing(false) + stopMediaPlayer() + } messageUpdate.postValue(System.currentTimeMillis()) } diff --git a/app/src/main/kotlin/com/tutpro/baresip/Call.kt b/app/src/main/kotlin/com/tutpro/baresip/Call.kt index 643c0f27..5a9f4638 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Call.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Call.kt @@ -150,6 +150,26 @@ open class Call(val callp: Long, val ua: UserAgent, val peerUri: String, val dir Api.call_destroy(callp) } + open fun hangup(code: Int, reason: String) { + if (BaresipService.telecom) { + val connection = ConnectionService.connections[callp] + if (connection != null) + connection.onDisconnect() + else + Api.ua_hangup(ua.uap, callp, code, reason) + } else { + Api.ua_hangup(ua.uap, callp, code, reason) + } + } + + open fun answer() { + Api.ua_answer(ua.uap, callp, Api.VIDMODE_OFF) + } + + open fun reject() { + hangup(486, "Busy Here") + } + class ExternalCall( val telecomCall: android.telecom.Call, ua: UserAgent, @@ -163,6 +183,10 @@ open class Call(val callp: Long, val ua: UserAgent, val peerUri: String, val dir return true } + override fun answer() { + telecomCall.answer(android.telecom.VideoProfile.STATE_AUDIO_ONLY) + } + override fun hold(): Boolean { telecomCall.hold() onhold = true @@ -177,6 +201,14 @@ open class Call(val callp: Long, val ua: UserAgent, val peerUri: String, val dir return true } + override fun hangup(code: Int, reason: String) { + telecomCall.disconnect() + } + + override fun reject() { + telecomCall.disconnect() + } + override fun destroy() { telecomCall.disconnect() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainScreen.kt b/app/src/main/kotlin/com/tutpro/baresip/MainScreen.kt index 2332d78e..14490f91 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainScreen.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainScreen.kt @@ -1532,18 +1532,8 @@ private fun CallRow( onClick = { if (call.terminated.value) return@IconButton call.terminated.value = true - if (BaresipService.telecom) { - val connection = ConnectionService.connections[call.callp] - if (connection != null) - connection.onDisconnect() - else { - Log.d(TAG, "AoR ${call.ua.account.aor} canceling call ${call.callp}") - Api.ua_hangup(call.ua.uap, call.callp, 487, "Request Terminated") - } - } else { - Log.d(TAG, "AoR ${call.ua.account.aor} canceling call ${call.callp}") - Api.ua_hangup(call.ua.uap, call.callp, 487, "Request Terminated") - } + Log.d(TAG, "AoR ${call.ua.account.aor} canceling call ${call.callp}") + call.hangup(487, "Request Terminated") }, ) { Icon( @@ -1564,18 +1554,8 @@ private fun CallRow( onClick = { if (call.terminated.value) return@IconButton call.terminated.value = true - if (BaresipService.telecom) { - val connection = ConnectionService.connections[call.callp] - if (connection != null) - connection.onDisconnect() - else { - Log.d(TAG, "AoR ${call.ua.account.aor} hanging up call ${call.callp}") - Api.ua_hangup(call.ua.uap, call.callp, 487, "Request Terminated") - } - } else { - Log.d(TAG, "AoR ${call.ua.account.aor} hanging up call ${call.callp}") - Api.ua_hangup(call.ua.uap, call.callp, 487, "Request Terminated") - } + Log.d(TAG, "AoR ${call.ua.account.aor} hanging up call ${call.callp}") + call.hangup(487, "Request Terminated") } ) { Icon( @@ -1623,8 +1603,7 @@ private fun CallRow( showAlert.value = true } else { - val connection = ConnectionService.connections[call.callp] - connection?.onHold() + call.hold() if (!call.executeTransfer()) { alertTitle.value = ctx.getString(R.string.notice) alertMessage.value = ctx.getString(R.string.transfer_failed) @@ -2197,8 +2176,6 @@ private fun makeCall(ctx: Context, viewModel: ViewModel, uriText: String, private fun answer(ctx: Context, call: Call) { Log.d(TAG, "AoR ${call.ua.account.aor} answering call from ${call.callUri.value}") - if (BaresipService.telecom) - ConnectionService.connections[call.callp]?.setActive() val intent = Intent(ctx, BaresipService::class.java) intent.action = "Call Answer" intent.putExtra("uap", call.ua.uap) @@ -2208,19 +2185,7 @@ private fun answer(ctx: Context, call: Call) { private fun reject(call: Call) { Log.d(TAG, "AoR ${call.ua.account.aor} rejecting call ${call.callp} from ${call.callUri.value}") - if (BaresipService.telecom) { - val connection = ConnectionService.connections[call.callp] - if (connection != null) - connection.onReject() - else { - call.rejected = true - Api.ua_hangup(call.ua.uap, call.callp, 486, "Busy Here") - } - } - else { - call.rejected = true - Api.ua_hangup(call.ua.uap, call.callp, 486, "Busy Here") - } + call.reject() } private fun transfer(ctx: Context, viewModel: ViewModel, ua: UserAgent, uriText: String, attended: Boolean) { @@ -2237,14 +2202,7 @@ private fun transfer(ctx: Context, viewModel: ViewModel, ua: UserAgent, uriText: val call = ua.currentCall() if (call != null) { if (attended) { - val connection = ConnectionService.connections[call.callp] - val success = if (connection != null) { - connection.onHold() - true - } else { - call.hold() - } - if (success) { + if (call.hold()) { call.onhold = true call.referTo = uri makeCall(ctx, viewModel, uri, viewModel.dialerState, call.callp) @@ -2252,8 +2210,7 @@ private fun transfer(ctx: Context, viewModel: ViewModel, ua: UserAgent, uriText: } } else { - val connection = ConnectionService.connections[call.callp] - connection?.onHold() + call.hold() if (!call.transfer(uri)) { alertTitle.value = ctx.getString(R.string.notice) alertMessage.value = ctx.getString(R.string.transfer_failed) @@ -2353,7 +2310,7 @@ private fun showCall(ctx: Context, viewModel: ViewModel, ua: UserAgent?, showCal call.callUriLabel.value = ctx.getString(R.string.incoming_call_from_dots) call.callUri.value = Utils.friendlyUri(ctx, call.peerUri, ua.account) } - call.transferButtonEnabled.value = true + call.transferButtonEnabled.value = !ua.account.isMobile } call.callUri2.value = "" call.callTransfer.value = call.onHoldCall != null @@ -2569,7 +2526,7 @@ fun handleServiceEvent(ctx: Context, viewModel: ViewModel, event: String, params val callp = params[1] as Long val call = Call.ofCallp(callp) if (call in Call.calls()) - Api.ua_hangup(uap, callp, 487, "Request Terminated") + call!!.hangup(487, "Request Terminated") makeCall(ctx, viewModel, ev[1], viewModel.dialerState) showCall(ctx, viewModel, ua) }