// // Copyright (c) 2017 Open Whisper Systems. All rights reserved. // #import "BlockListUIUtils.h" #import "OWSContactsManager.h" #import "PhoneNumber.h" #import "Signal-Swift.h" #import #import #import #import 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 *)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 *)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 *)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 *)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