From 638dfae6682a7c00d27399985cb02386da195404 Mon Sep 17 00:00:00 2001 From: Christine Corbett Date: Mon, 26 Jan 2015 15:20:11 -1000 Subject: [PATCH] messaging view and group creation fixes: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Create button should be btnCompose--white • Add people to be a tableview header (ask @helveticade for creatives) • Send button = btnSend--blue • Attachments button = btnAttachments--blue • message footer changes from call to message as input • Remove more button • Empty State update with asset and new copy • Default group name should be 'New Group' (UI only) • loading view • Update tab bar items with revised PDFs • Blue outline around avatar-less contacts • Replace swipe left actions with btnDelete--white asset • Replace swipe right buttons with cellBtnMoveToArchive--blue and cellBtnMoveToInbox--blue respectively • Done icon replaced with btnSignal in settings • Settings: Swap blue and grey for Registered Number and Change (change doesn't look like a button) • Settings: UI Switch on should be Signal Blue. • Disable search ui + group button while downloading contacts • new group: Create button should be btnCompose--white • new group: Add people to be a tableview header --- Podfile.lock | 2 +- Pods | 2 +- Signal/src/AppDelegate.m | 2 + Signal/src/Storyboard/Storyboard.storyboard | 113 ++++++++++++---- .../src/view controllers/InboxTableViewCell.m | 17 ++- .../view controllers/InboxTableViewCell.xib | 9 +- .../MessageComposeTableViewController.m | 31 ++++- .../view controllers/MessagesViewController.m | 128 +++++++++++++----- .../view controllers/NewGroupViewController.m | 38 ++---- .../UITests/SignalsViewController.h | 2 + .../UITests/SignalsViewController.m | 60 ++------ 11 files changed, 259 insertions(+), 145 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index 0b42c1c06..78f653860 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -97,7 +97,7 @@ CHECKOUT OPTIONS: :commit: cf63307d5e3833b16caa9a07f3b5ea06359913f9 :git: https://github.com/corbett/APDropDownNavToolbar.git JSQMessagesViewController: - :commit: 184f53b07b6a80709b9801d605f666fd61e297fb + :commit: c8262eee36cf84eded334062dc80e1f2a1c495ab :git: https://github.com/WhisperSystems/JSQMessagesViewController SocketRocket: :commit: 954750c018 diff --git a/Pods b/Pods index 19ec30e1b..8bf6fdd6c 160000 --- a/Pods +++ b/Pods @@ -1 +1 @@ -Subproject commit 19ec30e1b24355b4115a21b6895a49f378ad40c4 +Subproject commit 8bf6fdd6c8a4c4e48c41814734e8709ba2396e6f diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 74b1fadd0..9399af72e 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -315,6 +315,8 @@ static NSString* const kCallSegue = @"2.0_6.0_Call_Segue"; [UIColor clearColor], UITextAttributeTextShadowColor, [NSValue valueWithUIOffset:UIOffsetMake(-1, 0)], UITextAttributeTextShadowOffset, nil]; + [[UISwitch appearance] setOnTintColor:[UIColor ows_materialBlueColor]]; + [[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes]; } diff --git a/Signal/src/Storyboard/Storyboard.storyboard b/Signal/src/Storyboard/Storyboard.storyboard index 7f6d4653c..4343e4311 100755 --- a/Signal/src/Storyboard/Storyboard.storyboard +++ b/Signal/src/Storyboard/Storyboard.storyboard @@ -201,6 +201,13 @@ + + + + + + + @@ -216,6 +223,9 @@ + + + @@ -225,6 +235,9 @@ + + + @@ -232,7 +245,11 @@ + + + + @@ -241,45 +258,56 @@ + + - - - + + + + + + + + - - - + + + + + + + @@ -307,6 +335,7 @@ + @@ -4569,7 +4598,7 @@ A0 09 9A FF A8 8A 09 99 - + @@ -4613,7 +4642,7 @@ A0 09 9A FF A8 8A 09 99 - + @@ -5159,9 +5188,10 @@ A0 09 9A FF A8 8A 09 99 - + + - + @@ -5481,24 +5511,52 @@ A0 09 9A FF A8 8A 09 99 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - @@ -5636,6 +5694,7 @@ A0 09 9A FF A8 8A 09 99 + diff --git a/Signal/src/view controllers/InboxTableViewCell.m b/Signal/src/view controllers/InboxTableViewCell.m index 2f53df174..95156c2c3 100644 --- a/Signal/src/view controllers/InboxTableViewCell.m +++ b/Signal/src/view controllers/InboxTableViewCell.m @@ -28,8 +28,6 @@ if (self) { _scrollView.contentSize = CGSizeMake(CGRectGetWidth(_contentContainerView.bounds), CGRectGetHeight(_scrollView.frame)); - - [UIUtil applyRoundedBorderToImageView:&_contactPictureView]; _scrollView.contentOffset = CGPointMake(CGRectGetWidth(_archiveView.frame), 0); _deleteImageView.image = [_deleteImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; @@ -48,8 +46,11 @@ _nameLabel.text = thread.name; _snippetLabel.text = thread.lastMessageLabel; _timeLabel.attributedText = [self dateAttributedString:thread.lastMessageDate]; - if([thread isKindOfClass:[TSGroupThread class]] ) { + if([thread isKindOfClass:[TSGroupThread class]]) { _contactPictureView.image = ((TSGroupThread*)thread).groupModel.groupImage!=nil ? ((TSGroupThread*)thread).groupModel.groupImage : [UIImage imageNamed:@"empty-group-avatar"]; + if([_nameLabel.text length]==0) { + _nameLabel.text = @"New Group"; + } } else { NSMutableString *initials = [NSMutableString string]; @@ -64,6 +65,14 @@ } UIImage* image = [[JSQMessagesAvatarImageFactory avatarImageWithUserInitials:initials backgroundColor:[UIColor whiteColor] textColor:[UIColor ows_materialBlueColor] font:[UIFont ows_regularFontWithSize:36.0] diameter:100] avatarImage]; _contactPictureView.image = thread.image!=nil ? thread.image : image; + if(thread.image==nil) { + UIImage *overlayImage = [UIImage imageNamed:@"circContact--empty"]; + UIImageView *overlayImageView = [[UIImageView alloc] initWithImage:overlayImage]; + [_contactPictureView addSubview:overlayImageView]; + } + else { + [UIUtil applyRoundedBorderToImageView:&_contactPictureView]; + } } self.separatorInset = UIEdgeInsetsMake(0,_contactPictureView.frame.size.width*1.5f, 0, 0); @@ -75,7 +84,7 @@ { switch (state) { case kArchiveState: - _archiveImageView.image = [[UIImage imageNamed:@"reply"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; + _archiveImageView.image = [[UIImage imageNamed:@"cellBtnMoveToInbox--blue"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; break; case kInboxState: break; diff --git a/Signal/src/view controllers/InboxTableViewCell.xib b/Signal/src/view controllers/InboxTableViewCell.xib index e329b744c..b7ae941c5 100644 --- a/Signal/src/view controllers/InboxTableViewCell.xib +++ b/Signal/src/view controllers/InboxTableViewCell.xib @@ -17,8 +17,9 @@ - + + @@ -29,7 +30,7 @@ - + @@ -200,8 +201,8 @@ - + + - diff --git a/Signal/src/view controllers/MessageComposeTableViewController.m b/Signal/src/view controllers/MessageComposeTableViewController.m index 22b7863d7..14200de58 100644 --- a/Signal/src/view controllers/MessageComposeTableViewController.m +++ b/Signal/src/view controllers/MessageComposeTableViewController.m @@ -31,7 +31,8 @@ } @property (nonatomic, strong) UISearchController *searchController; - +@property (nonatomic, strong) UIActivityIndicatorView *activityIndicator; +@property (nonatomic, strong) UIBarButtonItem *addGroup; @end @implementation MessageComposeTableViewController @@ -39,11 +40,26 @@ - (void)viewDidLoad { [super viewDidLoad]; [self.navigationController.navigationBar setTranslucent:NO]; - [self initializeSearch]; contacts = [[Environment getCurrent] contactsManager].textSecureContacts; searchResults = contacts; + [self initializeSearch]; + self.searchController.searchBar.hidden = NO; + + + + UIView* loadingView = [[UIView alloc] initWithFrame:self.tableView.frame]; + UIImageView *loadingImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"uiEmpty"]]; + [loadingImageView setBackgroundColor:[UIColor whiteColor]]; + [loadingImageView setContentMode:UIViewContentModeCenter]; + [loadingImageView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; + [loadingImageView setFrame:self.tableView.frame]; + [loadingView addSubview:loadingImageView]; + + self.tableView.backgroundView = loadingView; + self.tableView.backgroundView.opaque = YES; + self.tableView.tableFooterView = [[UIView alloc]initWithFrame:CGRectZero]; } @@ -236,6 +252,17 @@ } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + if([contacts count] == 0) { + self.tableView.backgroundView.hidden = NO; + self.searchController.searchBar.hidden = YES; + _addGroup = self.navigationItem.rightBarButtonItem!=nil ? _addGroup : self.navigationItem.rightBarButtonItem; + self.navigationItem.rightBarButtonItem = nil; + } + else { + self.tableView.backgroundView.hidden = YES; + self.searchController.searchBar.hidden = NO; + self.navigationItem.rightBarButtonItem = self.navigationItem.rightBarButtonItem!=nil ? self.navigationItem.rightBarButtonItem : _addGroup; + } if (self.searchController.active) { return (NSInteger)[searchResults count]; diff --git a/Signal/src/view controllers/MessagesViewController.m b/Signal/src/view controllers/MessagesViewController.m index e8b45b20e..f8f751387 100644 --- a/Signal/src/view controllers/MessagesViewController.m +++ b/Signal/src/view controllers/MessagesViewController.m @@ -89,6 +89,9 @@ typedef enum : NSUInteger { @property (nonatomic, strong) TSVideoAttachmentAdapter *currentMediaAdapter; @property (nonatomic, retain) NSTimer *readTimer; +@property (nonatomic, retain) UIButton *callButton; +@property (nonatomic, retain) UIButton *messageButton; +@property (nonatomic, retain) UIButton *attachButton; @property (nonatomic, retain) NSIndexPath *lastDeliveredMessageIndexPath; @@ -131,11 +134,29 @@ typedef enum : NSUInteger { [self inputToolbar].hidden= YES; // user has requested they leave the group. further sends disallowed self.navigationItem.rightBarButtonItem = nil; } + else if(![self isTextSecureReachable] ){ + [self inputToolbar].hidden= YES; // only RedPhone + self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"btnPhone--white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(callAction)];; + + } } - (void)viewDidLoad { [super viewDidLoad]; [self.navigationController.navigationBar setTranslucent:NO]; + _callButton = [[UIButton alloc] init]; + [_callButton setBackgroundImage:[UIImage imageNamed:@"btnPhone--blue"] forState:UIControlStateNormal]; + [_callButton addTarget:self action:@selector(callAction) forControlEvents:UIControlEventTouchUpInside]; + [_callButton setFrame:CGRectMake(0, 0, 30, 30)]; + + _messageButton = [[UIButton alloc] init]; + [_messageButton setBackgroundImage:[UIImage imageNamed:@"btnSend--blue"] forState:UIControlStateNormal]; + [_messageButton setFrame:CGRectMake(0, 0, 30, 30)]; + + _attachButton = [[UIButton alloc] init]; + [_attachButton setBackgroundImage:[UIImage imageNamed:@"btnAttachments--blue"] forState:UIControlStateNormal]; + [_attachButton setFrame:CGRectMake(0, 0, 30, 30)]; + [super viewDidLoad]; [self markAllMessagesAsRead]; @@ -167,8 +188,15 @@ typedef enum : NSUInteger { -(void) initializeTextView { [self.inputToolbar.contentView.textView setFont:[UIFont ows_regularFontWithSize:17.f]]; - [self.inputToolbar.contentView.rightBarButtonItem.titleLabel setFont:[UIFont ows_mediumFontWithSize:15.f]]; - [self.inputToolbar.contentView.rightBarButtonItem setTitleColor:[UIColor ows_materialBlueColor] forState:UIControlStateNormal]; + self.inputToolbar.contentView.leftBarButtonItem = _attachButton; + + if(!isGroupConversation&& [self isRedPhoneReachable] && ![((TSContactThread*)_thread).contactIdentifier isEqualToString:[SignalKeyingStorage.localNumber toE164]]) { + self.inputToolbar.contentView.rightBarButtonItem = _callButton; + self.inputToolbar.contentView.rightBarButtonItem.enabled = YES; + } + else { + self.inputToolbar.contentView.rightBarButtonItem = _messageButton; + } } -(void)viewWillAppear:(BOOL)animated @@ -234,56 +262,46 @@ typedef enum : NSUInteger { - (IBAction)didSelectShow:(id)sender { + if (isGroupConversation) { + UIBarButtonItem *spaceEdge = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; - UIBarButtonItem *spaceEdge = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; + spaceEdge.width = 40; - spaceEdge.width = 40; + UIBarButtonItem *spaceMiddleIcons = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; + spaceMiddleIcons.width = 61; - UIBarButtonItem *spaceMiddleIcons = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; - spaceMiddleIcons.width = 61; - - UIBarButtonItem *spaceMiddleWords = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; + UIBarButtonItem *spaceMiddleWords = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; - if (!isGroupConversation) { - //UIBarButtonItem* contactAddOrLaunch = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"contact-add@1x"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:nil]; - - UIBarButtonItem* contactSecurity = [[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"contact-security@1x"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(showFingerprint)]; - - - if ([self isRedPhoneReachable] && ![((TSContactThread*)_thread).contactIdentifier isEqualToString:[SignalKeyingStorage.localNumber toE164]]) { - UIBarButtonItem * callButton = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"contact-call@1x"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(callAction)]; - self.navController.dropDownToolbar.items = @[spaceEdge, callButton,spaceMiddleWords, contactSecurity, spaceEdge]; - } - else { - self.navController.dropDownToolbar.items = @[spaceMiddleWords, contactSecurity, spaceMiddleWords]; - } - } - else { + UIBarButtonItem *groupUpdateButton = [[UIBarButtonItem alloc] initWithTitle:@"Update" style:UIBarButtonItemStylePlain target:self action:@selector(updateGroup)]; UIBarButtonItem *groupLeaveButton = [[UIBarButtonItem alloc] initWithTitle:@"Leave" style:UIBarButtonItemStylePlain target:self action:@selector(leaveGroup)]; UIBarButtonItem *showGroupMembersButton = [[UIBarButtonItem alloc] initWithTitle:@"Members" style:UIBarButtonItemStylePlain target:self action:@selector(showGroupMembers)]; self.navController.dropDownToolbar.items =@[spaceEdge, groupUpdateButton, spaceMiddleWords, groupLeaveButton, spaceMiddleWords, showGroupMembersButton, spaceEdge]; -} - for(UIButton *button in self.navController.dropDownToolbar.items) { - [button setTintColor:[UIColor ows_materialBlueColor]]; + + for(UIButton *button in self.navController.dropDownToolbar.items) { + [button setTintColor:[UIColor ows_materialBlueColor]]; + } + if(self.navController.isDropDownVisible){ + [self.navController hideDropDown:sender]; + } + else{ + [self.navController showDropDown:sender]; + } + // Can also toggle toolbar from current state + // [self.navController toggleToolbar:sender]; + [self setNavigationTitle]; } - if(self.navController.isDropDownVisible){ - [self.navController hideDropDown:sender]; - } - else{ - [self.navController showDropDown:sender]; - } - // Can also toggle toolbar from current state - // [self.navController toggleToolbar:sender]; - [self setNavigationTitle]; } -(void) setNavigationTitle { NSString* navTitle = !isGroupConversation ? self.thread.name : ((TSGroupThread*)self.thread).groupModel.groupName; + if(isGroupConversation && [navTitle length]==0) { + navTitle = @"New Group"; + } self.navController.activeNavigationBarTitle = nil; self.title = navTitle; } @@ -291,8 +309,11 @@ typedef enum : NSUInteger { -(void)initializeToolbars { self.navController = (APNavigationController*)self.navigationController; - //self.navController.activeBarButtonTitle = @"Hide"; + if(!isGroupConversation) { + self.navigationItem.rightBarButtonItem = nil; + } [self setNavigationTitle]; + [self hideInputIfNeeded]; } @@ -342,24 +363,52 @@ typedef enum : NSUInteger { return [[Environment getCurrent].contactsManager isPhoneNumberRegisteredWithRedPhone:[self phoneNumberForThread]]; } + +-(BOOL)isTextSecureReachable { + if(isGroupConversation) { + return YES; + } + else { + PhoneNumber *number = [self phoneNumberForThread]; + Contact *contact = [[Environment.getCurrent contactsManager] latestContactForPhoneNumber:number]; + return [contact isTextSecureContact]; + } +} + -(PhoneNumber*)phoneNumberForThread { NSString * contactId = [(TSContactThread*)self.thread contactIdentifier]; return [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:contactId]; } + + + -(void)callAction { if ([self isRedPhoneReachable]) { PhoneNumber *number = [self phoneNumberForThread]; Contact *contact = [[Environment.getCurrent contactsManager] latestContactForPhoneNumber:number]; - [Environment.phoneManager initiateOutgoingCallToContact:contact atRemoteNumber:number]; } else { DDLogWarn(@"Tried to initiate a call but contact has no RedPhone identifier"); } } +- (void)textViewDidChange:(UITextView *)textView { + if([textView.text length]>0) { + self.inputToolbar.contentView.rightBarButtonItem = _messageButton; + self.inputToolbar.contentView.rightBarButtonItem.enabled = YES; + } + else if(!isGroupConversation) { + self.inputToolbar.contentView.rightBarButtonItem = _callButton; + self.inputToolbar.contentView.rightBarButtonItem.enabled = YES; + } + else { + self.inputToolbar.contentView.rightBarButtonItem.enabled = NO; + } + +} #pragma mark - JSQMessagesViewController method overrides - (void)didPressSendButton:(UIButton *)button @@ -376,9 +425,14 @@ typedef enum : NSUInteger { [[TSMessagesManager sharedManager] sendMessage:message inThread:self.thread]; [self finishSendingMessage]; } + if(!isGroupConversation) { + self.inputToolbar.contentView.rightBarButtonItem = _callButton; + self.inputToolbar.contentView.rightBarButtonItem.enabled = YES; + } } + #pragma mark - JSQMessages CollectionView DataSource - (id)collectionView:(JSQMessagesCollectionView *)collectionView messageDataForItemAtIndexPath:(NSIndexPath *)indexPath diff --git a/Signal/src/view controllers/NewGroupViewController.m b/Signal/src/view controllers/NewGroupViewController.m index b2395d0d9..d99b8d72f 100644 --- a/Signal/src/view controllers/NewGroupViewController.m +++ b/Signal/src/view controllers/NewGroupViewController.m @@ -47,6 +47,9 @@ static NSString* const kUnwindToMessagesViewSegue = @"UnwindToMessagesViewSegue" contacts = [Environment getCurrent].contactsManager.textSecureContacts; + + self.tableView.tableHeaderView.frame = CGRectMake(0, 0, 400, 44); + self.tableView.tableHeaderView = self.tableView.tableHeaderView; contacts = [contacts filter:^int(Contact* contact) { for(PhoneNumber* number in [contact parsedPhoneNumbers]) { if([[number toE164] isEqualToString:[SignalKeyingStorage.localNumber toE164]]) { @@ -61,7 +64,7 @@ static NSString* const kUnwindToMessagesViewSegue = @"UnwindToMessagesViewSegue" [self initializeKeyboardHandlers]; if(_thread==nil) { - self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Create" style:UIBarButtonItemStylePlain target:self action:@selector(createGroup)]; + self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"add-conversation"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(createGroup)]; self.navigationItem.title = @"New Group"; } @@ -73,7 +76,7 @@ static NSString* const kUnwindToMessagesViewSegue = @"UnwindToMessagesViewSegue" [self setupGroupImageButton:_thread.groupModel.groupImage]; } // Select the contacts already selected: - for (NSInteger r = 0; r < [_tableView numberOfRowsInSection:0]-1; r++) { + for (NSInteger r = 0; r < [_tableView numberOfRowsInSection:0]; r++) { // TODOGROUP this will not scale well NSMutableSet *usersInGroup = [NSMutableSet setWithArray:_thread.groupModel.groupMemberIds]; NSMutableArray *contactPhoneNumbers = [[NSMutableArray alloc] init]; @@ -82,7 +85,7 @@ static NSString* const kUnwindToMessagesViewSegue = @"UnwindToMessagesViewSegue" } [usersInGroup intersectSet:[NSSet setWithArray:contactPhoneNumbers]]; if([usersInGroup count]>0) { - [_tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:(r+1) inSection:0] + [_tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:r inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone]; } @@ -131,7 +134,7 @@ static NSString* const kUnwindToMessagesViewSegue = @"UnwindToMessagesViewSegue" -(void)updateGroup { NSMutableArray* mut = [[NSMutableArray alloc]init]; for (NSIndexPath* idx in _tableView.indexPathsForSelectedRows) { - [mut addObjectsFromArray:[[contacts objectAtIndex:(NSUInteger)idx.row-1] textSecureIdentifiers]]; + [mut addObjectsFromArray:[[contacts objectAtIndex:(NSUInteger)idx.row] textSecureIdentifiers]]; } [mut addObject:[SignalKeyingStorage.localNumber toE164]]; // Also add the originator _groupModel = [[TSGroupModel alloc] initWithTitle:_nameGroupTextField.text memberIds:[NSMutableArray arrayWithArray:[[NSSet setWithArray:mut] allObjects]] image:_thread.groupModel.groupImage groupId:_thread.groupModel.groupId]; @@ -146,7 +149,7 @@ static NSString* const kUnwindToMessagesViewSegue = @"UnwindToMessagesViewSegue" NSMutableArray* mut = [[NSMutableArray alloc]init]; for (NSIndexPath* idx in _tableView.indexPathsForSelectedRows) { - [mut addObjectsFromArray:[[contacts objectAtIndex:(NSUInteger)idx.row-1] textSecureIdentifiers]]; + [mut addObjectsFromArray:[[contacts objectAtIndex:(NSUInteger)idx.row] textSecureIdentifiers]]; } // Also add the originator [mut addObject:[SignalKeyingStorage.localNumber toE164]]; @@ -249,7 +252,7 @@ static NSString* const kUnwindToMessagesViewSegue = @"UnwindToMessagesViewSegue" } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return (NSInteger)[contacts count]+1; + return (NSInteger)[contacts count]; } @@ -259,19 +262,12 @@ static NSString* const kUnwindToMessagesViewSegue = @"UnwindToMessagesViewSegue" if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: indexPath.row == 0 ? @"HeaderCell" : @"GroupSearchCell"]; + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"GroupSearchCell"]; } - if (indexPath.row > 0) { - NSUInteger row = (NSUInteger)indexPath.row; - Contact* contact = contacts[row-1]; - - cell.textLabel.attributedText = [self attributedStringForContact:contact inCell:cell]; + NSUInteger row = (NSUInteger)indexPath.row; + Contact* contact = contacts[row]; - } else { - cell.textLabel.text = @"Add People:"; - cell.textLabel.textColor = [UIColor lightGrayColor]; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - } + cell.textLabel.attributedText = [self attributedStringForContact:contact inCell:cell]; tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; @@ -282,18 +278,14 @@ static NSString* const kUnwindToMessagesViewSegue = @"UnwindToMessagesViewSegue" -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath]; - if(indexPath.row>0) { - cell.accessoryType = UITableViewCellAccessoryCheckmark; - } + cell.accessoryType = UITableViewCellAccessoryCheckmark; } -(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath]; - if(indexPath.row>0) { - cell.accessoryType = UITableViewCellAccessoryNone; - } + cell.accessoryType = UITableViewCellAccessoryNone; } #pragma mark - Text Field Delegate diff --git a/Signal/src/view controllers/UITests/SignalsViewController.h b/Signal/src/view controllers/UITests/SignalsViewController.h index 4224c24f9..920771322 100644 --- a/Signal/src/view controllers/UITests/SignalsViewController.h +++ b/Signal/src/view controllers/UITests/SignalsViewController.h @@ -21,6 +21,8 @@ @property (nonatomic, retain) IBOutlet UIButton *inboxButton; @property (nonatomic, retain) IBOutlet UIButton *archiveButton; @property (nonatomic, retain) IBOutlet UILabel *inboxCountLabel; +@property (nonatomic, strong) IBOutlet UIImageView *emptyBoxImage; + @property (nonatomic, retain) CallState* latestCall; -(IBAction)selectedInbox:(id)sender; diff --git a/Signal/src/view controllers/UITests/SignalsViewController.m b/Signal/src/view controllers/UITests/SignalsViewController.m index b303da8b1..557cb42d5 100644 --- a/Signal/src/view controllers/UITests/SignalsViewController.m +++ b/Signal/src/view controllers/UITests/SignalsViewController.m @@ -40,8 +40,6 @@ static NSString* const kCallSegue = @"2.0_6.0_Call_Segue"; static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; @interface SignalsViewController () -@property (nonatomic, strong) UILabel *emptyViewLabel; -@property (nonatomic, strong) UIImageView *emptyBoxImage; @property (nonatomic, strong) YapDatabaseConnection *editingDbConnection; @property (nonatomic, strong) YapDatabaseConnection *uiDatabaseConnection; @property (nonatomic, strong) YapDatabaseViewMappings *threadMappings; @@ -82,7 +80,7 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - [self updateTableViewHeader]; + [self checkIfEmptyView]; } - (void)viewDidAppear:(BOOL)animated{ @@ -181,7 +179,7 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; [thread removeWithTransaction:transaction]; }]; _inboxCount -= (self.viewingThreadsIn == kArchiveState) ? 1 : 0; - [self updateTableViewHeader]; + [self checkIfEmptyView]; } - (void)tableViewCellTappedArchive:(InboxTableViewCell*)cell { @@ -192,7 +190,7 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; [self.editingDbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [thread saveWithTransaction:transaction]; }]; - [self updateTableViewHeader]; + [self checkIfEmptyView]; } @@ -260,7 +258,7 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; [self.threadMappings updateWithTransaction:transaction]; }]; [self.tableView reloadData]; - [self updateTableViewHeader]; + [self checkIfEmptyView]; } @@ -355,7 +353,7 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; [self.tableView endUpdates]; [self updateInboxCountLabel]; - [self updateTableViewHeader]; + [self checkIfEmptyView]; } @@ -367,46 +365,16 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; } -- (void)updateTableViewHeader{ - _emptyViewLabel = nil; - _emptyBoxImage = nil; - self.tableView.tableHeaderView = nil; - // Something like this can be used to put in a tutorial image. currently malformatted. -// if (userHasNeverSentMessage) { -// _emptyBoxImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"first-screen"] highlightedImage:[UIImage imageNamed:@"first-screen"]]; -// self.tableView.tableHeaderView = _emptyBoxImage; -// } -// else - if ((self.viewingThreadsIn == kInboxState && [self.threadMappings numberOfItemsInGroup:TSInboxGroup]==0) || - (self.viewingThreadsIn == kArchiveState && [self.threadMappings numberOfItemsInGroup:TSArchiveGroup]==0)) { - CGRect r = CGRectMake(0, 60, 300, 70); - _emptyViewLabel = [[UILabel alloc]initWithFrame:r]; - _emptyViewLabel.textColor = [UIColor grayColor]; - _emptyViewLabel.font = [UIFont ows_regularFontWithSize:18.f]; - _emptyViewLabel.textAlignment = NSTextAlignmentCenter; - _emptyViewLabel.numberOfLines = 2; - - NSString* firstLine = @""; - NSString* secondLine = @""; +- (void)checkIfEmptyView{ + [_tableView setHidden:NO]; + if (self.viewingThreadsIn == kInboxState && [self.threadMappings numberOfItemsInGroup:TSInboxGroup]==0) { + _emptyBoxImage.image = [UIImage imageNamed:@"uiEmptyContact"]; + [_tableView setHidden:YES]; - if(self.viewingThreadsIn == kInboxState) { - // Check if this is the first launch - firstLine = @"Done. Done. Done."; - secondLine = @"Tip: add a conversation as a reminder."; - } - else { - firstLine = @"Squeaky Freaking Clean."; - secondLine = @"None. Zero. Zilch. Nada."; - } - NSMutableAttributedString *fullLabelString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@\n%@",firstLine,secondLine]]; - - [fullLabelString addAttribute:NSFontAttributeName value:[UIFont ows_boldFontWithSize:17.f] range:NSMakeRange(0,firstLine.length)]; - [fullLabelString addAttribute:NSFontAttributeName value:[UIFont ows_regularFontWithSize:16.f] range:NSMakeRange(firstLine.length + 1, secondLine.length)]; - [fullLabelString addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0,firstLine.length)]; - [fullLabelString addAttribute:NSForegroundColorAttributeName value:[UIColor ows_darkGrayColor] range:NSMakeRange(firstLine.length + 1, secondLine.length)]; - - _emptyViewLabel.attributedText = fullLabelString; - self.tableView.tableHeaderView = _emptyViewLabel; + } + else if (self.viewingThreadsIn == kArchiveState && [self.threadMappings numberOfItemsInGroup:TSArchiveGroup]==0) { + _emptyBoxImage.image = [UIImage imageNamed:@"uiEmptyArchive"]; + [_tableView setHidden:YES]; } }