diff --git a/DocumentationTests/DocumentationTests/DocumentationTests/06-advanced/03-callkit-integration.swift b/DocumentationTests/DocumentationTests/DocumentationTests/06-advanced/03-callkit-integration.swift index df3080a39..a300b942f 100644 --- a/DocumentationTests/DocumentationTests/DocumentationTests/06-advanced/03-callkit-integration.swift +++ b/DocumentationTests/DocumentationTests/DocumentationTests/06-advanced/03-callkit-integration.swift @@ -153,6 +153,11 @@ private func content() { callKitAdapter.availabilityPolicy = .custom(MyCustomAvailabilityPolicy()) } + container { + @Injected(\.callKitAdapter) var callKitAdapter + callKitAdapter.includesCallsInRecents = false + } + container { class IntentHandler: INExtension, INStartCallIntentHandling { override func handler(for intent: INIntent) -> Any { diff --git a/Sources/StreamVideo/CallKit/CallKitAdapter.swift b/Sources/StreamVideo/CallKit/CallKitAdapter.swift index 29a27f4b7..39d5a4f6a 100644 --- a/Sources/StreamVideo/CallKit/CallKitAdapter.swift +++ b/Sources/StreamVideo/CallKit/CallKitAdapter.swift @@ -27,6 +27,12 @@ open class CallKitAdapter { set { callKitService.ringtoneSound = newValue } } + /// Configure whether calls should appear in the Recents app. + open var includesCallsInRecents: Bool { + get { callKitService.includesCallsInRecents } + set { callKitService.includesCallsInRecents = newValue } + } + /// The callSettings to use when joining a call (after accepting it on CallKit) /// default: nil open var callSettings: CallSettings? { diff --git a/Sources/StreamVideo/CallKit/CallKitService.swift b/Sources/StreamVideo/CallKit/CallKitService.swift index 182d55a13..20bb366c9 100644 --- a/Sources/StreamVideo/CallKit/CallKitService.swift +++ b/Sources/StreamVideo/CallKit/CallKitService.swift @@ -83,6 +83,8 @@ open class CallKitService: NSObject, CXProviderDelegate, @unchecked Sendable { /// Whether video is supported. If true, CallKit push titles add "Video"; /// otherwise "Audio". Default is `false`. open var supportsVideo: Bool = false + /// Whether calls received will be showing in Recents app. + open var includesCallsInRecents: Bool = true /// Policy for handling calls when mic permission is missing while the app /// runs in the background. See `CallKitMissingPermissionPolicy`. @@ -692,6 +694,7 @@ open class CallKitService: NSObject, CXProviderDelegate, @unchecked Sendable { configuration.supportedHandleTypes = supportedHandleTypes configuration.iconTemplateImageData = iconTemplateImageData configuration.ringtoneSound = ringtoneSound + configuration.includesCallsInRecents = includesCallsInRecents if supportsHolding { // Holding a call isn't supported yet. diff --git a/StreamVideoTests/CallKit/CallKitServiceTests.swift b/StreamVideoTests/CallKit/CallKitServiceTests.swift index e8f958aa3..cf042b23e 100644 --- a/StreamVideoTests/CallKit/CallKitServiceTests.swift +++ b/StreamVideoTests/CallKit/CallKitServiceTests.swift @@ -137,6 +137,35 @@ final class CallKitServiceTests: XCTestCase, @unchecked Sendable { XCTAssertNil(subject.callProvider.configuration.iconTemplateImageData) } + @MainActor + func test_reportIncomingCall_withIncludesCallsInRecents_callUpdateWasConfiguredCorrectly() throws { + subject = .init() + + subject.reportIncomingCall( + cid, + localizedCallerName: localizedCallerName, + callerId: callerId, + hasVideo: false + ) { _ in } + + XCTAssertTrue(subject.callProvider.configuration.includesCallsInRecents) + } + + @MainActor + func test_reportIncomingCall_withoutIncludesCallsInRecents_callUpdateWasConfiguredCorrectly() throws { + subject = .init() + subject.includesCallsInRecents = false + + subject.reportIncomingCall( + cid, + localizedCallerName: localizedCallerName, + callerId: callerId, + hasVideo: false + ) { _ in } + + XCTAssertFalse(subject.callProvider.configuration.includesCallsInRecents) + } + @MainActor func test_reportIncomingCall_callProviderWasCalledWithExpectedValues() { // Given