diff --git a/Signal/Signal-Prefix.pch b/Signal/Signal-Prefix.pch index 30e5aba65..215a8114a 100644 --- a/Signal/Signal-Prefix.pch +++ b/Signal/Signal-Prefix.pch @@ -15,8 +15,9 @@ static const NSUInteger ddLogLevel = DDLogLevelInfo; #endif - #import "iOSVersions.h" #import + #import "iOSVersions.h" + #import "OWSDispatch.h" #define SignalAlertView(title,msg) [[[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"") otherButtonTitles:nil, nil] show] #define SignalReportError [Pastelog reportErrorAndSubmitLogsWithAlertTitle:NSLocalizedString(@"ERROR_WAS_DETECTED_TITLE", @"") alertBody:NSLocalizedString(@"ERROR_WAS_DETECTED_SUBMIT", @"")]; diff --git a/Signal/src/contact/OWSContactsManager.h b/Signal/src/contact/OWSContactsManager.h index c01c6b41d..4f9be825e 100644 --- a/Signal/src/contact/OWSContactsManager.h +++ b/Signal/src/contact/OWSContactsManager.h @@ -8,6 +8,8 @@ NS_ASSUME_NONNULL_BEGIN +extern NSString *const OWSContactsManagerContactsDidChangeNotification; + @class UIFont; /** diff --git a/Signal/src/contact/OWSContactsManager.m b/Signal/src/contact/OWSContactsManager.m index 350e0eeb6..5261da0de 100644 --- a/Signal/src/contact/OWSContactsManager.m +++ b/Signal/src/contact/OWSContactsManager.m @@ -7,6 +7,8 @@ typedef BOOL (^ContactSearchBlock)(id, NSUInteger, BOOL *); +NSString *const OWSContactsManagerContactsDidChangeNotification = @"OWSContactsManagerContactsDidChangeNotification"; + @interface OWSContactsManager () @property id addressBookReference; @@ -99,18 +101,26 @@ void onAddressBookChanged(ABAddressBookRef notifyAddressBook, CFDictionaryRef in - (void)intersectContacts { [[ContactsUpdater sharedUpdater] updateSignalContactIntersectionWithABContacts:self.allContacts - success:^{ - DDLogInfo(@"%@ Successfully intersected contacts.", self.tag); - } - failure:^(NSError *error) { - DDLogWarn(@"%@ Failed to intersect contacts with error: %@. Rescheduling", self.tag, error); - - [NSTimer scheduledTimerWithTimeInterval:60 - target:self - selector:@selector(intersectContacts) - userInfo:nil - repeats:NO]; - }]; + success:^{ + DDLogInfo(@"%@ Successfully intersected contacts.", self.tag); + [self fireContactsDidChange]; + } + failure:^(NSError *error) { + DDLogWarn(@"%@ Failed to intersect contacts with error: %@. Rescheduling", self.tag, error); + + [NSTimer scheduledTimerWithTimeInterval:60 + target:self + selector:@selector(intersectContacts) + userInfo:nil + repeats:NO]; + }]; +} + +- (void)fireContactsDidChange { + AssertIsOnMainThread(); + + [[NSNotificationCenter defaultCenter] postNotificationName:OWSContactsManagerContactsDidChangeNotification + object:nil]; } - (void)pullLatestAddressBook { diff --git a/Signal/src/view controllers/MessageComposeTableViewController.m b/Signal/src/view controllers/MessageComposeTableViewController.m index 819d3317c..df6e09ba9 100644 --- a/Signal/src/view controllers/MessageComposeTableViewController.m +++ b/Signal/src/view controllers/MessageComposeTableViewController.m @@ -77,6 +77,8 @@ NSString *const MessageComposeTableViewControllerCellContact = @"ContactTableVie _contactsManager = [Environment getCurrent].contactsManager; _phoneNumberAccountSet = [NSMutableSet set]; + [self observeNotifications]; + return self; } @@ -89,9 +91,28 @@ NSString *const MessageComposeTableViewControllerCellContact = @"ContactTableVie _contactsManager = [Environment getCurrent].contactsManager; + [self observeNotifications]; + return self; } +- (void)observeNotifications +{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(contactsDidChange:) + name:OWSContactsManagerContactsDidChangeNotification + object:nil]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)contactsDidChange:(NSNotification *)notification { + [self updateContacts]; +} + - (void)viewDidLoad { [super viewDidLoad]; [self.navigationController.navigationBar setTranslucent:NO]; @@ -612,32 +633,36 @@ NSString *const MessageComposeTableViewControllerCellContact = @"ContactTableVie - (void)refreshContacts { [[ContactsUpdater sharedUpdater] updateSignalContactIntersectionWithABContacts:self.contactsManager.allContacts - success:^{ - self.contacts = self.contactsManager.signalContacts; - dispatch_async(dispatch_get_main_queue(), ^{ - [self updateSearchResultsForSearchController:self.searchController]; - [self.tableView reloadData]; - [self updateAfterRefreshTry]; - }); - } - failure:^(NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - UIAlertView *alert = - [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"ERROR_WAS_DETECTED_TITLE", @"") - message:NSLocalizedString(@"TIMEOUT_CONTACTS_DETAIL", @"") - delegate:nil - cancelButtonTitle:NSLocalizedString(@"OK", @"") - otherButtonTitles:nil]; - [alert show]; - [self updateAfterRefreshTry]; - }); - }]; - + success:^{ + [self updateContacts]; + } + failure:^(NSError *error) { + dispatch_async(dispatch_get_main_queue(), ^{ + UIAlertView *alert = + [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"ERROR_WAS_DETECTED_TITLE", @"") + message:NSLocalizedString(@"TIMEOUT_CONTACTS_DETAIL", @"") + delegate:nil + cancelButtonTitle:NSLocalizedString(@"OK", @"") + otherButtonTitles:nil]; + [alert show]; + [self updateAfterRefreshTry]; + }); + }]; + if ([self.contacts count] == 0) { [self showLoadingBackgroundView:YES]; } } +- (void)updateContacts { + self.contacts = self.contactsManager.signalContacts; + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateSearchResultsForSearchController:self.searchController]; + [self.tableView reloadData]; + [self updateAfterRefreshTry]; + }); +} + #pragma mark - Navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(nullable id)sender diff --git a/Signal/src/view controllers/NewGroupViewController.m b/Signal/src/view controllers/NewGroupViewController.m index 92f08e4ba..58f132880 100644 --- a/Signal/src/view controllers/NewGroupViewController.m +++ b/Signal/src/view controllers/NewGroupViewController.m @@ -68,6 +68,33 @@ static NSString *const kUnwindToMessagesViewSegue = @"UnwindToMessagesViewSegue" contactsUpdater:[Environment getCurrent].contactsUpdater]; _contactsManager = [Environment getCurrent].contactsManager; + + [self observeNotifications]; +} + +- (void)observeNotifications +{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(contactsDidChange:) + name:OWSContactsManagerContactsDidChangeNotification + object:nil]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)contactsDidChange:(NSNotification *)notification { + [self updateContacts]; +} + +- (void)updateContacts { + AssertIsOnMainThread(); + + contacts = self.contactsManager.signalContacts; + + [self.tableView reloadData]; } - (void)configWithThread:(TSGroupThread *)gThread { @@ -78,7 +105,7 @@ static NSString *const kUnwindToMessagesViewSegue = @"UnwindToMessagesViewSegue" [super viewDidLoad]; [self.navigationController.navigationBar setTranslucent:NO]; - contacts = [Environment getCurrent].contactsManager.signalContacts; + contacts = self.contactsManager.signalContacts; self.tableView.tableHeaderView.frame = CGRectMake(0, 0, 400, 44);