From 32f1cb37558abf757305fa811e11ca534f43180d Mon Sep 17 00:00:00 2001 From: dtsbourg Date: Sat, 6 Dec 2014 19:26:01 +0100 Subject: [PATCH] Archive/Inbox: Unread layout and other enhancements - Add lastAction indicator for errors and info in TSThreadViews - Enable unarchiving and deletion from archive. - Unread message layout --- Signal.xcodeproj/project.pbxproj | 8 ++++ Signal/Images/error_white@2x.png | Bin 0 -> 7824 bytes Signal/Images/warning_white@2x.png | Bin 0 -> 7306 bytes Signal/src/Storyboard/Storyboard.storyboard | 9 ---- Signal/src/textsecure/Contacts/TSThread.h | 8 +++- Signal/src/textsecure/Contacts/TSThread.m | 21 ++++++-- Signal/src/util/UIFont+OWS.h | 2 + Signal/src/util/UIFont+OWS.m | 6 +++ .../src/view controllers/InboxTableViewCell.m | 45 ++++++++++++++---- .../view controllers/InboxTableViewCell.xib | 3 +- .../UITests/SignalsViewController.m | 2 +- 11 files changed, 79 insertions(+), 25 deletions(-) create mode 100644 Signal/Images/error_white@2x.png create mode 100644 Signal/Images/warning_white@2x.png 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 0000000000000000000000000000000000000000..93ffedd0fd16528422136fc32d74da91aad14858 GIT binary patch literal 7824 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

^_Hn8E4^cJJK91x6{cbzj0};^?7U)hyrfG7>0)+ z_v68e)jgZ-SI+x?coh33cUa-al+Pza4>(?zQc(GV6Jl7kj9G}P+9zC)rfX!~L_`0(`k=j1153gm4=?Fvo% G@c#iI53k+; literal 0 HcmV?d00001 diff --git a/Signal/Images/warning_white@2x.png b/Signal/Images/warning_white@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ae81081e0177acae67f9aec573331d94f73eb26f GIT binary patch literal 7306 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 z zl7DstnQ!L!0mVLU0*LPT!S+Qz8C>?TNXphNnl^;!v*g!r`=5a&`}kEr^xGA-FQBA< z26t@Tju-}?t@!na{~0(Ju}I0|VKyDCU4@i{&JbCJMuNe&Nd`^EOeTXn$F>C5JuXo^@+O{0t&r#Zlp2Sd-*Z-jocG>cP1pthNfU!vfK1vJi-+e6g zTf56>cjssFh4H^mdQZv9{7zuCOHn8q(d^=_C25_EsqrYPaae z_wc_9>Wl z@t@-QCArq~&B5+@RyktH{9mFTE+|D%kUU~5gVDiV1-IFFURVL56@Sz(j$K@`cxJ78 zK~&?b>&tyE@6#ElY;XBB?)%qxy#i@Dueg2^l0?noU$__&G`o8HUsO8G#%{5FQC#Ll zO?JnzO=Uh#FcM{bQo{PJ#QBoNv@t;BJ&f&(-Y;&{tDuK{1$b^j3HEHduDU7+Z{{k4 zTRs!~2pl}PaRAdSS_R=@AxB*Kq2nUtvi0+kT|0PFe8Lik~_mt>U#wzIO#7|yvvk5 zX!)m=Aqn;HP&u4rRQ7@t>WV@V@HvPPLB;r9H!xNZ4(JCsjjZvTi2PJWF(_6{(X3p2 z?=Xri4yA7|Su`T}?Mu#sFJP9X)YC#zWR-0dksh?630JLEH6y#4I&uf)Wnfs*+eS9) zDQA=*BTv8C+k)biCq@4WBxjH%jqJJ{hzzUhHx;8?WV_l@h8URYrSuz4EKEuUKOuqk zB|kI9fPJ>LN(`zmGOp+@1Etmo{0~Ln@@Gu5ZELF-NF_3;C@PT6>Fh!;IQ*B_LH{@H zD!Xx&cW}b3>dK1sWLc;53LeI{aH2XYG3I}@y^cJLx2XM8Rl9Q$N3++|LDgkXG_P>f z-wZw8cvVTEhp8R`Hf$%a#%1IWN0k+a>ovfISm(>!}%IH9S!wBjgP)-+wk zj4bwP{?MOD+cyYtLJ212d`PW7QI+o=Oa_`#ov;f@vg{_Q#@u8uWWU4W91EDmYMX;-?1pOM)mE-kFe^*fdl9l-7g}pn9N0a9nU0rbss)!eI3}zMKM07{ zaQufhJMW-S*!#|ptw-U%-hl=ri?LyF_0s9Sr zLePwH{rr}#4lL~4bQgX-;mgxO(jS2Gj2D}e{mganGe}?*jRi7(|LwNAy$Gds8_Km(Vi;0+*ekjXVpZ~q)v3*6zK zMb*X!KVH2zY@6KfS1$iW**r=17D_J@ydgGc1#*V+T+(m$B_YI(G`Z6wb;LQ#y%fGD z|C$;(9h<;i!rJZkO)FOZ^ZrNaJI!l)vG@1{_Nx=!=^-~sU)3EgGHfSdP!SCrO;}}X zP4>xzRIhr}gF#+^ytg@T2gvjx*i5)fPrh~ty~JYH64~9XA>y|YrDEA?c=^?l>xw6u zaP76PvKkqKpL LX;O8?4fp>5up6C4 literal 0 HcmV?d00001 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];