From 634617b7d45ee2104cb33bab928fbb3714106107 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 3 Aug 2017 10:26:22 -0400 Subject: [PATCH] Terminate call if call view presentation is delayed. // FREEBIE --- Signal/src/call/CallService.swift | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/Signal/src/call/CallService.swift b/Signal/src/call/CallService.swift index 4c31e7c85..1fe1b5c9d 100644 --- a/Signal/src/call/CallService.swift +++ b/Signal/src/call/CallService.swift @@ -144,8 +144,10 @@ protocol CallServiceObserver: class { if let oldValue = oldValue { DeviceSleepManager.sharedInstance.removeBlock(blockObject: oldValue) } + stopAnyActiveCallTimer() if let call = call { DeviceSleepManager.sharedInstance.addBlock(blockObject: call) + self.startActiveCallTimer() } } @@ -911,8 +913,6 @@ protocol CallServiceObserver: class { call.state = .connected - self.startActiveCallTimer(call: call) - // We don't risk transmitting any media until the remote client has admitted to being connected. peerConnectionClient.setAudioEnabled(enabled: !call.isMuted) peerConnectionClient.setLocalVideoEnabled(enabled: shouldHaveLocalVideoTrack()) @@ -1432,7 +1432,6 @@ protocol CallServiceObserver: class { self.call?.removeAllObservers() self.call = nil - self.stopAnyActiveCallTimer() self.sendIceUpdatesImmediately = true Logger.info("\(TAG) clearing pendingIceUpdateMessages") self.pendingIceUpdateMessages = [] @@ -1574,9 +1573,8 @@ protocol CallServiceObserver: class { // MARK: CallViewController Timer var activeCallTimer: Timer? - func startActiveCallTimer(call: SignalCall) { + func startActiveCallTimer() { AssertIsOnMainThread() - assert(call.state == .connected) if self.activeCallTimer != nil { owsFail("\(TAG) activeCallTimer should only be set once per call") @@ -1589,7 +1587,7 @@ protocol CallServiceObserver: class { return } - guard call == strongSelf.call else { + guard let call = strongSelf.call else { owsFail("\(strongSelf.TAG) call has since ended. Timer should have been invalidated.") timer.invalidate() return @@ -1600,18 +1598,27 @@ protocol CallServiceObserver: class { } func ensureCallScreenVisible(call: SignalCall) { + guard let connectedDate = call.connectedDate else { + // Ignore; call hasn't connected yet. + return + } + + let kMaxViewPresentationDelay = 2.5 + guard fabs(connectedDate.timeIntervalSinceNow) > kMaxViewPresentationDelay else { + // Ignore; call connected recently. + return + } + guard nil != UIApplication.shared.frontmostViewController as? CallViewController else { + OWSProdError("call_service_call_view_could_not_present", file:#file, function:#function, line:#line) owsFail("\(TAG) in \(#function) CallViewController should already be visible.") - self.callUIAdapter.showCall(call) + self.terminateCall() return } - - Logger.debug("\(TAG) in \(#function) already visible.") } func stopAnyActiveCallTimer() { AssertIsOnMainThread() - assert(self.call == nil) self.activeCallTimer?.invalidate() self.activeCallTimer = nil