From b316e18cfa7130b1da416f880a61f3d7dffe3bd0 Mon Sep 17 00:00:00 2001
From: Matthew Chen <charlesmchen@gmail.com>
Date: Fri, 12 May 2017 11:09:25 -0400
Subject: [PATCH] Ensure contact delegate helper is set during initialization.

// FREEBIE
---
 .../ViewControllers/BlockListViewController.m   |  3 +--
 Signal/src/ViewControllers/ContactsViewHelper.h |  6 +++++-
 Signal/src/ViewControllers/ContactsViewHelper.m | 17 ++++++++++++++---
 .../MessageComposeTableViewController.m         |  3 +--
 .../ViewControllers/NewGroupViewController.m    |  3 +--
 ...OWSConversationSettingsTableViewController.m |  3 +--
 .../SelectRecipientViewController.m             |  3 +--
 .../SelectThreadViewController.m                |  3 +--
 .../ShowGroupMembersViewController.m            |  3 +--
 .../ViewControllers/UpdateGroupViewController.m |  3 +--
 10 files changed, 27 insertions(+), 20 deletions(-)

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<ContactsViewHelperDelegate> delegate;
+@property (nonatomic, readonly, weak) id<ContactsViewHelperDelegate> delegate;
 
 @property (nonatomic, readonly) OWSContactsManager *contactsManager;
 @property (nonatomic, readonly) OWSBlockingManager *blockingManager;
@@ -42,6 +42,10 @@ NS_ASSUME_NONNULL_BEGIN
 
 @property (nonatomic, readonly) NSArray<NSString *> *blockedPhoneNumbers;
 
+- (instancetype)init NS_UNAVAILABLE;
+
+- (instancetype)initWithDelegate:(id<ContactsViewHelperDelegate>)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<NSString *> *blockedPhoneNumbers;
 
+@property (nonatomic) BOOL suppressDelegateEvents;
+
 @end
 
 #pragma mark -
 
 @implementation ContactsViewHelper
 
-- (instancetype)init
+- (instancetype)initWithDelegate:(id<ContactsViewHelperDelegate>)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;