From 615f8f612db67ab9bd88365a0ffaedcfdcb3fffb Mon Sep 17 00:00:00 2001 From: Christophe Deschamps Date: Mon, 29 Nov 2021 18:55:01 +0100 Subject: [PATCH] Option to use device ring tone for callkit ring --- Classes/CallManager.swift | 3 +- Classes/LinphoneCoreSettingsStore.m | 5 +++ Classes/LinphoneManager.m | 2 +- Classes/ProviderDelegate.swift | 39 ++++++++++++++---------- Settings/InAppSettings.bundle/Call.plist | 10 ++++++ 5 files changed, 41 insertions(+), 18 deletions(-) diff --git a/Classes/CallManager.swift b/Classes/CallManager.swift index 6d3a7930f..cc2e380e2 100644 --- a/Classes/CallManager.swift +++ b/Classes/CallManager.swift @@ -51,7 +51,7 @@ import AVFoundation @objc var backgroundContextCameraIsEnabled : Bool = false fileprivate override init() { - providerDelegate = ProviderDelegate() + providerDelegate = ProviderDelegate.shared callController = CXCallController() } @@ -62,6 +62,7 @@ import AVFoundation return theCallManager! } + @objc func setCore(core: OpaquePointer) { self.core = Core.getSwiftObject(cObject: core) self.core?.addDelegate(delegate: self) diff --git a/Classes/LinphoneCoreSettingsStore.m b/Classes/LinphoneCoreSettingsStore.m index 077c5e84b..d9a59ac84 100644 --- a/Classes/LinphoneCoreSettingsStore.m +++ b/Classes/LinphoneCoreSettingsStore.m @@ -329,6 +329,8 @@ // call section { + + [self setBool:[lm lpConfigBoolForKey:@"use_device_ringtone"] forKey:@"use_device_ringtone"]; [self setBool:linphone_core_get_use_info_for_dtmf(LC) forKey:@"sipinfo_dtmf_preference"]; [self setBool:linphone_core_get_use_rfc2833_for_dtmf(LC) forKey:@"rfc_dtmf_preference"]; @@ -783,6 +785,9 @@ // call section linphone_core_set_use_rfc2833_for_dtmf(LC, [self boolForKey:@"rfc_dtmf_preference"]); + [lm lpConfigSetBool:[self boolForKey:@"use_device_ringtone"] forKey:@"use_device_ringtone"]; + [ProviderDelegate resetSharedProviderConfiguration]; + linphone_core_set_use_info_for_dtmf(LC, [self boolForKey:@"sipinfo_dtmf_preference"]); linphone_core_set_inc_timeout(LC, [self integerForKey:@"incoming_call_timeout_preference"]); linphone_core_set_in_call_timeout(LC, [self integerForKey:@"in_call_timeout_preference"]); diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index a04fd5220..8cb934663 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -1384,8 +1384,8 @@ void popup_link_account_cb(LinphoneAccountCreator *creator, LinphoneAccountCreat theLinphoneCore = linphone_factory_create_shared_core_with_config(factory, _configDb, NULL, [kLinphoneMsgNotificationAppGroupId UTF8String], true); linphone_core_add_callbacks(theLinphoneCore, cbs); - [CallManager.instance setCoreWithCore:theLinphoneCore]; [ConfigManager.instance setDbWithDb:_configDb]; + [CallManager.instance setCoreWithCore:theLinphoneCore]; [LinphoneManager.instance startLinphoneCore]; diff --git a/Classes/ProviderDelegate.swift b/Classes/ProviderDelegate.swift index a6f324058..5f4ecd512 100644 --- a/Classes/ProviderDelegate.swift +++ b/Classes/ProviderDelegate.swift @@ -53,7 +53,8 @@ import os * A delegate to support callkit. */ class ProviderDelegate: NSObject { - private let provider: CXProvider + static var shared = ProviderDelegate() + let provider: CXProvider var uuids: [String : UUID] = [:] var callInfos: [UUID : CallInfo] = [:] @@ -63,21 +64,27 @@ class ProviderDelegate: NSObject { provider.setDelegate(self, queue: nil) } - static var providerConfiguration: CXProviderConfiguration = { - let providerConfiguration = CXProviderConfiguration(localizedName: Bundle.main.infoDictionary!["CFBundleName"] as! String) - providerConfiguration.ringtoneSound = "notes_of_the_optimistic.caf" - providerConfiguration.supportsVideo = true - providerConfiguration.iconTemplateImageData = UIImage(named: "callkit_logo")?.pngData() - providerConfiguration.supportedHandleTypes = [.generic, .phoneNumber, .emailAddress] - - providerConfiguration.maximumCallsPerCallGroup = 10 - providerConfiguration.maximumCallGroups = 10 - - //not show app's calls in tel's history - //providerConfiguration.includesCallsInRecents = YES; - - return providerConfiguration - }() + static var providerConfiguration: CXProviderConfiguration { + get { + let providerConfiguration = CXProviderConfiguration(localizedName: Bundle.main.infoDictionary!["CFBundleName"] as! String) + providerConfiguration.ringtoneSound = ConfigManager.instance().lpConfigBoolForKey(key: "use_device_ringtone") ? nil : "notes_of_the_optimistic.caf" + providerConfiguration.supportsVideo = true + providerConfiguration.iconTemplateImageData = UIImage(named: "callkit_logo")?.pngData() + providerConfiguration.supportedHandleTypes = [.generic, .phoneNumber, .emailAddress] + + providerConfiguration.maximumCallsPerCallGroup = 10 + providerConfiguration.maximumCallGroups = 10 + + //not show app's calls in tel's history + //providerConfiguration.includesCallsInRecents = YES; + + return providerConfiguration + } + } + + @objc static func resetSharedProviderConfiguration() { + shared.provider.configuration = ProviderDelegate.providerConfiguration + } func reportIncomingCall(call:Call?, uuid: UUID, handle: String, hasVideo: Bool, displayName:String) { let update = CXCallUpdate() diff --git a/Settings/InAppSettings.bundle/Call.plist b/Settings/InAppSettings.bundle/Call.plist index 321051151..ff9d16866 100644 --- a/Settings/InAppSettings.bundle/Call.plist +++ b/Settings/InAppSettings.bundle/Call.plist @@ -4,6 +4,16 @@ PreferenceSpecifiers + + Type + PSToggleSwitchSpecifier + Title + Use device ringtone + Key + use_device_ringtone + DefaultValue + + Type PSToggleSwitchSpecifier