diff --git a/Signal/src/ViewControllers/BlockListViewController.m b/Signal/src/ViewControllers/BlockListViewController.m index 308f69129..5e654fecb 100644 --- a/Signal/src/ViewControllers/BlockListViewController.m +++ b/Signal/src/ViewControllers/BlockListViewController.m @@ -33,8 +33,7 @@ NS_ASSUME_NONNULL_BEGIN { [super loadView]; - _contactsViewHelper = [ContactsViewHelper new]; - _contactsViewHelper.delegate = self; + _contactsViewHelper = [[ContactsViewHelper alloc] initWithDelegate:self]; self.title = NSLocalizedString(@"SETTINGS_BLOCK_LIST_TITLE", @"Label for the block list section of the settings view"); diff --git a/Signal/src/ViewControllers/ContactsViewHelper.h b/Signal/src/ViewControllers/ContactsViewHelper.h index 79fc60bef..e5f1b67a9 100644 --- a/Signal/src/ViewControllers/ContactsViewHelper.h +++ b/Signal/src/ViewControllers/ContactsViewHelper.h @@ -32,7 +32,7 @@ NS_ASSUME_NONNULL_BEGIN @interface ContactsViewHelper : NSObject -@property (nonatomic, weak) id delegate; +@property (nonatomic, readonly, weak) id delegate; @property (nonatomic, readonly) OWSContactsManager *contactsManager; @property (nonatomic, readonly) OWSBlockingManager *blockingManager; @@ -42,6 +42,10 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) NSArray *blockedPhoneNumbers; +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithDelegate:(id)delegate; + - (nullable SignalAccount *)signalAccountForRecipientId:(NSString *)recipientId; // This method is faster than OWSBlockingManager but diff --git a/Signal/src/ViewControllers/ContactsViewHelper.m b/Signal/src/ViewControllers/ContactsViewHelper.m index 1ee6f45df..d3efe58cf 100644 --- a/Signal/src/ViewControllers/ContactsViewHelper.m +++ b/Signal/src/ViewControllers/ContactsViewHelper.m @@ -26,19 +26,26 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) NSArray *blockedPhoneNumbers; +@property (nonatomic) BOOL suppressDelegateEvents; + @end #pragma mark - @implementation ContactsViewHelper -- (instancetype)init +- (instancetype)initWithDelegate:(id)delegate { self = [super init]; if (!self) { return self; } + OWSAssert(delegate); + _delegate = delegate; + + self.suppressDelegateEvents = YES; + _blockingManager = [OWSBlockingManager sharedManager]; _blockedPhoneNumbers = [_blockingManager blockedPhoneNumbers]; @@ -48,6 +55,8 @@ NS_ASSUME_NONNULL_BEGIN [self observeNotifications]; + self.suppressDelegateEvents = NO; + return self; } @@ -98,7 +107,6 @@ NS_ASSUME_NONNULL_BEGIN { OWSAssert([NSThread isMainThread]); - if ([self.delegate respondsToSelector:@selector(shouldHideLocalNumber)] && [self.delegate shouldHideLocalNumber] && [self isCurrentUser:signalAccount]) { @@ -154,7 +162,10 @@ NS_ASSUME_NONNULL_BEGIN self.signalAccounts = [signalAccounts copy]; self.nonSignalContacts = nil; - [self.delegate contactsViewHelperDidUpdateContacts]; + // Don't fire delegate "change" events during initialization. + if (!self.suppressDelegateEvents) { + [self.delegate contactsViewHelperDidUpdateContacts]; + } } - (BOOL)doesSignalAccount:(SignalAccount *)signalAccount matchSearchTerm:(NSString *)searchTerm diff --git a/Signal/src/ViewControllers/MessageComposeTableViewController.m b/Signal/src/ViewControllers/MessageComposeTableViewController.m index 8381df6fd..10f2f2415 100644 --- a/Signal/src/ViewControllers/MessageComposeTableViewController.m +++ b/Signal/src/ViewControllers/MessageComposeTableViewController.m @@ -56,8 +56,7 @@ NS_ASSUME_NONNULL_BEGIN { [super loadView]; - _contactsViewHelper = [ContactsViewHelper new]; - _contactsViewHelper.delegate = self; + _contactsViewHelper = [[ContactsViewHelper alloc] initWithDelegate:self]; _nonContactAccountSet = [NSMutableSet set]; ReminderView *contactsPermissionReminderView = [[ReminderView alloc] diff --git a/Signal/src/ViewControllers/NewGroupViewController.m b/Signal/src/ViewControllers/NewGroupViewController.m index 53862e822..862fa22b2 100644 --- a/Signal/src/ViewControllers/NewGroupViewController.m +++ b/Signal/src/ViewControllers/NewGroupViewController.m @@ -81,8 +81,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)commonInit { _messageSender = [Environment getCurrent].messageSender; - _contactsViewHelper = [ContactsViewHelper new]; - _contactsViewHelper.delegate = self; + _contactsViewHelper = [[ContactsViewHelper alloc] initWithDelegate:self]; _groupViewHelper = [GroupViewHelper new]; _groupViewHelper.delegate = self; diff --git a/Signal/src/ViewControllers/OWSConversationSettingsTableViewController.m b/Signal/src/ViewControllers/OWSConversationSettingsTableViewController.m index 8e1789439..11de12304 100644 --- a/Signal/src/ViewControllers/OWSConversationSettingsTableViewController.m +++ b/Signal/src/ViewControllers/OWSConversationSettingsTableViewController.m @@ -96,8 +96,7 @@ NS_ASSUME_NONNULL_BEGIN _contactsManager = [Environment getCurrent].contactsManager; _messageSender = [Environment getCurrent].messageSender; _blockingManager = [OWSBlockingManager sharedManager]; - _contactsViewHelper = [ContactsViewHelper new]; - _contactsViewHelper.delegate = self; + _contactsViewHelper = [[ContactsViewHelper alloc] initWithDelegate:self]; } - (NSString *)threadName diff --git a/Signal/src/ViewControllers/SelectRecipientViewController.m b/Signal/src/ViewControllers/SelectRecipientViewController.m index d4e219e56..12170a862 100644 --- a/Signal/src/ViewControllers/SelectRecipientViewController.m +++ b/Signal/src/ViewControllers/SelectRecipientViewController.m @@ -58,8 +58,7 @@ NSString *const kSelectRecipientViewControllerCellIdentifier = @"kSelectRecipien self.view.backgroundColor = [UIColor whiteColor]; [self.navigationController.navigationBar setTranslucent:NO]; - _contactsViewHelper = [ContactsViewHelper new]; - _contactsViewHelper.delegate = self; + _contactsViewHelper = [[ContactsViewHelper alloc] initWithDelegate:self]; [self createViews]; diff --git a/Signal/src/ViewControllers/SelectThreadViewController.m b/Signal/src/ViewControllers/SelectThreadViewController.m index d786bff2f..4b3e94fd8 100644 --- a/Signal/src/ViewControllers/SelectThreadViewController.m +++ b/Signal/src/ViewControllers/SelectThreadViewController.m @@ -53,8 +53,7 @@ NS_ASSUME_NONNULL_BEGIN self.view.backgroundColor = [UIColor whiteColor]; - _contactsViewHelper = [ContactsViewHelper new]; - _contactsViewHelper.delegate = self; + _contactsViewHelper = [[ContactsViewHelper alloc] initWithDelegate:self]; _threadViewHelper = [ThreadViewHelper new]; _threadViewHelper.delegate = self; diff --git a/Signal/src/ViewControllers/ShowGroupMembersViewController.m b/Signal/src/ViewControllers/ShowGroupMembersViewController.m index 536bee6a5..dd31b5017 100644 --- a/Signal/src/ViewControllers/ShowGroupMembersViewController.m +++ b/Signal/src/ViewControllers/ShowGroupMembersViewController.m @@ -62,8 +62,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)commonInit { - _contactsViewHelper = [ContactsViewHelper new]; - _contactsViewHelper.delegate = self; + _contactsViewHelper = [[ContactsViewHelper alloc] initWithDelegate:self]; } - (void)configWithThread:(TSGroupThread *)thread diff --git a/Signal/src/ViewControllers/UpdateGroupViewController.m b/Signal/src/ViewControllers/UpdateGroupViewController.m index 6f8e3b59e..9942392a0 100644 --- a/Signal/src/ViewControllers/UpdateGroupViewController.m +++ b/Signal/src/ViewControllers/UpdateGroupViewController.m @@ -82,8 +82,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)commonInit { _messageSender = [Environment getCurrent].messageSender; - _contactsViewHelper = [ContactsViewHelper new]; - _contactsViewHelper.delegate = self; + _contactsViewHelper = [[ContactsViewHelper alloc] initWithDelegate:self]; _groupViewHelper = [GroupViewHelper new]; _groupViewHelper.delegate = self;