diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 51001f545..8de1ab05f 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -485,6 +485,8 @@ FC3BD97C1A2CD385005B96BB /* signal_dotted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FC3BD97A1A2CD385005B96BB /* signal_dotted@2x.png */; }; FC4FA0261A1B9DC600DA100A /* SignalsNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = FC4FA0251A1B9DC600DA100A /* SignalsNavigationController.m */; }; FC4FA0331A1D46AE00DA100A /* InitialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FC4FA0321A1D46AE00DA100A /* InitialViewController.m */; }; + FC5CDF391A3393DD00B47253 /* error_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FC5CDF371A3393DD00B47253 /* error_white@2x.png */; }; + FC5CDF3A1A3393DD00B47253 /* warning_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FC5CDF381A3393DD00B47253 /* warning_white@2x.png */; }; FCA52AE61A2B676C00CCADFA /* call_canceled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52ADE1A2B676C00CCADFA /* call_canceled@2x.png */; }; FCA52AE71A2B676C00CCADFA /* call_failed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52ADF1A2B676C00CCADFA /* call_failed@2x.png */; }; FCA52AE81A2B676C00CCADFA /* call_incoming@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52AE01A2B676C00CCADFA /* call_incoming@2x.png */; }; @@ -1151,6 +1153,8 @@ FC4FA0251A1B9DC600DA100A /* SignalsNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SignalsNavigationController.m; sourceTree = ""; }; FC4FA0311A1D46AE00DA100A /* InitialViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InitialViewController.h; sourceTree = ""; }; FC4FA0321A1D46AE00DA100A /* InitialViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InitialViewController.m; sourceTree = ""; }; + FC5CDF371A3393DD00B47253 /* error_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "error_white@2x.png"; sourceTree = ""; }; + FC5CDF381A3393DD00B47253 /* warning_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "warning_white@2x.png"; sourceTree = ""; }; FCA52ADE1A2B676C00CCADFA /* call_canceled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_canceled@2x.png"; sourceTree = ""; }; FCA52ADF1A2B676C00CCADFA /* call_failed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_failed@2x.png"; sourceTree = ""; }; FCA52AE01A2B676C00CCADFA /* call_incoming@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_incoming@2x.png"; sourceTree = ""; }; @@ -2107,6 +2111,7 @@ B633C5161A1D190B0059AC12 /* delete_history@2x.png */, B633C5151A1D190B0059AC12 /* delete@2x.png */, B633C51B1A1D190B0059AC12 /* endcall@2x.png */, + FC5CDF371A3393DD00B47253 /* error_white@2x.png */, FC1F90BF1A22342B004F8253 /* group_photo@2x.png */, B633C5321A1D190B0059AC12 /* keypad@2x.png */, B633C5341A1D190B0059AC12 /* lock_white@2x.png */, @@ -2131,6 +2136,7 @@ FC1F90C51A223991004F8253 /* signals_tab@2x.png */, B633C5641A1D190B0059AC12 /* speaker_off@2x.png */, B633C5651A1D190B0059AC12 /* speaker_on@2x.png */, + FC5CDF381A3393DD00B47253 /* warning_white@2x.png */, ); path = Images; sourceTree = ""; @@ -2834,6 +2840,7 @@ FC15B7BF1A1F80F200F59801 /* defaultConctact_light@2x.png in Resources */, E14874F918A06951002CC4F3 /* CountryCodeTableViewCell.xib in Resources */, B633C5871A1D190B0059AC12 /* call_dark@2x.png in Resources */, + FC5CDF391A3393DD00B47253 /* error_white@2x.png in Resources */, B633C5851A1D190B0059AC12 /* blue-archive@2x.png in Resources */, B633C5D21A1D190B0059AC12 /* savephoto@2x.png in Resources */, B633C5921A1D190B0059AC12 /* contacts_tab@2x.png in Resources */, @@ -2849,6 +2856,7 @@ FC1F90C61A223991004F8253 /* settings_tab@2x.png in Resources */, FCA52AEA1A2B676C00CCADFA /* call_outgoing@2x.png in Resources */, B633C5B61A1D190B0059AC12 /* lock_white@2x.png in Resources */, + FC5CDF3A1A3393DD00B47253 /* warning_white@2x.png in Resources */, B633C5DF1A1D190B0059AC12 /* signal@2x.png in Resources */, B633C5831A1D190B0059AC12 /* backspace.png in Resources */, E1370BE018A0686600826894 /* busy.mp3 in Resources */, diff --git a/Signal/Images/error_white@2x.png b/Signal/Images/error_white@2x.png new file mode 100644 index 000000000..93ffedd0f Binary files /dev/null and b/Signal/Images/error_white@2x.png differ diff --git a/Signal/Images/warning_white@2x.png b/Signal/Images/warning_white@2x.png new file mode 100644 index 000000000..ae81081e0 Binary files /dev/null and b/Signal/Images/warning_white@2x.png differ diff --git a/Signal/src/Storyboard/Storyboard.storyboard b/Signal/src/Storyboard/Storyboard.storyboard index 1a2c21797..325e1957e 100755 --- a/Signal/src/Storyboard/Storyboard.storyboard +++ b/Signal/src/Storyboard/Storyboard.storyboard @@ -2402,9 +2402,6 @@ Licensed under the GPLv3 - - - @@ -2476,9 +2473,6 @@ Licensed under the GPLv3 - - - @@ -2609,9 +2603,6 @@ Licensed under the GPLv3 - - - diff --git a/Signal/src/textsecure/Contacts/TSThread.h b/Signal/src/textsecure/Contacts/TSThread.h index 3b3c4ae96..4c5ca03ac 100644 --- a/Signal/src/textsecure/Contacts/TSThread.h +++ b/Signal/src/textsecure/Contacts/TSThread.h @@ -26,7 +26,11 @@ typedef NS_ENUM(NSInteger, TSLastActionType) { TSLastActionMessageSent, TSLastActionMessageDelivered, - TSLastActionMessageIncoming + TSLastActionMessageIncomingRead, + TSLastActionMessageIncomingUnread, + + TSLastActionInfoMessage, + TSLastActionErrorMessage }; /** @@ -69,6 +73,6 @@ typedef NS_ENUM(NSInteger, TSLastActionType) { - (TSLastActionType)lastAction; -- (int)unreadMessages; +- (BOOL)hasUnreadMessages; @end diff --git a/Signal/src/textsecure/Contacts/TSThread.m b/Signal/src/textsecure/Contacts/TSThread.m index 750ebdeef..9e666116f 100644 --- a/Signal/src/textsecure/Contacts/TSThread.m +++ b/Signal/src/textsecure/Contacts/TSThread.m @@ -16,6 +16,8 @@ #import "TSCall.h" #import "TSOutgoingMessage.h" #import "TSIncomingMessage.h" +#import "TSInfoMessage.h" +#import "TSErrorMessage.h" @implementation TSThread @@ -125,14 +127,27 @@ } } else if ([interaction isKindOfClass:[TSIncomingMessage class]]) { - return TSLastActionNone; + return self.hasUnreadMessages ? TSLastActionMessageIncomingUnread : TSLastActionMessageIncomingRead ; + } else if ([interaction isKindOfClass:[TSErrorMessage class]]) { + return TSLastActionErrorMessage; + } else if ([interaction isKindOfClass:[TSInfoMessage class]]) { + return TSLastActionInfoMessage; } else { return TSLastActionNone; } } -- (int)unreadMessages{ - return 0; +- (BOOL)hasUnreadMessages{ + __block TSInteraction * interaction; + __block BOOL hasUnread = NO; + [[TSStorageManager sharedManager].dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + interaction = [TSInteraction fetchObjectWithUniqueID:[TSInteraction stringFromTimeStamp:_lastMessageId] transaction:transaction]; + if ([interaction isKindOfClass:[TSIncomingMessage class]]){ + hasUnread = ![(TSIncomingMessage*)interaction wasRead]; + } + }]; + + return hasUnread; } - (NSString *)name{ diff --git a/Signal/src/util/UIFont+OWS.h b/Signal/src/util/UIFont+OWS.h index 1c42ffcfb..e0f16522a 100644 --- a/Signal/src/util/UIFont+OWS.h +++ b/Signal/src/util/UIFont+OWS.h @@ -16,6 +16,8 @@ + (UIFont*) ows_regularFontWithSize:(CGFloat)size; ++ (UIFont*) ows_mediumFontWithSize:(CGFloat)size; + + (UIFont*) ows_boldFontWithSize:(CGFloat)size; @end diff --git a/Signal/src/util/UIFont+OWS.m b/Signal/src/util/UIFont+OWS.m index f7d12027e..46677bc09 100644 --- a/Signal/src/util/UIFont+OWS.m +++ b/Signal/src/util/UIFont+OWS.m @@ -9,6 +9,7 @@ static NSString *const kHelveticaNeueThin = @"HelveticaNeue-Thin"; static NSString *const kHelveticaNeueLight = @"HelveticaNeue-Light"; static NSString *const kHelveticaNeueRegular = @"HelveticaNeue-Regular"; +static NSString *const kHelveticaNeueMedium = @"HelveticaNeue-Medium"; static NSString *const kHelveticaNeueBold = @"HelveticaNeue-Bold"; #import "UIFont+OWS.h" @@ -30,6 +31,11 @@ static NSString *const kHelveticaNeueBold = @"HelveticaNeue-Bold"; return [UIFont fontWithName:kHelveticaNeueRegular size:size]; } ++ (UIFont*) ows_mediumFontWithSize:(CGFloat)size +{ + return [UIFont fontWithName:kHelveticaNeueMedium size:size]; +} + + (UIFont*) ows_boldFontWithSize:(CGFloat)size { return [UIFont fontWithName:kHelveticaNeueBold size:size]; diff --git a/Signal/src/view controllers/InboxTableViewCell.m b/Signal/src/view controllers/InboxTableViewCell.m index a18a4e4e5..f11232e21 100644 --- a/Signal/src/view controllers/InboxTableViewCell.m +++ b/Signal/src/view controllers/InboxTableViewCell.m @@ -8,10 +8,11 @@ #import "InboxTableViewCell.h" #import "Util.h" +#import "UIImage+JSQMessages.h" #define ARCHIVE_IMAGE_VIEW_WIDTH 22.0f #define DELETE_IMAGE_VIEW_WIDTH 19.0f -#define TIME_LABEL_SIZE 10 +#define TIME_LABEL_SIZE 11 #define DATE_LABEL_SIZE 13 @@ -28,10 +29,11 @@ CGRectGetHeight(_scrollView.frame)); [UIUtil applyRoundedBorderToImageView:&_contactPictureView]; - + _scrollView.contentOffset = CGPointMake(CGRectGetWidth(_archiveView.frame), 0); _deleteImageView.image = [_deleteImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; _archiveImageView.image = [_archiveImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; + _lastActionImageView.image = [_lastActionImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; } return self; @@ -55,10 +57,9 @@ { switch (state) { case kArchiveState: - _scrollView.userInteractionEnabled=NO; + _archiveImageView.image = [[UIImage imageNamed:@"reply"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; break; case kInboxState: - _scrollView.userInteractionEnabled=YES; break; default: @@ -101,15 +102,41 @@ case TSLastActionMessageDelivered: _lastActionImageView.image = [UIImage imageNamed:@"checkmark_light"]; break; - case TSLastActionMessageIncoming: + case TSLastActionMessageIncomingRead: + _lastActionImageView.image = nil; + break; + case TSLastActionMessageIncomingUnread: + [self updateCellForUnreadMessage]; _lastActionImageView.image = nil; break; + case TSLastActionInfoMessage: + _lastActionImageView.image = [UIImage imageNamed:@"warning_white"]; + break; + case TSLastActionErrorMessage: + _lastActionImageView.image = [UIImage imageNamed:@"error_white"]; + break; default: _lastActionImageView.image = nil; break; } } +-(void)updateCellForUnreadMessage +{ + _nameLabel.font = [UIFont ows_mediumFontWithSize:17.0f]; + _snippetLabel.textColor = [UIColor blackColor]; + _timeLabel.textColor = [UIColor ows_blueColor]; + [_contactPictureView.layer setBorderWidth:1.0f]; + [_contactPictureView.layer setBorderColor:[[UIColor ows_blueColor] CGColor]]; + +} + +-(void)updateCellForReadMessage +{ + _nameLabel.font = [UIFont ows_lightFontWithSize:17.0f]; + _snippetLabel.textColor = [UIColor lightGrayColor]; +} + #pragma mark - Date formatting - (NSAttributedString *)dateAttributedString:(NSDate *)date { @@ -137,31 +164,32 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (_scrollView.contentOffset.x < 0) { - _archiveImageView.image = [UIImage imageNamed:@"blue-archive"]; + _archiveImageView.image = [_archiveImageView.image jsq_imageMaskedWithColor:[UIColor ows_blueColor]]; _archiveImageView.bounds = CGRectMake(_archiveImageView.bounds.origin.x, _archiveImageView.bounds.origin.y, ARCHIVE_IMAGE_VIEW_WIDTH, _archiveImageView.bounds.size.height); } else { + _archiveImageView.image = [_archiveImageView.image jsq_imageMaskedWithColor:[UIColor ows_darkGrayColor]]; double ratio = (_archiveView.frame.size.width/2.0f - _scrollView.contentOffset.x) / (_archiveView.frame.size.width/2.0f); double newWidth = ARCHIVE_IMAGE_VIEW_WIDTH/2.0f + (ARCHIVE_IMAGE_VIEW_WIDTH * ratio)/2.0f; _archiveImageView.bounds = CGRectMake(_archiveImageView.bounds.origin.x, _archiveImageView.bounds.origin.y, (CGFloat)newWidth, _archiveImageView.bounds.size.height); - _archiveImageView.tintColor = UIColor.whiteColor; } if (scrollView.contentOffset.x > CGRectGetWidth(_archiveView.frame)*2) { - _deleteImageView.image = [UIImage imageNamed:@"red-delete"]; + _deleteImageView.image = [_deleteImageView.image jsq_imageMaskedWithColor:[UIColor ows_redColor]]; _deleteImageView.bounds = CGRectMake(_deleteImageView.bounds.origin.x, _deleteImageView.bounds.origin.y, DELETE_IMAGE_VIEW_WIDTH, _deleteImageView.bounds.size.height); } else { + _deleteImageView.image = [_deleteImageView.image jsq_imageMaskedWithColor:[UIColor ows_darkGrayColor]]; double ratio = _scrollView.contentOffset.x / (CGRectGetWidth(_deleteView.frame)*2); double newWidth = DELETE_IMAGE_VIEW_WIDTH/2.0f + (DELETE_IMAGE_VIEW_WIDTH * ratio)/2.0f; @@ -169,7 +197,6 @@ _deleteImageView.bounds.origin.y, (CGFloat)newWidth, _deleteImageView.bounds.size.height); - _deleteImageView.tintColor = UIColor.whiteColor; } } diff --git a/Signal/src/view controllers/InboxTableViewCell.xib b/Signal/src/view controllers/InboxTableViewCell.xib index 6fcada75e..c1703caee 100644 --- a/Signal/src/view controllers/InboxTableViewCell.xib +++ b/Signal/src/view controllers/InboxTableViewCell.xib @@ -66,10 +66,11 @@ - + + diff --git a/Signal/src/view controllers/UITests/SignalsViewController.m b/Signal/src/view controllers/UITests/SignalsViewController.m index 4b58b2d81..6714a4969 100644 --- a/Signal/src/view controllers/UITests/SignalsViewController.m +++ b/Signal/src/view controllers/UITests/SignalsViewController.m @@ -140,7 +140,7 @@ static NSString *const kSegueIndentifier = @"showSegue"; - (void)tableViewCellTappedArchive:(InboxTableViewCell*)cell { NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; TSThread *thread = [self threadForIndexPath:indexPath]; - thread.archivalDate = [NSDate date]; + thread.archivalDate = _inboxArchiveSwitch.selectedSegmentIndex == 0 ? [NSDate date] : nil ; [self.editingDbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [thread saveWithTransaction:transaction];