// // Copyright (c) 2021 Open Whisper Systems. All rights reserved. // #import "SSKEnvironment.h" #import "AppContext.h" #import "OWSBlockingManager.h" #import "TSAccountManager.h" #import #import NS_ASSUME_NONNULL_BEGIN static SSKEnvironment *sharedSSKEnvironment; @interface SSKEnvironment () @property (nonatomic) id contactsManagerRef; @property (nonatomic) MessageSender *messageSenderRef; @property (nonatomic) id profileManagerRef; @property (nonatomic) TSNetworkManager *networkManagerRef; @property (nonatomic) OWSMessageManager *messageManagerRef; @property (nonatomic) OWSBlockingManager *blockingManagerRef; @property (nonatomic) OWSIdentityManager *identityManagerRef; @property (nonatomic) id udManagerRef; @property (nonatomic) OWSMessageDecrypter *messageDecrypterRef; @property (nonatomic) GroupsV2MessageProcessor *groupsV2MessageProcessorRef; @property (nonatomic) TSSocketManager *socketManagerRef; @property (nonatomic) TSAccountManager *tsAccountManagerRef; @property (nonatomic) OWS2FAManager *ows2FAManagerRef; @property (nonatomic) OWSDisappearingMessagesJob *disappearingMessagesJobRef; @property (nonatomic) OWSReadReceiptManager *readReceiptManagerRef; @property (nonatomic) OWSOutgoingReceiptManager *outgoingReceiptManagerRef; @property (nonatomic) id syncManagerRef; @property (nonatomic) id reachabilityManagerRef; @property (nonatomic) id typingIndicatorsRef; @property (nonatomic) OWSAttachmentDownloads *attachmentDownloadsRef; @property (nonatomic) SignalServiceAddressCache *signalServiceAddressCacheRef; @property (nonatomic) StickerManager *stickerManagerRef; @property (nonatomic) SDSDatabaseStorage *databaseStorageRef; @property (nonatomic) StorageCoordinator *storageCoordinatorRef; @property (nonatomic) SSKPreferences *sskPreferencesRef; @property (nonatomic) id groupsV2Ref; @property (nonatomic) id groupV2UpdatesRef; @property (nonatomic) MessageFetcherJob *messageFetcherJobRef; @property (nonatomic) BulkProfileFetch *bulkProfileFetchRef; @property (nonatomic) BulkUUIDLookup *bulkUUIDLookupRef; @property (nonatomic) id versionedProfilesRef; @property (nonatomic) ModelReadCaches *modelReadCachesRef; @property (nonatomic) EarlyMessageManager *earlyMessageManagerRef; @property (nonatomic) OWSMessagePipelineSupervisor *messagePipelineSupervisorRef; @property (nonatomic) AppExpiry *appExpiryRef; @property (nonatomic) id paymentsRef; @property (nonatomic) id paymentsCurrenciesRef; @end #pragma mark - @implementation SSKEnvironment @synthesize callMessageHandlerRef = _callMessageHandlerRef; @synthesize notificationsManagerRef = _notificationsManagerRef; - (instancetype)initWithContactsManager:(id)contactsManager linkPreviewManager:(OWSLinkPreviewManager *)linkPreviewManager messageSender:(MessageSender *)messageSender messageSenderJobQueue:(MessageSenderJobQueue *)messageSenderJobQueue pendingReadReceiptRecorder:(id)pendingReadReceiptRecorder profileManager:(id)profileManager networkManager:(TSNetworkManager *)networkManager messageManager:(OWSMessageManager *)messageManager blockingManager:(OWSBlockingManager *)blockingManager identityManager:(OWSIdentityManager *)identityManager remoteConfigManager:(id)remoteConfigManager sessionStore:(SSKSessionStore *)sessionStore signedPreKeyStore:(SSKSignedPreKeyStore *)signedPreKeyStore preKeyStore:(SSKPreKeyStore *)preKeyStore udManager:(id)udManager messageDecrypter:(OWSMessageDecrypter *)messageDecrypter groupsV2MessageProcessor:(GroupsV2MessageProcessor *)groupsV2MessageProcessor socketManager:(TSSocketManager *)socketManager tsAccountManager:(TSAccountManager *)tsAccountManager ows2FAManager:(OWS2FAManager *)ows2FAManager disappearingMessagesJob:(OWSDisappearingMessagesJob *)disappearingMessagesJob readReceiptManager:(OWSReadReceiptManager *)readReceiptManager outgoingReceiptManager:(OWSOutgoingReceiptManager *)outgoingReceiptManager reachabilityManager:(id)reachabilityManager syncManager:(id)syncManager typingIndicators:(id)typingIndicators attachmentDownloads:(OWSAttachmentDownloads *)attachmentDownloads stickerManager:(StickerManager *)stickerManager databaseStorage:(SDSDatabaseStorage *)databaseStorage signalServiceAddressCache:(SignalServiceAddressCache *)signalServiceAddressCache accountServiceClient:(AccountServiceClient *)accountServiceClient storageServiceManager:(id)storageServiceManager storageCoordinator:(StorageCoordinator *)storageCoordinator sskPreferences:(SSKPreferences *)sskPreferences groupsV2:(id)groupsV2 groupV2Updates:(id)groupV2Updates messageFetcherJob:(MessageFetcherJob *)messageFetcherJob bulkProfileFetch:(BulkProfileFetch *)bulkProfileFetch bulkUUIDLookup:(BulkUUIDLookup *)bulkUUIDLookup versionedProfiles:(id)versionedProfiles modelReadCaches:(ModelReadCaches *)modelReadCaches earlyMessageManager:(EarlyMessageManager *)earlyMessageManager messagePipelineSupervisor:(OWSMessagePipelineSupervisor *)messagePipelineSupervisor appExpiry:(AppExpiry *)appExpiry messageProcessor:(MessageProcessor *)messageProcessor payments:(id)payments paymentsCurrencies:(id)paymentsCurrencies { self = [super init]; if (!self) { return self; } _contactsManagerRef = contactsManager; _linkPreviewManagerRef = linkPreviewManager; _messageSenderRef = messageSender; _messageSenderJobQueueRef = messageSenderJobQueue; _pendingReadReceiptRecorderRef = pendingReadReceiptRecorder; _profileManagerRef = profileManager; _networkManagerRef = networkManager; _messageManagerRef = messageManager; _blockingManagerRef = blockingManager; _identityManagerRef = identityManager; _remoteConfigManagerRef = remoteConfigManager; _sessionStoreRef = sessionStore; _signedPreKeyStoreRef = signedPreKeyStore; _preKeyStoreRef = preKeyStore; _udManagerRef = udManager; _messageDecrypterRef = messageDecrypter; _groupsV2MessageProcessorRef = groupsV2MessageProcessor; _socketManagerRef = socketManager; _tsAccountManagerRef = tsAccountManager; _ows2FAManagerRef = ows2FAManager; _disappearingMessagesJobRef = disappearingMessagesJob; _readReceiptManagerRef = readReceiptManager; _outgoingReceiptManagerRef = outgoingReceiptManager; _syncManagerRef = syncManager; _reachabilityManagerRef = reachabilityManager; _typingIndicatorsRef = typingIndicators; _attachmentDownloadsRef = attachmentDownloads; _stickerManagerRef = stickerManager; _databaseStorageRef = databaseStorage; _signalServiceAddressCacheRef = signalServiceAddressCache; _accountServiceClientRef = accountServiceClient; _storageServiceManagerRef = storageServiceManager; _storageCoordinatorRef = storageCoordinator; _sskPreferencesRef = sskPreferences; _groupsV2Ref = groupsV2; _groupV2UpdatesRef = groupV2Updates; _messageFetcherJobRef = messageFetcherJob; _bulkProfileFetchRef = bulkProfileFetch; _versionedProfilesRef = versionedProfiles; _bulkUUIDLookupRef = bulkUUIDLookup; _modelReadCachesRef = modelReadCaches; _earlyMessageManagerRef = earlyMessageManager; _messagePipelineSupervisorRef = messagePipelineSupervisor; _appExpiryRef = appExpiry; _messageProcessorRef = messageProcessor; _paymentsRef = payments; _paymentsCurrenciesRef = paymentsCurrencies; return self; } + (instancetype)shared { OWSAssertDebug(sharedSSKEnvironment); return sharedSSKEnvironment; } + (void)setShared:(SSKEnvironment *)env { OWSAssertDebug(env); OWSAssertDebug(!sharedSSKEnvironment || CurrentAppContext().isRunningTests); sharedSSKEnvironment = env; } + (void)clearSharedForTests { sharedSSKEnvironment = nil; } + (BOOL)hasShared { return sharedSSKEnvironment != nil; } #pragma mark - Mutable Accessors - (nullable id)callMessageHandlerRef { @synchronized(self) { OWSAssertDebug(_callMessageHandlerRef); return _callMessageHandlerRef; } } - (void)setCallMessageHandlerRef:(nullable id)callMessageHandlerRef { @synchronized(self) { OWSAssertDebug(callMessageHandlerRef); OWSAssertDebug(!_callMessageHandlerRef); _callMessageHandlerRef = callMessageHandlerRef; } } - (nullable id)notificationsManagerRef { @synchronized(self) { OWSAssertDebug(_notificationsManagerRef); return _notificationsManagerRef; } } - (void)setNotificationsManagerRef:(nullable id)notificationsManagerRef { @synchronized(self) { OWSAssertDebug(notificationsManagerRef); OWSAssertDebug(!_notificationsManagerRef); _notificationsManagerRef = notificationsManagerRef; } } - (BOOL)isComplete { return (self.callMessageHandler != nil && self.notificationsManager != nil); } - (void)warmCaches { [self.tsAccountManager warmCaches]; [self.signalServiceAddressCache warmCaches]; [self.remoteConfigManager warmCaches]; [self.udManager warmCaches]; [self.blockingManager warmCaches]; [self.profileManager warmCaches]; [self.readReceiptManager prepareCachedValues]; [OWSKeyBackupService warmCaches]; [PinnedThreadManager warmCaches]; [self.typingIndicatorsImpl warmCaches]; [self.payments warmCaches]; [self.paymentsCurrencies warmCaches]; } @end NS_ASSUME_NONNULL_END