diff --git a/submodules/TelegramCallsUI/Sources/PresentationCall.swift b/submodules/TelegramCallsUI/Sources/PresentationCall.swift index 0b266a868e..50b17933d5 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCall.swift @@ -786,6 +786,28 @@ public final class PresentationCallImpl: PresentationCall { strongSelf.audioLevelPromise.set(level) } }) + + let localIsConnected = conferenceCall.state + |> map { state -> Bool in + switch state.networkState { + case .connected: + return true + default: + return false + } + } + |> distinctUntilChanged + + let bothLocalAndRemoteConnected = combineLatest(queue: .mainQueue(), + localIsConnected, + remoteIsConnectedAggregated + ) + |> map { localIsConnected, remoteIsConnectedAggregated -> Bool in + return localIsConnected && remoteIsConnectedAggregated + } + |> distinctUntilChanged + + conferenceCall.internal_isRemoteConnected.set(bothLocalAndRemoteConnected) }) } } diff --git a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift index 6d178d7f3e..641110e91b 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift @@ -871,6 +871,9 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { private let conferenceFromCallId: CallId? private let isConference: Bool + var internal_isRemoteConnected = Promise() + private var internal_isRemoteConnectedDisposable: Disposable? + public var onMutedSpeechActivityDetected: ((Bool) -> Void)? init( @@ -1228,6 +1231,8 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { self.screencastFramesDisposable?.dispose() self.screencastAudioDataDisposable?.dispose() self.screencastStateDisposable?.dispose() + + self.internal_isRemoteConnectedDisposable?.dispose() } private func switchToTemporaryParticipantsContext(sourceContext: GroupCallParticipantsContext?, oldMyPeerId: PeerId) { @@ -1783,6 +1788,15 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { }) self.signalBarsPromise.set(callContext.signalBars) + + self.internal_isRemoteConnectedDisposable = (self.internal_isRemoteConnected.get() + |> distinctUntilChanged + |> deliverOnMainQueue).startStrict(next: { [weak callContext] isRemoteConnected in + guard let callContext else { + return + } + callContext.addRemoteConnectedEvent(isRemoteConntected: isRemoteConnected) + }) } } diff --git a/submodules/TelegramVoip/Sources/GroupCallContext.swift b/submodules/TelegramVoip/Sources/GroupCallContext.swift index ddfb4b0f13..b0af5d23a2 100644 --- a/submodules/TelegramVoip/Sources/GroupCallContext.swift +++ b/submodules/TelegramVoip/Sources/GroupCallContext.swift @@ -1035,6 +1035,10 @@ public final class OngoingGroupCallContext { #endif } + + func addRemoteConnectedEvent(isRemoteConntected: Bool) { + self.context.addRemoteConnectedEvent(isRemoteConntected) + } } private let queue = Queue() @@ -1250,4 +1254,10 @@ public final class OngoingGroupCallContext { impl.setTone(tone: tone) } } + + public func addRemoteConnectedEvent(isRemoteConntected: Bool) { + self.impl.with { impl in + impl.addRemoteConnectedEvent(isRemoteConntected: isRemoteConntected) + } + } } diff --git a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h index 7e88388dc6..6255cbebbd 100644 --- a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h +++ b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h @@ -453,6 +453,8 @@ isConference:(bool)isConference; - (void)getStats:(void (^ _Nonnull)(OngoingGroupCallStats * _Nonnull))completion; +- (void)addRemoteConnectedEvent:(bool)isRemoteConnected; + @end #endif diff --git a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm index 93a32e0d5a..0a8fcf3821 100644 --- a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm +++ b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm @@ -2323,6 +2323,12 @@ isConference:(bool)isConference { } } +- (void)addRemoteConnectedEvent:(bool)isRemoteConnected { + if (_instance) { + _instance->internal_addCustomNetworkEvent(isRemoteConnected); + } +} + @end @implementation OngoingGroupCallMediaChannelDescription diff --git a/submodules/TgVoipWebrtc/tgcalls b/submodules/TgVoipWebrtc/tgcalls index b872bbfe2a..a0706c7557 160000 --- a/submodules/TgVoipWebrtc/tgcalls +++ b/submodules/TgVoipWebrtc/tgcalls @@ -1 +1 @@ -Subproject commit b872bbfe2ad48d07d8388905bb0bfd592e3068b1 +Subproject commit a0706c7557f4b5391bc2465cc23783945980ce77