Finish CallActivity when m.call.hangup received.

This commit is contained in:
onurays 2020-05-13 22:25:40 +03:00 committed by Valere
parent dc19652c2b
commit a1fc0db8a2
5 changed files with 44 additions and 5 deletions

View File

@ -17,6 +17,7 @@
package im.vector.matrix.android.api.session.call package im.vector.matrix.android.api.session.call
import im.vector.matrix.android.api.session.room.model.call.CallAnswerContent import im.vector.matrix.android.api.session.room.model.call.CallAnswerContent
import im.vector.matrix.android.api.session.room.model.call.CallHangupContent
import im.vector.matrix.android.api.session.room.model.call.CallInviteContent import im.vector.matrix.android.api.session.room.model.call.CallInviteContent
interface CallsListener { interface CallsListener {
@ -44,4 +45,6 @@ interface CallsListener {
fun onCallAnswerReceived(callAnswerContent: CallAnswerContent) fun onCallAnswerReceived(callAnswerContent: CallAnswerContent)
fun onCallHangupReceived(callHangupContent: CallHangupContent)
} }

View File

@ -30,6 +30,7 @@ import im.vector.matrix.android.api.session.events.model.toContent
import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.events.model.toModel
import im.vector.matrix.android.api.session.room.model.call.CallAnswerContent import im.vector.matrix.android.api.session.room.model.call.CallAnswerContent
import im.vector.matrix.android.api.session.room.model.call.CallCandidatesContent import im.vector.matrix.android.api.session.room.model.call.CallCandidatesContent
import im.vector.matrix.android.api.session.room.model.call.CallHangupContent
import im.vector.matrix.android.api.session.room.model.call.CallInviteContent import im.vector.matrix.android.api.session.room.model.call.CallInviteContent
import im.vector.matrix.android.internal.di.UserId import im.vector.matrix.android.internal.di.UserId
import im.vector.matrix.android.internal.session.SessionScope import im.vector.matrix.android.internal.session.SessionScope
@ -146,6 +147,19 @@ internal class DefaultCallService @Inject constructor(
onCallInvite(event.roomId ?: "", it) onCallInvite(event.roomId ?: "", it)
} }
} }
EventType.CALL_HANGUP -> {
event.getClearContent().toModel<CallHangupContent>()?.let {
onCallHangup(it)
}
}
}
}
private fun onCallHangup(hangup: CallHangupContent) {
callListeners.forEach {
tryThis {
it.onCallHangupReceived(hangup)
}
} }
} }

View File

@ -348,6 +348,9 @@ class VectorCallActivity : VectorBaseActivity(), WebRtcPeerConnectionManager.Lis
peerConnectionManager.answerReceived("", sdp) peerConnectionManager.answerReceived("", sdp)
// peerConnection?.setRemoteDescription(object : SdpObserverAdapter() {}, sdp) // peerConnection?.setRemoteDescription(object : SdpObserverAdapter() {}, sdp)
} }
is VectorCallViewEvents.CallHangup -> {
finish()
}
} }
} }
@ -423,6 +426,7 @@ class VectorCallActivity : VectorBaseActivity(), WebRtcPeerConnectionManager.Lis
} }
override fun removeRemoteVideoStream(mediaStream: MediaStream) { override fun removeRemoteVideoStream(mediaStream: MediaStream) {
} }
override fun onDisconnect() { override fun onDisconnect() {

View File

@ -25,6 +25,7 @@ import com.squareup.inject.assisted.AssistedInject
import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.session.call.CallsListener import im.vector.matrix.android.api.session.call.CallsListener
import im.vector.matrix.android.api.session.room.model.call.CallAnswerContent import im.vector.matrix.android.api.session.room.model.call.CallAnswerContent
import im.vector.matrix.android.api.session.room.model.call.CallHangupContent
import im.vector.matrix.android.api.session.room.model.call.CallInviteContent import im.vector.matrix.android.api.session.room.model.call.CallInviteContent
import im.vector.matrix.android.internal.util.awaitCallback import im.vector.matrix.android.internal.util.awaitCallback
import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.extensions.exhaustive
@ -51,6 +52,7 @@ sealed class VectorCallViewActions : VectorViewModelAction {
sealed class VectorCallViewEvents : VectorViewEvents { sealed class VectorCallViewEvents : VectorViewEvents {
data class CallAnswered(val content: CallAnswerContent) : VectorCallViewEvents() data class CallAnswered(val content: CallAnswerContent) : VectorCallViewEvents()
data class CallHangup(val content: CallHangupContent) : VectorCallViewEvents()
} }
class VectorCallViewModel @AssistedInject constructor( class VectorCallViewModel @AssistedInject constructor(
@ -70,6 +72,14 @@ class VectorCallViewModel @AssistedInject constructor(
override fun onCallInviteReceived(signalingRoomId: String, callInviteContent: CallInviteContent) { override fun onCallInviteReceived(signalingRoomId: String, callInviteContent: CallInviteContent) {
} }
override fun onCallHangupReceived(callHangupContent: CallHangupContent) {
withState { state ->
if (callHangupContent.callId == state.callId) {
_viewEvents.post(VectorCallViewEvents.CallHangup(callHangupContent))
}
}
}
} }
init { init {

View File

@ -28,6 +28,7 @@ import androidx.core.content.ContextCompat
import im.vector.matrix.android.api.session.call.CallsListener import im.vector.matrix.android.api.session.call.CallsListener
import im.vector.matrix.android.api.session.call.EglUtils import im.vector.matrix.android.api.session.call.EglUtils
import im.vector.matrix.android.api.session.room.model.call.CallAnswerContent import im.vector.matrix.android.api.session.room.model.call.CallAnswerContent
import im.vector.matrix.android.api.session.room.model.call.CallHangupContent
import im.vector.matrix.android.api.session.room.model.call.CallInviteContent import im.vector.matrix.android.api.session.room.model.call.CallInviteContent
import im.vector.riotx.BuildConfig import im.vector.riotx.BuildConfig
import im.vector.riotx.R import im.vector.riotx.R
@ -72,6 +73,7 @@ class WebRtcPeerConnectionManager @Inject constructor(
} }
var phoneAccountHandle: PhoneAccountHandle? = null var phoneAccountHandle: PhoneAccountHandle? = null
var localMediaStream: MediaStream? = null
init { init {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@ -239,7 +241,7 @@ class WebRtcPeerConnectionManager @Inject constructor(
} }
) )
val localMediaStream = peerConnectionFactory?.createLocalMediaStream("ARDAMS") // magic value? localMediaStream = peerConnectionFactory?.createLocalMediaStream("ARDAMS") // magic value?
localMediaStream?.addTrack(localVideoTrack) localMediaStream?.addTrack(localVideoTrack)
localMediaStream?.addTrack(audioTrack) localMediaStream?.addTrack(audioTrack)
@ -315,13 +317,15 @@ class WebRtcPeerConnectionManager @Inject constructor(
fun close() { fun close() {
executor.execute { executor.execute {
peerConnectionFactory?.stopAecDump() // Do not dispose peer connection (https://bugs.chromium.org/p/webrtc/issues/detail?id=7543)
peerConnectionFactory = null peerConnection?.close()
peerConnection?.removeStream(localMediaStream)
peerConnection = null
audioSource?.dispose() audioSource?.dispose()
videoSource?.dispose() videoSource?.dispose()
peerConnection?.dispose()
peerConnection = null
videoCapturer?.dispose() videoCapturer?.dispose()
peerConnectionFactory?.stopAecDump()
peerConnectionFactory = null
} }
} }
@ -367,6 +371,10 @@ class WebRtcPeerConnectionManager @Inject constructor(
override fun onCallAnswerReceived(callAnswerContent: CallAnswerContent) { override fun onCallAnswerReceived(callAnswerContent: CallAnswerContent) {
} }
override fun onCallHangupReceived(callHangupContent: CallHangupContent) {
close()
}
} }