From c6069376d8dfc58b88d5855a7084bb5e46a3f643 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Wed, 2 Aug 2017 19:13:06 -0400 Subject: [PATCH 1/2] more logging // FREEBIE --- .../Speakerbox/CallKitCallUIAdaptee.swift | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift b/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift index b93d1199f..910ba07ff 100644 --- a/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift +++ b/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift @@ -67,7 +67,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { func startOutgoingCall(handle: String) -> SignalCall { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") let call = SignalCall.outgoingCall(localId: UUID(), remotePhoneNumber: handle) @@ -82,7 +82,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { // Called from CallService after call has ended to clean up any remaining CallKit call state. func failCall(_ call: SignalCall, error: CallError) { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") switch error { case .timeout(description: _): @@ -96,7 +96,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { func reportIncomingCall(_ call: SignalCall, callerName: String) { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") // Construct a CXCallUpdate describing the incoming call, including the caller. let update = CXCallUpdate() @@ -130,14 +130,14 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { func answerCall(localId: UUID) { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") owsFail("\(self.TAG) \(#function) CallKit should answer calls via system call screen, not via notifications.") } func answerCall(_ call: SignalCall) { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") callManager.answer(call: call) } @@ -150,14 +150,14 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { func declineCall(_ call: SignalCall) { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") callManager.localHangup(call: call) } func recipientAcceptedCall(_ call: SignalCall) { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") self.provider.reportOutgoingCall(with: call.localId, connectedAt: nil) @@ -169,28 +169,28 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { func localHangupCall(_ call: SignalCall) { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") callManager.localHangup(call: call) } func remoteDidHangupCall(_ call: SignalCall) { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") provider.reportCall(with: call.localId, endedAt: nil, reason: CXCallEndedReason.remoteEnded) } func remoteBusy(_ call: SignalCall) { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") provider.reportCall(with: call.localId, endedAt: nil, reason: CXCallEndedReason.unanswered) } func setIsMuted(call: SignalCall, isMuted: Bool) { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") callManager.setIsMuted(call: call, isMuted: isMuted) } @@ -212,7 +212,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { func providerDidReset(_ provider: CXProvider) { AssertIsOnMainThread() - Logger.debug("\(self.TAG) \(#function)") + Logger.info("\(self.TAG) \(#function)") // Stop any in-progress WebRTC related audio. PeerConnectionClient.stopAudioSession() @@ -228,7 +228,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { func provider(_ provider: CXProvider, perform action: CXStartCallAction) { AssertIsOnMainThread() - Logger.debug("\(TAG) in \(#function) CXStartCallAction") + Logger.info("\(TAG) in \(#function) CXStartCallAction") guard let call = callManager.callWithLocalId(action.callUUID) else { Logger.error("\(TAG) unable to find call in \(#function)") @@ -256,7 +256,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) { AssertIsOnMainThread() - Logger.debug("\(TAG) Received \(#function) CXAnswerCallAction") + Logger.info("\(TAG) Received \(#function) CXAnswerCallAction") // Retrieve the instance corresponding to the action's call UUID guard let call = callManager.callWithLocalId(action.callUUID) else { action.fail() @@ -271,7 +271,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { public func provider(_ provider: CXProvider, perform action: CXEndCallAction) { AssertIsOnMainThread() - Logger.debug("\(TAG) Received \(#function) CXEndCallAction") + Logger.info("\(TAG) Received \(#function) CXEndCallAction") guard let call = callManager.callWithLocalId(action.callUUID) else { Logger.error("\(self.TAG) in \(#function) trying to end unknown call with localId: \(action.callUUID)") action.fail() @@ -290,7 +290,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { public func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) { AssertIsOnMainThread() - Logger.debug("\(TAG) Received \(#function) CXSetHeldCallAction") + Logger.info("\(TAG) Received \(#function) CXSetHeldCallAction") guard let call = callManager.callWithLocalId(action.callUUID) else { action.fail() return @@ -316,7 +316,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { public func provider(_ provider: CXProvider, perform action: CXSetMutedCallAction) { AssertIsOnMainThread() - Logger.debug("\(TAG) Received \(#function) CXSetMutedCallAction") + Logger.info("\(TAG) Received \(#function) CXSetMutedCallAction") guard callManager.callWithLocalId(action.callUUID) != nil else { Logger.error("\(TAG) Failing CXSetMutedCallAction for unknown call: \(action.callUUID)") action.fail() @@ -342,7 +342,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { func provider(_ provider: CXProvider, timedOutPerforming action: CXAction) { AssertIsOnMainThread() - Logger.debug("\(TAG) Timed out \(#function) while performing \(action)") + owsFail("\(TAG) Timed out \(#function) while performing \(action)") // React to the action timeout if necessary, such as showing an error UI. } From 81d7f282533797196e844c9a6e6f24b2ccf91463 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Wed, 2 Aug 2017 19:07:53 -0400 Subject: [PATCH 2/2] Timer to ensure call screen shown // FREEBIE --- Signal/src/call/CallService.swift | 51 ++++++++++++++++++- Signal/src/call/NonCallKitCallUIAdaptee.swift | 2 +- .../call/UserInterface/CallUIAdapter.swift | 2 +- 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/Signal/src/call/CallService.swift b/Signal/src/call/CallService.swift index 4a28852a1..4c31e7c85 100644 --- a/Signal/src/call/CallService.swift +++ b/Signal/src/call/CallService.swift @@ -894,7 +894,7 @@ protocol CallServiceObserver: class { * For incoming call, when the local user has chosen to accept the call. */ func handleConnectedCall(_ call: SignalCall) { - Logger.debug("\(TAG) in \(#function)") + Logger.info("\(TAG) in \(#function)") AssertIsOnMainThread() guard let peerConnectionClient = self.peerConnectionClient else { @@ -911,6 +911,8 @@ 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()) @@ -1430,6 +1432,7 @@ protocol CallServiceObserver: class { self.call?.removeAllObservers() self.call = nil + self.stopAnyActiveCallTimer() self.sendIceUpdatesImmediately = true Logger.info("\(TAG) clearing pendingIceUpdateMessages") self.pendingIceUpdateMessages = [] @@ -1567,6 +1570,52 @@ protocol CallServiceObserver: class { remoteVideoTrack:remoteVideoTrack) } } + + // MARK: CallViewController Timer + + var activeCallTimer: Timer? + func startActiveCallTimer(call: SignalCall) { + AssertIsOnMainThread() + assert(call.state == .connected) + + if self.activeCallTimer != nil { + owsFail("\(TAG) activeCallTimer should only be set once per call") + self.activeCallTimer!.invalidate() + self.activeCallTimer = nil + } + + self.activeCallTimer = WeakTimer.scheduledTimer(timeInterval: 1, target: self, userInfo: nil, repeats: true) { [weak self] timer in + guard let strongSelf = self else { + return + } + + guard call == strongSelf.call else { + owsFail("\(strongSelf.TAG) call has since ended. Timer should have been invalidated.") + timer.invalidate() + return + } + + strongSelf.ensureCallScreenVisible(call: call) + } + } + + func ensureCallScreenVisible(call: SignalCall) { + guard nil != UIApplication.shared.frontmostViewController as? CallViewController else { + owsFail("\(TAG) in \(#function) CallViewController should already be visible.") + self.callUIAdapter.showCall(call) + return + } + + Logger.debug("\(TAG) in \(#function) already visible.") + } + + func stopAnyActiveCallTimer() { + AssertIsOnMainThread() + assert(self.call == nil) + + self.activeCallTimer?.invalidate() + self.activeCallTimer = nil + } } fileprivate extension MessageSender { diff --git a/Signal/src/call/NonCallKitCallUIAdaptee.swift b/Signal/src/call/NonCallKitCallUIAdaptee.swift index 2a4861ca0..7f78e4c54 100644 --- a/Signal/src/call/NonCallKitCallUIAdaptee.swift +++ b/Signal/src/call/NonCallKitCallUIAdaptee.swift @@ -31,7 +31,7 @@ class NonCallKitCallUIAdaptee: CallUIAdaptee { Logger.debug("\(self.TAG) handleOutgoingCall succeeded") }.catch { error in Logger.error("\(self.TAG) handleOutgoingCall failed with error: \(error)") - } + }.retainUntilComplete() return call } diff --git a/Signal/src/call/UserInterface/CallUIAdapter.swift b/Signal/src/call/UserInterface/CallUIAdapter.swift index b472010ae..c458c5b60 100644 --- a/Signal/src/call/UserInterface/CallUIAdapter.swift +++ b/Signal/src/call/UserInterface/CallUIAdapter.swift @@ -34,7 +34,7 @@ extension CallUIAdaptee { internal func showCall(_ call: SignalCall) { AssertIsOnMainThread() - let callViewController = CallViewController(call:call) + let callViewController = CallViewController(call: call) callViewController.modalTransitionStyle = .crossDissolve guard let presentingViewController = Environment.getCurrent().signalsViewController else {