From 603e3bf0b6b158f3c19d9df2985a1fbb6e8de425 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 12 Oct 2018 16:39:40 -0400 Subject: [PATCH] Move SM singletons to Environment. --- Signal/test/mocks/MockEnvironment.m | 16 ++++- SignalMessaging/contacts/OWSContactsSyncing.h | 4 +- SignalMessaging/contacts/OWSContactsSyncing.m | 62 +++++++++---------- SignalMessaging/environment/AppSetup.m | 11 +++- SignalMessaging/environment/Environment.h | 14 ++++- SignalMessaging/environment/Environment.m | 13 +++- SignalMessaging/environment/OWSSounds.h | 3 + SignalMessaging/environment/OWSSounds.m | 15 +---- SignalMessaging/utils/OWSWindowManager.h | 1 + SignalMessaging/utils/OWSWindowManager.m | 10 ++- .../LockInteractionController.h | 5 +- .../LockInteractionController.m | 25 +++++--- 12 files changed, 117 insertions(+), 62 deletions(-) diff --git a/Signal/test/mocks/MockEnvironment.m b/Signal/test/mocks/MockEnvironment.m index 0f178cd90..80c616a0e 100644 --- a/Signal/test/mocks/MockEnvironment.m +++ b/Signal/test/mocks/MockEnvironment.m @@ -6,7 +6,9 @@ #import "OWSBackup.h" #import "OWSContactsSyncing.h" #import "OWSWindowManager.h" +#import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -21,9 +23,21 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init { + OWSPrimaryStorage *primaryStorage = SSKEnvironment.shared.primaryStorage; + OWSAssertDebug(primaryStorage); + // TODO: We should probably mock this out. OWSPreferences *preferences = [OWSPreferences new]; - self = [super initWithPreferences:preferences]; + OWSContactsSyncing *contactsSyncing = [[OWSContactsSyncing alloc] initDefault]; + OWSSounds *sounds = [[OWSSounds alloc] initWithPrimaryStorage:primaryStorage]; + LockInteractionController *lockInteractionController = [[LockInteractionController alloc] initDefault]; + OWSWindowManager *windowManager = [[OWSWindowManager alloc] initDefault]; + + self = [super initWithPreferences:preferences + contactsSyncing:contactsSyncing + sounds:sounds + lockInteractionController:lockInteractionController + windowManager:windowManager]; OWSAssertDebug(self); return self; } diff --git a/SignalMessaging/contacts/OWSContactsSyncing.h b/SignalMessaging/contacts/OWSContactsSyncing.h index 85cdef2ed..c359a4519 100644 --- a/SignalMessaging/contacts/OWSContactsSyncing.h +++ b/SignalMessaging/contacts/OWSContactsSyncing.h @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // NS_ASSUME_NONNULL_BEGIN @@ -13,6 +13,8 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; +- (instancetype)initDefault NS_DESIGNATED_INITIALIZER; + + (instancetype)sharedManager; @end diff --git a/SignalMessaging/contacts/OWSContactsSyncing.m b/SignalMessaging/contacts/OWSContactsSyncing.m index 6bb842bd5..8117512e0 100644 --- a/SignalMessaging/contacts/OWSContactsSyncing.m +++ b/SignalMessaging/contacts/OWSContactsSyncing.m @@ -24,11 +24,6 @@ NSString *const kOWSPrimaryStorageOWSContactsSyncingLastMessageKey @property (nonatomic, readonly) dispatch_queue_t serialQueue; -@property (nonatomic, readonly) OWSContactsManager *contactsManager; -@property (nonatomic, readonly) OWSIdentityManager *identityManager; -@property (nonatomic, readonly) OWSMessageSender *messageSender; -@property (nonatomic, readonly) OWSProfileManager *profileManager; - @property (nonatomic) BOOL isRequestInFlight; @end @@ -37,26 +32,12 @@ NSString *const kOWSPrimaryStorageOWSContactsSyncingLastMessageKey + (instancetype)sharedManager { - static OWSContactsSyncing *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [[self alloc] initDefault]; - }); - return instance; -} + OWSAssertDebug(Environment.shared.contactsSyncing); -- (instancetype)initDefault -{ - return [self initWithContactsManager:Environment.shared.contactsManager - identityManager:OWSIdentityManager.sharedManager - messageSender:SSKEnvironment.shared.messageSender - profileManager:OWSProfileManager.sharedManager]; + return Environment.shared.contactsSyncing; } -- (instancetype)initWithContactsManager:(OWSContactsManager *)contactsManager - identityManager:(OWSIdentityManager *)identityManager - messageSender:(OWSMessageSender *)messageSender - profileManager:(OWSProfileManager *)profileManager +- (instancetype)initDefault { self = [super init]; @@ -64,15 +45,6 @@ NSString *const kOWSPrimaryStorageOWSContactsSyncingLastMessageKey return self; } - OWSAssertDebug(contactsManager); - OWSAssertDebug(messageSender); - OWSAssertDebug(identityManager); - - _contactsManager = contactsManager; - _identityManager = identityManager; - _messageSender = messageSender; - _profileManager = profileManager; - OWSSingletonAssert(); [[NSNotificationCenter defaultCenter] addObserver:self @@ -92,6 +64,34 @@ NSString *const kOWSPrimaryStorageOWSContactsSyncingLastMessageKey [[NSNotificationCenter defaultCenter] removeObserver:self]; } +#pragma mark - Dependencies + +- (OWSContactsManager *)contactsManager { + OWSAssertDebug(Environment.shared.contactsManager); + + return Environment.shared.contactsManager; +} + +- (OWSIdentityManager *)identityManager { + OWSAssertDebug(SSKEnvironment.shared.identityManager); + + return SSKEnvironment.shared.identityManager; +} + +- (OWSMessageSender *)messageSender { + OWSAssertDebug(SSKEnvironment.shared.messageSender); + + return SSKEnvironment.shared.messageSender; +} + +- (OWSProfileManager *)profileManager { + OWSAssertDebug(SSKEnvironment.shared.profileManager); + + return SSKEnvironment.shared.profileManager; +} + +#pragma mark - + - (void)signalAccountsDidChange:(id)notification { OWSAssertIsOnMainThread(); diff --git a/SignalMessaging/environment/AppSetup.m b/SignalMessaging/environment/AppSetup.m index 28ab3b0be..48c1009c2 100644 --- a/SignalMessaging/environment/AppSetup.m +++ b/SignalMessaging/environment/AppSetup.m @@ -82,7 +82,16 @@ NS_ASSUME_NONNULL_BEGIN OWSOutgoingReceiptManager *outgoingReceiptManager = [[OWSOutgoingReceiptManager alloc] initWithPrimaryStorage:primaryStorage]; - [Environment setShared:[[Environment alloc] initWithPreferences:preferences]]; + OWSContactsSyncing *contactsSyncing = [[OWSContactsSyncing alloc] initDefault]; + OWSSounds *sounds = [[OWSSounds alloc] initWithPrimaryStorage:primaryStorage]; + LockInteractionController *lockInteractionController = [[LockInteractionController alloc] initDefault]; + OWSWindowManager *windowManager = [[OWSWindowManager alloc] initDefault]; + + [Environment setShared:[[Environment alloc] initWithPreferences:preferences + contactsSyncing:contactsSyncing + sounds:sounds + lockInteractionController:lockInteractionController + windowManager:windowManager]]; [SSKEnvironment setShared:[[SSKEnvironment alloc] initWithContactsManager:contactsManager messageSender:messageSender diff --git a/SignalMessaging/environment/Environment.h b/SignalMessaging/environment/Environment.h index 5cf009fba..95d494732 100644 --- a/SignalMessaging/environment/Environment.h +++ b/SignalMessaging/environment/Environment.h @@ -4,8 +4,12 @@ #import +@class LockInteractionController; @class OWSContactsManager; +@class OWSContactsSyncing; @class OWSPreferences; +@class OWSSounds; +@class OWSWindowManager; /** * @@ -19,10 +23,18 @@ - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithPreferences:(OWSPreferences *)preferences; +- (instancetype)initWithPreferences:(OWSPreferences *)preferences + contactsSyncing:(OWSContactsSyncing *)contactsSyncing + sounds:(OWSSounds *)sounds + lockInteractionController:(LockInteractionController *)lockInteractionController + windowManager:(OWSWindowManager *)windowManager; @property (nonatomic, readonly) OWSContactsManager *contactsManager; @property (nonatomic, readonly) OWSPreferences *preferences; +@property (nonatomic, readonly) OWSContactsSyncing *contactsSyncing; +@property (nonatomic, readonly) OWSSounds *sounds; +@property (nonatomic, readonly) LockInteractionController *lockInteractionController; +@property (nonatomic, readonly) OWSWindowManager *windowManager; @property (class, nonatomic) Environment *shared; diff --git a/SignalMessaging/environment/Environment.m b/SignalMessaging/environment/Environment.m index 4487f8098..6cc134d22 100644 --- a/SignalMessaging/environment/Environment.m +++ b/SignalMessaging/environment/Environment.m @@ -36,15 +36,26 @@ static Environment *sharedEnvironment = nil; } - (instancetype)initWithPreferences:(OWSPreferences *)preferences -{ + contactsSyncing:(OWSContactsSyncing *)contactsSyncing + sounds:(OWSSounds *)sounds + lockInteractionController:(LockInteractionController *)lockInteractionController + windowManager:(OWSWindowManager *)windowManager { self = [super init]; if (!self) { return self; } OWSAssertDebug(preferences); + OWSAssertDebug(contactsSyncing); + OWSAssertDebug(sounds); + OWSAssertDebug(lockInteractionController); + OWSAssertDebug(windowManager); _preferences = preferences; + _contactsSyncing = contactsSyncing; + _sounds = sounds; + _lockInteractionController = lockInteractionController; + _windowManager = windowManager; OWSSingletonAssert(); diff --git a/SignalMessaging/environment/OWSSounds.h b/SignalMessaging/environment/OWSSounds.h index 746470f21..4cee5e581 100644 --- a/SignalMessaging/environment/OWSSounds.h +++ b/SignalMessaging/environment/OWSSounds.h @@ -40,6 +40,7 @@ typedef NS_ENUM(NSUInteger, OWSSound) { }; @class OWSAudioPlayer; +@class OWSPrimaryStorage; @class TSThread; @class YapDatabaseReadWriteTransaction; @@ -47,6 +48,8 @@ typedef NS_ENUM(NSUInteger, OWSSound) { - (instancetype)init NS_UNAVAILABLE; +- (instancetype)initWithPrimaryStorage:(OWSPrimaryStorage *)primaryStorage NS_DESIGNATED_INITIALIZER; + + (NSString *)displayNameForSound:(OWSSound)sound; + (nullable NSString *)filenameForSound:(OWSSound)sound; diff --git a/SignalMessaging/environment/OWSSounds.m b/SignalMessaging/environment/OWSSounds.m index 591ff6300..3ef0bf1da 100644 --- a/SignalMessaging/environment/OWSSounds.m +++ b/SignalMessaging/environment/OWSSounds.m @@ -3,6 +3,7 @@ // #import "OWSSounds.h" +#import "Environment.h" #import "OWSAudioPlayer.h" #import #import @@ -68,19 +69,9 @@ NSString *const kOWSSoundsStorageGlobalNotificationKey = @"kOWSSoundsStorageGlob + (instancetype)sharedManager { - static OWSSounds *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [[self alloc] initDefault]; - }); - return instance; -} - -- (instancetype)initDefault -{ - OWSPrimaryStorage *primaryStorage = [OWSPrimaryStorage sharedManager]; + OWSAssertDebug(Environment.shared.sounds); - return [self initWithPrimaryStorage:primaryStorage]; + return Environment.shared.sounds; } - (instancetype)initWithPrimaryStorage:(OWSPrimaryStorage *)primaryStorage diff --git a/SignalMessaging/utils/OWSWindowManager.h b/SignalMessaging/utils/OWSWindowManager.h index f8117d22c..6696dbd2d 100644 --- a/SignalMessaging/utils/OWSWindowManager.h +++ b/SignalMessaging/utils/OWSWindowManager.h @@ -20,6 +20,7 @@ extern const UIWindowLevel UIWindowLevel_Background; @interface OWSWindowManager : NSObject - (instancetype)init NS_UNAVAILABLE; +- (instancetype)initDefault NS_DESIGNATED_INITIALIZER; + (instancetype)sharedManager; diff --git a/SignalMessaging/utils/OWSWindowManager.m b/SignalMessaging/utils/OWSWindowManager.m index 41e86d36e..f64658875 100644 --- a/SignalMessaging/utils/OWSWindowManager.m +++ b/SignalMessaging/utils/OWSWindowManager.m @@ -3,6 +3,7 @@ // #import "OWSWindowManager.h" +#import "Environment.h" #import "UIColor+OWS.h" #import "UIFont+OWS.h" #import "UIView+OWS.h" @@ -129,12 +130,9 @@ const UIWindowLevel UIWindowLevel_MessageActions(void) + (instancetype)sharedManager { - static OWSWindowManager *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [[self alloc] initDefault]; - }); - return instance; + OWSAssertDebug(Environment.shared.windowManager); + + return Environment.shared.windowManager; } - (instancetype)initDefault diff --git a/SignalMessaging/viewControllers/LockInteractionController.h b/SignalMessaging/viewControllers/LockInteractionController.h index fa1a49265..7e47377d8 100644 --- a/SignalMessaging/viewControllers/LockInteractionController.h +++ b/SignalMessaging/viewControllers/LockInteractionController.h @@ -1,9 +1,12 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // @interface LockInteractionController : NSObject +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)initDefault NS_DESIGNATED_INITIALIZER; + typedef void (^LIControllerCompletionBlock)(void); typedef BOOL (^LIControllerBlockingOperation)(void); typedef void (^LIControllerRetryBlock)( diff --git a/SignalMessaging/viewControllers/LockInteractionController.m b/SignalMessaging/viewControllers/LockInteractionController.m index becbdce70..302a06972 100644 --- a/SignalMessaging/viewControllers/LockInteractionController.m +++ b/SignalMessaging/viewControllers/LockInteractionController.m @@ -1,8 +1,9 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "LockInteractionController.h" +#import "Environment.h" #import @interface LockInteractionController () @@ -17,12 +18,22 @@ + (instancetype)sharedController { - static LockInteractionController *sharedController = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - sharedController = [self new]; - }); - return sharedController; + OWSAssertDebug(Environment.shared.lockInteractionController); + + return Environment.shared.lockInteractionController; +} + +- (instancetype)initDefault { + self = [super init]; + + if (!self) { + return self; + } + + OWSAssertIsOnMainThread(); + OWSSingletonAssert(); + + return self; } + (void)performBlock:(LIControllerBlockingOperation)blockingOperation