mirror of
https://github.com/signalapp/Signal-iOS.git
synced 2025-12-05 01:10:41 +00:00
Add call summary support for all calls
This commit is contained in:
4
Podfile
4
Podfile
@@ -15,8 +15,8 @@ ENV['LIBSIGNAL_FFI_PREBUILD_CHECKSUM'] = '39d2dd642c433d14d3bf0bdead848ea3248037
|
|||||||
pod 'LibSignalClient', git: 'https://github.com/signalapp/libsignal.git', tag: 'v0.86.4', testspecs: ["Tests"]
|
pod 'LibSignalClient', git: 'https://github.com/signalapp/libsignal.git', tag: 'v0.86.4', testspecs: ["Tests"]
|
||||||
# pod 'LibSignalClient', path: '../libsignal', testspecs: ["Tests"]
|
# pod 'LibSignalClient', path: '../libsignal', testspecs: ["Tests"]
|
||||||
|
|
||||||
ENV['RINGRTC_PREBUILD_CHECKSUM'] = 'b4a56a4d548cf2ea0215664f5a64c127c725ccf2ec360cbebe790da689286837'
|
ENV['RINGRTC_PREBUILD_CHECKSUM'] = 'a6a179d697778d4bf306ae4f749ee988c31ca6449bb07ad329e5e3989068b2ae'
|
||||||
pod 'SignalRingRTC', git: 'https://github.com/signalapp/ringrtc', tag: 'v2.59.3', inhibit_warnings: true
|
pod 'SignalRingRTC', git: 'https://github.com/signalapp/ringrtc', tag: 'v2.60.5', inhibit_warnings: true
|
||||||
# pod 'SignalRingRTC', path: '../ringrtc', testspecs: ["Tests"]
|
# pod 'SignalRingRTC', path: '../ringrtc', testspecs: ["Tests"]
|
||||||
|
|
||||||
pod 'GRDB.swift/SQLCipher'
|
pod 'GRDB.swift/SQLCipher'
|
||||||
|
|||||||
16
Podfile.lock
16
Podfile.lock
@@ -39,9 +39,9 @@ PODS:
|
|||||||
- SDWebImageWebPCoder (0.14.6):
|
- SDWebImageWebPCoder (0.14.6):
|
||||||
- libwebp (~> 1.0)
|
- libwebp (~> 1.0)
|
||||||
- SDWebImage/Core (~> 5.17)
|
- SDWebImage/Core (~> 5.17)
|
||||||
- SignalRingRTC (2.59.3):
|
- SignalRingRTC (2.60.5):
|
||||||
- SignalRingRTC/WebRTC (= 2.59.3)
|
- SignalRingRTC/WebRTC (= 2.60.5)
|
||||||
- SignalRingRTC/WebRTC (2.59.3)
|
- SignalRingRTC/WebRTC (2.60.5)
|
||||||
- SQLCipher (4.6.1):
|
- SQLCipher (4.6.1):
|
||||||
- SQLCipher/standard (= 4.6.1)
|
- SQLCipher/standard (= 4.6.1)
|
||||||
- SQLCipher/common (4.6.1)
|
- SQLCipher/common (4.6.1)
|
||||||
@@ -66,7 +66,7 @@ DEPENDENCIES:
|
|||||||
- Reachability
|
- Reachability
|
||||||
- SDWebImage
|
- SDWebImage
|
||||||
- SDWebImageWebPCoder
|
- SDWebImageWebPCoder
|
||||||
- SignalRingRTC (from `https://github.com/signalapp/ringrtc`, tag `v2.59.3`)
|
- SignalRingRTC (from `https://github.com/signalapp/ringrtc`, tag `v2.60.5`)
|
||||||
- SQLCipher (from `https://github.com/signalapp/sqlcipher.git`, tag `v4.6.1-f_barrierfsync`)
|
- SQLCipher (from `https://github.com/signalapp/sqlcipher.git`, tag `v4.6.1-f_barrierfsync`)
|
||||||
- SwiftProtobuf (= 1.31.1)
|
- SwiftProtobuf (= 1.31.1)
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ EXTERNAL SOURCES:
|
|||||||
:tag: v6.0.3
|
:tag: v6.0.3
|
||||||
SignalRingRTC:
|
SignalRingRTC:
|
||||||
:git: https://github.com/signalapp/ringrtc
|
:git: https://github.com/signalapp/ringrtc
|
||||||
:tag: v2.59.3
|
:tag: v2.60.5
|
||||||
SQLCipher:
|
SQLCipher:
|
||||||
:git: https://github.com/signalapp/sqlcipher.git
|
:git: https://github.com/signalapp/sqlcipher.git
|
||||||
:tag: v4.6.1-f_barrierfsync
|
:tag: v4.6.1-f_barrierfsync
|
||||||
@@ -132,7 +132,7 @@ CHECKOUT OPTIONS:
|
|||||||
:tag: v6.0.3
|
:tag: v6.0.3
|
||||||
SignalRingRTC:
|
SignalRingRTC:
|
||||||
:git: https://github.com/signalapp/ringrtc
|
:git: https://github.com/signalapp/ringrtc
|
||||||
:tag: v2.59.3
|
:tag: v2.60.5
|
||||||
SQLCipher:
|
SQLCipher:
|
||||||
:git: https://github.com/signalapp/sqlcipher.git
|
:git: https://github.com/signalapp/sqlcipher.git
|
||||||
:tag: v4.6.1-f_barrierfsync
|
:tag: v4.6.1-f_barrierfsync
|
||||||
@@ -154,10 +154,10 @@ SPEC CHECKSUMS:
|
|||||||
Reachability: fd0ecd23705e2599e4cceeb943222ae02296cbc6
|
Reachability: fd0ecd23705e2599e4cceeb943222ae02296cbc6
|
||||||
SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a
|
SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a
|
||||||
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
|
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
|
||||||
SignalRingRTC: 8fa61457ba96231dcf8913bfd2a53d8a1aa0e510
|
SignalRingRTC: 184d29a8b625e5e3c64d0807588eb8cf34d77f04
|
||||||
SQLCipher: ff2f045b20d675a73a70f7329395ddd4a2580063
|
SQLCipher: ff2f045b20d675a73a70f7329395ddd4a2580063
|
||||||
SwiftProtobuf: e02f51c8c2df5845657aee2d4de9d61bf50ef788
|
SwiftProtobuf: e02f51c8c2df5845657aee2d4de9d61bf50ef788
|
||||||
|
|
||||||
PODFILE CHECKSUM: 59876cee69aacbf8909777ef18ff1ae29281717a
|
PODFILE CHECKSUM: 3c2bc39810ece143d74e3428cc6bc3d7f074bf30
|
||||||
|
|
||||||
COCOAPODS: 1.15.2
|
COCOAPODS: 1.15.2
|
||||||
|
|||||||
2
Pods
2
Pods
Submodule Pods updated: 253eabbc47...32ff19b073
@@ -125,7 +125,7 @@ class CallAudioService: IndividualCallObserver, GroupCallObserver {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||||
stopPlayingAnySounds()
|
stopPlayingAnySounds()
|
||||||
ensureProperAudioSession(call: call)
|
ensureProperAudioSession(call: call)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -976,7 +976,7 @@ extension CallService: GroupCallObserver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupCallEnded(_ groupCall: GroupCall, reason: GroupCallEndReason) {
|
func groupCallEnded(_ groupCall: GroupCall, reason: CallEndReason) {
|
||||||
groupCallAccessoryMessageDelegate.localDeviceGroupCallDidEnd()
|
groupCallAccessoryMessageDelegate.localDeviceGroupCallDidEnd()
|
||||||
|
|
||||||
let call = callServiceState.currentCall
|
let call = callServiceState.currentCall
|
||||||
@@ -1283,6 +1283,22 @@ extension CallService: CallManagerDelegate {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func callManager(
|
||||||
|
_ callManager: SignalRingRTC.CallManager<SignalCall, CallService>,
|
||||||
|
onCallEnded call: SignalCall,
|
||||||
|
callId: UInt64,
|
||||||
|
reason: CallEndReason,
|
||||||
|
summary: CallSummary
|
||||||
|
) {
|
||||||
|
individualCallService.callManager(
|
||||||
|
callManager,
|
||||||
|
onCallEnded: call,
|
||||||
|
callId: callId,
|
||||||
|
reason: reason,
|
||||||
|
summary: summary
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
public func callManager(
|
public func callManager(
|
||||||
_ callManager: CallManager<SignalCall, CallService>,
|
_ callManager: CallManager<SignalCall, CallService>,
|
||||||
onEvent call: SignalCall,
|
onEvent call: SignalCall,
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ protocol GroupCallObserver: AnyObject {
|
|||||||
func groupCallPeekChanged(_ call: GroupCall)
|
func groupCallPeekChanged(_ call: GroupCall)
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason)
|
func groupCallEnded(_ call: GroupCall, reason: CallEndReason)
|
||||||
func groupCallReceivedReactions(_ call: GroupCall, reactions: [SignalRingRTC.Reaction])
|
func groupCallReceivedReactions(_ call: GroupCall, reactions: [SignalRingRTC.Reaction])
|
||||||
func groupCallReceivedRaisedHands(_ call: GroupCall, raisedHands: [DemuxId])
|
func groupCallReceivedRaisedHands(_ call: GroupCall, raisedHands: [DemuxId])
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ extension GroupCallObserver {
|
|||||||
func groupCallLocalDeviceStateChanged(_ call: GroupCall) {}
|
func groupCallLocalDeviceStateChanged(_ call: GroupCall) {}
|
||||||
func groupCallRemoteDeviceStatesChanged(_ call: GroupCall) {}
|
func groupCallRemoteDeviceStatesChanged(_ call: GroupCall) {}
|
||||||
func groupCallPeekChanged(_ call: GroupCall) {}
|
func groupCallPeekChanged(_ call: GroupCall) {}
|
||||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {}
|
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {}
|
||||||
func groupCallReceivedReactions(_ call: GroupCall, reactions: [SignalRingRTC.Reaction]) {}
|
func groupCallReceivedReactions(_ call: GroupCall, reactions: [SignalRingRTC.Reaction]) {}
|
||||||
func groupCallReceivedRaisedHands(_ call: GroupCall, raisedHands: [DemuxId]) {}
|
func groupCallReceivedRaisedHands(_ call: GroupCall, raisedHands: [DemuxId]) {}
|
||||||
func handleUntrustedIdentityError(_ call: GroupCall) {}
|
func handleUntrustedIdentityError(_ call: GroupCall) {}
|
||||||
@@ -213,9 +213,10 @@ class GroupCall: SignalRingRTC.GroupCallDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
func groupCall(onEnded groupCall: SignalRingRTC.GroupCall, reason: GroupCallEndReason) {
|
func groupCall(onEnded groupCall: SignalRingRTC.GroupCall, reason: CallEndReason, summary: CallSummary) {
|
||||||
self.hasInvokedConnectMethod = false
|
self.hasInvokedConnectMethod = false
|
||||||
|
|
||||||
|
// TODO: Handle the call summary.
|
||||||
observers.elements.forEach { $0.groupCallEnded(self, reason: reason) }
|
observers.elements.forEach { $0.groupCallEnded(self, reason: reason) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ extension GroupCallRemoteVideoManager: GroupCallObserver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||||
videoViews.keys.forEach { destroyRemoteVideoView(for: $0) }
|
videoViews.keys.forEach { destroyRemoteVideoView(for: $0) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -455,38 +455,13 @@ final class IndividualCallService: CallServiceStateObserver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
public func callManager(_ callManager: CallService.CallManagerType, onEvent call: SignalCall, event: CallManagerEvent) {
|
public func callManager(_ callManager: CallService.CallManagerType, onCallEnded call: SignalCall, callId: UInt64, reason: CallEndReason, summary: CallSummary) {
|
||||||
Logger.info("call: \(call), onEvent: \(event)")
|
Logger.info("call: \(call), onCallEnded: \(reason)")
|
||||||
|
|
||||||
switch event {
|
// TODO: Handle the call summary.
|
||||||
case .ringingLocal:
|
|
||||||
handleRinging(call: call)
|
|
||||||
|
|
||||||
case .ringingRemote:
|
switch reason {
|
||||||
handleRinging(call: call)
|
case .localHangup:
|
||||||
|
|
||||||
case .connectedLocal:
|
|
||||||
Logger.debug("")
|
|
||||||
// nothing further to do - already handled in handleAcceptCall().
|
|
||||||
|
|
||||||
case .connectedRemote:
|
|
||||||
defer {
|
|
||||||
callUIAdapter.recipientAcceptedCall(call.mode)
|
|
||||||
}
|
|
||||||
|
|
||||||
guard call === callServiceState.currentCall else {
|
|
||||||
cleanUpStaleCall(call)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the audio session configuration before audio is enabled in WebRTC
|
|
||||||
// via recipientAcceptedCall().
|
|
||||||
handleConnected(call: call)
|
|
||||||
|
|
||||||
// Update the call interaction now that we've connected.
|
|
||||||
call.individualCall.createOrUpdateCallInteractionAsync(callType: .outgoing)
|
|
||||||
|
|
||||||
case .endedLocalHangup:
|
|
||||||
guard call === callServiceState.currentCall else {
|
guard call === callServiceState.currentCall else {
|
||||||
cleanUpStaleCall(call)
|
cleanUpStaleCall(call)
|
||||||
return
|
return
|
||||||
@@ -513,7 +488,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
|||||||
|
|
||||||
callServiceState.terminateCall(call)
|
callServiceState.terminateCall(call)
|
||||||
|
|
||||||
case .endedRemoteHangup:
|
case .remoteHangup:
|
||||||
guard call === callServiceState.currentCall else {
|
guard call === callServiceState.currentCall else {
|
||||||
cleanUpStaleCall(call)
|
cleanUpStaleCall(call)
|
||||||
return
|
return
|
||||||
@@ -537,7 +512,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
|||||||
|
|
||||||
callServiceState.terminateCall(call)
|
callServiceState.terminateCall(call)
|
||||||
|
|
||||||
case .endedRemoteHangupNeedPermission:
|
case .remoteHangupNeedPermission:
|
||||||
guard call === callServiceState.currentCall else {
|
guard call === callServiceState.currentCall else {
|
||||||
cleanUpStaleCall(call)
|
cleanUpStaleCall(call)
|
||||||
return
|
return
|
||||||
@@ -559,7 +534,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
|||||||
|
|
||||||
callServiceState.terminateCall(call)
|
callServiceState.terminateCall(call)
|
||||||
|
|
||||||
case .endedRemoteHangupAccepted:
|
case .remoteHangupAccepted:
|
||||||
guard call === callServiceState.currentCall else {
|
guard call === callServiceState.currentCall else {
|
||||||
cleanUpStaleCall(call)
|
cleanUpStaleCall(call)
|
||||||
return
|
return
|
||||||
@@ -580,7 +555,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
|||||||
Logger.info("ignoring 'endedRemoteHangupAccepted' since call is already finished")
|
Logger.info("ignoring 'endedRemoteHangupAccepted' since call is already finished")
|
||||||
}
|
}
|
||||||
|
|
||||||
case .endedRemoteHangupDeclined:
|
case .remoteHangupDeclined:
|
||||||
guard call === callServiceState.currentCall else {
|
guard call === callServiceState.currentCall else {
|
||||||
cleanUpStaleCall(call)
|
cleanUpStaleCall(call)
|
||||||
return
|
return
|
||||||
@@ -601,7 +576,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
|||||||
Logger.info("ignoring 'endedRemoteHangupDeclined' since call is already finished")
|
Logger.info("ignoring 'endedRemoteHangupDeclined' since call is already finished")
|
||||||
}
|
}
|
||||||
|
|
||||||
case .endedRemoteHangupBusy:
|
case .remoteHangupBusy:
|
||||||
guard call === callServiceState.currentCall else {
|
guard call === callServiceState.currentCall else {
|
||||||
cleanUpStaleCall(call)
|
cleanUpStaleCall(call)
|
||||||
return
|
return
|
||||||
@@ -622,7 +597,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
|||||||
Logger.info("ignoring 'endedRemoteHangupBusy' since call is already finished")
|
Logger.info("ignoring 'endedRemoteHangupBusy' since call is already finished")
|
||||||
}
|
}
|
||||||
|
|
||||||
case .endedRemoteBusy:
|
case .remoteBusy:
|
||||||
guard call === callServiceState.currentCall else {
|
guard call === callServiceState.currentCall else {
|
||||||
cleanUpStaleCall(call)
|
cleanUpStaleCall(call)
|
||||||
return
|
return
|
||||||
@@ -638,7 +613,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
|||||||
|
|
||||||
callServiceState.terminateCall(call)
|
callServiceState.terminateCall(call)
|
||||||
|
|
||||||
case .endedRemoteGlare, .endedRemoteReCall:
|
case .remoteGlare, .remoteReCall:
|
||||||
guard call === callServiceState.currentCall else {
|
guard call === callServiceState.currentCall else {
|
||||||
cleanUpStaleCall(call)
|
cleanUpStaleCall(call)
|
||||||
return
|
return
|
||||||
@@ -669,7 +644,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
|||||||
call.individualCall.state = .localHangup
|
call.individualCall.state = .localHangup
|
||||||
callServiceState.terminateCall(call)
|
callServiceState.terminateCall(call)
|
||||||
|
|
||||||
case .endedTimeout:
|
case .timeout:
|
||||||
let description: String
|
let description: String
|
||||||
|
|
||||||
if call.individualCall.direction == .outgoing {
|
if call.individualCall.direction == .outgoing {
|
||||||
@@ -680,21 +655,74 @@ final class IndividualCallService: CallServiceStateObserver {
|
|||||||
|
|
||||||
handleFailedCall(failedCall: call, error: CallError.timeout(description: description), shouldResetUI: true, shouldResetRingRTC: false)
|
handleFailedCall(failedCall: call, error: CallError.timeout(description: description), shouldResetUI: true, shouldResetRingRTC: false)
|
||||||
|
|
||||||
case .endedSignalingFailure, .endedGlareHandlingFailure:
|
case .internalFailure:
|
||||||
handleFailedCall(failedCall: call, error: CallError.signaling, shouldResetUI: true, shouldResetRingRTC: false)
|
|
||||||
|
|
||||||
case .endedInternalFailure:
|
|
||||||
handleFailedCall(failedCall: call, error: OWSAssertionError("call manager internal error"), shouldResetUI: true, shouldResetRingRTC: false)
|
handleFailedCall(failedCall: call, error: OWSAssertionError("call manager internal error"), shouldResetUI: true, shouldResetRingRTC: false)
|
||||||
|
|
||||||
case .endedConnectionFailure:
|
case .signalingFailure:
|
||||||
|
handleFailedCall(failedCall: call, error: CallError.signaling, shouldResetUI: true, shouldResetRingRTC: false)
|
||||||
|
|
||||||
|
case .connectionFailure:
|
||||||
handleFailedCall(failedCall: call, error: CallError.disconnected, shouldResetUI: true, shouldResetRingRTC: false)
|
handleFailedCall(failedCall: call, error: CallError.disconnected, shouldResetUI: true, shouldResetRingRTC: false)
|
||||||
|
|
||||||
case .endedDropped:
|
case .appDroppedCall:
|
||||||
Logger.debug("")
|
Logger.debug("")
|
||||||
|
|
||||||
// An incoming call was dropped, ignoring because we have already
|
// An incoming call was dropped, ignoring because we have already
|
||||||
// failed the call on the screen.
|
// failed the call on the screen.
|
||||||
|
|
||||||
|
case
|
||||||
|
.deviceExplicitlyDisconnected,
|
||||||
|
.serverExplicitlyDisconnected,
|
||||||
|
.deniedRequestToJoinCall,
|
||||||
|
.removedFromCall,
|
||||||
|
.callManagerIsBusy,
|
||||||
|
.sfuClientFailedToJoin,
|
||||||
|
.failedToCreatePeerConnectionFactory,
|
||||||
|
.failedToNegotiateSrtpKeys,
|
||||||
|
.failedToCreatePeerConnection,
|
||||||
|
.failedToStartPeerConnection,
|
||||||
|
.failedToUpdatePeerConnection,
|
||||||
|
.failedToSetMaxSendBitrate,
|
||||||
|
.iceFailedWhileConnecting,
|
||||||
|
.iceFailedAfterConnected,
|
||||||
|
.serverChangedDemuxId,
|
||||||
|
.hasMaxDevices:
|
||||||
|
Logger.error("Received Group Call reason in a Direct Call context")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
public func callManager(_ callManager: CallService.CallManagerType, onEvent call: SignalCall, event: CallManagerEvent) {
|
||||||
|
Logger.info("call: \(call), onEvent: \(event)")
|
||||||
|
|
||||||
|
switch event {
|
||||||
|
case .ringingLocal:
|
||||||
|
handleRinging(call: call)
|
||||||
|
|
||||||
|
case .ringingRemote:
|
||||||
|
handleRinging(call: call)
|
||||||
|
|
||||||
|
case .connectedLocal:
|
||||||
|
Logger.debug("")
|
||||||
|
// nothing further to do - already handled in handleAcceptCall().
|
||||||
|
|
||||||
|
case .connectedRemote:
|
||||||
|
defer {
|
||||||
|
callUIAdapter.recipientAcceptedCall(call.mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
guard call === callServiceState.currentCall else {
|
||||||
|
cleanUpStaleCall(call)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the audio session configuration before audio is enabled in WebRTC
|
||||||
|
// via recipientAcceptedCall().
|
||||||
|
handleConnected(call: call)
|
||||||
|
|
||||||
|
// Update the call interaction now that we've connected.
|
||||||
|
call.individualCall.createOrUpdateCallInteractionAsync(callType: .outgoing)
|
||||||
|
|
||||||
case .remoteAudioEnable:
|
case .remoteAudioEnable:
|
||||||
guard call === callServiceState.currentCall else {
|
guard call === callServiceState.currentCall else {
|
||||||
cleanUpStaleCall(call)
|
cleanUpStaleCall(call)
|
||||||
@@ -768,6 +796,9 @@ final class IndividualCallService: CallServiceStateObserver {
|
|||||||
// TODO - This should not be a failure.
|
// TODO - This should not be a failure.
|
||||||
call.individualCall.state = .localFailure
|
call.individualCall.state = .localFailure
|
||||||
callServiceState.terminateCall(call)
|
callServiceState.terminateCall(call)
|
||||||
|
|
||||||
|
case .glareHandlingFailure:
|
||||||
|
handleFailedCall(failedCall: call, error: CallError.signaling, shouldResetUI: true, shouldResetRingRTC: false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -615,7 +615,7 @@ extension CallControlsViewModel: GroupCallObserver {
|
|||||||
refreshView?()
|
refreshView?()
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||||
refreshView?()
|
refreshView?()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ extension GroupCallSheetDataSource: GroupCallObserver {
|
|||||||
observers.elements.forEach { $0.callSheetMembershipDidChange(self) }
|
observers.elements.forEach { $0.callSheetMembershipDidChange(self) }
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||||
AssertIsOnMainThread()
|
AssertIsOnMainThread()
|
||||||
observers.elements.forEach { $0.callSheetMembershipDidChange(self) }
|
observers.elements.forEach { $0.callSheetMembershipDidChange(self) }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -509,7 +509,7 @@ extension CallHeader: GroupCallObserver {
|
|||||||
updateCallStatusLabel()
|
updateCallStatusLabel()
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||||
updateCallStatusLabel()
|
updateCallStatusLabel()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ extension GroupCallNotificationView: GroupCallObserver {
|
|||||||
updateActiveMembers()
|
updateActiveMembers()
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||||
AssertIsOnMainThread()
|
AssertIsOnMainThread()
|
||||||
|
|
||||||
hasJoined = false
|
hasJoined = false
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ extension GroupCallVideoGrid: GroupCallObserver {
|
|||||||
reloadData()
|
reloadData()
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||||
AssertIsOnMainThread()
|
AssertIsOnMainThread()
|
||||||
reloadData()
|
reloadData()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -223,7 +223,7 @@ extension GroupCallVideoOverflow: GroupCallObserver {
|
|||||||
reloadData()
|
reloadData()
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||||
AssertIsOnMainThread()
|
AssertIsOnMainThread()
|
||||||
reloadData()
|
reloadData()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1749,7 +1749,7 @@ extension GroupCallViewController: GroupCallObserver {
|
|||||||
updateCallUI()
|
updateCallUI()
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||||
AssertIsOnMainThread()
|
AssertIsOnMainThread()
|
||||||
owsPrecondition(self.groupCall === call)
|
owsPrecondition(self.groupCall === call)
|
||||||
|
|
||||||
@@ -1822,6 +1822,24 @@ extension GroupCallViewController: GroupCallObserver {
|
|||||||
)
|
)
|
||||||
message = nil
|
message = nil
|
||||||
shouldDismissCallAfterDismissingActionSheet = false
|
shouldDismissCallAfterDismissingActionSheet = false
|
||||||
|
|
||||||
|
case
|
||||||
|
.localHangup,
|
||||||
|
.remoteHangup,
|
||||||
|
.remoteHangupNeedPermission,
|
||||||
|
.remoteHangupAccepted,
|
||||||
|
.remoteHangupDeclined,
|
||||||
|
.remoteHangupBusy,
|
||||||
|
.remoteBusy,
|
||||||
|
.remoteGlare,
|
||||||
|
.remoteReCall,
|
||||||
|
.timeout,
|
||||||
|
.internalFailure,
|
||||||
|
.signalingFailure,
|
||||||
|
.connectionFailure,
|
||||||
|
.appDroppedCall:
|
||||||
|
Logger.error("Received Direct Call reason in a Group Call context")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.isReadyToHandleObserver {
|
if self.isReadyToHandleObserver {
|
||||||
|
|||||||
@@ -2446,7 +2446,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||||||
<key>License</key>
|
<key>License</key>
|
||||||
<string>ISC License</string>
|
<string>ISC License</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
<string>cubeb 0.31.2, cubeb-core 0.31.2, cubeb-sys 0.31.2</string>
|
<string>cubeb 0.33.0, cubeb-core 0.33.0, cubeb-sys 0.33.0</string>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
</dict>
|
</dict>
|
||||||
@@ -6783,7 +6783,7 @@ You should also get your employer (if you work as a programmer) or school, if an
|
|||||||
<key>License</key>
|
<key>License</key>
|
||||||
<string>GNU Affero General Public License v3.0</string>
|
<string>GNU Affero General Public License v3.0</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
<string>libsignal-account-keys 0.1.0, libsignal-core 0.1.0, mrp 2.59.3, partial-default-derive 0.1.0, protobuf 2.59.3, regex-aot 0.1.0, ringrtc 2.59.3</string>
|
<string>libsignal-account-keys 0.1.0, libsignal-core 0.1.0, mrp 2.60.5, partial-default-derive 0.1.0, protobuf 2.60.5, regex-aot 0.1.0, ringrtc 2.60.5</string>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
</dict>
|
</dict>
|
||||||
@@ -13138,6 +13138,217 @@ For more information on this, and how to apply and follow the GNU AGPL, see
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string> Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [2019] [Mike Heffner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
</string>
|
||||||
|
<key>License</key>
|
||||||
|
<string>Apache License 2.0</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>sketches-ddsketch 0.3.0</string>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>Copyright (c) 2019 Carl Lerche
|
<string>Copyright (c) 2019 Carl Lerche
|
||||||
|
|||||||
Reference in New Issue
Block a user