|  |  |  | @ -3,7 +3,10 @@ | 
		
	
		
			
				|  |  |  |  | // | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #import "AddToBlockListViewController.h" | 
		
	
		
			
				|  |  |  |  | #import "ContactTableViewCell.h" | 
		
	
		
			
				|  |  |  |  | #import "CountryCodeViewController.h" | 
		
	
		
			
				|  |  |  |  | #import "Environment.h" | 
		
	
		
			
				|  |  |  |  | #import "OWSContactsManager.h" | 
		
	
		
			
				|  |  |  |  | #import "PhoneNumber.h" | 
		
	
		
			
				|  |  |  |  | #import "StringUtil.h" | 
		
	
		
			
				|  |  |  |  | #import "UIFont+OWS.h" | 
		
	
	
		
			
				
					|  |  |  | @ -17,10 +20,14 @@ NS_ASSUME_NONNULL_BEGIN | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | NSString * const kAddToBlockListViewControllerCellIdentifier = @"kAddToBlockListViewControllerCellIdentifier"; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | NSString *const kContactsTable_CellReuseIdentifier = @"kContactsTable_CellReuseIdentifier"; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #pragma mark - | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | // TODO: Add a list of contacts to make it easier to block contacts. | 
		
	
		
			
				|  |  |  |  | @interface AddToBlockListViewController () <CountryCodeViewControllerDelegate, UITextFieldDelegate> | 
		
	
		
			
				|  |  |  |  | @interface AddToBlockListViewController () <CountryCodeViewControllerDelegate, | 
		
	
		
			
				|  |  |  |  |     UITextFieldDelegate, | 
		
	
		
			
				|  |  |  |  |     UITableViewDataSource, | 
		
	
		
			
				|  |  |  |  |     UITableViewDelegate> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | @property (nonatomic, readonly) OWSBlockingManager *blockingManager; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -31,20 +38,19 @@ NSString * const kAddToBlockListViewControllerCellIdentifier = @"kAddToBlockList | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | @property (nonatomic) UIButton *blockButton; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | @property (nonatomic) UITableView *contactsTableView; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | @property (nonatomic) NSString *callingCode; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | @property (nonatomic, readonly) OWSContactsManager *contactsManager; | 
		
	
		
			
				|  |  |  |  | @property (nonatomic) NSArray<Contact *> *contacts; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | @end | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #pragma mark - | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | @implementation AddToBlockListViewController | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)viewDidLoad | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     [super viewDidLoad]; | 
		
	
		
			
				|  |  |  |  |     [self.navigationController.navigationBar setTranslucent:NO]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)loadView | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     [super loadView]; | 
		
	
	
		
			
				
					|  |  |  | @ -52,6 +58,8 @@ NSString * const kAddToBlockListViewControllerCellIdentifier = @"kAddToBlockList | 
		
	
		
			
				|  |  |  |  |     self.view.backgroundColor = [UIColor whiteColor]; | 
		
	
		
			
				|  |  |  |  |      | 
		
	
		
			
				|  |  |  |  |     _blockingManager = [OWSBlockingManager sharedManager]; | 
		
	
		
			
				|  |  |  |  |     _contactsManager = [Environment getCurrent].contactsManager; | 
		
	
		
			
				|  |  |  |  |     self.contacts = self.contactsManager.signalContacts; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     self.title = NSLocalizedString(@"SETTINGS_ADD_TO_BLOCK_LIST_TITLE", @""); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -62,12 +70,22 @@ NSString * const kAddToBlockListViewControllerCellIdentifier = @"kAddToBlockList | 
		
	
		
			
				|  |  |  |  |     [self addNotificationListeners]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)viewDidLoad | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     [super viewDidLoad]; | 
		
	
		
			
				|  |  |  |  |     [self.navigationController.navigationBar setTranslucent:NO]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)addNotificationListeners | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     [[NSNotificationCenter defaultCenter] addObserver:self | 
		
	
		
			
				|  |  |  |  |                                              selector:@selector(blockedPhoneNumbersDidChange:) | 
		
	
		
			
				|  |  |  |  |                                                  name:kNSNotificationName_BlockedPhoneNumbersDidChange | 
		
	
		
			
				|  |  |  |  |                                                object:nil]; | 
		
	
		
			
				|  |  |  |  |     [[NSNotificationCenter defaultCenter] addObserver:self | 
		
	
		
			
				|  |  |  |  |                                              selector:@selector(signalRecipientsDidChange:) | 
		
	
		
			
				|  |  |  |  |                                                  name:OWSContactsManagerSignalRecipientsDidChangeNotification | 
		
	
		
			
				|  |  |  |  |                                                object:nil]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)dealloc | 
		
	
	
		
			
				
					|  |  |  | @ -164,6 +182,17 @@ NSString * const kAddToBlockListViewControllerCellIdentifier = @"kAddToBlockList | 
		
	
		
			
				|  |  |  |  |     [_blockButton autoSetDimension:ALDimensionWidth toSize:160]; | 
		
	
		
			
				|  |  |  |  |     [_blockButton autoSetDimension:ALDimensionHeight toSize:40]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     _contactsTableView = [UITableView new]; | 
		
	
		
			
				|  |  |  |  |     _contactsTableView.dataSource = self; | 
		
	
		
			
				|  |  |  |  |     _contactsTableView.delegate = self; | 
		
	
		
			
				|  |  |  |  |     [_contactsTableView registerClass:[ContactTableViewCell class] | 
		
	
		
			
				|  |  |  |  |                forCellReuseIdentifier:kContactsTable_CellReuseIdentifier]; | 
		
	
		
			
				|  |  |  |  |     _contactsTableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; | 
		
	
		
			
				|  |  |  |  |     [self.view addSubview:_contactsTableView]; | 
		
	
		
			
				|  |  |  |  |     [_contactsTableView autoPinWidthToSuperview]; | 
		
	
		
			
				|  |  |  |  |     [_contactsTableView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:blockButtonRow withOffset:30]; | 
		
	
		
			
				|  |  |  |  |     [_contactsTableView autoPinToBottomLayoutGuideOfViewController:self withInset:0]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     [self updateBlockButtonEnabling]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -247,10 +276,11 @@ NSString * const kAddToBlockListViewControllerCellIdentifier = @"kAddToBlockList | 
		
	
		
			
				|  |  |  |  |     [_blockingManager addBlockedPhoneNumber:[parsedPhoneNumber toE164]]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     UIAlertController *controller = [UIAlertController | 
		
	
		
			
				|  |  |  |  |         alertControllerWithTitle:NSLocalizedString(@"BLOCK_LIST_VIEW_BLOCKED_ALERT_TITLE", | 
		
	
		
			
				|  |  |  |  |         alertControllerWithTitle:NSLocalizedString(@"BLOCK_LIST_VIEW_PHONE_NUMBER_BLOCKED_ALERT_TITLE", | 
		
	
		
			
				|  |  |  |  |                                      @"The title of the 'phone number blocked' alert in the block view.") | 
		
	
		
			
				|  |  |  |  |                          message:[NSString | 
		
	
		
			
				|  |  |  |  |                                      stringWithFormat:NSLocalizedString(@"BLOCK_LIST_VIEW_BLOCKED_ALERT_MESSAGE_FORMAT", | 
		
	
		
			
				|  |  |  |  |                                      stringWithFormat:NSLocalizedString( | 
		
	
		
			
				|  |  |  |  |                                                           @"BLOCK_LIST_VIEW_PHONE_NUMBER_BLOCKED_ALERT_MESSAGE_FORMAT", | 
		
	
		
			
				|  |  |  |  |                                                           @"The message format of the 'phone number blocked' alert in " | 
		
	
		
			
				|  |  |  |  |                                                           @"the block view. Embeds {{the blocked phone number}}."), | 
		
	
		
			
				|  |  |  |  |                                      [parsedPhoneNumber toE164]] | 
		
	
	
		
			
				
					|  |  |  | @ -295,6 +325,19 @@ NSString * const kAddToBlockListViewControllerCellIdentifier = @"kAddToBlockList | 
		
	
		
			
				|  |  |  |  |     // TODO: Once we have a list of contacts, we should update it here. | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)signalRecipientsDidChange:(NSNotification *)notification | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     [self updateContacts]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)updateContacts | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     dispatch_async(dispatch_get_main_queue(), ^{ | 
		
	
		
			
				|  |  |  |  |         self.contacts = self.contactsManager.signalContacts; | 
		
	
		
			
				|  |  |  |  |         [self.contactsTableView reloadData]; | 
		
	
		
			
				|  |  |  |  |     }); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #pragma mark - CountryCodeViewControllerDelegate | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)countryCodeViewController:(CountryCodeViewController *)vc | 
		
	
	
		
			
				
					|  |  |  | @ -332,6 +375,113 @@ NSString * const kAddToBlockListViewControllerCellIdentifier = @"kAddToBlockList | 
		
	
		
			
				|  |  |  |  |     return NO; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #pragma mark - UITableViewDataSource | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     return 1; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     return (NSInteger)self.contacts.count; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     Contact *contact = self.contacts[(NSUInteger)indexPath.item]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     ContactTableViewCell *cell = [_contactsTableView cellForRowAtIndexPath:indexPath]; | 
		
	
		
			
				|  |  |  |  |     if (!cell) { | 
		
	
		
			
				|  |  |  |  |         cell = [ContactTableViewCell new]; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     [cell configureWithContact:contact contactsManager:self.contactsManager]; | 
		
	
		
			
				|  |  |  |  |     return cell; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     return NSLocalizedString( | 
		
	
		
			
				|  |  |  |  |         @"BLOCK_LIST_VIEW_CONTACTS_SECTION_TITLE", @"A title for the contacts section of the blocklist view."); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     return [ContactTableViewCell rowHeight]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #pragma mark - UITableViewDelegate | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     [tableView deselectRowAtIndexPath:indexPath animated:YES]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     Contact *contact = self.contacts[(NSUInteger)indexPath.item]; | 
		
	
		
			
				|  |  |  |  |     [self showBlockActionSheet:contact]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)showBlockActionSheet:(Contact *)contact | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     OWSAssert(contact); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     NSString *displayName = contact.fullName; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     NSString *title = [NSString stringWithFormat:NSLocalizedString(@"BLOCK_LIST_BLOCK_TITLE_FORMAT", | 
		
	
		
			
				|  |  |  |  |                                                      @"A format for the 'block phone number' action sheet title."), | 
		
	
		
			
				|  |  |  |  |                                 displayName]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     UIAlertController *actionSheetController = | 
		
	
		
			
				|  |  |  |  |         [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleActionSheet]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     __weak AddToBlockListViewController *weakSelf = self; | 
		
	
		
			
				|  |  |  |  |     UIAlertAction *unblockAction = [UIAlertAction | 
		
	
		
			
				|  |  |  |  |         actionWithTitle:NSLocalizedString(@"BLOCK_LIST_BLOCK_BUTTON", @"Button label for the 'block' button") | 
		
	
		
			
				|  |  |  |  |                   style:UIAlertActionStyleDefault | 
		
	
		
			
				|  |  |  |  |                 handler:^(UIAlertAction *_Nonnull action) { | 
		
	
		
			
				|  |  |  |  |                     [weakSelf blockContact:contact displayName:displayName]; | 
		
	
		
			
				|  |  |  |  |                 }]; | 
		
	
		
			
				|  |  |  |  |     [actionSheetController addAction:unblockAction]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     UIAlertAction *dismissAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"TXT_CANCEL_TITLE", @"") | 
		
	
		
			
				|  |  |  |  |                                                             style:UIAlertActionStyleCancel | 
		
	
		
			
				|  |  |  |  |                                                           handler:nil]; | 
		
	
		
			
				|  |  |  |  |     [actionSheetController addAction:dismissAction]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     [self presentViewController:actionSheetController animated:YES completion:nil]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)blockContact:(Contact *)contact displayName:(NSString *)displayName | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     for (PhoneNumber *phoneNumber in contact.parsedPhoneNumbers) { | 
		
	
		
			
				|  |  |  |  |         if (phoneNumber.toE164.length > 0) { | 
		
	
		
			
				|  |  |  |  |             [_blockingManager addBlockedPhoneNumber:phoneNumber.toE164]; | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     UIAlertController *controller = [UIAlertController | 
		
	
		
			
				|  |  |  |  |         alertControllerWithTitle:NSLocalizedString(@"BLOCK_LIST_VIEW_CONTACT_BLOCKED_ALERT_TITLE", | 
		
	
		
			
				|  |  |  |  |                                      @"The title of the 'contact blocked' alert in the block view.") | 
		
	
		
			
				|  |  |  |  |                          message:[NSString stringWithFormat:NSLocalizedString( | 
		
	
		
			
				|  |  |  |  |                                                                 @"BLOCK_LIST_VIEW_CONTACT_BLOCKED_ALERT_MESSAGE_FORMAT", | 
		
	
		
			
				|  |  |  |  |                                                                 @"The message format of the 'contact blocked' " | 
		
	
		
			
				|  |  |  |  |                                                                 @"alert in the block view. It is populated with the " | 
		
	
		
			
				|  |  |  |  |                                                                 @"blocked contact's name."), | 
		
	
		
			
				|  |  |  |  |                                            displayName] | 
		
	
		
			
				|  |  |  |  |                   preferredStyle:UIAlertControllerStyleAlert]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     [controller addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) | 
		
	
		
			
				|  |  |  |  |                                                    style:UIAlertActionStyleDefault | 
		
	
		
			
				|  |  |  |  |                                                  handler:nil]]; | 
		
	
		
			
				|  |  |  |  |     [self presentViewController:controller animated:YES completion:nil]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #pragma mark - UIScrollViewDelegate | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)scrollViewDidScroll:(UIScrollView *)scrollView | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     [self.phoneNumberTextField resignFirstResponder]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #pragma mark - Logging | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | + (NSString *)tag | 
		
	
	
		
			
				
					|  |  |  | 
 |