Block actions in message view for blocked group conversations.
* Add block status indicator view. // FREEBIE
This commit is contained in:
parent
8c347699bb
commit
9c9060203e
@ -7,6 +7,7 @@
|
||||
#import "AttachmentSharing.h"
|
||||
#import "BlockListUIUtils.h"
|
||||
#import "DebugUITableViewController.h"
|
||||
#import "BlockListViewController.h"
|
||||
#import "Environment.h"
|
||||
#import "FingerprintViewController.h"
|
||||
#import "FullImageViewController.h"
|
||||
@ -200,7 +201,7 @@ typedef enum : NSUInteger {
|
||||
@property (nonatomic) UILabel *navigationBarTitleLabel;
|
||||
@property (nonatomic) UILabel *navigationBarSubtitleLabel;
|
||||
@property (nonatomic) UIButton *attachButton;
|
||||
@property (nonatomic) UIButton *blockStateIndicator;
|
||||
@property (nonatomic) UIView *blockStateIndicator;
|
||||
|
||||
@property (nonatomic) CGFloat previousCollectionViewFrameWidth;
|
||||
|
||||
@ -530,10 +531,86 @@ typedef enum : NSUInteger {
|
||||
|
||||
- (void)ensureBlockStateIndicator
|
||||
{
|
||||
// This method should be called rarely, so it's simplest to discard and
|
||||
// rebuild the indicator view every time.
|
||||
[self.blockStateIndicator removeFromSuperview];
|
||||
self.blockStateIndicator = nil;
|
||||
|
||||
NSString *blockStateMessage = nil;
|
||||
if ([self isBlockedContactConversation]) {
|
||||
blockStateMessage = NSLocalizedString(@"MESSAGES_VIEW_CONTACT_BLOCKED",
|
||||
@"Indicates that this 1:1 conversation has been blocked.");
|
||||
} else {
|
||||
int blockedGroupMemberCount = [self blockedGroupMemberCount];
|
||||
if (blockedGroupMemberCount == 1) {
|
||||
blockStateMessage = [NSString stringWithFormat:NSLocalizedString(@"MESSAGES_VIEW_GROUP_1_MEMBER_BLOCKED_FORMAT",
|
||||
@"Indicates that a single member of this group has been blocked."),
|
||||
blockedGroupMemberCount];
|
||||
} else if (blockedGroupMemberCount > 1) {
|
||||
blockStateMessage = [NSString stringWithFormat:NSLocalizedString(@"MESSAGES_VIEW_GROUP_N_MEMBERS_BLOCKED_FORMAT",
|
||||
@"Indicates that some members of this group has been blocked. Embeds "
|
||||
@"{{the number of blocked user in this group}}."),
|
||||
blockedGroupMemberCount];
|
||||
}
|
||||
}
|
||||
|
||||
if (blockStateMessage) {
|
||||
UILabel *label = [UILabel new];
|
||||
label.font = [UIFont ows_mediumFontWithSize:14.f];
|
||||
label.text = blockStateMessage;
|
||||
label.textColor = [UIColor whiteColor];
|
||||
|
||||
UIView * blockStateIndicator = [UIView new];
|
||||
blockStateIndicator.backgroundColor = [UIColor ows_signalBrandBlueColor];
|
||||
blockStateIndicator.layer.cornerRadius = 2.5f;
|
||||
|
||||
// Use a shadow to "pop" the indicator above the other views.
|
||||
blockStateIndicator.layer.shadowColor = [UIColor blackColor].CGColor;
|
||||
blockStateIndicator.layer.shadowOffset = CGSizeMake(2, 3);
|
||||
blockStateIndicator.layer.shadowRadius = 2.f;
|
||||
blockStateIndicator.layer.shadowOpacity = 0.35f;
|
||||
|
||||
[blockStateIndicator addSubview:label];
|
||||
[label autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:5];
|
||||
[label autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:5];
|
||||
[label autoPinEdgeToSuperviewEdge:ALEdgeLeft withInset:15];
|
||||
[label autoPinEdgeToSuperviewEdge:ALEdgeRight withInset:15];
|
||||
|
||||
[blockStateIndicator addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self
|
||||
action:@selector(blockStateIndicatorWasTapped:)]];
|
||||
|
||||
[self.view addSubview:blockStateIndicator];
|
||||
[blockStateIndicator autoHCenterInSuperview];
|
||||
[blockStateIndicator autoPinToTopLayoutGuideOfViewController:self withInset:10];
|
||||
[self.view layoutSubviews];
|
||||
|
||||
self.blockStateIndicator = blockStateIndicator;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)blockStateIndicatorWasTapped:(UIGestureRecognizer *)sender {
|
||||
if (sender.state != UIGestureRecognizerStateRecognized) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ([self isBlockedContactConversation]) {
|
||||
// If this a blocked 1:1 conversation, offer to unblock the user.
|
||||
NSString *contactIdentifier = ((TSContactThread *)self.thread).contactIdentifier;
|
||||
[BlockListUIUtils showUnblockPhoneNumberActionSheet:contactIdentifier
|
||||
fromViewController:self
|
||||
blockingManager:_blockingManager
|
||||
contactsManager:_contactsManager
|
||||
completionBlock:nil];
|
||||
} else {
|
||||
// If this a group conversation with at least one blocked member,
|
||||
// Show the block list view.
|
||||
int blockedGroupMemberCount = [self blockedGroupMemberCount];
|
||||
if (blockedGroupMemberCount > 0) {
|
||||
BlockListViewController *vc = [[BlockListViewController alloc] init];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)isBlockedContactConversation
|
||||
{
|
||||
@ -544,6 +621,22 @@ typedef enum : NSUInteger {
|
||||
return [[_blockingManager blockedPhoneNumbers] containsObject:contactIdentifier];
|
||||
}
|
||||
|
||||
- (int)blockedGroupMemberCount
|
||||
{
|
||||
if (![self.thread isKindOfClass:[TSGroupThread class]]) {
|
||||
return 0;
|
||||
}
|
||||
TSGroupThread *groupThread = (TSGroupThread *)self.thread;
|
||||
int blockedMemberCount = 0;
|
||||
NSArray<NSString *> *blockedPhoneNumbers = [_blockingManager blockedPhoneNumbers];
|
||||
for (NSString *contactIdentifier in groupThread.groupModel.groupMemberIds) {
|
||||
if ([blockedPhoneNumbers containsObject:contactIdentifier]) {
|
||||
blockedMemberCount++;
|
||||
}
|
||||
}
|
||||
return blockedMemberCount;
|
||||
}
|
||||
|
||||
- (void)startReadTimer {
|
||||
self.readTimer = [NSTimer scheduledTimerWithTimeInterval:1
|
||||
target:self
|
||||
|
||||
@ -346,9 +346,6 @@
|
||||
/* No comment provided by engineer. */
|
||||
"ERROR_MESSAGE_WRONG_TRUSTED_IDENTITY_KEY" = "Safety number changed. Tap to verify.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"ERROR_WAS_DETECTED_TITLE" = "Bummer!";
|
||||
|
||||
/* during registration */
|
||||
"EXISTING_USER_REGISTRATION_ALERT_BODY" = "At this time Signal can only be active on one mobile device per phone number.";
|
||||
|
||||
@ -529,6 +526,15 @@
|
||||
/* message footer while attachment is uploading */
|
||||
"MESSAGE_STATUS_UPLOADING" = "Uploading...";
|
||||
|
||||
/* Indicates that this 1:1 conversation has been blocked. */
|
||||
"MESSAGES_VIEW_CONTACT_BLOCKED" = "This user is blocked";
|
||||
|
||||
/* Indicates that some members of this group has been blocked. Embeds {{the number of blocked user in this group}}. */
|
||||
"MESSAGES_VIEW_GROUP_1_MEMBER_BLOCKED_FORMAT" = "1 Blocked Member of this Group";
|
||||
|
||||
/* Indicates that some members of this group has been blocked. Embeds {{the number of blocked user in this group}}. */
|
||||
"MESSAGES_VIEW_GROUP_N_MEMBERS_BLOCKED_FORMAT" = "%d Blocked Members of this Group";
|
||||
|
||||
/* The subtitle for the messages view title indicates that the title can be tapped to access settings for this conversation. */
|
||||
"MESSAGES_VIEW_TITLE_SUBTITLE" = "Tap here for settings";
|
||||
|
||||
@ -970,9 +976,6 @@
|
||||
/* No comment provided by engineer. */
|
||||
"SUCCESSFUL_VERIFICATION_TITLE" = "Safety Number Verified!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"TIMEOUT_CONTACTS_DETAIL" = "We couldn't fetch an updated contact list from the server. Please try again later.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"TXT_CANCEL_TITLE" = "Cancel";
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user