From dc531a86ea2f5599f7c9ae80041e80340d705355 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 28 Jun 2018 11:44:39 -0400 Subject: [PATCH] Tweak message cells. --- .../Contents.json | 23 +++ .../double check@1x.png | Bin 0 -> 306 bytes .../double check@2x.png | Bin 0 -> 622 bytes .../double check@3x.png | Bin 0 -> 1024 bytes .../Contents.json | 23 +++ .../sending@1x.png | Bin 0 -> 175 bytes .../sending@2x.png | Bin 0 -> 280 bytes .../sending@3x.png | Bin 0 -> 487 bytes .../Contents.json | 23 +++ .../message_status_sent.imageset/check@1x.png | Bin 0 -> 259 bytes .../message_status_sent.imageset/check@2x.png | Bin 0 -> 497 bytes .../message_status_sent.imageset/check@3x.png | Bin 0 -> 818 bytes .../Cells/OWSMessageFooterView.m | 155 +++++++++--------- 13 files changed, 149 insertions(+), 75 deletions(-) create mode 100644 Signal/Images.xcassets/message_status_delivered.imageset/Contents.json create mode 100644 Signal/Images.xcassets/message_status_delivered.imageset/double check@1x.png create mode 100644 Signal/Images.xcassets/message_status_delivered.imageset/double check@2x.png create mode 100644 Signal/Images.xcassets/message_status_delivered.imageset/double check@3x.png create mode 100644 Signal/Images.xcassets/message_status_sending.imageset/Contents.json create mode 100644 Signal/Images.xcassets/message_status_sending.imageset/sending@1x.png create mode 100644 Signal/Images.xcassets/message_status_sending.imageset/sending@2x.png create mode 100644 Signal/Images.xcassets/message_status_sending.imageset/sending@3x.png create mode 100644 Signal/Images.xcassets/message_status_sent.imageset/Contents.json create mode 100644 Signal/Images.xcassets/message_status_sent.imageset/check@1x.png create mode 100644 Signal/Images.xcassets/message_status_sent.imageset/check@2x.png create mode 100644 Signal/Images.xcassets/message_status_sent.imageset/check@3x.png diff --git a/Signal/Images.xcassets/message_status_delivered.imageset/Contents.json b/Signal/Images.xcassets/message_status_delivered.imageset/Contents.json new file mode 100644 index 000000000..a030518be --- /dev/null +++ b/Signal/Images.xcassets/message_status_delivered.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "double check@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "double check@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "double check@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Signal/Images.xcassets/message_status_delivered.imageset/double check@1x.png b/Signal/Images.xcassets/message_status_delivered.imageset/double check@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..5aa97259d5c4b0ba3df04b6ee9948c963b3fbfd9 GIT binary patch literal 306 zcmV-20nPr2P)Px#>`6pHR45g#lQ9wjK@dezGA@8*$^qQL0i1zEMCbsUxPsG&L~cPY+zWVb)UMg7 z5p0#NdTQqP-`3sBVDOD0$35Jkh8G+m*UjnCYpxSBZdbU$2E0#U4!Lelk6v@$V^~$; z45O%gK7Q$qMX%5JZ0yVyt)3R)8e1>v=8PRIL60@!ytbN$dnoDp4)A~gdi2J{I%j|_ zG~rT9dRj!Uo_g#liHh?CE{W!`0(EzBf;Bv$6X^(nj4iLAq&MS`ZlfJ7Uv|K-QU6n8mDatKNJ6AbBQ+ojH!X>HQaZ1KMpq>zJ6>7ytkO07*qoM6N<$ Ef-w4piU0rr literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/message_status_delivered.imageset/double check@2x.png b/Signal/Images.xcassets/message_status_delivered.imageset/double check@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9a6483abb9452ee5fc3101006576422b46c5d6 GIT binary patch literal 622 zcmV-!0+IcRP)Px%C`m*?R7efYm%UEIFcgJTkeFClt8Pdvh)3WFD#Qk;uYf8hMkGH+5gQW&KLf0N z2^NNKh=mO{pn~(Ixs^?w#2!#N(oy2;<8yCg$8kGFGkWUY7yII-*cDgASMgE25N||7 zOi$m7I1%r~JMme}0*OcBm-t=7vEmydNYR@Qo_I4R342n#i5Pr{SK>h264xtozb1lI zJsx=Bi8nbI+lZlhry>KcMW(36%D^A2VKWQp4E^M$AiRtBs==mbaJu;v4=mtabM}r2is@5|!8$0YZVH@)u_USb)M6+on6jot>KC=kNFi0v)8z*_u?@kZK9-t+eE4E; z3eta8b*Ac5i@}!M=q1^@s6 literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/message_status_delivered.imageset/double check@3x.png b/Signal/Images.xcassets/message_status_delivered.imageset/double check@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6cd8faf48c59650eb9ff55ca4c906cfecddb3b25 GIT binary patch literal 1024 zcmV+b1poVqP)Px&x=BPqR9Fe!nK5e=K^TTFYGI)e8w(*}ZSn_Frn$n?!sbeg{0zJN0~_xz*ehsZ z5#&?|HewS{L2OoqG!}w_7U9(Q3HKe}P4;$YW=Bw8c$wMRZ{F|yZue$q@74zCxTGmJ z#gVuvUYYZZ+Rt;oR{LChDt;21uu6y6qd7mSeIh;A}7o|TF55(KzP}~wP%t?PJUK9;| zbjU$2a)v(cY7FfptSfq7^kP4Bd`G-2#-fxCImwL&?+K6OhysCcL@#h($KkEjC00tu z=fT4R(R;&dXK`Fwf2Drvcu!14DV~R%2|0*7YY+ArDJ+w zdtC$X#H;QEUj1r`hXtnUSz#=zxhSR6l%JxkfLi@ZG~n6%_2D-UETv<4`Jf((F-0-Qd*5V$RmLvi76Sn) z9lsT?1>@miDIIhv$`%T|)nX;K0q<4^UIyRX0K0ULN(Z&bgzw@=T!m6PIYr?K?^YOI zq6=dZpW>?GVhd~2$t{XHcvZ5(zA_MV3)OBC#bF>sUmX^T)Z5Q{ICU#N(^;!@=p$Xf zQoj~0uBo^_I(>_hwUgD-{NZJAPqYEvSXZIaiCVN+isMHeLm!c6S zz7|cuzbd3WphF$gLz{CsSb9Js!1g0$OI0bp7BTZuH1yFys}?IU2aQ`Qgr=f>YB8JO zO7XS$Ui8S-sU=c*p~QaUCK!#J*NsZ^phqbkui4dS$K$`FORp_VF7<*~N~fzJJKy@E zNzjgHwPx#(n&-?R7ef&mC*{qFbqZK{z7~S{MSuewI;F1$Y5|fjj0~wbmHwCzva*%hD?Q_I;;J_tkJy5?SYjFxR z(5iYulc+hrx)f-jg=U7yqoI+S=Oo8L11)pbw{Ts7ojzYzAHO9g-La+OrnRU7rtGd4 zt;eXimcQJ6*p-|8#b@L)6(hs%rw1oVoSPVVGU32YvM}fgjkmW9gr*Tt#NoiL9++Z% emiuXguL2LFLMPwWhS9MA0000Px$p-DtRR9Fe^n6Xa7Fcd`#tva!xF7z81`X7vpmH3sgFfi~X9hvxn&J|4TuppHc zvA{i2Uz8?w?beO!NWIci(!}@P7dv*I+v~-nki_3AIFG`4AbY5Gvw`t$8+e!>-sDh% zg=?;$!BP?P0*f95Jn+I3@5aK*0>+wgr$`07@Z4v?O_k%xr(-?9%T!cyuAWyew|-js zk`U9*aICkz%)$4yw?va22XeYk=H@oaAqRJMr#qeMfohG+l;=Y?Q7jTY1s~UI#cSO! zyYeHu0*xNas)V&6bQav!poQZxJP-RA><+TpD6&=IYfM4TG~E?&te8hD3XE^kKN~`_ zW%jXeVym*LUMh5*9wa!g0}fm?8XLlTW6BR7p4H$*F;ZZaK&b-x73wWj*UTToe6}>vh1b_F0zMize&tOBJB|YysQhDxVl`eU| z)L7NX+}2y$_)lWd(%t)JSw24Y=1GNpeXsdeLyhzHTg_R49%1lw^>bP0 Hl+XkK2kd5! literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/message_status_sent.imageset/check@2x.png b/Signal/Images.xcassets/message_status_sent.imageset/check@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8c5fd34fc6f04fd038d916a4cd2ec277fba4b7 GIT binary patch literal 497 zcmVPx$t4TybR7efAmN8DlKoCVY&~gIH9TE-VBnZ&~$`zuN^m~rbQc)l%;4UfBAr1f? zNd*5{JJC9}*K3k|>BsBYKY!xc^(G^iMycs*@lre$3lV&Z3-L{S6+gs5z-T6}#NQsG zL2Jb|Oyf$^Un0go;*&TQ&%~2J#>ALIgO(g}lbC9DEt2po(w07;K}!y~c(j7*2;hCI zA{`{h@*7W5Xwus9A9E{BuC)u#4IVVIwrqj}1{aam+J$EYwjw)$#mebiXqNb#Zo-tIfx@Ddrk221hA0@1b494THDz`L^m0v75PQ9zD4(prJ87I_KdBDv-i zsI@4y$Z-*#hJwWUP+R1Q)Fg6nwZSXMe6Bejc%jGJl_KAcmxGt24PHT*13d7;6YmPU z9u?-p)sBi;94vHm(8G>m2R*LsX{H)*rn5kM|G}{$Jc+f7#oFsnrWIjLSa^1VZPBhP n8nomzFlt2V0k+vre_Q?lw?U`>y=|kb00000NkvXXu0mjfFjCxa literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/message_status_sent.imageset/check@3x.png b/Signal/Images.xcassets/message_status_sent.imageset/check@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..76a6466c97adc8af201d58ee7a0f11041a385dc1 GIT binary patch literal 818 zcmV-21I_%2P)Px%>`6pHR9Fecn7wY)Koo@?K?zdQP(%tEn!E&!3qlH-Eh%^my1W4m`wFCnk|K&$ zDG-l9q;wVqEfPpjtOA_R@?G7X^?GNVu{hF^?eV?$9F6C1cdyFFfl^+GC*ouAu%j;3 zw~k+Ry%ax+-^EEVQ`LpI6#piYSaQfMhNr6ZSxhytEsh%08jX9(oQtu*t=c|`ufr7eIpq3U)J7u-1bz{Hf%keoO3LmJ zBKL#nYof8!6kX|i=8vAw#8RLZHO&}WgP(8if=PTSmIgJwDaKSUm;vUTYssF81*z?| z(B6Qb+I;WQxE~etV+!px%=BcAnGtsxz-xuOhv&N9h)>*0H2mzt!wL)CnIWcWNnpl= z8{G%dfR^dvp#^)>Qsl+0n6u6(d=TCY^&2sW2DH%R9Ukyfy%NnOt7|FjGGjVunm%5t zbJxIJ&)4F! zsJ-to*9zCzLuMH9r7?)Kv()PWn+soFsmy|el4;&PX1?uG*(~+_$9%N^ndH?_b literal 0 HcmV?d00001 diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageFooterView.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageFooterView.m index 35c13d3bc..b078026e6 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageFooterView.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageFooterView.m @@ -11,9 +11,7 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSMessageFooterView () @property (nonatomic) UILabel *timestampLabel; -@property (nonatomic) UIView *spacerView; -@property (nonatomic) UILabel *statusLabel; -@property (nonatomic) UIView *statusIndicatorView; +@property (nonatomic) UIImageView *statusIndicatorImageView; @end @@ -41,42 +39,32 @@ NS_ASSUME_NONNULL_BEGIN self.alignment = UIStackViewAlignmentCenter; self.timestampLabel = [UILabel new]; - // TODO: Color - self.timestampLabel.textColor = [UIColor lightGrayColor]; [self addArrangedSubview:self.timestampLabel]; - self.spacerView = [UIView new]; - [self.spacerView setContentHuggingLow]; - [self addArrangedSubview:self.spacerView]; - - self.statusLabel = [UILabel new]; - // TODO: Color - self.statusLabel.textColor = [UIColor lightGrayColor]; - [self addArrangedSubview:self.statusLabel]; - - self.statusIndicatorView = [UIView new]; - [self.statusIndicatorView autoSetDimension:ALDimensionWidth toSize:self.statusIndicatorSize]; - [self.statusIndicatorView autoSetDimension:ALDimensionHeight toSize:self.statusIndicatorSize]; - self.statusIndicatorView.layer.cornerRadius = self.statusIndicatorSize * 0.5f; - [self addArrangedSubview:self.statusIndicatorView]; + self.statusIndicatorImageView = [UIImageView new]; + [self.statusIndicatorImageView setContentHuggingHigh]; + [self addArrangedSubview:self.statusIndicatorImageView]; } - (void)configureFonts { - self.timestampLabel.font = UIFont.ows_dynamicTypeCaption2Font; - self.statusLabel.font = UIFont.ows_dynamicTypeCaption2Font; + self.timestampLabel.font = UIFont.ows_dynamicTypeCaption1Font; } -- (CGFloat)statusIndicatorSize +- (CGFloat)hSpacing { // TODO: Review constant. - return 12.f; + return 8.f; } -- (CGFloat)hSpacing +- (CGFloat)maxImageWidth { - // TODO: Review constant. - return 8.f; + return 18.f; +} + +- (CGFloat)imageHeight +{ + return 12.f; } #pragma mark - Load @@ -87,19 +75,75 @@ NS_ASSUME_NONNULL_BEGIN [self configureLabelsWithConversationViewItem:viewItem]; - // TODO: - self.statusIndicatorView.backgroundColor = [UIColor orangeColor]; - BOOL isOutgoing = (viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage); + // TODO: Constants for (UIView *subview in @[ - self.spacerView, - self.statusLabel, - self.statusIndicatorView, + self.timestampLabel, + self.statusIndicatorImageView, ]) { - subview.hidden = !isOutgoing; + if (hasShadows) { + subview.layer.shadowColor = [UIColor blackColor].CGColor; + subview.layer.shadowOpacity = 0.35f; + subview.layer.shadowOffset = CGSizeZero; + subview.layer.shadowRadius = 0.5f; + } else { + subview.layer.shadowColor = nil; + subview.layer.shadowOpacity = 0.f; + subview.layer.shadowOffset = CGSizeZero; + subview.layer.shadowRadius = 0.f; + } } - [self setHasShadows:hasShadows viewItem:viewItem]; + UIColor *textColor; + if (hasShadows) { + textColor = [UIColor whiteColor]; + } else if (viewItem.interaction.interactionType == OWSInteractionType_IncomingMessage) { + textColor = [UIColor colorWithWhite:1.f alpha:0.7f]; + } else { + textColor = [UIColor ows_light60Color]; + } + self.timestampLabel.textColor = textColor; + + if (viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage) { + TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)viewItem.interaction; + + UIImage *_Nullable statusIndicatorImage = nil; + MessageReceiptStatus messageStatus = + [MessageRecipientStatusUtils recipientStatusWithOutgoingMessage:outgoingMessage referenceView:self]; + switch (messageStatus) { + case MessageReceiptStatusUploading: + case MessageReceiptStatusSending: + statusIndicatorImage = [UIImage imageNamed:@"message_status_sending"]; + break; + case MessageReceiptStatusSent: + case MessageReceiptStatusSkipped: + statusIndicatorImage = [UIImage imageNamed:@"message_status_sent"]; + break; + case MessageReceiptStatusDelivered: + case MessageReceiptStatusRead: + statusIndicatorImage = [UIImage imageNamed:@"message_status_delivered"]; + break; + case MessageReceiptStatusFailed: + // TODO: + statusIndicatorImage = [UIImage imageNamed:@"message_status_sending"]; + break; + } + + OWSAssert(statusIndicatorImage); + OWSAssert(statusIndicatorImage.size.width <= self.maxImageWidth); + self.statusIndicatorImageView.image = + [statusIndicatorImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + if (messageStatus == MessageReceiptStatusRead) { + // TODO: Tint the icon with the conversation color. + self.statusIndicatorImageView.tintColor = textColor; + } else { + self.statusIndicatorImageView.tintColor = textColor; + } + self.statusIndicatorImageView.hidden = NO; + } else { + self.statusIndicatorImageView.image = nil; + self.statusIndicatorImageView.hidden = YES; + } } - (void)configureLabelsWithConversationViewItem:(ConversationViewItem *)viewItem @@ -109,7 +153,6 @@ NS_ASSUME_NONNULL_BEGIN [self configureFonts]; self.timestampLabel.text = [DateUtil formatTimestampShort:viewItem.interaction.timestamp]; - self.statusLabel.text = [self messageStatusTextForConversationViewItem:viewItem]; } - (CGSize)measureWithConversationViewItem:(ConversationViewItem *)viewItem @@ -119,11 +162,9 @@ NS_ASSUME_NONNULL_BEGIN [self configureLabelsWithConversationViewItem:viewItem]; CGSize result = CGSizeZero; - result.height - = MAX(self.timestampLabel.font.lineHeight, MAX(self.statusLabel.font.lineHeight, self.statusIndicatorSize)); + result.height = MAX(self.timestampLabel.font.lineHeight, self.imageHeight); if (viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage) { - result.width = ([self.timestampLabel sizeThatFits:CGSizeZero].width + - [self.statusLabel sizeThatFits:CGSizeZero].width + self.statusIndicatorSize + self.hSpacing * 3.f); + result.width = ([self.timestampLabel sizeThatFits:CGSizeZero].width + self.maxImageWidth + self.hSpacing); } else { result.width = [self.timestampLabel sizeThatFits:CGSizeZero].width; } @@ -143,42 +184,6 @@ NS_ASSUME_NONNULL_BEGIN return statusMessage; } -#pragma mark - Shadows - -- (void)setHasShadows:(BOOL)hasShadows viewItem:(ConversationViewItem *)viewItem -{ - // TODO: Constants - for (UIView *subview in @[ - self.timestampLabel, - self.statusLabel, - self.statusIndicatorView, - ]) { - if (hasShadows) { - subview.layer.shadowColor = [UIColor blackColor].CGColor; - subview.layer.shadowOpacity = 0.35f; - subview.layer.shadowOffset = CGSizeZero; - subview.layer.shadowRadius = 0.5f; - } else { - subview.layer.shadowColor = nil; - subview.layer.shadowOpacity = 0.f; - subview.layer.shadowOffset = CGSizeZero; - subview.layer.shadowRadius = 0.f; - } - } - - UIColor *textColor; - if (hasShadows) { - textColor = [UIColor whiteColor]; - } else if (viewItem.interaction.interactionType == OWSInteractionType_IncomingMessage) { - // TODO: - textColor = [UIColor lightGrayColor]; - } else { - textColor = [UIColor whiteColor]; - } - self.timestampLabel.textColor = textColor; - self.statusLabel.textColor = textColor; -} - @end NS_ASSUME_NONNULL_END