diff --git a/Signal/Signal-Info.plist b/Signal/Signal-Info.plist
index e7c2409d40..9a8094cf2e 100644
--- a/Signal/Signal-Info.plist
+++ b/Signal/Signal-Info.plist
@@ -5,7 +5,7 @@
BuildDetails
WebRTCCommit
- 1263343626b945acd509c94d3f65bc75bffdb9c9 Production build of v2.19.2
+ 0bdc4fb9c7a703c8a8f498fa78b6c1f398625348 Production build of v2.20.0
CFBundleDevelopmentRegion
en
diff --git a/Signal/src/Calls/Individual/IndividualCallService.swift b/Signal/src/Calls/Individual/IndividualCallService.swift
index 92ce38778e..2777f92b82 100644
--- a/Signal/src/Calls/Individual/IndividualCallService.swift
+++ b/Signal/src/Calls/Individual/IndividualCallService.swift
@@ -757,6 +757,44 @@ import CallKit
call.individualCall.state = .localHangup
callService.terminate(call: call)
+ case .endedRemoteReCall:
+ guard call === callService.currentCall else {
+ callService.cleanupStaleCall(call)
+ return
+ }
+
+ if let callRecord = call.individualCall.callRecord {
+ switch callRecord.callType {
+ case .outgoingMissed, .incomingDeclined, .incomingMissed, .incomingMissedBecauseOfChangedIdentity, .incomingAnsweredElsewhere, .incomingDeclinedElsewhere, .incomingBusyElsewhere:
+ // already handled and ended, don't update the call record.
+ break
+ case .incomingIncomplete, .incoming:
+ callRecord.updateCallType(.incomingMissed)
+ callUIAdapter.reportMissedCall(call)
+ case .outgoingIncomplete:
+ callRecord.updateCallType(.outgoingMissed)
+ callUIAdapter.remoteBusy(call)
+ case .outgoing:
+ callRecord.updateCallType(.outgoingMissed)
+ callUIAdapter.reportMissedCall(call)
+ @unknown default:
+ owsFailDebug("unknown RPRecentCallType: \(callRecord.callType)")
+ }
+ } else {
+ assert(call.individualCall.direction == .incoming)
+ let callRecord = TSCall(
+ callType: .incomingMissed,
+ offerType: call.individualCall.offerMediaType,
+ thread: call.individualCall.thread,
+ sentAtTimestamp: call.individualCall.sentAtTimestamp
+ )
+ databaseStorage.asyncWrite { callRecord.anyInsert(transaction: $0) }
+ call.individualCall.callRecord = callRecord
+ callUIAdapter.reportMissedCall(call)
+ }
+ call.individualCall.state = .localHangup
+ callService.terminate(call: call)
+
case .endedTimeout:
let description: String
@@ -771,6 +809,9 @@ import CallKit
case .endedSignalingFailure:
handleFailedCall(failedCall: call, error: SignalCall.CallError.signaling, shouldResetUI: true, shouldResetRingRTC: false)
+ case .endedGlareHandlingFailure:
+ handleFailedCall(failedCall: call, error: SignalCall.CallError.signaling, shouldResetUI: true, shouldResetRingRTC: false)
+
case .endedInternalFailure:
handleFailedCall(failedCall: call, error: OWSAssertionError("call manager internal error"), shouldResetUI: true, shouldResetRingRTC: false)
diff --git a/ThirdParty/RingRTC b/ThirdParty/RingRTC
index d8abec7efb..43441a36b6 160000
--- a/ThirdParty/RingRTC
+++ b/ThirdParty/RingRTC
@@ -1 +1 @@
-Subproject commit d8abec7efb80198dad3fe730633b67ba0995647d
+Subproject commit 43441a36b6208e63ca872a929539350665a20fa3
diff --git a/ThirdParty/SignalRingRTC.podspec b/ThirdParty/SignalRingRTC.podspec
index 811536ff79..be284135cd 100644
--- a/ThirdParty/SignalRingRTC.podspec
+++ b/ThirdParty/SignalRingRTC.podspec
@@ -8,7 +8,7 @@
Pod::Spec.new do |s|
s.name = "SignalRingRTC"
- s.version = "2.18.1"
+ s.version = "2.20.0"
s.summary = "A Swift & Objective-C library used by the Signal iOS app for WebRTC interactions."
s.description = <<-DESC
diff --git a/ThirdParty/WebRTC b/ThirdParty/WebRTC
index 1263343626..0bdc4fb9c7 160000
--- a/ThirdParty/WebRTC
+++ b/ThirdParty/WebRTC
@@ -1 +1 @@
-Subproject commit 1263343626b945acd509c94d3f65bc75bffdb9c9
+Subproject commit 0bdc4fb9c7a703c8a8f498fa78b6c1f398625348