From 17fe3f66c0cbcf6df5126834a9d7c93fada5c6c5 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 3 Feb 2017 15:37:16 -0500 Subject: [PATCH] Ensure audio service observation of call is always correctly wired up. // FREEBIE --- Signal/src/call/CallService.swift | 9 +++++++ .../call/UserInterface/CallUIAdapter.swift | 27 +++++++++++++++---- .../view controllers/CallViewController.swift | 4 +++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Signal/src/call/CallService.swift b/Signal/src/call/CallService.swift index e230c09ba..593c7bb71 100644 --- a/Signal/src/call/CallService.swift +++ b/Signal/src/call/CallService.swift @@ -82,6 +82,11 @@ fileprivate let timeoutSeconds = 60 // All Observer methods will be invoked from the main thread. protocol CallServiceObserver: class { + /** + * Fired whenever the call changes. + */ + func didUpdateCall(call: SignalCall?) + /** * Fired whenever the local or remote video track become active or inactive. */ @@ -132,6 +137,10 @@ protocol CallServiceObserver: class { call?.addObserverAndSyncState(observer: self) updateIsVideoEnabled() + + for observer in observers { + observer.value?.didUpdateCall(call:call) + } } } diff --git a/Signal/src/call/UserInterface/CallUIAdapter.swift b/Signal/src/call/UserInterface/CallUIAdapter.swift index 740b75e46..9759b2173 100644 --- a/Signal/src/call/UserInterface/CallUIAdapter.swift +++ b/Signal/src/call/UserInterface/CallUIAdapter.swift @@ -5,6 +5,7 @@ import Foundation import PromiseKit import CallKit +import WebRTC protocol CallUIAdaptee { var notificationsAdapter: CallNotificationsAdapter { get } @@ -60,7 +61,7 @@ extension CallUIAdaptee { * Notify the user of call related activities. * Driven by either a CallKit or System notifications adaptee */ -@objc class CallUIAdapter: NSObject { +@objc class CallUIAdapter: NSObject, CallServiceObserver { let TAG = "[CallUIAdapter]" private let adaptee: CallUIAdaptee @@ -86,13 +87,15 @@ extension CallUIAdaptee { } audioService = CallAudioService(handleRinging: adaptee.hasManualRinger) + + super.init() + + callService.addObserverAndSyncState(observer: self) } internal func reportIncomingCall(_ call: SignalCall, thread: TSContactThread) { AssertIsOnMainThread() - call.addObserverAndSyncState(observer: audioService) - let callerName = self.contactsManager.displayName(forPhoneIdentifier: call.remotePhoneNumber) adaptee.reportIncomingCall(call, callerName: callerName) } @@ -108,8 +111,6 @@ extension CallUIAdaptee { AssertIsOnMainThread() let call = adaptee.startOutgoingCall(handle: handle) - call.addObserverAndSyncState(observer: audioService) - return call } @@ -207,4 +208,20 @@ extension CallUIAdaptee { return adaptee.hasManualRinger } + + // MARK: - CallServiceObserver + + internal func didUpdateCall(call: SignalCall?) { + AssertIsOnMainThread() + + call?.addObserverAndSyncState(observer: audioService) + } + + internal func didUpdateVideoTracks(localVideoTrack: RTCVideoTrack?, + remoteVideoTrack: RTCVideoTrack?) { + AssertIsOnMainThread() + + // Do nothing. + } + } diff --git a/Signal/src/view controllers/CallViewController.swift b/Signal/src/view controllers/CallViewController.swift index 03afd222c..b304b4bee 100644 --- a/Signal/src/view controllers/CallViewController.swift +++ b/Signal/src/view controllers/CallViewController.swift @@ -774,6 +774,10 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R // MARK: - CallServiceObserver + internal func didUpdateCall(call: SignalCall?) { + // Do nothing. + } + internal func didUpdateVideoTracks(localVideoTrack: RTCVideoTrack?, remoteVideoTrack: RTCVideoTrack?) { AssertIsOnMainThread()