mirror of
https://github.com/element-hq/element-android
synced 2024-11-24 10:25:35 +03:00
Fix other call not always refreshed when ended #4028
This commit is contained in:
parent
226b0e6c9d
commit
82864b2b98
5 changed files with 41 additions and 19 deletions
1
changelog.d/4028.bugfix
Normal file
1
changelog.d/4028.bugfix
Normal file
|
@ -0,0 +1 @@
|
|||
Fix other call not always refreshed when ended
|
|
@ -36,7 +36,7 @@ class CurrentCallsViewPresenter {
|
|||
this.currentCall = currentCall
|
||||
this.currentCall?.addListener(tickListener)
|
||||
this.calls = calls
|
||||
val hasActiveCall = currentCall != null
|
||||
val hasActiveCall = calls.isNotEmpty()
|
||||
currentCallsView?.isVisible = hasActiveCall
|
||||
currentCallsView?.render(calls, currentCall?.formattedDuration() ?: "")
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ class SharedKnownCallsViewModel @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private val currentCallListener = object : WebRtcCallManager.CurrentCallListener {
|
||||
private val callManagerListener = object : WebRtcCallManager.Listener {
|
||||
override fun onCurrentCallChange(call: WebRtcCall?) {
|
||||
val knownCalls = callManager.getCalls()
|
||||
liveKnownCalls.postValue(knownCalls)
|
||||
|
@ -50,12 +50,17 @@ class SharedKnownCallsViewModel @Inject constructor(
|
|||
it.addListener(callListener)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCallEnded(callId: String) {
|
||||
val knownCalls = callManager.getCalls()
|
||||
liveKnownCalls.postValue(knownCalls)
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
val knownCalls = callManager.getCalls()
|
||||
liveKnownCalls.postValue(knownCalls)
|
||||
callManager.addCurrentCallListener(currentCallListener)
|
||||
callManager.addListener(callManagerListener)
|
||||
knownCalls.forEach {
|
||||
it.addListener(callListener)
|
||||
}
|
||||
|
@ -65,7 +70,7 @@ class SharedKnownCallsViewModel @Inject constructor(
|
|||
callManager.getCalls().forEach {
|
||||
it.removeListener(callListener)
|
||||
}
|
||||
callManager.removeCurrentCallListener(currentCallListener)
|
||||
callManager.removeListener(callManagerListener)
|
||||
super.onCleared()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -134,7 +134,15 @@ class VectorCallViewModel @AssistedInject constructor(
|
|||
} ?: VectorCallViewState.TransfereeState.UnknownTransferee
|
||||
}
|
||||
|
||||
private val currentCallListener = object : WebRtcCallManager.CurrentCallListener {
|
||||
private val callManagerListener = object : WebRtcCallManager.Listener {
|
||||
|
||||
override fun onCallEnded(callId: String) {
|
||||
withState { state ->
|
||||
if (state.otherKnownCallInfo?.callId == callId) {
|
||||
setState { copy(otherKnownCallInfo = null) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCurrentCallChange(call: WebRtcCall?) {
|
||||
if (call != null) {
|
||||
|
@ -159,9 +167,7 @@ class VectorCallViewModel @AssistedInject constructor(
|
|||
}
|
||||
|
||||
private fun updateOtherKnownCall(currentCall: WebRtcCall) {
|
||||
val otherCall = callManager.getCalls().firstOrNull {
|
||||
it.callId != currentCall.callId && it.mxCall.state is CallState.Connected
|
||||
}
|
||||
val otherCall = getOtherKnownCall(currentCall)
|
||||
setState {
|
||||
if (otherCall == null) {
|
||||
copy(otherKnownCallInfo = null)
|
||||
|
@ -171,6 +177,12 @@ class VectorCallViewModel @AssistedInject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private fun getOtherKnownCall(currentCall: WebRtcCall): WebRtcCall? {
|
||||
return callManager.getCalls().firstOrNull {
|
||||
it.callId != currentCall.callId && it.mxCall.state is CallState.Connected
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
setupCallWithCurrentState()
|
||||
}
|
||||
|
@ -184,7 +196,7 @@ class VectorCallViewModel @AssistedInject constructor(
|
|||
}
|
||||
} else {
|
||||
call = webRtcCall
|
||||
callManager.addCurrentCallListener(currentCallListener)
|
||||
callManager.addListener(callManagerListener)
|
||||
webRtcCall.addListener(callListener)
|
||||
val currentSoundDevice = callManager.audioManager.selectedDevice
|
||||
if (currentSoundDevice == CallAudioManager.Device.Phone) {
|
||||
|
@ -230,7 +242,7 @@ class VectorCallViewModel @AssistedInject constructor(
|
|||
}
|
||||
|
||||
override fun onCleared() {
|
||||
callManager.removeCurrentCallListener(currentCallListener)
|
||||
callManager.removeListener(callManagerListener)
|
||||
call?.removeListener(callListener)
|
||||
call = null
|
||||
proximityManager.stop()
|
||||
|
|
|
@ -84,9 +84,10 @@ class WebRtcCallManager @Inject constructor(
|
|||
private val sessionScope: CoroutineScope?
|
||||
get() = currentSession?.coroutineScope
|
||||
|
||||
interface CurrentCallListener {
|
||||
fun onCurrentCallChange(call: WebRtcCall?) {}
|
||||
fun onAudioDevicesChange() {}
|
||||
interface Listener {
|
||||
fun onCallEnded(callId: String) = Unit
|
||||
fun onCurrentCallChange(call: WebRtcCall?) = Unit
|
||||
fun onAudioDevicesChange() = Unit
|
||||
}
|
||||
|
||||
val supportedPSTNProtocol: String?
|
||||
|
@ -106,13 +107,13 @@ class WebRtcCallManager @Inject constructor(
|
|||
protocolsChecker?.removeListener(listener)
|
||||
}
|
||||
|
||||
private val currentCallsListeners = CopyOnWriteArrayList<CurrentCallListener>()
|
||||
private val currentCallsListeners = CopyOnWriteArrayList<Listener>()
|
||||
|
||||
fun addCurrentCallListener(listener: CurrentCallListener) {
|
||||
fun addListener(listener: Listener) {
|
||||
currentCallsListeners.add(listener)
|
||||
}
|
||||
|
||||
fun removeCurrentCallListener(listener: CurrentCallListener) {
|
||||
fun removeListener(listener: Listener) {
|
||||
currentCallsListeners.remove(listener)
|
||||
}
|
||||
|
||||
|
@ -250,10 +251,13 @@ class WebRtcCallManager @Inject constructor(
|
|||
callsByRoomId[webRtcCall.signalingRoomId]?.remove(webRtcCall)
|
||||
callsByRoomId[webRtcCall.nativeRoomId]?.remove(webRtcCall)
|
||||
transferees.remove(callId)
|
||||
if (getCurrentCall()?.callId == callId) {
|
||||
if (currentCall.get()?.callId == callId) {
|
||||
val otherCall = getCalls().lastOrNull()
|
||||
currentCall.setAndNotify(otherCall)
|
||||
}
|
||||
tryOrNull {
|
||||
currentCallsListeners.forEach { it.onCallEnded(callId) }
|
||||
}
|
||||
// There is no active calls
|
||||
if (getCurrentCall() == null) {
|
||||
Timber.tag(loggerTag.value).v("Dispose peerConnectionFactory as there is no need to keep one")
|
||||
|
|
Loading…
Reference in a new issue