@ -49,6 +49,8 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
}
}
init ( callService : CallService , notificationsAdapter : CallNotificationsAdapter ) {
init ( callService : CallService , notificationsAdapter : CallNotificationsAdapter ) {
AssertIsOnMainThread ( )
self . callManager = CallKitCallManager ( )
self . callManager = CallKitCallManager ( )
self . callService = callService
self . callService = callService
self . notificationsAdapter = notificationsAdapter
self . notificationsAdapter = notificationsAdapter
@ -62,6 +64,8 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
// MARK: C a l l U I A d a p t e e
// MARK: C a l l U I A d a p t e e
func startOutgoingCall ( handle : String ) -> SignalCall {
func startOutgoingCall ( handle : String ) -> SignalCall {
AssertIsOnMainThread ( )
let call = SignalCall . outgoingCall ( localId : UUID ( ) , remotePhoneNumber : handle )
let call = SignalCall . outgoingCall ( localId : UUID ( ) , remotePhoneNumber : handle )
// A d d t h e n e w o u t g o i n g c a l l t o t h e a p p ' s l i s t o f c a l l s .
// A d d t h e n e w o u t g o i n g c a l l t o t h e a p p ' s l i s t o f c a l l s .
@ -74,11 +78,15 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
// C a l l e d f r o m C a l l S e r v i c e a f t e r c a l l h a s e n d e d t o c l e a n u p a n y r e m a i n i n g C a l l K i t c a l l s t a t e .
// C a l l e d f r o m C a l l S e r v i c e a f t e r c a l l h a s e n d e d t o c l e a n u p a n y r e m a i n i n g C a l l K i t c a l l s t a t e .
func failCall ( _ call : SignalCall , error : CallError ) {
func failCall ( _ call : SignalCall , error : CallError ) {
AssertIsOnMainThread ( )
provider . reportCall ( with : call . localId , endedAt : Date ( ) , reason : CXCallEndedReason . failed )
provider . reportCall ( with : call . localId , endedAt : Date ( ) , reason : CXCallEndedReason . failed )
self . callManager . removeCall ( call )
self . callManager . removeCall ( call )
}
}
func reportIncomingCall ( _ call : SignalCall , callerName : String ) {
func reportIncomingCall ( _ call : SignalCall , callerName : String ) {
AssertIsOnMainThread ( )
// C o n s t r u c t a C X C a l l U p d a t e d e s c r i b i n g t h e i n c o m i n g c a l l , i n c l u d i n g t h e c a l l e r .
// C o n s t r u c t a C X C a l l U p d a t e d e s c r i b i n g t h e i n c o m i n g c a l l , i n c l u d i n g t h e c a l l e r .
let update = CXCallUpdate ( )
let update = CXCallUpdate ( )
update . remoteHandle = CXHandle ( type : . phoneNumber , value : call . remotePhoneNumber )
update . remoteHandle = CXHandle ( type : . phoneNumber , value : call . remotePhoneNumber )
@ -104,39 +112,57 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
}
}
func answerCall ( localId : UUID ) {
func answerCall ( localId : UUID ) {
AssertIsOnMainThread ( )
assertionFailure ( " CallKit should answer calls via system call screen, not via notifications. " )
assertionFailure ( " CallKit should answer calls via system call screen, not via notifications. " )
}
}
func answerCall ( _ call : SignalCall ) {
func answerCall ( _ call : SignalCall ) {
AssertIsOnMainThread ( )
callManager . answer ( call : call )
callManager . answer ( call : call )
}
}
func declineCall ( localId : UUID ) {
func declineCall ( localId : UUID ) {
AssertIsOnMainThread ( )
assertionFailure ( " CallKit should decline calls via system call screen, not via notifications. " )
assertionFailure ( " CallKit should decline calls via system call screen, not via notifications. " )
}
}
func declineCall ( _ call : SignalCall ) {
func declineCall ( _ call : SignalCall ) {
AssertIsOnMainThread ( )
callManager . localHangup ( call : call )
callManager . localHangup ( call : call )
}
}
func recipientAcceptedCall ( _ call : SignalCall ) {
func recipientAcceptedCall ( _ call : SignalCall ) {
AssertIsOnMainThread ( )
// n o - o p
// n o - o p
// T O D O p r o v i d e r u p d a t e c a l l c o n n e c t e d ?
// T O D O p r o v i d e r u p d a t e c a l l c o n n e c t e d ?
}
}
func localHangupCall ( _ call : SignalCall ) {
func localHangupCall ( _ call : SignalCall ) {
AssertIsOnMainThread ( )
callManager . localHangup ( call : call )
callManager . localHangup ( call : call )
}
}
func remoteDidHangupCall ( _ call : SignalCall ) {
func remoteDidHangupCall ( _ call : SignalCall ) {
AssertIsOnMainThread ( )
provider . reportCall ( with : call . localId , endedAt : nil , reason : CXCallEndedReason . remoteEnded )
provider . reportCall ( with : call . localId , endedAt : nil , reason : CXCallEndedReason . remoteEnded )
}
}
func setIsMuted ( call : SignalCall , isMuted : Bool ) {
func setIsMuted ( call : SignalCall , isMuted : Bool ) {
AssertIsOnMainThread ( )
callManager . setIsMuted ( call : call , isMuted : isMuted )
callManager . setIsMuted ( call : call , isMuted : isMuted )
}
}
func setHasLocalVideo ( call : SignalCall , hasLocalVideo : Bool ) {
func setHasLocalVideo ( call : SignalCall , hasLocalVideo : Bool ) {
AssertIsOnMainThread ( )
let update = CXCallUpdate ( )
let update = CXCallUpdate ( )
update . remoteHandle = CXHandle ( type : . phoneNumber , value : call . remotePhoneNumber )
update . remoteHandle = CXHandle ( type : . phoneNumber , value : call . remotePhoneNumber )
update . hasVideo = hasLocalVideo
update . hasVideo = hasLocalVideo
@ -152,6 +178,8 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
// MARK: C X P r o v i d e r D e l e g a t e
// MARK: C X P r o v i d e r D e l e g a t e
func providerDidReset ( _ provider : CXProvider ) {
func providerDidReset ( _ provider : CXProvider ) {
AssertIsOnMainThread ( )
Logger . debug ( " \( TAG ) in \( #function ) " )
Logger . debug ( " \( TAG ) in \( #function ) " )
// T O D O
// T O D O
@ -174,6 +202,8 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
}
}
func provider ( _ provider : CXProvider , perform action : CXStartCallAction ) {
func provider ( _ provider : CXProvider , perform action : CXStartCallAction ) {
AssertIsOnMainThread ( )
Logger . debug ( " \( TAG ) in \( #function ) CXStartCallAction " )
Logger . debug ( " \( TAG ) in \( #function ) CXStartCallAction " )
// T O D O d o e s t h i s w o r k w h e n ` a c t i o n . h a n d l e . v a l u e ` i s n o t i n e 1 6 4 f o r m a t , e . g . i f c a l l e d v i a i n t e n t ?
// T O D O d o e s t h i s w o r k w h e n ` a c t i o n . h a n d l e . v a l u e ` i s n o t i n e 1 6 4 f o r m a t , e . g . i f c a l l e d v i a i n t e n t ?
@ -207,6 +237,8 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
}
}
func provider ( _ provider : CXProvider , perform action : CXAnswerCallAction ) {
func provider ( _ provider : CXProvider , perform action : CXAnswerCallAction ) {
AssertIsOnMainThread ( )
Logger . debug ( " \( TAG ) Received \( #function ) CXAnswerCallAction " )
Logger . debug ( " \( TAG ) Received \( #function ) CXAnswerCallAction " )
// R e t r i e v e t h e S p e a k e r b o x C a l l i n s t a n c e c o r r e s p o n d i n g t o t h e a c t i o n ' s c a l l U U I D
// R e t r i e v e t h e S p e a k e r b o x C a l l i n s t a n c e c o r r e s p o n d i n g t o t h e a c t i o n ' s c a l l U U I D
guard let call = callManager . callWithLocalId ( action . callUUID ) else {
guard let call = callManager . callWithLocalId ( action . callUUID ) else {
@ -232,6 +264,8 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
}
}
public func provider ( _ provider : CXProvider , perform action : CXEndCallAction ) {
public func provider ( _ provider : CXProvider , perform action : CXEndCallAction ) {
AssertIsOnMainThread ( )
Logger . debug ( " \( TAG ) Received \( #function ) CXEndCallAction " )
Logger . debug ( " \( TAG ) Received \( #function ) CXEndCallAction " )
guard let call = callManager . callWithLocalId ( action . callUUID ) else {
guard let call = callManager . callWithLocalId ( action . callUUID ) else {
action . fail ( )
action . fail ( )
@ -257,6 +291,8 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
}
}
public func provider ( _ provider : CXProvider , perform action : CXSetHeldCallAction ) {
public func provider ( _ provider : CXProvider , perform action : CXSetHeldCallAction ) {
AssertIsOnMainThread ( )
Logger . debug ( " \( TAG ) Received \( #function ) CXSetHeldCallAction " )
Logger . debug ( " \( TAG ) Received \( #function ) CXSetHeldCallAction " )
guard let call = callManager . callWithLocalId ( action . callUUID ) else {
guard let call = callManager . callWithLocalId ( action . callUUID ) else {
action . fail ( )
action . fail ( )
@ -282,6 +318,8 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
}
}
public func provider ( _ provider : CXProvider , perform action : CXSetMutedCallAction ) {
public func provider ( _ provider : CXProvider , perform action : CXSetMutedCallAction ) {
AssertIsOnMainThread ( )
Logger . debug ( " \( TAG ) Received \( #function ) CXSetMutedCallAction " )
Logger . debug ( " \( TAG ) Received \( #function ) CXSetMutedCallAction " )
guard callManager . callWithLocalId ( action . callUUID ) != nil else {
guard callManager . callWithLocalId ( action . callUUID ) != nil else {
Logger . error ( " \( TAG ) Failing CXSetMutedCallAction for unknown call: \( action . callUUID ) " )
Logger . error ( " \( TAG ) Failing CXSetMutedCallAction for unknown call: \( action . callUUID ) " )
@ -296,20 +334,28 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
}
}
public func provider ( _ provider : CXProvider , perform action : CXSetGroupCallAction ) {
public func provider ( _ provider : CXProvider , perform action : CXSetGroupCallAction ) {
AssertIsOnMainThread ( )
Logger . warn ( " \( TAG ) unimplemented \( #function ) for CXSetGroupCallAction " )
Logger . warn ( " \( TAG ) unimplemented \( #function ) for CXSetGroupCallAction " )
}
}
public func provider ( _ provider : CXProvider , perform action : CXPlayDTMFCallAction ) {
public func provider ( _ provider : CXProvider , perform action : CXPlayDTMFCallAction ) {
AssertIsOnMainThread ( )
Logger . warn ( " \( TAG ) unimplemented \( #function ) for CXPlayDTMFCallAction " )
Logger . warn ( " \( TAG ) unimplemented \( #function ) for CXPlayDTMFCallAction " )
}
}
func provider ( _ provider : CXProvider , timedOutPerforming action : CXAction ) {
func provider ( _ provider : CXProvider , timedOutPerforming action : CXAction ) {
AssertIsOnMainThread ( )
Logger . debug ( " \( TAG ) Timed out \( #function ) " )
Logger . debug ( " \( TAG ) Timed out \( #function ) " )
// R e a c t t o t h e a c t i o n t i m e o u t i f n e c e s s a r y , s u c h a s s h o w i n g a n e r r o r U I .
// R e a c t t o t h e a c t i o n t i m e o u t i f n e c e s s a r y , s u c h a s s h o w i n g a n e r r o r U I .
}
}
func provider ( _ provider : CXProvider , didActivate audioSession : AVAudioSession ) {
func provider ( _ provider : CXProvider , didActivate audioSession : AVAudioSession ) {
AssertIsOnMainThread ( )
Logger . debug ( " \( TAG ) Received \( #function ) " )
Logger . debug ( " \( TAG ) Received \( #function ) " )
// S t a r t r e c o r d i n g
// S t a r t r e c o r d i n g
@ -317,6 +363,8 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate {
}
}
func provider ( _ provider : CXProvider , didDeactivate audioSession : AVAudioSession ) {
func provider ( _ provider : CXProvider , didDeactivate audioSession : AVAudioSession ) {
AssertIsOnMainThread ( )
Logger . debug ( " \( TAG ) Received \( #function ) " )
Logger . debug ( " \( TAG ) Received \( #function ) " )
/*
/*