diff --git a/SignalServiceKit/Account/TSAccountManager/RegistrationStateChangeManager/RegistrationStateChangeManagerImpl.swift b/SignalServiceKit/Account/TSAccountManager/RegistrationStateChangeManager/RegistrationStateChangeManagerImpl.swift index 3ca7579aae..5bde2cbbd9 100644 --- a/SignalServiceKit/Account/TSAccountManager/RegistrationStateChangeManager/RegistrationStateChangeManagerImpl.swift +++ b/SignalServiceKit/Account/TSAccountManager/RegistrationStateChangeManager/RegistrationStateChangeManagerImpl.swift @@ -16,11 +16,7 @@ public class RegistrationStateChangeManagerImpl: RegistrationStateChangeManager private let backupSubscriptionManager: BackupSubscriptionManager private let backupTestFlightEntitlementManager: BackupTestFlightEntitlementManager private let blockedRecipientStore: BlockedRecipientStore - private var chatConnectionManager: any ChatConnectionManager { - // TODO: Fix circular dependency. - return DependenciesBridge.shared.chatConnectionManager - } - + private let chatConnectionManager: any ChatConnectionManager private let cron: Cron private let db: DB private let dmConfigurationStore: DisappearingMessagesConfigurationStore @@ -45,6 +41,7 @@ public class RegistrationStateChangeManagerImpl: RegistrationStateChangeManager backupSubscriptionManager: BackupSubscriptionManager, backupTestFlightEntitlementManager: BackupTestFlightEntitlementManager, blockedRecipientStore: BlockedRecipientStore, + chatConnectionManager: any ChatConnectionManager, cron: Cron, db: DB, dmConfigurationStore: DisappearingMessagesConfigurationStore, @@ -68,6 +65,7 @@ public class RegistrationStateChangeManagerImpl: RegistrationStateChangeManager self.backupSubscriptionManager = backupSubscriptionManager self.backupTestFlightEntitlementManager = backupTestFlightEntitlementManager self.blockedRecipientStore = blockedRecipientStore + self.chatConnectionManager = chatConnectionManager self.cron = cron self.db = db self.dmConfigurationStore = dmConfigurationStore diff --git a/SignalServiceKit/Environment/AppSetup.swift b/SignalServiceKit/Environment/AppSetup.swift index 25eb9abd26..0f59755dcb 100644 --- a/SignalServiceKit/Environment/AppSetup.swift +++ b/SignalServiceKit/Environment/AppSetup.swift @@ -1011,6 +1011,16 @@ extension AppSetup.GlobalsContinuation { let inactivePrimaryDeviceStore = InactivePrimaryDeviceStore() let keyTransparencyStore = KeyTransparencyStore() + let chatConnectionManager = ChatConnectionManagerImpl( + accountManager: tsAccountManager, + appContext: appContext, + appExpiry: appExpiry, + appReadiness: appReadiness, + db: db, + inactivePrimaryDeviceStore: inactivePrimaryDeviceStore, + libsignalNet: libsignalNet, + ) + let registrationStateChangeManager = RegistrationStateChangeManagerImpl( authCredentialStore: authCredentialStore, backupAttachmentUploadEraStore: backupAttachmentUploadEraStore, @@ -1018,6 +1028,7 @@ extension AppSetup.GlobalsContinuation { backupSubscriptionManager: backupSubscriptionManager, backupTestFlightEntitlementManager: backupTestFlightEntitlementManager, blockedRecipientStore: blockedRecipientStore, + chatConnectionManager: chatConnectionManager, cron: cron, db: db, dmConfigurationStore: disappearingMessagesConfigurationStore, @@ -1035,17 +1046,9 @@ extension AppSetup.GlobalsContinuation { udManager: udManager, versionedProfiles: versionedProfiles, ) - - let chatConnectionManager = ChatConnectionManagerImpl( - accountManager: tsAccountManager, - appContext: appContext, - appExpiry: appExpiry, - appReadiness: appReadiness, - db: db, - inactivePrimaryDeviceStore: inactivePrimaryDeviceStore, - libsignalNet: libsignalNet, - registrationStateChangeManager: registrationStateChangeManager, - ) + chatConnectionManager.onRegistrationStateChange = { [weak registrationStateChangeManager] isDelinkedOrDeregistered, tx in + registrationStateChangeManager?.setIsDeregisteredOrDelinked(isDelinkedOrDeregistered, tx: tx) + } let attachmentUploadManager = AttachmentUploadManagerImpl( accountKeyStore: accountKeyStore, diff --git a/SignalServiceKit/Network/ChatConnectionManager.swift b/SignalServiceKit/Network/ChatConnectionManager.swift index 7f08b9f019..a1b165bdfb 100644 --- a/SignalServiceKit/Network/ChatConnectionManager.swift +++ b/SignalServiceKit/Network/ChatConnectionManager.swift @@ -96,6 +96,19 @@ public class ChatConnectionManagerImpl: ChatConnectionManager { private let connectionUnidentified: OWSUnauthConnectionUsingLibSignal private var connections: [OWSChatConnection] { [connectionIdentified, connectionUnidentified] } + // TODO: This is a workaround to solve the circular dependency between + // ChatConnectionManager and RegistrationStateChangeManager. In the event that + // someday RegistrationStateChangeManager is split up into smaller pieces, this + // can be revisited. + public var onRegistrationStateChange: ((_ isDelinkedOrDeregisterd: Bool, _ tx: DBWriteTransaction) -> Void)? { + get { + connectionIdentified.onRegistrationStateChange + } + set { + connectionIdentified.onRegistrationStateChange = newValue + } + } + @MainActor public init( accountManager: TSAccountManager, @@ -105,7 +118,6 @@ public class ChatConnectionManagerImpl: ChatConnectionManager { db: any DB, inactivePrimaryDeviceStore: InactivePrimaryDeviceStore, libsignalNet: Net, - registrationStateChangeManager: RegistrationStateChangeManager, ) { self.connectionIdentified = OWSAuthConnectionUsingLibSignal( libsignalNet: libsignalNet, @@ -115,7 +127,6 @@ public class ChatConnectionManagerImpl: ChatConnectionManager { appReadiness: appReadiness, db: db, inactivePrimaryDeviceStore: inactivePrimaryDeviceStore, - registrationStateChangeManager: registrationStateChangeManager, ) self.connectionUnidentified = OWSUnauthConnectionUsingLibSignal( libsignalNet: libsignalNet, diff --git a/SignalServiceKit/Network/OWSChatConnection.swift b/SignalServiceKit/Network/OWSChatConnection.swift index 068884f08d..30fdc228d8 100644 --- a/SignalServiceKit/Network/OWSChatConnection.swift +++ b/SignalServiceKit/Network/OWSChatConnection.swift @@ -885,9 +885,10 @@ class OWSAuthConnectionUsingLibSignal: OWSChatConnectionUsingLibSignal Void)? + private let accountManager: TSAccountManager private let inactivePrimaryDeviceStore: InactivePrimaryDeviceStore - private let registrationStateChangeManager: RegistrationStateChangeManager init( libsignalNet: Net, @@ -897,11 +898,9 @@ class OWSAuthConnectionUsingLibSignal: OWSChatConnectionUsingLibSignal