mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			321 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Objective-C
		
	
			
		
		
	
	
			321 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Objective-C
		
	
| //
 | |
| //  Copyright (c) 2017 Open Whisper Systems. All rights reserved.
 | |
| //
 | |
| 
 | |
| #import "BlockListUIUtils.h"
 | |
| #import "OWSContactsManager.h"
 | |
| #import "PhoneNumber.h"
 | |
| #import <SignalMessaging/SignalMessaging-Swift.h>
 | |
| #import <SignalServiceKit/Contact.h>
 | |
| #import <SignalServiceKit/OWSBlockingManager.h>
 | |
| #import <SignalServiceKit/SignalAccount.h>
 | |
| #import <SignalServiceKit/TSAccountManager.h>
 | |
| 
 | |
| NS_ASSUME_NONNULL_BEGIN
 | |
| 
 | |
| typedef void (^BlockAlertCompletionBlock)(UIAlertAction *action);
 | |
| 
 | |
| @implementation BlockListUIUtils
 | |
| 
 | |
| #pragma mark - Block
 | |
| 
 | |
| + (void)showBlockPhoneNumberActionSheet:(NSString *)phoneNumber
 | |
|                      fromViewController:(UIViewController *)fromViewController
 | |
|                         blockingManager:(OWSBlockingManager *)blockingManager
 | |
|                         contactsManager:(OWSContactsManager *)contactsManager
 | |
|                         completionBlock:(nullable BlockActionCompletionBlock)completionBlock
 | |
| {
 | |
|     NSString *displayName = [contactsManager displayNameForPhoneIdentifier:phoneNumber];
 | |
|     [self showBlockPhoneNumbersActionSheet:@[ phoneNumber ]
 | |
|                                displayName:displayName
 | |
|                         fromViewController:fromViewController
 | |
|                            blockingManager:blockingManager
 | |
|                            completionBlock:completionBlock];
 | |
| }
 | |
| 
 | |
| + (void)showBlockSignalAccountActionSheet:(SignalAccount *)signalAccount
 | |
|                        fromViewController:(UIViewController *)fromViewController
 | |
|                           blockingManager:(OWSBlockingManager *)blockingManager
 | |
|                           contactsManager:(OWSContactsManager *)contactsManager
 | |
|                           completionBlock:(nullable BlockActionCompletionBlock)completionBlock
 | |
| {
 | |
|     NSString *displayName = [contactsManager displayNameForSignalAccount:signalAccount];
 | |
|     [self showBlockPhoneNumbersActionSheet:@[ signalAccount.recipientId ]
 | |
|                                displayName:displayName
 | |
|                         fromViewController:fromViewController
 | |
|                            blockingManager:blockingManager
 | |
|                            completionBlock:completionBlock];
 | |
| }
 | |
| 
 | |
| + (void)showBlockPhoneNumbersActionSheet:(NSArray<NSString *> *)phoneNumbers
 | |
|                              displayName:(NSString *)displayName
 | |
|                       fromViewController:(UIViewController *)fromViewController
 | |
|                          blockingManager:(OWSBlockingManager *)blockingManager
 | |
|                          completionBlock:(nullable BlockActionCompletionBlock)completionBlock
 | |
| {
 | |
|     OWSAssert(phoneNumbers.count > 0);
 | |
|     OWSAssert(displayName.length > 0);
 | |
|     OWSAssert(fromViewController);
 | |
|     OWSAssert(blockingManager);
 | |
| 
 | |
|     NSString *localContactId = [TSAccountManager localNumber];
 | |
|     OWSAssert(localContactId.length > 0);
 | |
|     for (NSString *phoneNumber in phoneNumbers) {
 | |
|         OWSAssert(phoneNumber.length > 0);
 | |
| 
 | |
|         if ([localContactId isEqualToString:phoneNumber]) {
 | |
|             [self showOkAlertWithTitle:NSLocalizedString(@"BLOCK_LIST_VIEW_CANT_BLOCK_SELF_ALERT_TITLE",
 | |
|                                            @"The title of the 'You can't block yourself' alert.")
 | |
|                                message:NSLocalizedString(@"BLOCK_LIST_VIEW_CANT_BLOCK_SELF_ALERT_MESSAGE",
 | |
|                                            @"The message of the 'You can't block yourself' alert.")
 | |
|                     fromViewController:fromViewController
 | |
|                        completionBlock:^(UIAlertAction *action) {
 | |
|                            if (completionBlock) {
 | |
|                                completionBlock(NO);
 | |
|                            }
 | |
|                        }];
 | |
|             return;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     NSString *title = [NSString stringWithFormat:NSLocalizedString(@"BLOCK_LIST_BLOCK_TITLE_FORMAT",
 | |
|                                                      @"A format for the 'block user' action sheet title. Embeds {{the "
 | |
|                                                      @"blocked user's name or phone number}}."),
 | |
|                                 [self formatDisplayNameForAlertTitle:displayName]];
 | |
| 
 | |
|     UIAlertController *actionSheetController =
 | |
|         [UIAlertController alertControllerWithTitle:title
 | |
|                                             message:NSLocalizedString(@"BLOCK_BEHAVIOR_EXPLANATION",
 | |
|                                                         @"An explanation of the consequences of blocking another user.")
 | |
|                                      preferredStyle:UIAlertControllerStyleActionSheet];
 | |
| 
 | |
|     UIAlertAction *unblockAction = [UIAlertAction
 | |
|         actionWithTitle:NSLocalizedString(@"BLOCK_LIST_BLOCK_BUTTON", @"Button label for the 'block' button")
 | |
|                   style:UIAlertActionStyleDestructive
 | |
|                 handler:^(UIAlertAction *_Nonnull action) {
 | |
|                     [self blockPhoneNumbers:phoneNumbers
 | |
|                                 displayName:displayName
 | |
|                          fromViewController:fromViewController
 | |
|                             blockingManager:blockingManager
 | |
|                             completionBlock:^(UIAlertAction *ignore) {
 | |
|                                 if (completionBlock) {
 | |
|                                     completionBlock(YES);
 | |
|                                 }
 | |
|                             }];
 | |
|                 }];
 | |
|     [actionSheetController addAction:unblockAction];
 | |
| 
 | |
|     UIAlertAction *dismissAction = [UIAlertAction actionWithTitle:CommonStrings.cancelButton
 | |
|                                                             style:UIAlertActionStyleCancel
 | |
|                                                           handler:^(UIAlertAction *_Nonnull action) {
 | |
|                                                               if (completionBlock) {
 | |
|                                                                   completionBlock(NO);
 | |
|                                                               }
 | |
|                                                           }];
 | |
|     [actionSheetController addAction:dismissAction];
 | |
| 
 | |
|     [fromViewController presentViewController:actionSheetController animated:YES completion:nil];
 | |
| }
 | |
| 
 | |
| + (void)blockPhoneNumbers:(NSArray<NSString *> *)phoneNumbers
 | |
|               displayName:(NSString *)displayName
 | |
|        fromViewController:(UIViewController *)fromViewController
 | |
|           blockingManager:(OWSBlockingManager *)blockingManager
 | |
|           completionBlock:(BlockAlertCompletionBlock)completionBlock
 | |
| {
 | |
|     OWSAssert(phoneNumbers.count > 0);
 | |
|     OWSAssert(displayName.length > 0);
 | |
|     OWSAssert(fromViewController);
 | |
|     OWSAssert(blockingManager);
 | |
| 
 | |
|     for (NSString *phoneNumber in phoneNumbers) {
 | |
|         OWSAssert(phoneNumber.length > 0);
 | |
|         [blockingManager addBlockedPhoneNumber:phoneNumber];
 | |
|     }
 | |
| 
 | |
|     [self showOkAlertWithTitle:NSLocalizedString(
 | |
|                                    @"BLOCK_LIST_VIEW_BLOCKED_ALERT_TITLE", @"The title of the 'user blocked' alert.")
 | |
|                        message:[NSString
 | |
|                                    stringWithFormat:NSLocalizedString(@"BLOCK_LIST_VIEW_BLOCKED_ALERT_MESSAGE_FORMAT",
 | |
|                                                         @"The message format of the 'user blocked' "
 | |
|                                                         @"alert. Embeds {{the blocked user's name or phone number}}."),
 | |
|                                    [self formatDisplayNameForAlertMessage:displayName]]
 | |
|             fromViewController:fromViewController
 | |
|                completionBlock:completionBlock];
 | |
| }
 | |
| 
 | |
| #pragma mark - Unblock
 | |
| 
 | |
| + (void)showUnblockPhoneNumberActionSheet:(NSString *)phoneNumber
 | |
|                        fromViewController:(UIViewController *)fromViewController
 | |
|                           blockingManager:(OWSBlockingManager *)blockingManager
 | |
|                           contactsManager:(OWSContactsManager *)contactsManager
 | |
|                           completionBlock:(nullable BlockActionCompletionBlock)completionBlock
 | |
| {
 | |
|     NSString *displayName = [contactsManager displayNameForPhoneIdentifier:phoneNumber];
 | |
|     [self showUnblockPhoneNumbersActionSheet:@[ phoneNumber ]
 | |
|                                  displayName:displayName
 | |
|                           fromViewController:fromViewController
 | |
|                              blockingManager:blockingManager
 | |
|                              completionBlock:completionBlock];
 | |
| }
 | |
| 
 | |
| + (void)showUnblockSignalAccountActionSheet:(SignalAccount *)signalAccount
 | |
|                          fromViewController:(UIViewController *)fromViewController
 | |
|                             blockingManager:(OWSBlockingManager *)blockingManager
 | |
|                             contactsManager:(OWSContactsManager *)contactsManager
 | |
|                             completionBlock:(nullable BlockActionCompletionBlock)completionBlock
 | |
| {
 | |
|     NSString *displayName = [contactsManager displayNameForSignalAccount:signalAccount];
 | |
|     [self showUnblockPhoneNumbersActionSheet:@[ signalAccount.recipientId ]
 | |
|                                  displayName:displayName
 | |
|                           fromViewController:fromViewController
 | |
|                              blockingManager:blockingManager
 | |
|                              completionBlock:completionBlock];
 | |
| }
 | |
| 
 | |
| + (void)showUnblockPhoneNumbersActionSheet:(NSArray<NSString *> *)phoneNumbers
 | |
|                                displayName:(NSString *)displayName
 | |
|                         fromViewController:(UIViewController *)fromViewController
 | |
|                            blockingManager:(OWSBlockingManager *)blockingManager
 | |
|                            completionBlock:(nullable BlockActionCompletionBlock)completionBlock
 | |
| {
 | |
|     OWSAssert(phoneNumbers.count > 0);
 | |
|     OWSAssert(displayName.length > 0);
 | |
|     OWSAssert(fromViewController);
 | |
|     OWSAssert(blockingManager);
 | |
| 
 | |
|     NSString *title = [NSString stringWithFormat:NSLocalizedString(@"BLOCK_LIST_UNBLOCK_TITLE_FORMAT",
 | |
|                                                      @"A format for the 'unblock user' action sheet title. Embeds "
 | |
|                                                      @"{{the blocked user's name or phone number}}."),
 | |
|                                 [self formatDisplayNameForAlertTitle:displayName]];
 | |
| 
 | |
|     UIAlertController *actionSheetController =
 | |
|         [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleActionSheet];
 | |
| 
 | |
|     UIAlertAction *unblockAction = [UIAlertAction
 | |
|         actionWithTitle:NSLocalizedString(@"BLOCK_LIST_UNBLOCK_BUTTON", @"Button label for the 'unblock' button")
 | |
|                   style:UIAlertActionStyleDestructive
 | |
|                 handler:^(UIAlertAction *_Nonnull action) {
 | |
|                     [BlockListUIUtils unblockPhoneNumbers:phoneNumbers
 | |
|                                               displayName:displayName
 | |
|                                        fromViewController:fromViewController
 | |
|                                           blockingManager:blockingManager
 | |
|                                           completionBlock:^(UIAlertAction *ignore) {
 | |
|                                               if (completionBlock) {
 | |
|                                                   completionBlock(NO);
 | |
|                                               }
 | |
|                                           }];
 | |
|                 }];
 | |
|     [actionSheetController addAction:unblockAction];
 | |
| 
 | |
|     UIAlertAction *dismissAction = [UIAlertAction actionWithTitle:CommonStrings.cancelButton
 | |
|                                                             style:UIAlertActionStyleCancel
 | |
|                                                           handler:^(UIAlertAction *_Nonnull action) {
 | |
|                                                               if (completionBlock) {
 | |
|                                                                   completionBlock(YES);
 | |
|                                                               }
 | |
|                                                           }];
 | |
|     [actionSheetController addAction:dismissAction];
 | |
| 
 | |
|     [fromViewController presentViewController:actionSheetController animated:YES completion:nil];
 | |
| }
 | |
| 
 | |
| + (void)unblockPhoneNumbers:(NSArray<NSString *> *)phoneNumbers
 | |
|                 displayName:(NSString *)displayName
 | |
|          fromViewController:(UIViewController *)fromViewController
 | |
|             blockingManager:(OWSBlockingManager *)blockingManager
 | |
|             completionBlock:(BlockAlertCompletionBlock)completionBlock
 | |
| {
 | |
|     OWSAssert(phoneNumbers.count > 0);
 | |
|     OWSAssert(displayName.length > 0);
 | |
|     OWSAssert(fromViewController);
 | |
|     OWSAssert(blockingManager);
 | |
| 
 | |
|     for (NSString *phoneNumber in phoneNumbers) {
 | |
|         OWSAssert(phoneNumber.length > 0);
 | |
|         [blockingManager removeBlockedPhoneNumber:phoneNumber];
 | |
|     }
 | |
| 
 | |
|     [self showOkAlertWithTitle:NSLocalizedString(@"BLOCK_LIST_VIEW_UNBLOCKED_ALERT_TITLE",
 | |
|                                    @"The title of the 'user unblocked' alert.")
 | |
|                        message:[NSString
 | |
|                                    stringWithFormat:NSLocalizedString(@"BLOCK_LIST_VIEW_UNBLOCKED_ALERT_MESSAGE_FORMAT",
 | |
|                                                         @"The message format of the 'user unblocked' "
 | |
|                                                         @"alert. Embeds {{the blocked user's name or phone number}}."),
 | |
|                                    [self formatDisplayNameForAlertMessage:displayName]]
 | |
|             fromViewController:fromViewController
 | |
|                completionBlock:completionBlock];
 | |
| }
 | |
| 
 | |
| + (void)showBlockFailedAlert:(UIViewController *)fromViewController
 | |
|              completionBlock:(BlockAlertCompletionBlock)completionBlock
 | |
| {
 | |
|     OWSAssert(fromViewController);
 | |
| 
 | |
|     [self showOkAlertWithTitle:NSLocalizedString(@"BLOCK_LIST_VIEW_BLOCK_FAILED_ALERT_TITLE",
 | |
|                                    @"The title of the 'block user failed' alert.")
 | |
|                        message:NSLocalizedString(@"BLOCK_LIST_VIEW_BLOCK_FAILED_ALERT_MESSAGE",
 | |
|                                    @"The title of the 'block user failed' alert.")
 | |
|             fromViewController:fromViewController
 | |
|                completionBlock:completionBlock];
 | |
| }
 | |
| 
 | |
| + (void)showUnblockFailedAlert:(UIViewController *)fromViewController
 | |
|                completionBlock:(BlockAlertCompletionBlock)completionBlock
 | |
| {
 | |
|     OWSAssert(fromViewController);
 | |
| 
 | |
|     [self showOkAlertWithTitle:NSLocalizedString(@"BLOCK_LIST_VIEW_UNBLOCK_FAILED_ALERT_TITLE",
 | |
|                                    @"The title of the 'unblock user failed' alert.")
 | |
|                        message:NSLocalizedString(@"BLOCK_LIST_VIEW_UNBLOCK_FAILED_ALERT_MESSAGE",
 | |
|                                    @"The title of the 'unblock user failed' alert.")
 | |
|             fromViewController:fromViewController
 | |
|                completionBlock:completionBlock];
 | |
| }
 | |
| 
 | |
| #pragma mark - UI
 | |
| 
 | |
| + (void)showOkAlertWithTitle:(NSString *)title
 | |
|                      message:(NSString *)message
 | |
|           fromViewController:(UIViewController *)fromViewController
 | |
|              completionBlock:(BlockAlertCompletionBlock)completionBlock
 | |
| {
 | |
|     OWSAssert(title.length > 0);
 | |
|     OWSAssert(message.length > 0);
 | |
|     OWSAssert(fromViewController);
 | |
| 
 | |
|     UIAlertController *controller =
 | |
|         [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
 | |
| 
 | |
|     [controller addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
 | |
|                                                    style:UIAlertActionStyleDefault
 | |
|                                                  handler:completionBlock]];
 | |
|     [fromViewController presentViewController:controller animated:YES completion:nil];
 | |
| }
 | |
| 
 | |
| + (NSString *)formatDisplayNameForAlertTitle:(NSString *)displayName
 | |
| {
 | |
|     return [self formatDisplayName:displayName withMaxLength:20];
 | |
| }
 | |
| 
 | |
| + (NSString *)formatDisplayNameForAlertMessage:(NSString *)displayName
 | |
| {
 | |
|     return [self formatDisplayName:displayName withMaxLength:127];
 | |
| }
 | |
| 
 | |
| + (NSString *)formatDisplayName:(NSString *)displayName withMaxLength:(NSUInteger)maxLength
 | |
| {
 | |
|     OWSAssert(displayName.length > 0);
 | |
| 
 | |
|     if (displayName.length > maxLength) {
 | |
|         return [[displayName substringToIndex:maxLength] stringByAppendingString:@"…"];
 | |
|     }
 | |
| 
 | |
|     return displayName;
 | |
| }
 | |
| 
 | |
| @end
 | |
| 
 | |
| NS_ASSUME_NONNULL_END
 |