Rework creation of singletons.

This commit is contained in:
Matthew Chen 2018-09-17 09:27:58 -04:00
parent 27023c9d83
commit e1db60c1c0
83 changed files with 573 additions and 428 deletions

View File

@ -93,8 +93,6 @@
3461293E1FD1D72B00532771 /* ExperienceUpgradeFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3461293D1FD1D72B00532771 /* ExperienceUpgradeFinder.swift */; };
3461295A1FD1D74C00532771 /* Environment.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129401FD1D74B00532771 /* Environment.h */; settings = {ATTRIBUTES = (Public, ); }; };
3461295B1FD1D74C00532771 /* Environment.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129411FD1D74B00532771 /* Environment.m */; };
3461296F1FD1D74C00532771 /* Release.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129561FD1D74B00532771 /* Release.h */; settings = {ATTRIBUTES = (Public, ); }; };
346129701FD1D74C00532771 /* Release.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129571FD1D74B00532771 /* Release.m */; };
346129711FD1D74C00532771 /* SignalKeyingStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129581FD1D74B00532771 /* SignalKeyingStorage.h */; settings = {ATTRIBUTES = (Public, ); }; };
346129721FD1D74C00532771 /* SignalKeyingStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129591FD1D74B00532771 /* SignalKeyingStorage.m */; };
346129731FD1E01700532771 /* PromiseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 451DE9F11DC1585F00810E42 /* PromiseKit.framework */; };
@ -156,6 +154,7 @@
347850721FDAEB17007B8332 /* OWSUserProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 347850701FDAEB16007B8332 /* OWSUserProfile.h */; settings = {ATTRIBUTES = (Public, ); }; };
34843B2421432293004DED45 /* SignalBaseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 34843B2221432292004DED45 /* SignalBaseTest.m */; };
34843B26214327C9004DED45 /* OWSOrphanDataCleanerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 34843B25214327C9004DED45 /* OWSOrphanDataCleanerTest.m */; };
34843B2C214FE296004DED45 /* MockEnvironment.m in Sources */ = {isa = PBXBuildFile; fileRef = 34843B2A214FE295004DED45 /* MockEnvironment.m */; };
348570A820F67575004FF32B /* OWSMessageHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 348570A620F67574004FF32B /* OWSMessageHeaderView.m */; };
348BB25D20A0C5530047AEC2 /* ContactShareViewHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348BB25C20A0C5530047AEC2 /* ContactShareViewHelper.swift */; };
3491D9A121022DB7001EF5A1 /* CDSSigningCertificateTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 3491D9A021022DB7001EF5A1 /* CDSSigningCertificateTest.m */; };
@ -729,8 +728,6 @@
3461293D1FD1D72B00532771 /* ExperienceUpgradeFinder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ExperienceUpgradeFinder.swift; path = ExperienceUpgrades/ExperienceUpgradeFinder.swift; sourceTree = "<group>"; };
346129401FD1D74B00532771 /* Environment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Environment.h; sourceTree = "<group>"; };
346129411FD1D74B00532771 /* Environment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Environment.m; sourceTree = "<group>"; };
346129561FD1D74B00532771 /* Release.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Release.h; sourceTree = "<group>"; };
346129571FD1D74B00532771 /* Release.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Release.m; sourceTree = "<group>"; };
346129581FD1D74B00532771 /* SignalKeyingStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SignalKeyingStorage.h; sourceTree = "<group>"; };
346129591FD1D74B00532771 /* SignalKeyingStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SignalKeyingStorage.m; sourceTree = "<group>"; };
346129931FD1E30000532771 /* OWSDatabaseMigration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSDatabaseMigration.h; sourceTree = "<group>"; };
@ -795,6 +792,8 @@
34843B2221432292004DED45 /* SignalBaseTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SignalBaseTest.m; sourceTree = "<group>"; };
34843B2321432293004DED45 /* SignalBaseTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SignalBaseTest.h; sourceTree = "<group>"; };
34843B25214327C9004DED45 /* OWSOrphanDataCleanerTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSOrphanDataCleanerTest.m; sourceTree = "<group>"; };
34843B2A214FE295004DED45 /* MockEnvironment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MockEnvironment.m; sourceTree = "<group>"; };
34843B2B214FE295004DED45 /* MockEnvironment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MockEnvironment.h; sourceTree = "<group>"; };
348570A620F67574004FF32B /* OWSMessageHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSMessageHeaderView.m; sourceTree = "<group>"; };
348570A720F67574004FF32B /* OWSMessageHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSMessageHeaderView.h; sourceTree = "<group>"; };
348BB25C20A0C5530047AEC2 /* ContactShareViewHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactShareViewHelper.swift; sourceTree = "<group>"; };
@ -1630,8 +1629,6 @@
45F170AB1E2F0351003FC1F2 /* OWSAudioSession.swift */,
34074F60203D0CBE004596AE /* OWSSounds.h */,
34074F5F203D0CBD004596AE /* OWSSounds.m */,
346129561FD1D74B00532771 /* Release.h */,
346129571FD1D74B00532771 /* Release.m */,
346129581FD1D74B00532771 /* SignalKeyingStorage.h */,
346129591FD1D74B00532771 /* SignalKeyingStorage.m */,
346129E01FD5C0BE00532771 /* VersionMigrations.h */,
@ -1728,6 +1725,15 @@
path = Views;
sourceTree = "<group>";
};
34843B29214FE295004DED45 /* mocks */ = {
isa = PBXGroup;
children = (
34843B2B214FE295004DED45 /* MockEnvironment.h */,
34843B2A214FE295004DED45 /* MockEnvironment.m */,
);
path = mocks;
sourceTree = "<group>";
};
34B3F8331E8DF1700035BE1A /* ViewControllers */ = {
isa = PBXGroup;
children = (
@ -2308,15 +2314,16 @@
B660F66C1C29867F00687D6E /* test */ = {
isa = PBXGroup;
children = (
34843B2321432293004DED45 /* SignalBaseTest.h */,
34843B2221432292004DED45 /* SignalBaseTest.m */,
4C3EF8002109184A0007EBF7 /* SSKTests */,
34C6B0A41FA0E46F00D35993 /* Assets */,
B660F6731C29867F00687D6E /* call */,
B660F6751C29867F00687D6E /* contact */,
34843B29214FE295004DED45 /* mocks */,
458E38381D6699110094BD24 /* Models */,
B660F69B1C29868000687D6E /* push */,
34843B2321432293004DED45 /* SignalBaseTest.h */,
34843B2221432292004DED45 /* SignalBaseTest.m */,
4589670F1DC117CC00E9DD21 /* SignalTests-Bridging-Header.h */,
4C3EF8002109184A0007EBF7 /* SSKTests */,
B660F69D1C29868000687D6E /* Supporting Files */,
B660F6A01C29868000687D6E /* TestUtil.h */,
B660F6A21C29868000687D6E /* util */,
@ -2527,7 +2534,6 @@
451F8A3C1FD71392005CB9DA /* UIUtil.h in Headers */,
346129D61FD20ADC00532771 /* UIViewController+OWS.h in Headers */,
3421981421061A0700C57195 /* JSQMessagesAvatarImage.h in Headers */,
3461296F1FD1D74C00532771 /* Release.h in Headers */,
34612A061FD7238600532771 /* OWSContactsSyncing.h in Headers */,
34480B571FD0A7A400BC14EF /* OWSScrubbingLogFormatter.h in Headers */,
346129FC1FD5F31400532771 /* OWS101ExistingUsersBlockOnIdentityChange.h in Headers */,
@ -3181,7 +3187,6 @@
34AC09DF211B39B100997B47 /* OWSNavigationController.m in Sources */,
34074F61203D0CBE004596AE /* OWSSounds.m in Sources */,
346129B51FD1F7E800532771 /* OWSProfileManager.m in Sources */,
346129701FD1D74C00532771 /* Release.m in Sources */,
342950832124C9750000B063 /* OWSTextView.m in Sources */,
3421981321061A0700C57195 /* JSQMessagesAvatarImageFactory.m in Sources */,
452EC6E1205FF5DC000E787C /* Bench.swift in Sources */,
@ -3475,6 +3480,7 @@
45360B901F9527DA00FA666C /* SearcherTest.swift in Sources */,
B660F7561C29988E00687D6E /* PushManager.m in Sources */,
34DB0BED2011548B007B313F /* OWSDatabaseConverterTest.m in Sources */,
34843B2C214FE296004DED45 /* MockEnvironment.m in Sources */,
45360B911F952AA900FA666C /* MarqueeLabel.swift in Sources */,
454EBAB41F2BE14C00ACE0BB /* OWSAnalytics.swift in Sources */,
954AEE6A1DF33E01002E5410 /* ContactsPickerTest.swift in Sources */,

View File

@ -29,7 +29,6 @@
#import <SignalMessaging/OWSNavigationController.h>
#import <SignalMessaging/OWSPreferences.h>
#import <SignalMessaging/OWSProfileManager.h>
#import <SignalMessaging/Release.h>
#import <SignalMessaging/SignalMessaging.h>
#import <SignalMessaging/VersionMigrations.h>
#import <SignalServiceKit/AppReadiness.h>
@ -157,11 +156,9 @@ static NSTimeInterval launchStartedAt;
// This block will be cleared in storageIsReady.
[DeviceSleepManager.sharedInstance addBlockWithBlockObject:self];
[AppSetup setupEnvironmentWithCallMessageHandlerBlock:^{
return SignalApp.sharedApp.callMessageHandler;
}
notificationsProtocolBlock:^{
return SignalApp.sharedApp.notificationsManager;
[AppSetup
setupEnvironmentWithAppSpecificSingletonBlock:^{
[SignalApp.sharedApp createSingletons];
}
migrationCompletion:^{
OWSAssertIsOnMainThread();

View File

@ -16,7 +16,7 @@ class ConversationConfigurationSyncOperation: OWSOperation {
}
private var messageSender: MessageSender {
return Environment.shared.messageSender
return SSKEnvironment.shared.messageSender
}
private var contactsManager: OWSContactsManager {

View File

@ -59,7 +59,6 @@
#import <SignalMessaging/OWSQuotedReplyModel.h>
#import <SignalMessaging/OWSSounds.h>
#import <SignalMessaging/OWSViewController.h>
#import <SignalMessaging/Release.h>
#import <SignalMessaging/ThreadUtil.h>
#import <SignalMessaging/UIColor+OWS.h>
#import <SignalMessaging/UIFont+OWS.h>

View File

@ -12,7 +12,7 @@ public class CallNotificationsAdapter: NSObject {
let adaptee: OWSCallNotificationsAdaptee
override init() {
@objc public init(adaptee: OWSCallNotificationsAdaptee) {
// TODO We can't mix UILocalNotification (NotificationManager) with the UNNotifications
// Because registering message categories in one, clobbers the registered categories from the other
// We have to first port *all* the existing UINotification categories to UNNotifications
@ -21,7 +21,7 @@ public class CallNotificationsAdapter: NSObject {
// if #available(iOS 10.0, *) {
// adaptee = UserNotificationsAdaptee()
// } else {
adaptee = SignalApp.shared().notificationsManager
self.adaptee = adaptee
// }
super.init()

View File

@ -273,11 +273,10 @@ typedef enum : NSUInteger {
- (void)commonInit
{
_viewControllerCreatedAt = CACurrentMediaTime();
_contactsManager = Environment.shared.contactsManager;
_contactsUpdater = Environment.shared.contactsUpdater;
_messageSender = Environment.shared.messageSender;
_contactsUpdater = SSKEnvironment.shared.contactsUpdater;
_messageSender = SSKEnvironment.shared.messageSender;
_outboundCallInitiator = SignalApp.sharedApp.outboundCallInitiator;
_primaryStorage = [OWSPrimaryStorage sharedManager];
_networkManager = [TSNetworkManager sharedManager];

View File

@ -11,7 +11,7 @@ class DebugUICalling: DebugUIPage {
// MARK: Dependencies
var messageSender: MessageSender {
return Environment.shared.messageSender
return SSKEnvironment.shared.messageSender
}
// MARK: Overrides

View File

@ -242,7 +242,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSSyncGroupsRequestMessage *syncGroupsRequestMessage =
[[OWSSyncGroupsRequestMessage alloc] initWithThread:thread
groupId:[Randomness generateRandomBytes:16]];
[Environment.shared.messageSender enqueueMessage:syncGroupsRequestMessage
[SSKEnvironment.shared.messageSender enqueueMessage:syncGroupsRequestMessage
success:^{
OWSLogWarn(@"Successfully sent Request Group Info message.");
}
@ -326,7 +326,7 @@ NS_ASSUME_NONNULL_BEGIN
NSString *randomText = [self randomText];
NSString *text = [[[@(counter) description] stringByAppendingString:@" "] stringByAppendingString:randomText];
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
TSOutgoingMessage *message =
[ThreadUtil sendMessageWithText:text inThread:thread quotedReplyModel:nil messageSender:messageSender];
OWSLogError(@"sendTextMessageInThread timestamp: %llu.", message.timestamp);
@ -364,7 +364,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSAssertDebug(filePath);
OWSAssertDebug(thread);
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
NSString *filename = [filePath lastPathComponent];
NSString *utiType = [MIMETypeUtil utiTypeForFileExtension:filename.pathExtension];
DataSource *_Nullable dataSource = [DataSourcePath dataSourceWithFilePath:filePath shouldDeleteOnDeallocation:NO];
@ -1743,7 +1743,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSAssertDebug(thread);
SignalAttachment *attachment = [self signalAttachmentForFilePath:filePath];
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
[ThreadUtil sendMessageWithAttachment:attachment
inThread:thread
quotedReplyModel:nil
@ -3150,7 +3150,7 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
ActionFailureBlock failure) {
OWSContact *contact = contactBlock(transaction);
OWSLogVerbose(@"sending contact: %@", contact.debugDescription);
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
[ThreadUtil sendMessageWithContactShare:contact inThread:thread messageSender:messageSender completion:nil];
success();
@ -3342,7 +3342,7 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
+ (void)sendOversizeTextMessage:(TSThread *)thread
{
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
NSString *message = [self randomOversizeText];
DataSource *_Nullable dataSource = [DataSourceValue dataSourceWithOversizeText:message];
SignalAttachment *attachment =
@ -3374,7 +3374,7 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
+ (void)sendRandomAttachment:(TSThread *)thread uti:(NSString *)uti length:(NSUInteger)length
{
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
DataSource *_Nullable dataSource =
[DataSourceValue dataSourceWithData:[self createRandomNSDataOfSize:length] utiType:uti];
SignalAttachment *attachment =
@ -3860,7 +3860,7 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
[TSOutgoingMessage outgoingMessageInThread:thread groupMetaMessage:TSGroupMetaMessageNew expiresInSeconds:0];
[message updateWithCustomMessage:NSLocalizedString(@"GROUP_CREATED", nil)];
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
void (^completion)(void) = ^{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)1.f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[ThreadUtil sendMessageWithText:[@(counter) description]
@ -4401,7 +4401,7 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac
}
NSString *filename = filenames.lastObject;
[filenames removeLastObject];
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
NSString *utiType = (NSString *)kUTTypeData;
const NSUInteger kDataLength = 32;
DataSource *_Nullable dataSource =

View File

@ -230,7 +230,7 @@ NS_ASSUME_NONNULL_BEGIN
return;
}
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
NSString *utiType = [MIMETypeUtil utiTypeForFileExtension:fileName.pathExtension];
DataSource *_Nullable dataSource = [DataSourcePath dataSourceWithFilePath:filePath shouldDeleteOnDeallocation:YES];
[dataSource setSourceFilename:fileName];
@ -259,7 +259,7 @@ NS_ASSUME_NONNULL_BEGIN
return;
}
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
NSString *utiType = [MIMETypeUtil utiTypeForFileExtension:fileName.pathExtension];
DataSource *_Nullable dataSource = [DataSourcePath dataSourceWithFilePath:filePath shouldDeleteOnDeallocation:YES];
[dataSource setSourceFilename:fileName];

View File

@ -17,7 +17,7 @@ class DebugUINotifications: DebugUIPage {
return SignalApp.shared().callService.notificationsAdapter
}
var messageSender: MessageSender {
return Environment.shared.messageSender
return SSKEnvironment.shared.messageSender
}
var contactsManager: OWSContactsManager {
return Environment.shared.contactsManager

View File

@ -11,7 +11,7 @@ class DebugUIProfile: DebugUIPage {
// MARK: Dependencies
var messageSender: MessageSender {
return Environment.shared.messageSender
return SSKEnvironment.shared.messageSender
}
var profileManager: OWSProfileManager {
return OWSProfileManager.shared()

View File

@ -70,7 +70,7 @@ NS_ASSUME_NONNULL_BEGIN
[OWSTableItem itemWithTitle:@"Send session reset"
actionBlock:^{
[OWSSessionResetJob runWithContactThread:thread
messageSender:Environment.shared.messageSender
messageSender:SSKEnvironment.shared.messageSender
primaryStorage:[OWSPrimaryStorage sharedManager]];
}],
]];

View File

@ -471,7 +471,7 @@ NS_ASSUME_NONNULL_BEGIN
{
OWSAssertDebug(message);
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
[messageSender enqueueMessage:message
success:^{
OWSLogInfo(@"Successfully sent message.");

View File

@ -64,7 +64,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (OWSMessageSender *)messageSender
{
return Environment.shared.messageSender;
return SSKEnvironment.shared.messageSender;
}
+ (OWSContactsManager *)contactsManager

View File

@ -147,7 +147,7 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations
{
_accountManager = SignalApp.sharedApp.accountManager;
_contactsManager = Environment.shared.contactsManager;
_messageSender = Environment.shared.messageSender;
_messageSender = SSKEnvironment.shared.messageSender;
_blocklistCache = [OWSBlockListCache new];
[_blocklistCache startObservingAndSyncStateWithDelegate:self];
_threadViewModelCache = [NSCache new];

View File

@ -86,7 +86,7 @@ const NSUInteger kNewGroupViewControllerAvatarWidth = 68;
- (void)commonInit
{
_messageSender = Environment.shared.messageSender;
_messageSender = SSKEnvironment.shared.messageSender;
_contactsViewHelper = [[ContactsViewHelper alloc] initWithDelegate:self];
_avatarViewHelper = [AvatarViewHelper new];
_avatarViewHelper.delegate = self;

View File

@ -104,7 +104,7 @@ const CGFloat kIconViewLength = 24;
{
_accountManager = [TSAccountManager sharedInstance];
_contactsManager = Environment.shared.contactsManager;
_messageSender = Environment.shared.messageSender;
_messageSender = SSKEnvironment.shared.messageSender;
_blockingManager = [OWSBlockingManager sharedManager];
_contactsViewHelper = [[ContactsViewHelper alloc] initWithDelegate:self];

View File

@ -83,7 +83,7 @@ NS_ASSUME_NONNULL_BEGIN
- (void)commonInit
{
_messageSender = Environment.shared.messageSender;
_messageSender = SSKEnvironment.shared.messageSender;
_contactsViewHelper = [[ContactsViewHelper alloc] initWithDelegate:self];
_avatarViewHelper = [AvatarViewHelper new];
_avatarViewHelper.delegate = self;

View File

@ -17,6 +17,7 @@ NS_ASSUME_NONNULL_BEGIN
@class OutboundCallInitiator;
@class TSThread;
// TODO: Pull out singletons to MainAppEnvironment?
@interface SignalApp : NSObject
@property (nonatomic, nullable, weak) HomeViewController *homeViewController;
@ -35,6 +36,8 @@ NS_ASSUME_NONNULL_BEGIN
+ (instancetype)sharedApp;
- (void)createSingletons;
#pragma mark - Conversation Presentation
- (void)presentConversationForRecipientId:(NSString *)recipientId animated:(BOOL)isAnimated;

View File

@ -55,97 +55,90 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Singletons
- (void)createSingletons
{
OWSAssertDebug(SSKEnvironment.shared.messageSender);
OWSAssertDebug(Environment.shared.contactsManager);
OWSAssertDebug(Environment.shared.preferences);
OWSAssertDebug(SSKEnvironment.shared.networkManager);
OWSAssertDebug(SSKEnvironment.shared.contactsUpdater);
_accountManager = [[AccountManager alloc] initWithTextSecureAccountManager:[TSAccountManager sharedInstance]
preferences:Environment.shared.preferences];
_notificationsManager = [NotificationsManager new];
SSKEnvironment.shared.notificationsManager = self.notificationsManager;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didChangeCallLoggingPreference:)
name:OWSPreferencesCallLoggingDidChangeNotification
object:nil];
_callService = [[CallService alloc]
initWithAccountManager:self.accountManager
contactsManager:Environment.shared.contactsManager
messageSender:SSKEnvironment.shared.messageSender
notificationsAdapter:[[OWSCallNotificationsAdapter alloc] initWithAdaptee:self.notificationsManager]];
_callMessageHandler =
[[OWSWebRTCCallMessageHandler alloc] initWithAccountManager:self.accountManager
callService:self.callService
messageSender:SSKEnvironment.shared.messageSender];
SSKEnvironment.shared.callMessageHandler = self.callMessageHandler;
_outboundCallInitiator =
[[OutboundCallInitiator alloc] initWithContactsManager:Environment.shared.contactsManager
contactsUpdater:SSKEnvironment.shared.contactsUpdater];
_messageFetcherJob = [[OWSMessageFetcherJob alloc] initWithMessageReceiver:[OWSMessageReceiver sharedInstance]
networkManager:SSKEnvironment.shared.networkManager
signalService:[OWSSignalService sharedInstance]];
}
- (OWSWebRTCCallMessageHandler *)callMessageHandler
{
@synchronized(self)
{
if (!_callMessageHandler) {
_callMessageHandler =
[[OWSWebRTCCallMessageHandler alloc] initWithAccountManager:self.accountManager
callService:self.callService
messageSender:Environment.shared.messageSender];
}
}
OWSAssertDebug(_callMessageHandler);
return _callMessageHandler;
}
- (CallService *)callService
{
@synchronized(self)
{
if (!_callService) {
OWSAssertDebug(self.accountManager);
OWSAssertDebug(Environment.shared.contactsManager);
OWSAssertDebug(Environment.shared.messageSender);
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeCallLoggingPreference:) name:OWSPreferencesCallLoggingDidChangeNotification object:nil];
_callService = [[CallService alloc] initWithAccountManager:self.accountManager
contactsManager:Environment.shared.contactsManager
messageSender:Environment.shared.messageSender
notificationsAdapter:[OWSCallNotificationsAdapter new]];
}
}
OWSAssertDebug(_callService);
return _callService;
}
- (CallUIAdapter *)callUIAdapter
{
OWSAssertDebug(self.callService.callUIAdapter);
return self.callService.callUIAdapter;
}
- (OutboundCallInitiator *)outboundCallInitiator
{
@synchronized(self)
{
if (!_outboundCallInitiator) {
OWSAssertDebug(Environment.shared.contactsManager);
OWSAssertDebug(Environment.shared.contactsUpdater);
_outboundCallInitiator =
[[OutboundCallInitiator alloc] initWithContactsManager:Environment.shared.contactsManager
contactsUpdater:Environment.shared.contactsUpdater];
}
}
OWSAssertDebug(_outboundCallInitiator);
return _outboundCallInitiator;
}
- (OWSMessageFetcherJob *)messageFetcherJob
{
@synchronized(self)
{
if (!_messageFetcherJob) {
_messageFetcherJob =
[[OWSMessageFetcherJob alloc] initWithMessageReceiver:[OWSMessageReceiver sharedInstance]
networkManager:Environment.shared.networkManager
signalService:[OWSSignalService sharedInstance]];
}
}
OWSAssertDebug(_messageFetcherJob);
return _messageFetcherJob;
}
- (NotificationsManager *)notificationsManager
{
@synchronized(self)
{
if (!_notificationsManager) {
_notificationsManager = [NotificationsManager new];
}
}
OWSAssertDebug(_notificationsManager);
return _notificationsManager;
}
- (AccountManager *)accountManager
{
@synchronized(self)
{
if (!_accountManager) {
_accountManager = [[AccountManager alloc] initWithTextSecureAccountManager:[TSAccountManager sharedInstance]
preferences:Environment.shared.preferences];
}
}
OWSAssertDebug(_accountManager);
return _accountManager;
}

View File

@ -56,7 +56,7 @@ NSString *const Signal_Message_MarkAsRead_Identifier = @"Signal_Message_MarkAsRe
{
return [self initWithMessageFetcherJob:SignalApp.sharedApp.messageFetcherJob
primaryStorage:[OWSPrimaryStorage sharedManager]
messageSender:Environment.shared.messageSender
messageSender:SSKEnvironment.shared.messageSender
notificationsManager:SignalApp.sharedApp.notificationsManager];
}

View File

@ -226,7 +226,7 @@ NS_ASSUME_NONNULL_BEGIN
[MultiDeviceProfileKeyUpdateJob runWithProfileKey:profileKey
identityManager:OWSIdentityManager.sharedManager
messageSender:Environment.shared.messageSender
messageSender:SSKEnvironment.shared.messageSender
profileManager:OWSProfileManager.sharedManager];
}

View File

@ -520,7 +520,7 @@ typedef void (^DebugLogUploadFailure)(DebugLogUploader *uploader, NSError *error
return;
}
NSString *recipientId = [TSAccountManager localNumber];
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
DispatchMainThreadSafe(^{
__block TSThread *thread = nil;
@ -549,7 +549,7 @@ typedef void (^DebugLogUploadFailure)(DebugLogUploader *uploader, NSError *error
}];
DispatchMainThreadSafe(^{
if (thread) {
OWSMessageSender *messageSender = Environment.shared.messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
[ThreadUtil sendMessageWithText:url.absoluteString
inThread:thread
quotedReplyModel:nil

View File

@ -103,9 +103,6 @@ class AccountManagerTest: SignalBaseTest {
}
func testSuccessfulRegistration() {
Environment.clearSharedForTests()
Environment.shared = Release.releaseEnvironment()
let tsAccountManager = TokenObtainingTSAccountManager(networkManager: TSNetworkManager.shared(), primaryStorage: OWSPrimaryStorage.shared())
let accountManager = AccountManager(textSecureAccountManager: tsAccountManager, preferences: self.preferences)

View File

@ -2,6 +2,8 @@
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "MockEnvironment.h"
#import <SignalServiceKit/MockSSKEnvironment.h>
#import <XCTest/XCTest.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -18,15 +18,24 @@ NS_ASSUME_NONNULL_BEGIN
[super setUp];
ClearCurrentAppContextForTests();
[Environment clearSharedForTests];
[SSKEnvironment clearSharedForTests];
SetCurrentAppContext([TestAppContext new]);
[MockEnvironment activate];
[MockSSKEnvironment activate];
}
- (void)tearDown
{
NSLog(@"%@ tearDown", self.logTag);
[SSKEnvironment.shared.primaryStorage closeStorageForTests];
ClearCurrentAppContextForTests();
[Environment clearSharedForTests];
[SSKEnvironment clearSharedForTests];
[super tearDown];
}

View File

@ -1,9 +1,7 @@
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import <SignalMessaging/Release.h>
#define testPhoneNumber1 [PhoneNumber phoneNumberFromE164:@"+19027777777"]
#define testPhoneNumber2 [PhoneNumber phoneNumberFromE164:@"+19028888888"]

View File

@ -0,0 +1,17 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "Environment.h"
NS_ASSUME_NONNULL_BEGIN
@interface MockEnvironment : Environment
+ (MockEnvironment *)activate;
- (instancetype)init;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,30 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "MockEnvironment.h"
#import <SignalMessaging/OWSPreferences.h>
NS_ASSUME_NONNULL_BEGIN
@implementation MockEnvironment
+ (MockEnvironment *)activate
{
MockEnvironment *instance = [MockEnvironment new];
[self setShared:instance];
return instance;
}
- (instancetype)init
{
// TODO: We should probably mock this out.
OWSPreferences *preferences = [OWSPreferences new];
self = [super initWithPreferences:preferences];
OWSAssertDebug(self);
return self;
}
@end
NS_ASSUME_NONNULL_END

View File

@ -45,7 +45,6 @@ FOUNDATION_EXPORT const unsigned char SignalMessagingVersionString[];
#import <SignalMessaging/OWSUnreadIndicator.h>
#import <SignalMessaging/OWSUserProfile.h>
#import <SignalMessaging/OWSWindowManager.h>
#import <SignalMessaging/Release.h>
#import <SignalMessaging/ScreenLockViewController.h>
#import <SignalMessaging/SelectRecipientViewController.h>
#import <SignalMessaging/SharingThreadPickerViewController.h>

View File

@ -58,7 +58,7 @@ typedef void (^SendMessageBlock)(SendCompletionBlock completion);
[super loadView];
_contactsManager = Environment.shared.contactsManager;
_messageSender = Environment.shared.messageSender;
_messageSender = SSKEnvironment.shared.messageSender;
_progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
self.title = NSLocalizedString(@"SHARE_EXTENSION_VIEW_TITLE", @"Title for the 'share extension' view.");

View File

@ -10,6 +10,7 @@ NS_ASSUME_NONNULL_BEGIN
extern NSString *const OWSContactsManagerSignalAccountsDidChangeNotification;
@class ImageCache;
@class OWSPrimaryStorage;
@class SignalAccount;
@class UIFont;
@ -20,6 +21,10 @@ extern NSString *const OWSContactsManagerSignalAccountsDidChangeNotification;
#pragma mark - Setup
- (instancetype)init NS_UNAVAILABLE;
- (id)initWithPrimaryStorage:(OWSPrimaryStorage *)primaryStorage;
- (void)startObserving;
#pragma mark - Accessors

View File

@ -54,7 +54,7 @@ NSString *const OWSContactsManagerKeyNextFullIntersectionDate = @"OWSContactsMan
@implementation OWSContactsManager
- (id)init
- (id)initWithPrimaryStorage:(OWSPrimaryStorage *)primaryStorage
{
self = [super init];
if (!self) {
@ -64,8 +64,8 @@ NSString *const OWSContactsManagerKeyNextFullIntersectionDate = @"OWSContactsMan
// TODO: We need to configure the limits of this cache.
_avatarCache = [ImageCache new];
_dbReadConnection = [OWSPrimaryStorage sharedManager].newDatabaseConnection;
_dbWriteConnection = [OWSPrimaryStorage sharedManager].newDatabaseConnection;
_dbReadConnection = primaryStorage.newDatabaseConnection;
_dbWriteConnection = primaryStorage.newDatabaseConnection;
_allContacts = @[];
_allContactsMap = @{};

View File

@ -49,7 +49,7 @@ NSString *const kOWSPrimaryStorageOWSContactsSyncingLastMessageKey
{
return [self initWithContactsManager:Environment.shared.contactsManager
identityManager:OWSIdentityManager.sharedManager
messageSender:Environment.shared.messageSender
messageSender:SSKEnvironment.shared.messageSender
profileManager:OWSProfileManager.sharedManager];
}

View File

@ -4,18 +4,11 @@
NS_ASSUME_NONNULL_BEGIN
@protocol OWSCallMessageHandler;
@protocol NotificationsProtocol;
typedef id<OWSCallMessageHandler> _Nonnull (^CallMessageHandlerBlock)(void);
typedef id<NotificationsProtocol> _Nonnull (^NotificationsManagerBlock)(void);
// This is _NOT_ a singleton and will be instantiated each time that the SAE is used.
@interface AppSetup : NSObject
+ (void)setupEnvironmentWithCallMessageHandlerBlock:(CallMessageHandlerBlock)callMessageHandlerBlock
notificationsProtocolBlock:(NotificationsManagerBlock)notificationsManagerBlock
migrationCompletion:(dispatch_block_t)migrationCompletion;
+ (void)setupEnvironmentWithAppSpecificSingletonBlock:(dispatch_block_t)appSpecificSingletonBlock
migrationCompletion:(dispatch_block_t)migrationCompletion;
@end

View File

@ -4,7 +4,6 @@
#import "AppSetup.h"
#import "Environment.h"
#import "Release.h"
#import "VersionMigrations.h"
#import <AxolotlKit/SessionCipher.h>
#import <SignalMessaging/OWSDatabaseMigration.h>
@ -18,12 +17,10 @@ NS_ASSUME_NONNULL_BEGIN
@implementation AppSetup
+ (void)setupEnvironmentWithCallMessageHandlerBlock:(CallMessageHandlerBlock)callMessageHandlerBlock
notificationsProtocolBlock:(NotificationsManagerBlock)notificationsManagerBlock
migrationCompletion:(dispatch_block_t)migrationCompletion
+ (void)setupEnvironmentWithAppSpecificSingletonBlock:(dispatch_block_t)appSpecificSingletonBlock
migrationCompletion:(dispatch_block_t)migrationCompletion
{
OWSAssertDebug(callMessageHandlerBlock);
OWSAssertDebug(notificationsManagerBlock);
OWSAssertDebug(appSpecificSingletonBlock);
OWSAssertDebug(migrationCompletion);
__block OWSBackgroundTask *_Nullable backgroundTask =
@ -32,19 +29,39 @@ NS_ASSUME_NONNULL_BEGIN
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// Order matters here.
//
// All of these "singletons" should have any dependencies used in their
// initializers injected.
[[OWSBackgroundTaskManager sharedManager] observeNotifications];
[Environment setShared:[Release releaseEnvironment]];
OWSPrimaryStorage *primaryStorage = [[OWSPrimaryStorage alloc] initStorage];
[OWSPrimaryStorage protectFiles];
id<OWSCallMessageHandler> callMessageHandler = callMessageHandlerBlock();
id<NotificationsProtocol> notificationsManager = notificationsManagerBlock();
OWSPreferences *preferences = [OWSPreferences new];
SSKEnvironment *shared = [[SSKEnvironment alloc] initWithCallMessageHandler:callMessageHandler
contactsManager:Environment.shared.contactsManager
messageSender:Environment.shared.messageSender
notificationsManager:notificationsManager
profileManager:OWSProfileManager.sharedManager];
[SSKEnvironment setShared:shared];
TSNetworkManager *networkManager = [[TSNetworkManager alloc] initDefault];
OWSContactsManager *contactsManager = [[OWSContactsManager alloc] initWithPrimaryStorage:primaryStorage];
ContactsUpdater *contactsUpdater = [ContactsUpdater new];
OWSMessageSender *messageSender = [[OWSMessageSender alloc] initWithNetworkManager:networkManager
primaryStorage:primaryStorage
contactsManager:contactsManager];
OWSProfileManager *profileManager = [[OWSProfileManager alloc] initWithPrimaryStorage:primaryStorage
messageSender:messageSender
networkManager:networkManager];
[Environment setShared:[[Environment alloc] initWithPreferences:preferences]];
[SSKEnvironment setShared:[[SSKEnvironment alloc] initWithContactsManager:contactsManager
messageSender:messageSender
profileManager:profileManager
primaryStorage:primaryStorage
contactsUpdater:contactsUpdater
networkManager:networkManager]];
appSpecificSingletonBlock();
OWSAssertDebug(SSKEnvironment.shared.isComplete);
// Register renamed classes.
[NSKeyedUnarchiver setClass:[OWSUserProfile class] forClassName:[OWSUserProfile collection]];

View File

@ -2,7 +2,10 @@
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import <SignalServiceKit/TSStorageHeaders.h>
#import <SignalServiceKit/SSKEnvironment.h>
@class OWSContactsManager;
@class OWSPreferences;
/**
*
@ -11,32 +14,21 @@
* It also handles network configuration for testing/deployment server configurations.
*
**/
@class ContactsUpdater;
@class OWSContactsManager;
@class OWSMessageSender;
@class OWSNavigationController;
@class OWSPreferences;
@class TSGroupThread;
@class TSNetworkManager;
@class TSThread;
// TODO: Rename to AppEnvironment?
@interface Environment : NSObject
- (instancetype)initWithContactsManager:(OWSContactsManager *)contactsManager
contactsUpdater:(ContactsUpdater *)contactsUpdater
networkManager:(TSNetworkManager *)networkManager
messageSender:(OWSMessageSender *)messageSender;
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithPreferences:(OWSPreferences *)preferences;
@property (nonatomic, readonly) OWSContactsManager *contactsManager;
@property (nonatomic, readonly) ContactsUpdater *contactsUpdater;
@property (nonatomic, readonly) TSNetworkManager *networkManager;
@property (nonatomic, readonly) OWSMessageSender *messageSender;
@property (nonatomic, readonly) OWSPreferences *preferences;
@property (class, nonatomic) Environment *shared;
#ifdef DEBUG
// Should only be called by tests.
+ (void)clearSharedForTests;
#endif
@end

View File

@ -3,31 +3,12 @@
//
#import "Environment.h"
#import "DebugLogger.h"
#import "OWSPreferences.h"
#import "SignalKeyingStorage.h"
#import <SignalServiceKit/AppContext.h>
#import <SignalServiceKit/ContactsUpdater.h>
#import <SignalServiceKit/OWSMessageReceiver.h>
#import <SignalServiceKit/OWSSignalService.h>
#import <SignalServiceKit/TSContactThread.h>
#import <SignalServiceKit/TSGroupThread.h>
#import <SignalServiceKit/Threading.h>
#import <SignalServiceKit/SSKEnvironment.h>
static Environment *sharedEnvironment = nil;
@interface Environment ()
@property (nonatomic) OWSContactsManager *contactsManager;
@property (nonatomic) ContactsUpdater *contactsUpdater;
@property (nonatomic) TSNetworkManager *networkManager;
@property (nonatomic) OWSMessageSender *messageSender;
@property (nonatomic) OWSPreferences *preferences;
@end
#pragma mark -
@implementation Environment
+ (Environment *)shared
@ -54,20 +35,16 @@ static Environment *sharedEnvironment = nil;
sharedEnvironment = nil;
}
- (instancetype)initWithContactsManager:(OWSContactsManager *)contactsManager
contactsUpdater:(ContactsUpdater *)contactsUpdater
networkManager:(TSNetworkManager *)networkManager
messageSender:(OWSMessageSender *)messageSender
- (instancetype)initWithPreferences:(OWSPreferences *)preferences
{
self = [super init];
if (!self) {
return self;
}
_contactsManager = contactsManager;
_contactsUpdater = contactsUpdater;
_networkManager = networkManager;
_messageSender = messageSender;
OWSAssertDebug(preferences);
_preferences = preferences;
OWSSingletonAssert();
@ -76,43 +53,7 @@ static Environment *sharedEnvironment = nil;
- (OWSContactsManager *)contactsManager
{
OWSAssertDebug(_contactsManager);
return _contactsManager;
}
- (ContactsUpdater *)contactsUpdater
{
OWSAssertDebug(_contactsUpdater);
return _contactsUpdater;
}
- (TSNetworkManager *)networkManager
{
OWSAssertDebug(_networkManager);
return _networkManager;
}
- (OWSMessageSender *)messageSender
{
OWSAssertDebug(_messageSender);
return _messageSender;
}
// TODO: Convert to singleton?
- (OWSPreferences *)preferences
{
@synchronized(self)
{
if (!_preferences) {
_preferences = [OWSPreferences new];
}
}
return _preferences;
return (OWSContactsManager *)SSKEnvironment.shared.contactsManager;
}
@end

View File

@ -1,12 +0,0 @@
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
@class Environment;
@interface Release : NSObject
/// Connects to actual production infrastructure
+ (Environment *)releaseEnvironment;
@end

View File

@ -1,37 +0,0 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "Release.h"
#import "Environment.h"
#import "NotificationsManager.h"
#import "OWSContactsManager.h"
#import <SignalServiceKit/ContactsUpdater.h>
#import <SignalServiceKit/OWSMessageSender.h>
#import <SignalServiceKit/TSNetworkManager.h>
@implementation Release
+ (Environment *)releaseEnvironment
{
static Environment *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// Order matters here.
OWSPrimaryStorage *primaryStorage = [OWSPrimaryStorage sharedManager];
TSNetworkManager *networkManager = [TSNetworkManager sharedManager];
OWSContactsManager *contactsManager = [OWSContactsManager new];
ContactsUpdater *contactsUpdater = [ContactsUpdater sharedUpdater];
OWSMessageSender *messageSender = [[OWSMessageSender alloc] initWithNetworkManager:networkManager
primaryStorage:primaryStorage
contactsManager:contactsManager];
instance = [[Environment alloc] initWithContactsManager:contactsManager
contactsUpdater:contactsUpdater
networkManager:networkManager
messageSender:messageSender];
});
return instance;
}
@end

View File

@ -10,6 +10,7 @@
#import <SignalServiceKit/AppContext.h>
#import <SignalServiceKit/AppVersion.h>
#import <SignalServiceKit/NSUserDefaults+OWS.h>
#import <SignalServiceKit/OWSPrimaryStorage.h>
#import <SignalServiceKit/OWSRequestFactory.h>
#import <SignalServiceKit/TSAccountManager.h>
#import <SignalServiceKit/TSNetworkManager.h>

View File

@ -88,9 +88,7 @@ public class OWS106EnsureProfileComplete: OWSDatabaseMigration {
let (promise, fulfill, reject) = Promise<Void>.pending()
guard let networkManager = Environment.shared.networkManager else {
return Promise(error: OWSErrorMakeAssertionError("network manager was unexpectedly not set"))
}
let networkManager = SSKEnvironment.shared.networkManager
ProfileFetcherJob(networkManager: networkManager).getProfile(recipientId: localRecipientId).then { _ -> Void in
Logger.info("verified recipient profile is in good shape: \(localRecipientId)")

View File

@ -13,6 +13,8 @@ extern const NSUInteger kOWSProfileManager_MaxAvatarDiameter;
@class OWSAES256Key;
@class OWSMessageSender;
@class OWSPrimaryStorage;
@class TSNetworkManager;
@class TSThread;
// This class can be safely accessed and used from any thread.
@ -20,6 +22,10 @@ extern const NSUInteger kOWSProfileManager_MaxAvatarDiameter;
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithPrimaryStorage:(OWSPrimaryStorage *)primaryStorage
messageSender:(OWSMessageSender *)messageSender
networkManager:(TSNetworkManager *)networkManager;
+ (instancetype)sharedManager;
#pragma mark - Local Profile

View File

@ -68,21 +68,7 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
+ (instancetype)sharedManager
{
static OWSProfileManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] initDefault];
});
return sharedMyManager;
}
- (instancetype)initDefault
{
OWSPrimaryStorage *primaryStorage = [OWSPrimaryStorage sharedManager];
OWSMessageSender *messageSender = Environment.shared.messageSender;
TSNetworkManager *networkManager = Environment.shared.networkManager;
return [self initWithPrimaryStorage:primaryStorage messageSender:messageSender networkManager:networkManager];
return SSKEnvironment.shared.profileManager;
}
- (instancetype)initWithPrimaryStorage:(OWSPrimaryStorage *)primaryStorage

View File

@ -8,6 +8,7 @@
#import "OWSPrimaryStorage.h"
#import "OWSRequestFactory.h"
#import "PhoneNumber.h"
#import "SSKEnvironment.h"
#import "TSNetworkManager.h"
#import "Threading.h"
#import <SignalServiceKit/SignalServiceKit-Swift.h>
@ -21,17 +22,15 @@ NS_ASSUME_NONNULL_BEGIN
@end
#pragma mark -
@implementation ContactsUpdater
+ (instancetype)sharedUpdater {
static dispatch_once_t onceToken;
static id sharedInstance = nil;
dispatch_once(&onceToken, ^{
sharedInstance = [self new];
});
return sharedInstance;
}
OWSAssertDebug(SSKEnvironment.shared.contactsUpdater);
return SSKEnvironment.shared.contactsUpdater;
}
- (instancetype)init
{

View File

@ -20,7 +20,7 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)selfRecipient;
+ (instancetype)selfRecipientWithTransaction:(YapDatabaseReadWriteTransaction *)transaction;
+ (nullable instancetype)registeredRecipientForRecipientId:(NSString *)recipientId
transaction:(YapDatabaseReadTransaction *)transaction;

View File

@ -86,25 +86,13 @@ NS_ASSUME_NONNULL_BEGIN
return [self fetchObjectWithUniqueID:recipientId transaction:transaction];
}
+ (nullable instancetype)recipientForRecipientId:(NSString *)recipientId
{
OWSAssertDebug(recipientId.length > 0);
__block SignalRecipient *recipient;
[self.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
recipient = [self registeredRecipientForRecipientId:recipientId transaction:transaction];
}];
return recipient;
}
// TODO This method should probably live on the TSAccountManager rather than grabbing a global singleton.
+ (instancetype)selfRecipient
+ (instancetype)selfRecipientWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{
SignalRecipient *myself = [self recipientForRecipientId:[TSAccountManager localNumber]];
if (!myself) {
myself = [[self alloc] initWithTextSecureIdentifier:[TSAccountManager localNumber]];
}
return myself;
OWSAssertDebug(transaction);
NSString *recipientId = [TSAccountManager localNumber];
return [self markRecipientAsRegisteredAndGet:recipientId transaction:transaction];
}
- (void)addDevices:(NSSet *)devices

View File

@ -80,7 +80,7 @@ NS_ASSUME_NONNULL_BEGIN
// TODO deprecate this? seems weird to access the displayName in the DB model
- (NSString *)name
{
return [[SSKEnvironment shared].contactsManager displayNameForPhoneIdentifier:self.contactIdentifier];
return [SSKEnvironment.shared.contactsManager displayNameForPhoneIdentifier:self.contactIdentifier];
}

View File

@ -36,7 +36,7 @@ NS_ASSUME_NONNULL_BEGIN
networkManager:TSNetworkManager.sharedManager
primaryStorage:OWSPrimaryStorage.sharedManager
readReceiptManager:OWSReadReceiptManager.sharedManager
contactsManager:[SSKEnvironment shared].contactsManager];
contactsManager:SSKEnvironment.shared.contactsManager];
}
- (instancetype)initWithIncomingSentMessageTranscript:(OWSIncomingSentMessageTranscript *)incomingSentMessageTranscript

View File

@ -125,7 +125,7 @@ NSUInteger TSErrorMessageSchemaVersion = 1;
@"Shown when signal users safety numbers changed, embeds the user's {{name or phone number}}");
NSString *recipientDisplayName =
[[SSKEnvironment shared].contactsManager displayNameForPhoneIdentifier:self.recipientId];
[SSKEnvironment.shared.contactsManager displayNameForPhoneIdentifier:self.recipientId];
return [NSString stringWithFormat:messageFormat, recipientDisplayName];
} else {
// recipientId will be nil for legacy errors

View File

@ -120,7 +120,7 @@ NSUInteger TSInfoMessageSchemaVersion = 1;
return NSLocalizedString(@"UNSUPPORTED_ATTACHMENT", nil);
case TSInfoMessageUserNotRegistered:
if (self.unregisteredRecipientId.length > 0) {
id<ContactsManagerProtocol> contactsManager = [SSKEnvironment shared].contactsManager;
id<ContactsManagerProtocol> contactsManager = SSKEnvironment.shared.contactsManager;
NSString *recipientName = [contactsManager displayNameForPhoneIdentifier:self.unregisteredRecipientId];
return [NSString stringWithFormat:NSLocalizedString(@"ERROR_UNREGISTERED_USER_FORMAT",
@"Format string for 'unregistered user' error. Embeds {{the "

View File

@ -390,8 +390,8 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo
YapDatabaseReadWriteTransaction *transaction) {
// TODO: Add analytics.
TSErrorMessage *errorMessage = [TSErrorMessage corruptedMessageInUnknownThread];
[[SSKEnvironment shared].notificationsManager notifyUserForThreadlessErrorMessage:errorMessage
transaction:transaction];
[SSKEnvironment.shared.notificationsManager notifyUserForThreadlessErrorMessage:errorMessage
transaction:transaction];
};
@try {

View File

@ -58,7 +58,7 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan
- (instancetype)initDefault
{
OWSPrimaryStorage *primaryStorage = [OWSPrimaryStorage sharedManager];
OWSMessageSender *messageSender = [SSKEnvironment shared].messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
return [self initWithPrimaryStorage:primaryStorage messageSender:messageSender];
}

View File

@ -79,7 +79,7 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa
- (instancetype)initDefault
{
OWSPrimaryStorage *primaryStorage = [OWSPrimaryStorage sharedManager];
OWSMessageSender *messageSender = [SSKEnvironment shared].messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
return [self initWithPrimaryStorage:primaryStorage messageSender:messageSender];
}
@ -540,9 +540,9 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa
[message saveWithTransaction:transaction];
}
[[SSKEnvironment shared].notificationsManager notifyUserForErrorMessage:errorMessage
thread:contactThread
transaction:transaction];
[SSKEnvironment.shared.notificationsManager notifyUserForErrorMessage:errorMessage
thread:contactThread
transaction:transaction];
}
- (void)enqueueSyncMessageForVerificationStateForRecipientId:(NSString *)recipientId

View File

@ -184,8 +184,8 @@ NS_ASSUME_NONNULL_BEGIN
[[OWSPrimaryStorage.sharedManager newDatabaseConnection]
readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
TSErrorMessage *errorMessage = [TSErrorMessage corruptedMessageInUnknownThread];
[[SSKEnvironment shared].notificationsManager notifyUserForThreadlessErrorMessage:errorMessage
transaction:transaction];
[SSKEnvironment.shared.notificationsManager notifyUserForThreadlessErrorMessage:errorMessage
transaction:transaction];
}];
}
@ -328,9 +328,9 @@ NS_ASSUME_NONNULL_BEGIN
transaction:(YapDatabaseReadWriteTransaction *)transaction
{
TSThread *contactThread = [TSContactThread getOrCreateThreadWithContactId:envelope.source transaction:transaction];
[[SSKEnvironment shared].notificationsManager notifyUserForErrorMessage:errorMessage
thread:contactThread
transaction:transaction];
[SSKEnvironment.shared.notificationsManager notifyUserForErrorMessage:errorMessage
thread:contactThread
transaction:transaction];
}
@end

View File

@ -84,10 +84,10 @@ NS_ASSUME_NONNULL_BEGIN
{
TSNetworkManager *networkManager = [TSNetworkManager sharedManager];
OWSPrimaryStorage *primaryStorage = [OWSPrimaryStorage sharedManager];
id<ContactsManagerProtocol> contactsManager = [SSKEnvironment shared].contactsManager;
id<OWSCallMessageHandler> callMessageHandler = [SSKEnvironment shared].callMessageHandler;
id<ContactsManagerProtocol> contactsManager = SSKEnvironment.shared.contactsManager;
id<OWSCallMessageHandler> callMessageHandler = SSKEnvironment.shared.callMessageHandler;
OWSIdentityManager *identityManager = [OWSIdentityManager sharedManager];
OWSMessageSender *messageSender = [SSKEnvironment shared].messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
return [self initWithNetworkManager:networkManager
@ -524,7 +524,7 @@ NS_ASSUME_NONNULL_BEGIN
- (id<ProfileManagerProtocol>)profileManager
{
return [SSKEnvironment shared].profileManager;
return SSKEnvironment.shared.profileManager;
}
- (void)handleIncomingEnvelope:(SSKProtoEnvelope *)envelope
@ -960,7 +960,7 @@ NS_ASSUME_NONNULL_BEGIN
return;
}
id<ProfileManagerProtocol> profileManager = [SSKEnvironment shared].profileManager;
id<ProfileManagerProtocol> profileManager = SSKEnvironment.shared.profileManager;
[profileManager setProfileKeyData:profileKey forRecipientId:recipientId];
}
@ -1368,10 +1368,10 @@ NS_ASSUME_NONNULL_BEGIN
// Update thread preview in inbox
[thread touchWithTransaction:transaction];
[[SSKEnvironment shared].notificationsManager notifyUserForIncomingMessage:incomingMessage
inThread:thread
contactsManager:self.contactsManager
transaction:transaction];
[SSKEnvironment.shared.notificationsManager notifyUserForIncomingMessage:incomingMessage
inThread:thread
contactsManager:self.contactsManager
transaction:transaction];
}
#pragma mark - helpers

View File

@ -335,8 +335,8 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin
[[OWSPrimaryStorage.sharedManager newDatabaseConnection]
readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
TSErrorMessage *errorMessage = [TSErrorMessage corruptedMessageInUnknownThread];
[[SSKEnvironment shared].notificationsManager notifyUserForThreadlessErrorMessage:errorMessage
transaction:transaction];
[SSKEnvironment.shared.notificationsManager notifyUserForThreadlessErrorMessage:errorMessage
transaction:transaction];
}];
dispatch_async(self.serialQueue, ^{

View File

@ -10,7 +10,6 @@ extern const NSUInteger kOversizeTextMessageSizeThreshold;
@class OWSBlockingManager;
@class OWSPrimaryStorage;
@class OWSUploadingService;
@class TSInvalidIdentityKeySendingErrorMessage;
@class TSNetworkManager;
@class TSOutgoingMessage;
@ -34,13 +33,7 @@ typedef void (^RetryableFailureHandler)(NSError *_Nonnull error);
#pragma mark -
NS_SWIFT_NAME(MessageSender)
@interface OWSMessageSender : NSObject {
@protected
// For subclassing in tests
OWSUploadingService *_uploadingService;
}
@interface OWSMessageSender : NSObject
- (instancetype)init NS_UNAVAILABLE;

View File

@ -1200,8 +1200,13 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
OWSOutgoingSentMessageTranscript *sentMessageTranscript =
[[OWSOutgoingSentMessageTranscript alloc] initWithOutgoingMessage:message];
__block SignalRecipient *recipient;
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
recipient = [SignalRecipient selfRecipientWithTransaction:transaction];
}];
[self sendMessageToService:sentMessageTranscript
recipient:[SignalRecipient selfRecipient]
recipient:recipient
thread:message.thread
attempts:OWSMessageSenderRetryAttempts
useWebsocketIfAvailable:YES

View File

@ -57,7 +57,7 @@ NS_ASSUME_NONNULL_BEGIN
if (recipientId.length > 0) {
// Once we've shared our profile key with a user (perhaps due to being
// a member of a whitelisted group), make sure they're whitelisted.
id<ProfileManagerProtocol> profileManager = [SSKEnvironment shared].profileManager;
id<ProfileManagerProtocol> profileManager = SSKEnvironment.shared.profileManager;
[profileManager addUserToProfileWhitelist:recipientId];
}

View File

@ -156,7 +156,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE
- (instancetype)initDefault
{
OWSMessageSender *messageSender = [SSKEnvironment shared].messageSender;
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
OWSPrimaryStorage *primaryStorage = [OWSPrimaryStorage sharedManager];
return [self initWithMessageSender:messageSender primaryStorage:primaryStorage];

View File

@ -27,15 +27,27 @@ static const CGFloat kAttachmentUploadProgressTheta = 0.001f;
@interface OWSUploadOperation ()
@property (readonly, nonatomic) TSNetworkManager *networkManager;
@property (readonly, nonatomic) NSString *attachmentId;
@property (readonly, nonatomic) YapDatabaseConnection *dbConnection;
@end
#pragma mark -
@implementation OWSUploadOperation
- (instancetype)initWithAttachmentId:(NSString *)attachmentId
dbConnection:(YapDatabaseConnection *)dbConnection
{
return [self initWithAttachmentId:attachmentId
dbConnection:dbConnection
networkManager:[TSNetworkManager sharedManager]];
}
- (instancetype)initWithAttachmentId:(NSString *)attachmentId
dbConnection:(YapDatabaseConnection *)dbConnection
networkManager:(TSNetworkManager *)networkManager
{
self = [super init];
if (!self) {
@ -43,17 +55,14 @@ static const CGFloat kAttachmentUploadProgressTheta = 0.001f;
}
self.remainingRetries = 4;
_attachmentId = attachmentId;
_dbConnection = dbConnection;
_networkManager = networkManager;
return self;
}
- (TSNetworkManager *)networkManager
{
return [TSNetworkManager sharedManager];
}
- (void)run
{
__block TSAttachmentStream *attachmentStream;

View File

@ -19,6 +19,8 @@ typedef void (^TSNetworkManagerFailure)(NSURLSessionDataTask *task, NSError *err
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initDefault;
+ (instancetype)sharedManager;
- (void)makeRequest:(TSRequest *)request

View File

@ -7,6 +7,7 @@
#import "NSError+messageSending.h"
#import "NSURLSessionDataTask+StatusCode.h"
#import "OWSSignalService.h"
#import "SSKEnvironment.h"
#import "TSAccountManager.h"
#import "TSVerifyCodeRequest.h"
#import <AFNetworking/AFNetworking.h>
@ -31,14 +32,10 @@ typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error);
+ (instancetype)sharedManager
{
static TSNetworkManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] initDefault];
});
return sharedMyManager;
}
OWSAssertDebug(SSKEnvironment.shared.networkManager);
return SSKEnvironment.shared.networkManager;
}
- (instancetype)initDefault
{

View File

@ -749,8 +749,8 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_
[[OWSPrimaryStorage.sharedManager newDatabaseConnection] readWriteWithBlock:^(
YapDatabaseReadWriteTransaction *transaction) {
TSErrorMessage *errorMessage = [TSErrorMessage corruptedMessageInUnknownThread];
[[SSKEnvironment shared].notificationsManager notifyUserForThreadlessErrorMessage:errorMessage
transaction:transaction];
[SSKEnvironment.shared.notificationsManager notifyUserForThreadlessErrorMessage:errorMessage
transaction:transaction];
}];
}
@ -986,6 +986,13 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_
{
OWSAssertIsOnMainThread();
#ifdef DEBUG
if (CurrentAppContext().isRunningTests) {
OWSLogWarn(@"Suppressing socket in tests.");
return;
}
#endif
if (!AppReadiness.isAppReady) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{

View File

@ -17,7 +17,7 @@ NS_ASSUME_NONNULL_BEGIN
{
OWSAssertDebug(thread);
id<ProfileManagerProtocol> profileManager = [SSKEnvironment shared].profileManager;
id<ProfileManagerProtocol> profileManager = SSKEnvironment.shared.profileManager;
// For 1:1 threads, we want to include the profile key IFF the
// contact is in the whitelist.
@ -35,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (OWSAES256Key *)localProfileKey
{
id<ProfileManagerProtocol> profileManager = [SSKEnvironment shared].profileManager;
id<ProfileManagerProtocol> profileManager = SSKEnvironment.shared.profileManager;
return profileManager.localProfileKey;
}
@ -52,7 +52,7 @@ NS_ASSUME_NONNULL_BEGIN
if (recipientId.length > 0) {
// Once we've shared our profile key with a user (perhaps due to being
// a member of a whitelisted group), make sure they're whitelisted.
id<ProfileManagerProtocol> profileManager = [SSKEnvironment shared].profileManager;
id<ProfileManagerProtocol> profileManager = SSKEnvironment.shared.profileManager;
// FIXME PERF avoid this dispatch. It's going to happen for *each* recipient in a group message.
dispatch_async(dispatch_get_main_queue(), ^{
[profileManager addUserToProfileWhitelist:recipientId];
@ -81,7 +81,7 @@ NS_ASSUME_NONNULL_BEGIN
// Once we've shared our profile key with a user (perhaps due to being
// a member of a whitelisted group), make sure they're whitelisted.
id<ProfileManagerProtocol> profileManager = [SSKEnvironment shared].profileManager;
id<ProfileManagerProtocol> profileManager = SSKEnvironment.shared.profileManager;
// FIXME PERF avoid this dispatch. It's going to happen for *each* recipient in a group message.
dispatch_async(dispatch_get_main_queue(), ^{
[profileManager addUserToProfileWhitelist:recipientId];

View File

@ -4,31 +4,52 @@
NS_ASSUME_NONNULL_BEGIN
@protocol ContactsManagerProtocol;
@class ContactsUpdater;
@class OWSMessageSender;
@class OWSPrimaryStorage;
@class TSNetworkManager;
@class YapDatabaseConnection;
@protocol ContactsManagerProtocol;
@protocol NotificationsProtocol;
@protocol OWSCallMessageHandler;
@protocol ProfileManagerProtocol;
@interface SSKEnvironment : NSObject
- (instancetype)initWithCallMessageHandler:(id<OWSCallMessageHandler>)callMessageHandler
contactsManager:(id<ContactsManagerProtocol>)contactsManager
messageSender:(OWSMessageSender *)messageSender
notificationsManager:(id<NotificationsProtocol>)notificationsManager
profileManager:(id<ProfileManagerProtocol>)profileManager NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithContactsManager:(id<ContactsManagerProtocol>)contactsManager
messageSender:(OWSMessageSender *)messageSender
profileManager:(id<ProfileManagerProtocol>)profileManager
primaryStorage:(OWSPrimaryStorage *)primaryStorage
contactsUpdater:(ContactsUpdater *)contactsUpdater
networkManager:(TSNetworkManager *)networkManager NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
@property (class, nonatomic) SSKEnvironment *shared;
@property (nonatomic, readonly, class) SSKEnvironment *shared;
+ (void)setShared:(SSKEnvironment *)env;
#ifdef DEBUG
// Should only be called by tests.
+ (void)clearSharedForTests;
#endif
@property (nonatomic, readonly) id<OWSCallMessageHandler> callMessageHandler;
@property (nonatomic, readonly) id<ContactsManagerProtocol> contactsManager;
@property (nonatomic, readonly) OWSMessageSender *messageSender;
@property (nonatomic, readonly) id<NotificationsProtocol> notificationsManager;
@property (nonatomic, readonly) id<ProfileManagerProtocol> profileManager;
@property (nonatomic, readonly) OWSPrimaryStorage *primaryStorage;
@property (nonatomic, readonly) ContactsUpdater *contactsUpdater;
@property (nonatomic, readonly) TSNetworkManager *networkManager;
// This property is configured after Environment is created.
@property (atomic, nullable) id<OWSCallMessageHandler> callMessageHandler;
// This property is configured after Environment is created.
@property (atomic, nullable) id<NotificationsProtocol> notificationsManager;
@property (atomic, readonly) YapDatabaseConnection *objectReadWriteConnection;
- (BOOL)isComplete;
@end

View File

@ -4,47 +4,43 @@
#import "SSKEnvironment.h"
#import "AppContext.h"
#import "OWSPrimaryStorage.h"
NS_ASSUME_NONNULL_BEGIN
static SSKEnvironment *sharedSSKEnvironment;
@interface SSKEnvironment ()
@property (nonatomic) id<OWSCallMessageHandler> callMessageHandler;
@property (nonatomic) id<ContactsManagerProtocol> contactsManager;
@property (nonatomic) OWSMessageSender *messageSender;
@property (nonatomic) id<NotificationsProtocol> notificationsManager;
@property (nonatomic) id<ProfileManagerProtocol> profileManager;
@end
#pragma mark -
@implementation SSKEnvironment
- (instancetype)initWithCallMessageHandler:(id<OWSCallMessageHandler>)callMessageHandler
contactsManager:(id<ContactsManagerProtocol>)contactsManager
messageSender:(OWSMessageSender *)messageSender
notificationsManager:(id<NotificationsProtocol>)notificationsManager
profileManager:(id<ProfileManagerProtocol>)profileManager
@synthesize callMessageHandler = _callMessageHandler;
@synthesize notificationsManager = _notificationsManager;
@synthesize objectReadWriteConnection = _objectReadWriteConnection;
- (instancetype)initWithContactsManager:(id<ContactsManagerProtocol>)contactsManager
messageSender:(OWSMessageSender *)messageSender
profileManager:(id<ProfileManagerProtocol>)profileManager
primaryStorage:(OWSPrimaryStorage *)primaryStorage
contactsUpdater:(ContactsUpdater *)contactsUpdater
networkManager:(TSNetworkManager *)networkManager
{
self = [super init];
if (!self) {
return self;
}
OWSAssertDebug(callMessageHandler);
OWSAssertDebug(contactsManager);
OWSAssertDebug(messageSender);
OWSAssertDebug(notificationsManager);
OWSAssertDebug(profileManager);
OWSAssertDebug(primaryStorage);
OWSAssertDebug(contactsUpdater);
OWSAssertDebug(networkManager);
_callMessageHandler = callMessageHandler;
_contactsManager = contactsManager;
_messageSender = messageSender;
_notificationsManager = notificationsManager;
_profileManager = profileManager;
_primaryStorage = primaryStorage;
_contactsUpdater = contactsUpdater;
_networkManager = networkManager;
return self;
}
@ -64,6 +60,65 @@ static SSKEnvironment *sharedSSKEnvironment;
sharedSSKEnvironment = env;
}
+ (void)clearSharedForTests
{
sharedSSKEnvironment = nil;
}
#pragma mark - Mutable Accessors
- (nullable id<OWSCallMessageHandler>)callMessageHandler
{
@synchronized(self) {
OWSAssertDebug(_callMessageHandler);
return _callMessageHandler;
}
}
- (void)setCallMessageHandler:(nullable id<OWSCallMessageHandler>)callMessageHandler
{
@synchronized(self) {
OWSAssertDebug(callMessageHandler);
OWSAssertDebug(!_callMessageHandler);
_callMessageHandler = callMessageHandler;
}
}
- (nullable id<NotificationsProtocol>)notificationsManager
{
@synchronized(self) {
OWSAssertDebug(_notificationsManager);
return _notificationsManager;
}
}
- (void)setNotificationsManager:(nullable id<NotificationsProtocol>)notificationsManager
{
@synchronized(self) {
OWSAssertDebug(notificationsManager);
OWSAssertDebug(!_notificationsManager);
_notificationsManager = notificationsManager;
}
}
- (BOOL)isComplete
{
return (self.callMessageHandler != nil && self.notificationsManager != nil);
}
- (YapDatabaseConnection *)objectReadWriteConnection
{
@synchronized(self) {
if (!_objectReadWriteConnection) {
_objectReadWriteConnection = self.primaryStorage.newDatabaseConnection;
}
return _objectReadWriteConnection;
}
}
@end
NS_ASSUME_NONNULL_END

View File

@ -16,6 +16,8 @@ extern NSString *const OWSUIDatabaseConnectionNotificationsKey;
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initStorage;
+ (instancetype)sharedManager NS_SWIFT_NAME(shared());
@property (nonatomic, readonly) YapDatabaseConnection *uiDatabaseConnection;
@ -38,6 +40,8 @@ extern NSString *const OWSUIDatabaseConnectionNotificationsKey;
+ (NSString *)sharedDataDatabaseFilePath_SHM;
+ (NSString *)sharedDataDatabaseFilePath_WAL;
+ (void)protectFiles;
@end
NS_ASSUME_NONNULL_END

View File

@ -15,6 +15,7 @@
#import "OWSMediaGalleryFinder.h"
#import "OWSMessageReceiver.h"
#import "OWSStorage+Subclass.h"
#import "SSKEnvironment.h"
#import "TSDatabaseSecondaryIndexes.h"
#import "TSDatabaseView.h"
#import <SignalServiceKit/SignalServiceKit-Swift.h>
@ -64,16 +65,9 @@ void VerifyRegistrationsForPrimaryStorage(OWSStorage *storage)
+ (instancetype)sharedManager
{
static OWSPrimaryStorage *sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[self alloc] initStorage];
OWSAssertDebug(SSKEnvironment.shared.primaryStorage);
#if TARGET_OS_IPHONE
[OWSPrimaryStorage protectFiles];
#endif
});
return sharedManager;
return SSKEnvironment.shared.primaryStorage;
}
- (instancetype)initStorage
@ -106,6 +100,14 @@ void VerifyRegistrationsForPrimaryStorage(OWSStorage *storage)
return self;
}
- (void)dealloc
{
// Surface memory leaks by logging the deallocation of this class.
OWSLogVerbose(@"Dealloc: %@", self.class);
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)yapDatabaseModifiedExternally:(NSNotification *)notification
{
// Notify observers we're about to update the database connection

View File

@ -60,6 +60,10 @@ typedef void (^OWSStorageMigrationBlock)(void);
+ (void)registerExtensionsWithMigrationBlock:(OWSStorageMigrationBlock)migrationBlock;
#ifdef DEBUG
- (void)closeStorageForTests;
#endif
+ (void)resetAllStorage;
- (YapDatabaseConnection *)newDatabaseConnection;

View File

@ -662,6 +662,13 @@ NSString *const kNSUserDefaults_DatabaseExtensionVersionMap = @"kNSUserDefaults_
[OWSFileSystem deleteFile:[OWSPrimaryStorage sharedDataDatabaseFilePath_WAL]];
}
- (void)closeStorageForTests
{
[self resetStorage];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)resetStorage
{
self.database = nil;

View File

@ -4,6 +4,7 @@
#import "TSYapDatabaseObject.h"
#import "OWSPrimaryStorage.h"
#import "SSKEnvironment.h"
#import <YapDatabase/YapDatabaseTransaction.h>
NS_ASSUME_NONNULL_BEGIN
@ -123,13 +124,7 @@ NS_ASSUME_NONNULL_BEGIN
{
OWSJanksUI();
// Use a dedicated connection for model reads & writes.
static YapDatabaseConnection *dbReadWriteConnection = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dbReadWriteConnection = [self primaryStorage].newDatabaseConnection;
});
return dbReadWriteConnection;
return SSKEnvironment.shared.objectReadWriteConnection;
}
+ (OWSPrimaryStorage *)primaryStorage

View File

@ -0,0 +1,17 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "SSKEnvironment.h"
NS_ASSUME_NONNULL_BEGIN
@interface MockSSKEnvironment : SSKEnvironment
+ (void)activate;
- (instancetype)init;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,69 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "MockSSKEnvironment.h"
#import "OWSFakeCallMessageHandler.h"
#import "OWSFakeContactsManager.h"
#import "OWSFakeContactsUpdater.h"
#import "OWSFakeMessageSender.h"
#import "OWSFakeNetworkManager.h"
#import "OWSFakeNotificationsManager.h"
#import "OWSFakeProfileManager.h"
#import "OWSPrimaryStorage.h"
NS_ASSUME_NONNULL_BEGIN
@interface OWSPrimaryStorage (Tests)
@property (atomic) BOOL areAsyncRegistrationsComplete;
@property (atomic) BOOL areSyncRegistrationsComplete;
@end
#pragma mark -
@implementation MockSSKEnvironment
+ (void)activate
{
[self setShared:[self new]];
}
- (instancetype)init
{
OWSPrimaryStorage *primaryStorage = [MockSSKEnvironment createPrimaryStorageForTests];
id<ContactsManagerProtocol> contactsManager = [OWSFakeContactsManager new];
TSNetworkManager *networkManager = [OWSFakeNetworkManager new];
OWSMessageSender *messageSender = [OWSFakeMessageSender new];
self = [super initWithContactsManager:contactsManager
messageSender:messageSender
profileManager:[OWSFakeProfileManager new]
primaryStorage:primaryStorage
contactsUpdater:[OWSFakeContactsUpdater new]
networkManager:networkManager];
if (!self) {
return nil;
}
self.callMessageHandler = [OWSFakeCallMessageHandler new];
self.notificationsManager = [OWSFakeNotificationsManager new];
return self;
}
+ (OWSPrimaryStorage *)createPrimaryStorageForTests
{
OWSPrimaryStorage *primaryStorage = [[OWSPrimaryStorage alloc] initStorage];
[OWSPrimaryStorage protectFiles];
// TODO: Should we inject a block to do view registrations?
primaryStorage.areAsyncRegistrationsComplete = YES;
primaryStorage.areSyncRegistrationsComplete = YES;
return primaryStorage;
}
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,13 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "ContactsUpdater.h"
NS_ASSUME_NONNULL_BEGIN
@interface OWSFakeContactsUpdater : ContactsUpdater
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,21 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "OWSFakeContactsUpdater.h"
#import "SignalRecipient.h"
NS_ASSUME_NONNULL_BEGIN
@implementation OWSFakeContactsUpdater
//- (nullable SignalRecipient *)synchronousLookup:(NSString *)identifier error:(NSError **)error
//{
// NSLog(@"[OWSFakeContactsUpdater] Faking contact lookup.");
// return [[SignalRecipient alloc] initWithTextSecureIdentifier:@"fake-recipient-id"
// relay:nil];
//}
@end
NS_ASSUME_NONNULL_END

View File

@ -7,8 +7,6 @@
@import Contacts;
@import Contacts;
NS_ASSUME_NONNULL_BEGIN
@interface ContactSortingTest : SSKBaseTest

View File

@ -2,6 +2,7 @@
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "MockSSKEnvironment.h"
#import <XCTest/XCTest.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -21,6 +21,8 @@ NS_ASSUME_NONNULL_BEGIN
ClearCurrentAppContextForTests();
SetCurrentAppContext([TestAppContext new]);
[MockSSKEnvironment activate];
}
- (void)tearDown

View File

@ -88,13 +88,11 @@ public class ShareViewController: UIViewController, ShareViewDelegate, SAEFailed
}.retainUntilComplete()
// We shouldn't set up our environment until after we've consulted isReadyForAppExtensions.
AppSetup.setupEnvironment(callMessageHandlerBlock: {
return NoopCallMessageHandler()
},
notificationsProtocolBlock: {
return NoopNotificationsManager()
},
migrationCompletion: { [weak self] in
AppSetup.setupEnvironment(appSpecificSingletonBlock: {
SSKEnvironment.shared.callMessageHandler = NoopCallMessageHandler()
SSKEnvironment.shared.notificationsManager = NoopNotificationsManager()
},
migrationCompletion: { [weak self] in
AssertIsOnMainThread()
guard let strongSelf = self else { return }

View File

@ -14,7 +14,6 @@
#import <SignalMessaging/OWSContactsSyncing.h>
#import <SignalMessaging/OWSMath.h>
#import <SignalMessaging/OWSPreferences.h>
#import <SignalMessaging/Release.h>
#import <SignalMessaging/UIColor+OWS.h>
#import <SignalMessaging/UIFont+OWS.h>
#import <SignalMessaging/UIView+OWS.h>