From 5c2075cdb62e60bbf37e7cd9d1a0b6616b671ca7 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Wed, 17 Jan 2018 17:45:47 -0500 Subject: [PATCH 1/4] Show disappearing messages timer in share extension // FREEBIE --- SignalMessaging/Views/ContactTableViewCell.m | 13 +++- .../contacts/SelectThreadViewController.m | 65 +++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/SignalMessaging/Views/ContactTableViewCell.m b/SignalMessaging/Views/ContactTableViewCell.m index 255b4fbb8..9cf535f6c 100644 --- a/SignalMessaging/Views/ContactTableViewCell.m +++ b/SignalMessaging/Views/ContactTableViewCell.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "ContactTableViewCell.h" @@ -182,6 +182,17 @@ const CGFloat kContactTableViewCellAvatarTextMargin = 12; diameter:kContactTableViewCellAvatarSize contactsManager:contactsManager]; + if (self.accessoryMessage) { + UILabel *blockedLabel = [[UILabel alloc] init]; + blockedLabel.textAlignment = NSTextAlignmentRight; + blockedLabel.text = self.accessoryMessage; + blockedLabel.font = [UIFont ows_mediumFontWithSize:13.f]; + blockedLabel.textColor = [UIColor colorWithWhite:0.5f alpha:1.f]; + [blockedLabel sizeToFit]; + + self.accessoryView = blockedLabel; + } + // Force layout, since imageView isn't being initally rendered on App Store optimized build. [self layoutSubviews]; } diff --git a/SignalMessaging/contacts/SelectThreadViewController.m b/SignalMessaging/contacts/SelectThreadViewController.m index f8accb49b..22790a509 100644 --- a/SignalMessaging/contacts/SelectThreadViewController.m +++ b/SignalMessaging/contacts/SelectThreadViewController.m @@ -21,6 +21,7 @@ #import #import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -33,6 +34,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) ContactsViewHelper *contactsViewHelper; @property (nonatomic, readonly) ConversationSearcher *conversationSearcher; @property (nonatomic, readonly) ThreadViewHelper *threadViewHelper; +@property (nonatomic, readonly) YapDatabaseConnection *uiDatabaseConnection; @property (nonatomic, readonly) OWSTableViewController *tableViewController; @@ -60,6 +62,18 @@ NS_ASSUME_NONNULL_BEGIN _threadViewHelper = [ThreadViewHelper new]; _threadViewHelper.delegate = self; + _uiDatabaseConnection = [[TSStorageManager sharedManager] newDatabaseConnection]; + _uiDatabaseConnection.permittedTransactions = YDB_AnyReadTransaction; + [_uiDatabaseConnection beginLongLivedReadTransaction]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(yapDatabaseModified:) + name:YapDatabaseModifiedNotification + object:TSStorageManager.sharedManager.dbNotificationObject]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(yapDatabaseModifiedExternally:) + name:YapDatabaseModifiedExternallyNotification + object:nil]; + [self createViews]; [self updateTableContents]; @@ -104,6 +118,24 @@ NS_ASSUME_NONNULL_BEGIN [self autoPinViewToBottomGuideOrKeyboard:self.tableViewController.view]; } +- (void)yapDatabaseModifiedExternally:(NSNotification *)notification +{ + OWSAssertIsOnMainThread(); + + DDLogVerbose(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); + + [self.uiDatabaseConnection beginLongLivedReadTransaction]; + [self updateTableContents]; +} + +- (void)yapDatabaseModified:(NSNotification *)notification +{ + OWSAssertIsOnMainThread(); + + [self.uiDatabaseConnection beginLongLivedReadTransaction]; + [self updateTableContents]; +} + #pragma mark - UISearchBarDelegate - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText @@ -165,7 +197,40 @@ NS_ASSUME_NONNULL_BEGIN // To be consistent with the threads (above), we use ContactTableViewCell // instead of InboxTableViewCell to present contacts and threads. ContactTableViewCell *cell = [ContactTableViewCell new]; + + if ([thread isKindOfClass:[TSContactThread class]]) { + BOOL isBlocked = [helper isRecipientIdBlocked:thread.contactIdentifier]; + if (isBlocked) { + cell.accessoryMessage = NSLocalizedString(@"CONTACT_CELL_IS_BLOCKED", @"An indicator that a contact has been blocked."); + } + } + [cell configureWithThread:thread contactsManager:helper.contactsManager]; + + if (cell.accessoryView == nil) { + // Don't add a disappearing messages indicator if we've already added a "blocked" label. + __block OWSDisappearingMessagesConfiguration *disappearingMessagesConfiguration; + [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { + disappearingMessagesConfiguration = + [OWSDisappearingMessagesConfiguration fetchObjectWithUniqueID:thread.uniqueId + transaction:transaction]; + }]; + + if (disappearingMessagesConfiguration && disappearingMessagesConfiguration.isEnabled) { + UIImage *icon = [UIImage imageNamed:@"table_ic_hourglass"]; + OWSAssert(icon); + UIImageView *iconView = [UIImageView new]; + iconView.image = [icon imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + iconView.tintColor = [UIColor colorWithWhite:0.5f alpha:1.f]; + iconView.contentMode = UIViewContentModeScaleAspectFit; + // Default size of this icon is a too large for the thread picker context + // so we specify a bit smaller. + iconView.frame = CGRectMake(0, 0, 20, 20); + + cell.accessoryView = iconView; + } + } + return cell; } customRowHeight:[ContactTableViewCell rowHeight] From 5c76d4c99cb6b50de4d9c2e72f6c6dd0eec52509 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 19 Jan 2018 17:03:39 -0500 Subject: [PATCH 2/4] Stopwatch Asset instead of hourglass // FREEBIE --- .../button_timer_white.imageset/Contents.json | 6 ++-- .../button_timer_white@1x.png | Bin 1503 -> 0 bytes .../button_timer_white@2x.png | Bin 1858 -> 0 bytes .../button_timer_white@3x.png | Bin 2260 -> 0 bytes .../ic_timer_white.png | Bin 0 -> 354 bytes .../ic_timer_white@2x.png | Bin 0 -> 631 bytes .../ic_timer_white@3x.png | Bin 0 -> 809 bytes .../Contents.json | 6 ++-- .../ic_timer_white.png | Bin 0 -> 354 bytes .../ic_timer_white@2x.png | Bin 0 -> 631 bytes .../ic_timer_white@3x.png | Bin 0 -> 809 bytes .../system_message_timer@1x.png | Bin 1353 -> 0 bytes .../system_message_timer@2x.png | Bin 1731 -> 0 bytes .../system_message_timer@3x.png | Bin 1924 -> 0 bytes .../table_ic_hourglass.imageset/Contents.json | 2 +- .../table_ic_timer.png | Bin 0 -> 518 bytes .../table_ic_timer@1x.png | Bin 1628 -> 0 bytes .../table_ic_timer@2x.png | Bin 2143 -> 844 bytes .../table_ic_timer@3x.png | Bin 2805 -> 1064 bytes .../Contents.json | 26 ------------------ .../table_ic_hourglass_empty@1x.png | Bin 1485 -> 0 bytes .../table_ic_hourglass_empty@2x.png | Bin 1782 -> 0 bytes .../table_ic_hourglass_empty@3x.png | Bin 2221 -> 0 bytes .../table_ic_hourglass_full.png | Bin 209 -> 0 bytes .../table_ic_hourglass_full@2x.png | Bin 302 -> 0 bytes .../table_ic_hourglass_full@3x.png | Bin 424 -> 0 bytes .../Contents.json | 6 ++-- .../table_ic_timer.png | Bin 0 -> 518 bytes .../table_ic_timer@2x.png | Bin 0 -> 844 bytes .../table_ic_timer@3x.png | Bin 0 -> 1064 bytes .../OWSConversationSettingsViewController.m | 6 ++-- 31 files changed, 13 insertions(+), 39 deletions(-) delete mode 100644 Signal/Images.xcassets/button_timer_white.imageset/button_timer_white@1x.png delete mode 100644 Signal/Images.xcassets/button_timer_white.imageset/button_timer_white@2x.png delete mode 100644 Signal/Images.xcassets/button_timer_white.imageset/button_timer_white@3x.png create mode 100644 Signal/Images.xcassets/button_timer_white.imageset/ic_timer_white.png create mode 100644 Signal/Images.xcassets/button_timer_white.imageset/ic_timer_white@2x.png create mode 100644 Signal/Images.xcassets/button_timer_white.imageset/ic_timer_white@3x.png create mode 100644 Signal/Images.xcassets/system_message_timer.imageset/ic_timer_white.png create mode 100644 Signal/Images.xcassets/system_message_timer.imageset/ic_timer_white@2x.png create mode 100644 Signal/Images.xcassets/system_message_timer.imageset/ic_timer_white@3x.png delete mode 100644 Signal/Images.xcassets/system_message_timer.imageset/system_message_timer@1x.png delete mode 100644 Signal/Images.xcassets/system_message_timer.imageset/system_message_timer@2x.png delete mode 100644 Signal/Images.xcassets/system_message_timer.imageset/system_message_timer@3x.png create mode 100644 Signal/Images.xcassets/table_ic_hourglass.imageset/table_ic_timer.png delete mode 100644 Signal/Images.xcassets/table_ic_hourglass.imageset/table_ic_timer@1x.png delete mode 100644 Signal/Images.xcassets/table_ic_hourglass_empty.imageset/Contents.json delete mode 100644 Signal/Images.xcassets/table_ic_hourglass_empty.imageset/table_ic_hourglass_empty@1x.png delete mode 100644 Signal/Images.xcassets/table_ic_hourglass_empty.imageset/table_ic_hourglass_empty@2x.png delete mode 100644 Signal/Images.xcassets/table_ic_hourglass_empty.imageset/table_ic_hourglass_empty@3x.png delete mode 100644 Signal/Images.xcassets/table_ic_hourglass_full.imageset/table_ic_hourglass_full.png delete mode 100644 Signal/Images.xcassets/table_ic_hourglass_full.imageset/table_ic_hourglass_full@2x.png delete mode 100644 Signal/Images.xcassets/table_ic_hourglass_full.imageset/table_ic_hourglass_full@3x.png rename Signal/Images.xcassets/{table_ic_hourglass_full.imageset => table_ic_timer.imageset}/Contents.json (68%) create mode 100644 Signal/Images.xcassets/table_ic_timer.imageset/table_ic_timer.png create mode 100644 Signal/Images.xcassets/table_ic_timer.imageset/table_ic_timer@2x.png create mode 100644 Signal/Images.xcassets/table_ic_timer.imageset/table_ic_timer@3x.png diff --git a/Signal/Images.xcassets/button_timer_white.imageset/Contents.json b/Signal/Images.xcassets/button_timer_white.imageset/Contents.json index 23fa7eb54..72e4dc33d 100644 --- a/Signal/Images.xcassets/button_timer_white.imageset/Contents.json +++ b/Signal/Images.xcassets/button_timer_white.imageset/Contents.json @@ -2,17 +2,17 @@ "images" : [ { "idiom" : "universal", - "filename" : "button_timer_white@1x.png", + "filename" : "ic_timer_white.png", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "button_timer_white@2x.png", + "filename" : "ic_timer_white@2x.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "button_timer_white@3x.png", + "filename" : "ic_timer_white@3x.png", "scale" : "3x" } ], diff --git a/Signal/Images.xcassets/button_timer_white.imageset/button_timer_white@1x.png b/Signal/Images.xcassets/button_timer_white.imageset/button_timer_white@1x.png deleted file mode 100644 index 4668540065edb9365708e02096b6f5504def05e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1503 zcmeAS@N?(olHy`uVBq!ia0vp^B0wy`!3HFMdEYGqQjEnx?oJHr&dIz4aySb-B8wRq zxP?KOkzv*x2?hohrOc3sk_cZPtK|G#y~LFKq*T3%+ybC#1_ql7D* z7iAWdWaj57fXq!y$}cUkRZ;?31P2gzmSmOrNrwBXptL9l?5C7u{nVV)+|<01VxT@ltkwa;7OoM+krjyr5X-=U2=SW@$mLc+ zsm1v@rJx`P&C4vYGqM4D2wfNvA`o59`MCu}sl~-WZFZ(mEy!Z%>LU==*qOuZKo&&T z;9ryp^l2i;q38AY7TN8<7jR~?fND@dIQKgSO2i(C*_!C21>q7zvjs?|mxl#7sZ6(q}oMS*$Njti(0mjCUzT6l720*jL{ zPZ!4!3&EpPZT${A2)N0LCN#tQ<_^bmtg=%CWg3J7mM&cW&|QRM zLQ~4U>1)=0JRvQesp?jB>*n0&opZNdi=1X*wJqN7M&<22&LVl+JNdYT$zK~DUwgf* z=*hjCi}EWx3&qc^5jpwv#NMteH(PDw4=~M3kPr^#?z`i7CVH)M&jVSxheu9FahqBy z$FHBO-1m@M?!k@;Q`$|h9y?mKdLs9-4K39#4#%C?YL_d|j63DSzC2&(7r%C{(!QvTYW5s?Pmiqg$ymf3_UEPWg)hDr`$PIlpZyo#zrH3y Up83?C)1Xq<)78&qol`;+0Oe)=D*ylh diff --git a/Signal/Images.xcassets/button_timer_white.imageset/button_timer_white@2x.png b/Signal/Images.xcassets/button_timer_white.imageset/button_timer_white@2x.png deleted file mode 100644 index 4cf0e51096de0bb9357e0cbdc1053ae05701068f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1858 zcmeAS@N?(olHy`uVBq!ia0vp^8bEBo!3HFgt1V^&DaPU;cPEB*=VV?2Ih+L^k;M!Q z+`=Ht$S`Y;1Oo$$Qf5d*NrbPDRdRl=USdjqQmS4>ZUIm=1A|S46_A;mT9T+xk(-lO zY*k^a1Xf`MWP^nDl@!2AO0sR0B76fBob!uP6-@O^^bC~jxD*r=Y>HCStb$zJpxS{v zTcwPWk^(Dz{qpj1y>er{{GxPyLrY6beFGzXBO_g)3f?~)Z${GHakLamPfGmil0TlFB0htx4IT0?IzyJmN!o(<)sOOH%EO3=GY64a{^6OhXJ!tPISo3@vT+(bOQh03_pFl$uzQ zUlfv`pJNC1MJ|Y|V60~b(TOY%)oP;;%0)=I3X)~PqQE?B#|6|0%l~#<52yanXJBC3 z>FMGa62bX)=6*j>N0DRVriYj>L^Ll|G!)tHEM(2q%i7y(a>?mD^8?`vK@qcG2zU4| z*chUQ9wM+&lCA&WStL>Xhz&|EKSXo{hfDxwk1oz6}|S_0I*~y{yUN zK0ohpsmuL)IxDAyvK|zwdn53EnbE}kuM0Sq>y#hnT_pNvwPu0mADd~B8+JTd!Fk;) zr%r_L5a&N%?F;iB`|qB_8l0TDOigC;x;=591=c^dUzYms?@!myH{8{VcO+ah~uQ+Sc=7*0qebL;~dHQhlTkeChx@v}c$yrTzul$_3MdZ$* zwI^hC&-~z9r#2(q%KY-QL+q=XzAY7-expbJMaBHG50|bkf8kSP;iS2|B3o_I7LG@! z_Ie70ze{E-d}_Bs(EQ+Uz0&k2t9tieIT-UUjj`}_#mw8fEmQXB75{}ya`_AAFjZsrcbHkNggPiA%==kn*h$SiDrXu<*S<}Y<}#xt&5D7qEJJ8y!+ z@5(h3r!0I7id*Yu0r{odr`ewAO_9_77M}XQmdKI;Vst09ly1g#Z8m diff --git a/Signal/Images.xcassets/button_timer_white.imageset/button_timer_white@3x.png b/Signal/Images.xcassets/button_timer_white.imageset/button_timer_white@3x.png deleted file mode 100644 index 5d7d89616ede29adaadaf478351bdd0270188b07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2260 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 literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/system_message_timer.imageset/Contents.json b/Signal/Images.xcassets/system_message_timer.imageset/Contents.json index b1af6ed5c..72e4dc33d 100644 --- a/Signal/Images.xcassets/system_message_timer.imageset/Contents.json +++ b/Signal/Images.xcassets/system_message_timer.imageset/Contents.json @@ -2,17 +2,17 @@ "images" : [ { "idiom" : "universal", - "filename" : "system_message_timer@1x.png", + "filename" : "ic_timer_white.png", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "system_message_timer@2x.png", + "filename" : "ic_timer_white@2x.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "system_message_timer@3x.png", + "filename" : "ic_timer_white@3x.png", "scale" : "3x" } ], diff --git a/Signal/Images.xcassets/system_message_timer.imageset/ic_timer_white.png b/Signal/Images.xcassets/system_message_timer.imageset/ic_timer_white.png new file mode 100644 index 0000000000000000000000000000000000000000..dccf011eecaa47cd0a92ea445fea522d4d3303f0 GIT binary patch literal 354 zcmV-o0iFJdP){{&3C@HiAH`{T;gI_iEri z8rLr14H3^_k}x9a5mNDfngUr!!!I3Ra}EptqDs1DBnF5ye5Y_Qs~%E~MS|Ssj9ApJ zAF(6q(AnCa*h`97mE;t?2|20~sYp&=I*6CVPcXv377j*+RKO^`!C#w4%#v(1e0v;T_R*xKmrzPgTguluNbfkZgJxAZ4fsI=Tn2|VsWW(} zZ@qyj`_V1Prw$m~YwF3xbx^+Up#FEr=SZ$m>QVM2e|b)%en$<&eW}s98}8_0_Q}3+~qvHQjdixQycVsHZY6=t6}Ui!FlRp zU~tMfrbryE`gmL5+2wSFLq6u4w-q74H|6ufVa2aKffojb@w2a*+Dwpgsj1e=)q!e7 zLfFD~!x>w2C*|`t;Q((9eS68meVV532O2g+n$9D_azeXJ?6+@YKqG7$eHOt%9UFQC zw$2icMDH^iIBR{XnKMBP)Ol&)qa@aZGpx%+igehFY@u>z>WE|F65Hs2I=nc!B?*`s zP5WA%O<}k*H36Va%AL~$URz$d_Erv9 zf@zux@lkp{rqA>I_R^#Uh}Gn;6?H$~*eMtUgJ2N6YOq+zxyGG~Y?O;E)n}pksdRx} zw2N|y)5}wqgBR_HkWlR*NtKL8qSYw@s6-nke93241_<3hxYz*7yUtLmmG9C(n4-cE zFK(vrYBUg>VdMw^WY9Z`=DIODYrc1V&dm^br9MT#?a7lR2Un24tM5(P;$k&|n^hrP zp#TQNJ!J3}DEpKlbN~w|BL(6rRA98_22I4E+=hZs$DR$9rw3K?$P8vIJic02oIq2&O~W9TL=b#&dQ-4}A^RFsP&|76{Waex!&EsMN7Q0IU@h zE1+kVTV0wg(${nJLzTZi==xD%g3!(SA)(_BU0>GJZZQ(XoYwQ1<6QTEScEQ3PVors z-HQ)CMg6JK`;2bQUMe5{0`1Fad{1^m-U=Sv~dn7M~=MDAY$#Qq~ zOsEP<5Ld(6JbRxZAbt}}Z0R@#C)fCK+<(N>%5e-%AbQfx46fFs$)C?=CX{?PhtO5y z?08NQLtDqb&!Sx!PK%2Ktf4SiZH4`^5$oWV0K|^s%tZIHCT5ASpqEW(K9Z9oWZ3i}+Jbqs_6hUBaOu&Q9zWp~k51tcJ)+OTyq2j5`UYm%)Rb9Rdv n;EyXQ6riwJEEelQzXA*Z2R$EWlNXta00000NkvXXu0mjfdtzq8 literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/system_message_timer.imageset/system_message_timer@1x.png b/Signal/Images.xcassets/system_message_timer.imageset/system_message_timer@1x.png deleted file mode 100644 index b5757b28256581dbe7407588ea4d270875342060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1353 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~&H|6fVg?3o zVGw3ym^DX&fq_LSGbExU!q>+tIX_n~F(p4KRj(qq0H~UQ!KT6r$jnVGNmQuF&B-ga zs<2f8tFQvHLBje<3ScEA*|tg%z5xo(`9-M;rg|oN21<5Z3JMA~MJZ`kK`w4k?LeNb zQbtKhft9{~d3m{Bxv^e;QM$gNrKP35fswwEkuFe$ZgFK^Nn(X=Ua>O75STeGsl~}f znFS@8`FRQ;a}$&DOG|8(lt3220mPjpnP~`{@`|C}0(wv%B%^PrXP}QwTWUon4s9SA zoZ3>7;l3&;Ey@A=DJ5AyH77MUHLs)?sLv3qb-=KNYeaEmMPdQOGH@V5{AL4kxm8eV zaehuICu1<^J5 z7i9u{nh0{2ogvf$WHEI0k=QIi7DUnj3VN%6%!<^U2$xJ?fP#HtWMHF@RRUe3bAC>K zQE)+Gaw^DSU@b^O=&HfiMB=grNdie@O0rdPX;M~datTsw0pkpu_MH;b^^t^a^s%b8 z0j2~i-~5!!v`Ux6l2kh*14DCN12bI%(-1==D+4ntOJf^-G&M*r0LeHPr6!i-7lq{K z=h%ULkqhD~80(oqbRx?`wc6-|auHIlf@E2+C@|03aRGJ0^1mIIo3!LUV3BaZ)5S5w zLNGZ&;!VRu4)%ZQPP{&x%G^Dz?QD`iI6C?t1t#-OnS4~aU+Js#iRd1srjwCOBEL9= z(hf~IED*^iGVzdrtLOxlqUnpd9zL7Nuyh~OMs_|`g~ACo9}EUbP0l+XkK(fpxv diff --git a/Signal/Images.xcassets/system_message_timer.imageset/system_message_timer@2x.png b/Signal/Images.xcassets/system_message_timer.imageset/system_message_timer@2x.png deleted file mode 100644 index 3b397f1ea82ee29fb19aaaf6ff379a93804e60c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1731 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z81_llpi<;HsXMd|v6mX?-X(Gs7c7{+3kj2o|M`E)8SrADBDCn&MGAmMZB3v?o0SfkoiGhtiRta>C&iOg{ zMZpD$$*CZRfwdqBp{oX46N$?jBnc#qDalsFrAb+-$t6g!1&lLr+ILD!*GCez(Z{OV z2AC48eDhN>(<)sOOH%EO3=GY64a{^6OhXKftPISojDV4VrUuCcAQ|VP)WnkfqLBRj z96PWtazR`LV?8s7PGotgRvUd#E<(yxkSq%p1?E{hE}%|W{eVdWA$_ujP0eU_`{wr5-B*=*hF z#`DZIE^@Rl7`8`j^MdF_v4swM44Wkw@15>pn13{QV#DSG zHW%*AbUa!VwK)Cev!49ISNlT4qrdeCJ_r=zj8lwcTzfQm-cz>wn@f-9tFqT>{l3e0 z-YUxGz_;p;f*WPiHThMlgshLY>acaD8Gft?sg!sStorocO+in6n}fxR^e-$p%B=sr z?n7`?wnLKT`{12Ny&jq7gCkdf{mT= zlZ9(jEZ48>-L+OGxlUBfCou5Cy4EY47kH!EUuO8_|C3+4bKem=e$M3AT`|ig@4NUK zJ#SPDT)bAZ=hCp(@iW~qj_e7)8x>~n-TUu#x$y?94%PRv^LQ@#)YacLL-Rs`KpZod2B?dkJGxq&lGp5z8U^&3V sv%zEPw50Bj6PD~Umy*{0a9Fg0`S|^5-|G{09tG7bp00i_>zopr0Ig+YlmGw# diff --git a/Signal/Images.xcassets/system_message_timer.imageset/system_message_timer@3x.png b/Signal/Images.xcassets/system_message_timer.imageset/system_message_timer@3x.png deleted file mode 100644 index 87605c1461e1d9c2d1ff0190c00cb1da5a9e75c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1924 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 diff --git a/Signal/Images.xcassets/table_ic_hourglass.imageset/table_ic_timer@2x.png b/Signal/Images.xcassets/table_ic_hourglass.imageset/table_ic_timer@2x.png index c7a6a89168549c0255f2ac482cab54e2b5b50c2e..0a0f15709142d3a916523bbc8fa5ecdf518f56ac 100644 GIT binary patch delta 821 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 diff --git a/Signal/Images.xcassets/table_ic_hourglass_empty.imageset/Contents.json b/Signal/Images.xcassets/table_ic_hourglass_empty.imageset/Contents.json deleted file mode 100644 index b516838aa..000000000 --- a/Signal/Images.xcassets/table_ic_hourglass_empty.imageset/Contents.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "table_ic_hourglass_empty@1x.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "table_ic_hourglass_empty@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "table_ic_hourglass_empty@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "template-rendering-intent" : "template" - } -} \ No newline at end of file diff --git a/Signal/Images.xcassets/table_ic_hourglass_empty.imageset/table_ic_hourglass_empty@1x.png b/Signal/Images.xcassets/table_ic_hourglass_empty.imageset/table_ic_hourglass_empty@1x.png deleted file mode 100644 index 078b58fbb95d6a320bc4418b0a0ffc0195d90c5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1485 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 b_`)8@KX$F}-@pDYxDDay>gTe~DWM4f`;}B% diff --git a/Signal/Images.xcassets/table_ic_hourglass_full.imageset/table_ic_hourglass_full.png b/Signal/Images.xcassets/table_ic_hourglass_full.imageset/table_ic_hourglass_full.png deleted file mode 100644 index 645491b17e91e00076fbb0a94686d0ed3b78f0ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWu?Bo-U3d6}R48yU2S$frBL=!|KJ(&bf2Snz~$_eERd1^qJfy z?r-lCI15FLrrQA!oITRWg_!qFA%lDpgKAL4Vzs}xOo-9GXp1LTMX0UPO zY-jzwWkCst_w^6Sh2~B6N=zII4@#cI9P;RiZeV1X7uLkJ|qMX3zit diff --git a/Signal/Images.xcassets/table_ic_hourglass_full.imageset/table_ic_hourglass_full@3x.png b/Signal/Images.xcassets/table_ic_hourglass_full.imageset/table_ic_hourglass_full@3x.png deleted file mode 100644 index 1bfa7b1c24e388ec638937876e5ccada54df951c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGok|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7`;4Q978H@y}5HY^RRXhi0bY)Lm1iBut&eXC{52 zTEWBGc=vPWhvxt9C`;!w%kg_oQt{k<^<7Z`RL3rNvWkro^1k;V$Porb%Mt}zAD^%PB`&ClVFd0N5UTmmdET$ z67~WIe>8F&<9G3}t-EEPa!%hZ{7+A9&QI0XP2~qZAL?JQ-1YIX_6Z3!9Gqy>eQCv$ zKdO~fr0extmOOsnIHBgxR>7{G{c27dKVEmzu=;1ha-H{Yw!(GZSZko?U|zxS-vkxU fNlQ$B2_`Tw=OgTe~DWM4fLrk0- diff --git a/Signal/Images.xcassets/table_ic_hourglass_full.imageset/Contents.json b/Signal/Images.xcassets/table_ic_timer.imageset/Contents.json similarity index 68% rename from Signal/Images.xcassets/table_ic_hourglass_full.imageset/Contents.json rename to Signal/Images.xcassets/table_ic_timer.imageset/Contents.json index aac492cd0..a62333543 100644 --- a/Signal/Images.xcassets/table_ic_hourglass_full.imageset/Contents.json +++ b/Signal/Images.xcassets/table_ic_timer.imageset/Contents.json @@ -2,17 +2,17 @@ "images" : [ { "idiom" : "universal", - "filename" : "table_ic_hourglass_full.png", + "filename" : "table_ic_timer.png", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "table_ic_hourglass_full@2x.png", + "filename" : "table_ic_timer@2x.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "table_ic_hourglass_full@3x.png", + "filename" : "table_ic_timer@3x.png", "scale" : "3x" } ], diff --git a/Signal/Images.xcassets/table_ic_timer.imageset/table_ic_timer.png b/Signal/Images.xcassets/table_ic_timer.imageset/table_ic_timer.png new file mode 100644 index 0000000000000000000000000000000000000000..8c66731fea65578a28b8343ef6aaae3b58b26d0f GIT binary patch literal 518 zcmV+h0{Q)kP)7~G$XKy(+OxMXgUGjAZ%bdfh(?RPE~FEfqVTC-RU5XB|qz#XBEXiTNxW*jCos4 zSeCoL24Fk@qH^99w{9sEwD5QYui0Pk;0hRc&5jZlt-yP5ZTzNjZiTTOj@7A)H-QUt zyC4t>td62!K@Shfh9~eB@G~24z@NZ{Bb@@@0Y!5#*OtX8EF_)3bD5fgqHk>m8nAst}+Wkt9@4KCd z8cv?Mf>1Jf8xCUC)~%x+TrGqG`q{M^%HKM2I}snK3TCJPRl`GQ$#hgu*k*JvrA+5d zN;9#baF30H!tz!FRuUlUNiGV~vLPFXH_=1RtL_7-7mghAF(MA#V{{AS2h0>L1 zooIa02ZwK}qbf~BYelPNMvR8a)btIrb|aeGQ{%vxol&&oz{y-NBRW5N#goK}3`RbLI<8lkaVu z)BFv5YqLZOA7;-r6fYf&RT>b1uRI9FHUv2#IoU0EQN9f|0~*V&#a6y_p*)b-e`&2F z5=u-0xQm&Wtm)p7C2*8{0IX}-cJvW7l5Qz&5kR>IaBT7L$ z8_I4(z@6m%OGE^`7|L!$z*>ACeTF^FusCYUZcM=1&T7cw!=Nd<-A3r31Y}qQyhljD zyH5fR164NpCJ2x?$J-%bYp43#vfq0Lar^w`-P_JS@3GbpLqBcdomQC(C-^2gbJNHi z9o3ZGn1HkGKHDQIL)nekEhHx`7Lf%o)GVAUIqj$@-BDA3)@QGc1vhq$pdGi$Wj} z2n5fH5?hBRji?H1VAA(Rd{77w0t7;U5Fii&gaCm+AP@)y=}=@O(nqJDlb;Xx30;Nl)z|>-!7P$Hkl@YXKuz{J1WxU zEaB$19jl#xea2kpj}*PgvfjThQEQ9@3=Rq?g#A|z4)jhn?|U2H)IdTKwiHv33ea9O z0`5qllZqTlx=o<=q7vXZCiEDd=O?WkQV;;`*j7h%P67^=b$&&VfXZ^7(C5tkHfRF3 zn}h(z2(NPx(B<%slms}8aa|4q#vGoJfdHFGAD7<$Wnrh*7SG!E9MR*6a^^=P*3Rnwz_>wL4b+n55@$TbgM8BaAHir$um0y zn+H4`0~iw!TsPUKni)<6pnMtqOc5Y^t-`N0l@vrN1qo;nP%*X_iWFoT2cj;zDh-HC zfbz6W5&~9?BVdJr0Ml%+VN5{dX`3Jf7@vn=T>I$@(5dpYO%MW(0X&7H_uJYgh&N<= zC7Ce-aJ-VVWLj}bL!e8P_aI9N_-%2`E298-4P=v`UNNFxxEfARd<(Mxdy8v!47`6A z$QD^VBlzOn#5y*pm#F7ho}N%Q+vVv83LerCB%mV^;iIJ$V?xT@oGnTqxB z?zVUaOvH|_=S)QI4>%kszp)D)5ve|5ayuElE(Bka@l+r2;rJP=3&;uP4e}W)fj}S- i2m}IwK!6H=1sDKAdnR+cBmr#z0000 Date: Sat, 20 Jan 2018 11:27:32 -0500 Subject: [PATCH 3/4] Timer button with duration label // FREEBIE --- Signal.xcodeproj/project.pbxproj | 4 + .../xcshareddata/xcschemes/Signal.xcscheme | 2 +- .../button_timer_white.imageset/Contents.json | 23 --- .../ic_timer_white.png | Bin 354 -> 0 bytes .../ic_timer_white@2x.png | Bin 631 -> 0 bytes .../ic_timer_white@3x.png | Bin 809 -> 0 bytes .../Contents.json | 6 +- .../ic_timer.imageset/ic_timer.png | Bin 0 -> 778 bytes .../ic_timer.imageset/ic_timer@2x.png | Bin 0 -> 1524 bytes .../ic_timer.imageset/ic_timer@3x.png | Bin 0 -> 2476 bytes .../Contents.json | 23 --- .../ic_timer_white.png | Bin 354 -> 0 bytes .../ic_timer_white@2x.png | Bin 631 -> 0 bytes .../ic_timer_white@3x.png | Bin 809 -> 0 bytes .../table_ic_timer.png | Bin 518 -> 0 bytes .../table_ic_timer@2x.png | Bin 844 -> 0 bytes .../table_ic_timer@3x.png | Bin 1064 -> 0 bytes .../table_ic_timer.imageset/Contents.json | 26 ---- .../table_ic_timer.png | Bin 518 -> 0 bytes .../table_ic_timer@2x.png | Bin 844 -> 0 bytes .../table_ic_timer@3x.png | Bin 1064 -> 0 bytes .../Cells/OWSSystemMessageCell.m | 4 +- .../ConversationViewController.m | 49 +++---- .../OWSConversationSettingsViewController.m | 12 +- .../translations/en.lproj/Localizable.strings | 15 ++ .../DisappearingTimerConfigurationView.swift | 134 ++++++++++++++++++ SignalMessaging/categories/UIColor+OWS.h | 3 +- SignalMessaging/categories/UIColor+OWS.m | 7 +- .../contacts/SelectThreadViewController.m | 19 ++- .../OWSDisappearingMessagesConfiguration.h | 7 +- .../OWSDisappearingMessagesConfiguration.m | 106 ++++++++++---- ...sappearingConfigurationUpdateInfoMessage.m | 9 +- 32 files changed, 288 insertions(+), 161 deletions(-) delete mode 100644 Signal/Images.xcassets/button_timer_white.imageset/Contents.json delete mode 100644 Signal/Images.xcassets/button_timer_white.imageset/ic_timer_white.png delete mode 100644 Signal/Images.xcassets/button_timer_white.imageset/ic_timer_white@2x.png delete mode 100644 Signal/Images.xcassets/button_timer_white.imageset/ic_timer_white@3x.png rename Signal/Images.xcassets/{table_ic_hourglass.imageset => ic_timer.imageset}/Contents.json (72%) create mode 100644 Signal/Images.xcassets/ic_timer.imageset/ic_timer.png create mode 100644 Signal/Images.xcassets/ic_timer.imageset/ic_timer@2x.png create mode 100644 Signal/Images.xcassets/ic_timer.imageset/ic_timer@3x.png delete mode 100644 Signal/Images.xcassets/system_message_timer.imageset/Contents.json delete mode 100644 Signal/Images.xcassets/system_message_timer.imageset/ic_timer_white.png delete mode 100644 Signal/Images.xcassets/system_message_timer.imageset/ic_timer_white@2x.png delete mode 100644 Signal/Images.xcassets/system_message_timer.imageset/ic_timer_white@3x.png delete mode 100644 Signal/Images.xcassets/table_ic_hourglass.imageset/table_ic_timer.png delete mode 100644 Signal/Images.xcassets/table_ic_hourglass.imageset/table_ic_timer@2x.png delete mode 100644 Signal/Images.xcassets/table_ic_hourglass.imageset/table_ic_timer@3x.png delete mode 100644 Signal/Images.xcassets/table_ic_timer.imageset/Contents.json delete mode 100644 Signal/Images.xcassets/table_ic_timer.imageset/table_ic_timer.png delete mode 100644 Signal/Images.xcassets/table_ic_timer.imageset/table_ic_timer@2x.png delete mode 100644 Signal/Images.xcassets/table_ic_timer.imageset/table_ic_timer@3x.png create mode 100644 SignalMessaging/Views/DisappearingTimerConfigurationView.swift diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 0d2797499..5e37de0b7 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -292,6 +292,7 @@ 45BB93381E688E14001E3939 /* UIDevice+featureSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45BB93371E688E14001E3939 /* UIDevice+featureSupport.swift */; }; 45BC829D1FD9C4B400011CF3 /* ShareViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45BC829C1FD9C4B400011CF3 /* ShareViewDelegate.swift */; }; 45BD60821DE9547E00A8F436 /* Contacts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 45BD60811DE9547E00A8F436 /* Contacts.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 45BE4EA22012AD2000935E59 /* DisappearingTimerConfigurationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45BE4EA12012AD2000935E59 /* DisappearingTimerConfigurationView.swift */; }; 45C0DC1B1E68FE9000E04C47 /* UIApplication+OWS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45C0DC1A1E68FE9000E04C47 /* UIApplication+OWS.swift */; }; 45C0DC1E1E69011F00E04C47 /* UIStoryboard+OWS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45C0DC1D1E69011F00E04C47 /* UIStoryboard+OWS.swift */; }; 45C9DEB81DF4E35A0065CA84 /* WebRTCCallMessageHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45C9DEB71DF4E35A0065CA84 /* WebRTCCallMessageHandler.swift */; }; @@ -831,6 +832,7 @@ 45BB93371E688E14001E3939 /* UIDevice+featureSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIDevice+featureSupport.swift"; sourceTree = ""; }; 45BC829C1FD9C4B400011CF3 /* ShareViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewDelegate.swift; sourceTree = ""; }; 45BD60811DE9547E00A8F436 /* Contacts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Contacts.framework; path = System/Library/Frameworks/Contacts.framework; sourceTree = SDKROOT; }; + 45BE4EA12012AD2000935E59 /* DisappearingTimerConfigurationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisappearingTimerConfigurationView.swift; sourceTree = ""; }; 45C0DC1A1E68FE9000E04C47 /* UIApplication+OWS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIApplication+OWS.swift"; sourceTree = ""; }; 45C0DC1D1E69011F00E04C47 /* UIStoryboard+OWS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIStoryboard+OWS.swift"; sourceTree = ""; }; 45C9DEB71DF4E35A0065CA84 /* WebRTCCallMessageHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebRTCCallMessageHandler.swift; sourceTree = ""; }; @@ -1255,6 +1257,7 @@ 340CB2221EAC155C0001CAA1 /* ContactsViewHelper.h */, 340CB2231EAC155C0001CAA1 /* ContactsViewHelper.m */, 346129D11FD2085A00532771 /* CommonStrings.swift */, + 45BE4EA12012AD2000935E59 /* DisappearingTimerConfigurationView.swift */, 346129CF1FD207F200532771 /* OWSAlerts.swift */, 454A965E1FD60EA2008D2A0E /* OWSFlatButton.swift */, 3400C7971EAFB772008A8584 /* ThreadViewHelper.h */, @@ -2752,6 +2755,7 @@ buildActionMask = 2147483647; files = ( 45194F951FD7216600333B2C /* TSUnreadIndicatorInteraction.m in Sources */, + 45BE4EA22012AD2000935E59 /* DisappearingTimerConfigurationView.swift in Sources */, 346129F71FD5F31400532771 /* OWS105AttachmentFilePaths.m in Sources */, 45194F931FD7215C00333B2C /* OWSContactOffersInteraction.m in Sources */, 450998681FD8C0FF00D89EB3 /* AttachmentSharing.m in Sources */, diff --git a/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme b/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme index fdcb74c83..526b04e7a 100644 --- a/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme +++ b/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme @@ -28,7 +28,7 @@ buildForAnalyzing = "YES"> diff --git a/Signal/Images.xcassets/button_timer_white.imageset/Contents.json b/Signal/Images.xcassets/button_timer_white.imageset/Contents.json deleted file mode 100644 index 72e4dc33d..000000000 --- a/Signal/Images.xcassets/button_timer_white.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "ic_timer_white.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ic_timer_white@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ic_timer_white@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Signal/Images.xcassets/button_timer_white.imageset/ic_timer_white.png b/Signal/Images.xcassets/button_timer_white.imageset/ic_timer_white.png deleted file mode 100644 index dccf011eecaa47cd0a92ea445fea522d4d3303f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmV-o0iFJdP){{&3C@HiAH`{T;gI_iEri z8rLr14H3^_k}x9a5mNDfngUr!!!I3Ra}EptqDs1DBnF5ye5Y_Qs~%E~MS|Ssj9ApJ zAF(6q(AnCa*h`97mE;t?2|20~sYp&=I*6CVPcXv377j*+RKO^`!C#w4%#v(1e0v;T_R*xKmrzPgTguluNbfkZgJxAZ4fsI=Tn2|VsWW(} zZ@qyj`_V1Prw$m~YwF3xbx^+Up#FEr=SZ$m>QVM2e|b)%en$<&eW}s98}8_0_Q}3+~qvHQjdixQycVsHZY6=t6}Ui!FlRp zU~tMfrbryE`gmL5+2wSFLq6u4w-q74H|6ufVa2aKffojb@w2a*+Dwpgsj1e=)q!e7 zLfFD~!x>w2C*|`t;Q((9eS68meVV532O2g+n$9D_azeXJ?6+@YKqG7$eHOt%9UFQC zw$2icMDH^iIBR{XnKMBP)Ol&)qa@aZGpx%+igehFY@u>z>WE|F65Hs2I=nc!B?*`s zP5WA%O<}k*H36Va%AL~$URz$d_Erv9 zf@zux@lkp{rqA>I_R^#Uh}Gn;6?H$~*eMtUgJ2N6YOq+zxyGG~Y?O;E)n}pksdRx} zw2N|y)5}wqgBR_HkWlR*NtKL8qSYw@s6-nke93241_<3hxYz*7yUtLmmG9C(n4-cE zFK(vrYBUg>VdMw^WY9Z`=DIODYrc1V&dm^br9MT#?a7lR2Un24tM5(P;$k&|n^hrP zp#TQNJ!J3}DEpKlbN~w|BL(6rRA98_22I4E+=hZs$DR$9rw3K?$P8vIJic02oIq2&O~W9TL=b#&dQ-4}A^RFsP&|76{Waex!&EsMN7Q0IU@h zE1+kVTV0wg(${nJLzTZi==xD%g3!(SA)(_BU0>GJZZQ(XoYwQ1<6QTEScEQ3PVors z-HQ)CMg6JK`;2bQUMe5{0`1Fad{1^m-U=Sv~dn7M~=MDAY$#Qq~ zOsEP<5Ld(6JbRxZAbt}}Z0R@#C)fCK+<(N>%5e-%AbQfx46fFs$)C?=CX{?PhtO5y z?08NQLtDqb&!Sx!PK%2Ktf4SiZH4`^5$oWV0K|^s%tZIHCT5ASpqEW(K9Z9oWZ3i}+Jbqs_6hUBaOu&Q9zWp~k51tcJ)+OTyq2j5`UYm%)Rb9Rdv n;EyXQ6riwJEEelQzXA*Z2R$EWlNXta00000NkvXXu0mjfdtzq8 diff --git a/Signal/Images.xcassets/table_ic_hourglass.imageset/Contents.json b/Signal/Images.xcassets/ic_timer.imageset/Contents.json similarity index 72% rename from Signal/Images.xcassets/table_ic_hourglass.imageset/Contents.json rename to Signal/Images.xcassets/ic_timer.imageset/Contents.json index a62333543..b78318659 100644 --- a/Signal/Images.xcassets/table_ic_hourglass.imageset/Contents.json +++ b/Signal/Images.xcassets/ic_timer.imageset/Contents.json @@ -2,17 +2,17 @@ "images" : [ { "idiom" : "universal", - "filename" : "table_ic_timer.png", + "filename" : "ic_timer.png", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "table_ic_timer@2x.png", + "filename" : "ic_timer@2x.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "table_ic_timer@3x.png", + "filename" : "ic_timer@3x.png", "scale" : "3x" } ], diff --git a/Signal/Images.xcassets/ic_timer.imageset/ic_timer.png b/Signal/Images.xcassets/ic_timer.imageset/ic_timer.png new file mode 100644 index 0000000000000000000000000000000000000000..8b93f68735c86f9dacd17265a730e1448c9a71fe GIT binary patch literal 778 zcmV+l1NHogP)$dq+yd{tUZ~B==vH|mKR?sOQtGLF2&WJ*IOW<9e?SQ4rh-d?3)jzPiNh)@9?)9$5 zH+9=AZIhzTz&xA102TIC-^=p~Xw|cfe`n;`Fn57@Q8dp5f_K29{D#gAf)1t}_!aQ# zdG$}-Ho5DCAOpm0w)B-h07cz4YcGkJcLfv%UIBbF9QTD|{|w zit|O?Hrpr-10bA*8lKW$zzg^c$kqSN5TEx!xHoDz%>W5?diAfSyhFxRbTPuU155RP zKUMo=booMz0acPlY0$E)A=PDo4r!Y7n$WVWH+D=x)23*Wh+tVp1AMXfp78J` zrO|*fZ`o@jrXI**hzEAwf@Qf}NN0%46ipJLWtp;7z->U~A-yKFtjhLci~-NCD}5}8 z3|(?+UA|y7K(6#&dYi0SIC|;3D~0ie(Ng_?l``-u5N>_zY8@`%Ghj`B7YZrxM}=?} zYWURrvchRV-8QX(U<#CD-qylZVo2Xb2P;Cm5?lJo-Hxub98{gj%9keox^28W9hyqy z^j&EIR71{$%&q7vf1qCt8gY+}tpi=hBWP!%dZUT0#ZTY~e`^sUm4~$EuFYqMBI!)s zU3)zixBkFU5)dj~80{lp;3uXXaz^gr6VpB5|12pV2@h|;Uzgb`2ZL?yK>z>%07*qo IM6N<$f-jtKM*si- literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/ic_timer.imageset/ic_timer@2x.png b/Signal/Images.xcassets/ic_timer.imageset/ic_timer@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ba56ce864b85b15702dfd1f9ca2dc41445a214b0 GIT binary patch literal 1524 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 W>zh2DBD3umz|_#f;FZ2>?0*5_(2`LA literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/system_message_timer.imageset/Contents.json b/Signal/Images.xcassets/system_message_timer.imageset/Contents.json deleted file mode 100644 index 72e4dc33d..000000000 --- a/Signal/Images.xcassets/system_message_timer.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "ic_timer_white.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "ic_timer_white@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "ic_timer_white@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Signal/Images.xcassets/system_message_timer.imageset/ic_timer_white.png b/Signal/Images.xcassets/system_message_timer.imageset/ic_timer_white.png deleted file mode 100644 index dccf011eecaa47cd0a92ea445fea522d4d3303f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmV-o0iFJdP){{&3C@HiAH`{T;gI_iEri z8rLr14H3^_k}x9a5mNDfngUr!!!I3Ra}EptqDs1DBnF5ye5Y_Qs~%E~MS|Ssj9ApJ zAF(6q(AnCa*h`97mE;t?2|20~sYp&=I*6CVPcXv377j*+RKO^`!C#w4%#v(1e0v;T_R*xKmrzPgTguluNbfkZgJxAZ4fsI=Tn2|VsWW(} zZ@qyj`_V1Prw$m~YwF3xbx^+Up#FEr=SZ$m>QVM2e|b)%en$<&eW}s98}8_0_Q}3+~qvHQjdixQycVsHZY6=t6}Ui!FlRp zU~tMfrbryE`gmL5+2wSFLq6u4w-q74H|6ufVa2aKffojb@w2a*+Dwpgsj1e=)q!e7 zLfFD~!x>w2C*|`t;Q((9eS68meVV532O2g+n$9D_azeXJ?6+@YKqG7$eHOt%9UFQC zw$2icMDH^iIBR{XnKMBP)Ol&)qa@aZGpx%+igehFY@u>z>WE|F65Hs2I=nc!B?*`s zP5WA%O<}k*H36Va%AL~$URz$d_Erv9 zf@zux@lkp{rqA>I_R^#Uh}Gn;6?H$~*eMtUgJ2N6YOq+zxyGG~Y?O;E)n}pksdRx} zw2N|y)5}wqgBR_HkWlR*NtKL8qSYw@s6-nke93241_<3hxYz*7yUtLmmG9C(n4-cE zFK(vrYBUg>VdMw^WY9Z`=DIODYrc1V&dm^br9MT#?a7lR2Un24tM5(P;$k&|n^hrP zp#TQNJ!J3}DEpKlbN~w|BL(6rRA98_22I4E+=hZs$DR$9rw3K?$P8vIJic02oIq2&O~W9TL=b#&dQ-4}A^RFsP&|76{Waex!&EsMN7Q0IU@h zE1+kVTV0wg(${nJLzTZi==xD%g3!(SA)(_BU0>GJZZQ(XoYwQ1<6QTEScEQ3PVors z-HQ)CMg6JK`;2bQUMe5{0`1Fad{1^m-U=Sv~dn7M~=MDAY$#Qq~ zOsEP<5Ld(6JbRxZAbt}}Z0R@#C)fCK+<(N>%5e-%AbQfx46fFs$)C?=CX{?PhtO5y z?08NQLtDqb&!Sx!PK%2Ktf4SiZH4`^5$oWV0K|^s%tZIHCT5ASpqEW(K9Z9oWZ3i}+Jbqs_6hUBaOu&Q9zWp~k51tcJ)+OTyq2j5`UYm%)Rb9Rdv n;EyXQ6riwJEEelQzXA*Z2R$EWlNXta00000NkvXXu0mjfdtzq8 diff --git a/Signal/Images.xcassets/table_ic_hourglass.imageset/table_ic_timer.png b/Signal/Images.xcassets/table_ic_hourglass.imageset/table_ic_timer.png deleted file mode 100644 index 8c66731fea65578a28b8343ef6aaae3b58b26d0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 518 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 i2m}IwK!6H=1sDKAdnR+cBmr#z0000 \(frame)") + } + } + + override public var bounds: CGRect { + didSet { + Logger.verbose("\(logTag) in \(#function): \(oldValue) -> \(bounds)") + } + } + + override public func layoutSubviews() { + let oldFrame = self.frame + super.layoutSubviews() + Logger.verbose("\(logTag) in \(#function). Frame: \(oldFrame) -> \(self.frame)") + } + + private let imageView: UIImageView + private let label: UILabel + private var pressGesture: UILongPressGestureRecognizer! + + public required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc + public init(durationSeconds: UInt32) { + self.imageView = UIImageView(image: #imageLiteral(resourceName: "ic_timer")) + imageView.contentMode = .scaleAspectFit + + self.label = UILabel() + label.text = OWSDisappearingMessagesConfiguration.string(forDurationSeconds: durationSeconds, useShortFormat: true) + label.font = UIFont.systemFont(ofSize: 10) + label.textColor = UIColor.white + label.textAlignment = .center + label.minimumScaleFactor = 0.5 + + super.init(frame: CGRect.zero) + + applyTintColor(self.tintColor) + + // Gesture, simulating button touch up inside + let gesture = UILongPressGestureRecognizer(target: self, action: #selector(pressHandler)) + gesture.minimumPressDuration = 0 + self.pressGesture = gesture + self.addGestureRecognizer(pressGesture) + + // disable gesture recognizer until a delegate is assigned + // this lets us use the UI as either an interactive button + // or as a non-interactive status indicator + pressGesture.isEnabled = false + + // Accessability + self.accessibilityLabel = NSLocalizedString("DISAPPEARING_MESSAGES_LABEL", comment: "Accessibility label for disappearing messages") + let hintFormatString = NSLocalizedString("DISAPPEARING_MESSAGES_HINT", comment: "Accessibility hint that contains current timeout information") + let durationString = OWSDisappearingMessagesConfiguration.string(forDurationSeconds: durationSeconds, useShortFormat: false) + self.accessibilityHint = String(format: hintFormatString, durationString) + + // Layout + self.addSubview(imageView) + self.addSubview(label) + + let kHorizontalPadding: CGFloat = 4 + let kVerticalPadding: CGFloat = 6 + imageView.autoPinEdgesToSuperviewEdges(with: UIEdgeInsets(top: kVerticalPadding, left: kHorizontalPadding, bottom: 0, right: kHorizontalPadding), excludingEdge: .bottom) + label.autoPinEdgesToSuperviewEdges(with: UIEdgeInsets(top: 0, left: kHorizontalPadding, bottom: kVerticalPadding, right: kHorizontalPadding), excludingEdge: .top) + label.autoPinEdge(.top, to: .bottom, of: imageView) + } + + @objc + func pressHandler(_ gestureRecognizer: UILongPressGestureRecognizer) { + Logger.verbose("\(self.logTag) in \(#function)") + + // handle touch down and touch up events separately + if gestureRecognizer.state == .began { + applyTintColor(UIColor.gray) + } else if gestureRecognizer.state == .ended { + applyTintColor(self.tintColor) + + let location = gestureRecognizer.location(in: self) + let isTouchUpInside = self.bounds.contains(location) + + if (isTouchUpInside) { + // Similar to a UIButton's touch-up-inside + self.delegate?.disappearingTimerConfigurationViewWasTapped(self) + } else { + // Similar to a UIButton's touch-up-outside + + // cancel gesture + gestureRecognizer.isEnabled = false + gestureRecognizer.isEnabled = true + } + } + } + + override public var tintColor: UIColor! { + didSet { + applyTintColor(tintColor) + } + } + + private func applyTintColor(_ color: UIColor) { + imageView.tintColor = color + label.textColor = color + } +} diff --git a/SignalMessaging/categories/UIColor+OWS.h b/SignalMessaging/categories/UIColor+OWS.h index ac5c5263a..de19f3b5d 100644 --- a/SignalMessaging/categories/UIColor+OWS.h +++ b/SignalMessaging/categories/UIColor+OWS.h @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import @@ -21,6 +21,7 @@ NS_ASSUME_NONNULL_BEGIN @property (class, readonly, nonatomic) UIColor *ows_greenColor; @property (class, readonly, nonatomic) UIColor *ows_redColor; @property (class, readonly, nonatomic) UIColor *ows_blackColor; +@property (class, readonly, nonatomic) UIColor *ows_blackIconColor; @property (class, readonly, nonatomic) UIColor *ows_errorMessageBorderColor; @property (class, readonly, nonatomic) UIColor *ows_infoMessageBorderColor; @property (class, readonly, nonatomic) UIColor *ows_inputToolbarBackgroundColor; diff --git a/SignalMessaging/categories/UIColor+OWS.m b/SignalMessaging/categories/UIColor+OWS.m index a6736c3e9..d48b14435 100644 --- a/SignalMessaging/categories/UIColor+OWS.m +++ b/SignalMessaging/categories/UIColor+OWS.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSMath.h" @@ -27,6 +27,11 @@ NS_ASSUME_NONNULL_BEGIN return [UIColor colorWithRed:8.f / 255.f green:10.f / 255.f blue:0. / 255.f alpha:1.f]; } ++ (UIColor *)ows_blackIconColor +{ + return [UIColor colorWithRGBHex:0x505050]; +} + + (UIColor *)ows_darkGrayColor { return [UIColor colorWithRed:81.f / 255.f green:81.f / 255.f blue:81.f / 255.f alpha:1.f]; diff --git a/SignalMessaging/contacts/SelectThreadViewController.m b/SignalMessaging/contacts/SelectThreadViewController.m index 22790a509..62d44b97f 100644 --- a/SignalMessaging/contacts/SelectThreadViewController.m +++ b/SignalMessaging/contacts/SelectThreadViewController.m @@ -217,17 +217,14 @@ NS_ASSUME_NONNULL_BEGIN }]; if (disappearingMessagesConfiguration && disappearingMessagesConfiguration.isEnabled) { - UIImage *icon = [UIImage imageNamed:@"table_ic_hourglass"]; - OWSAssert(icon); - UIImageView *iconView = [UIImageView new]; - iconView.image = [icon imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - iconView.tintColor = [UIColor colorWithWhite:0.5f alpha:1.f]; - iconView.contentMode = UIViewContentModeScaleAspectFit; - // Default size of this icon is a too large for the thread picker context - // so we specify a bit smaller. - iconView.frame = CGRectMake(0, 0, 20, 20); - - cell.accessoryView = iconView; + DisappearingTimerConfigurationView *disappearingTimerConfigurationView = + [[DisappearingTimerConfigurationView alloc] + initWithDurationSeconds:disappearingMessagesConfiguration.durationSeconds]; + + disappearingTimerConfigurationView.frame = CGRectMake(0, 0, 44, 44); + disappearingTimerConfigurationView.tintColor = [UIColor colorWithWhite:0.5f alpha:1.f]; + + cell.accessoryView = disappearingTimerConfigurationView; } } diff --git a/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.h b/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.h index 03ee715f0..1aa20daab 100644 --- a/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.h +++ b/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.h @@ -1,5 +1,6 @@ -// Created by Michael Kirk on 9/23/16. -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// #import "TSYapDatabaseObject.h" @@ -24,7 +25,7 @@ extern const uint32_t OWSDisappearingMessagesConfigurationDefaultExpirationDurat + (NSArray *)validDurationsSeconds; -+ (NSString *)stringForDurationSeconds:(uint32_t)durationSeconds; ++ (NSString *)stringForDurationSeconds:(uint32_t)durationSeconds useShortFormat:(BOOL)useShortFormat; @end diff --git a/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.m b/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.m index f3242de2f..6ea20514b 100644 --- a/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.m +++ b/SignalServiceKit/src/Contacts/OWSDisappearingMessagesConfiguration.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSDisappearingMessagesConfiguration.h" @@ -62,7 +62,7 @@ const uint32_t OWSDisappearingMessagesConfigurationDefaultExpirationDuration = k } } -+ (NSString *)stringForDurationSeconds:(uint32_t)durationSeconds ++ (NSString *)stringForDurationSeconds:(uint32_t)durationSeconds useShortFormat:(BOOL)useShortFormat { NSString *amountFormat; uint32_t duration; @@ -73,55 +73,101 @@ const uint32_t OWSDisappearingMessagesConfigurationDefaultExpirationDuration = k uint32_t secondsPerWeek = secondsPerDay * 7; if (durationSeconds < secondsPerMinute) { // XX Seconds - amountFormat = NSLocalizedString(@"TIME_AMOUNT_SECONDS", - @"{{number of seconds}} embedded in strings, e.g. 'Alice updated disappearing messages " - @"expiration to {{5 seconds}}'. See other *_TIME_AMOUNT strings"); + if (useShortFormat) { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_SECONDS_SHORT_FORMAT", + @"Label text below navbar button, embeds {{number of seconds}}. Must be very short, like 1 or 2 characters, The space is intentionally ommitted between the text and the embedded duration so that we get, e.g. '5s' not '5 s'. See other *_TIME_AMOUNT strings"); + } else { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_SECONDS", + @"{{number of seconds}} embedded in strings, e.g. 'Alice updated disappearing messages " + @"expiration to {{5 seconds}}'. See other *_TIME_AMOUNT strings"); + } + duration = durationSeconds; } else if (durationSeconds < secondsPerMinute * 1.5) { // 1 Minute - amountFormat = NSLocalizedString(@"TIME_AMOUNT_SINGLE_MINUTE", - @"{{1 minute}} embedded in strings, e.g. 'Alice updated disappearing messages " - @"expiration to {{1 minute}}'. See other *_TIME_AMOUNT strings"); + if (useShortFormat) { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_MINUTES_SHORT_FORMAT", + @"Label text below navbar button, embeds {{number of minutes}}. Must be very short, like 1 or 2 characters, The space is intentionally ommitted between the text and the embedded duration so that we get, e.g. '5m' not '5 m'. See other *_TIME_AMOUNT strings"); + } else { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_SINGLE_MINUTE", + @"{{1 minute}} embedded in strings, e.g. 'Alice updated disappearing messages " + @"expiration to {{1 minute}}'. See other *_TIME_AMOUNT strings"); + } duration = durationSeconds / secondsPerMinute; } else if (durationSeconds < secondsPerHour) { // Multiple Minutes - amountFormat = NSLocalizedString(@"TIME_AMOUNT_MINUTES", - @"{{number of minutes}} embedded in strings, e.g. 'Alice updated disappearing messages " - @"expiration to {{5 minutes}}'. See other *_TIME_AMOUNT strings"); + if (useShortFormat) { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_MINUTES_SHORT_FORMAT", + @"Label text below navbar button, embeds {{number of minutes}}. Must be very short, like 1 or 2 characters, The space is intentionally ommitted between the text and the embedded duration so that we get, e.g. '5m' not '5 m'. See other *_TIME_AMOUNT strings"); + } else { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_MINUTES", + @"{{number of minutes}} embedded in strings, e.g. 'Alice updated disappearing messages " + @"expiration to {{5 minutes}}'. See other *_TIME_AMOUNT strings"); + } duration = durationSeconds / secondsPerMinute; } else if (durationSeconds < secondsPerHour * 1.5) { // 1 Hour - amountFormat = NSLocalizedString(@"TIME_AMOUNT_SINGLE_HOUR", - @"{{1 hour}} embedded in strings, e.g. 'Alice updated disappearing messages " - @"expiration to {{1 hour}}'. See other *_TIME_AMOUNT strings"); + if (useShortFormat) { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_HOURS_SHORT_FORMAT", + @"Label text below navbar button, embeds {{number of hours}}. Must be very short, like 1 or 2 characters, The space is intentionally ommitted between the text and the embedded duration so that we get, e.g. '5h' not '5 h'. See other *_TIME_AMOUNT strings"); + } else { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_SINGLE_HOUR", + @"{{1 hour}} embedded in strings, e.g. 'Alice updated disappearing messages " + @"expiration to {{1 hour}}'. See other *_TIME_AMOUNT strings"); + } duration = durationSeconds / secondsPerHour; } else if (durationSeconds < secondsPerDay) { // Multiple Hours - amountFormat = NSLocalizedString(@"TIME_AMOUNT_HOURS", - @"{{number of hours}} embedded in strings, e.g. 'Alice updated disappearing messages " - @"expiration to {{5 hours}}'. See other *_TIME_AMOUNT strings"); + if (useShortFormat) { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_HOURS_SHORT_FORMAT", + @"Label text below navbar button, embeds {{number of hours}}. Must be very short, like 1 or 2 characters, The space is intentionally ommitted between the text and the embedded duration so that we get, e.g. '5h' not '5 h'. See other *_TIME_AMOUNT strings"); + } else { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_HOURS", + @"{{number of hours}} embedded in strings, e.g. 'Alice updated disappearing messages " + @"expiration to {{5 hours}}'. See other *_TIME_AMOUNT strings"); + } duration = durationSeconds / secondsPerHour; } else if (durationSeconds < secondsPerDay * 1.5) { // 1 Day - amountFormat = NSLocalizedString(@"TIME_AMOUNT_SINGLE_DAY", - @"{{1 day}} embedded in strings, e.g. 'Alice updated disappearing messages " - @"expiration to {{1 day}}'. See other *_TIME_AMOUNT strings"); + if (useShortFormat) { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_DAYS_SHORT_FORMAT", + @"Label text below navbar button, embeds {{number of days}}. Must be very short, like 1 or 2 characters, The space is intentionally ommitted between the text and the embedded duration so that we get, e.g. '5d' not '5 d'. See other *_TIME_AMOUNT strings"); + } else { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_SINGLE_DAY", + @"{{1 day}} embedded in strings, e.g. 'Alice updated disappearing messages " + @"expiration to {{1 day}}'. See other *_TIME_AMOUNT strings"); + } duration = durationSeconds / secondsPerDay; } else if (durationSeconds < secondsPerWeek) { // Multiple Days - amountFormat = NSLocalizedString(@"TIME_AMOUNT_DAYS", - @"{{number of days}} embedded in strings, e.g. 'Alice updated disappearing messages " - @"expiration to {{5 days}}'. See other *_TIME_AMOUNT strings"); + if (useShortFormat) { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_DAYS_SHORT_FORMAT", + @"Label text below navbar button, embeds {{number of days}}. Must be very short, like 1 or 2 characters, The space is intentionally ommitted between the text and the embedded duration so that we get, e.g. '5d' not '5 d'. See other *_TIME_AMOUNT strings"); + } else { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_DAYS", + @"{{number of days}} embedded in strings, e.g. 'Alice updated disappearing messages " + @"expiration to {{5 days}}'. See other *_TIME_AMOUNT strings"); + } duration = durationSeconds / secondsPerDay; } else if (durationSeconds < secondsPerWeek * 1.5) { // 1 Week - amountFormat = NSLocalizedString(@"TIME_AMOUNT_SINGLE_WEEK", - @"{{1 week}} embedded in strings, e.g. 'Alice updated disappearing messages " - @"expiration to {{1 week}}'. See other *_TIME_AMOUNT strings"); + if (useShortFormat) { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_WEEKS_SHORT_FORMAT", + @"Label text below navbar button, embeds {{number of weeks}}. Must be very short, like 1 or 2 characters, The space is intentionally ommitted between the text and the embedded duration so that we get, e.g. '5w' not '5 w'. See other *_TIME_AMOUNT strings"); + } else { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_SINGLE_WEEK", + @"{{1 week}} embedded in strings, e.g. 'Alice updated disappearing messages " + @"expiration to {{1 week}}'. See other *_TIME_AMOUNT strings"); + } duration = durationSeconds / secondsPerWeek; } else { // Multiple weeks - amountFormat = NSLocalizedString(@"TIME_AMOUNT_WEEKS", - @"{{number of weeks}}, embedded in strings, e.g. 'Alice updated disappearing messages " - @"expiration to {{5 weeks}}'. See other *_TIME_AMOUNT strings"); + if (useShortFormat) { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_WEEKS_SHORT_FORMAT", + @"Label text below navbar button, embeds {{number of weeks}}. Must be very short, like 1 or 2 characters, The space is intentionally ommitted between the text and the embedded duration so that we get, e.g. '5w' not '5 w'. See other *_TIME_AMOUNT strings"); + } else { + amountFormat = NSLocalizedString(@"TIME_AMOUNT_WEEKS", + @"{{number of weeks}}, embedded in strings, e.g. 'Alice updated disappearing messages " + @"expiration to {{5 weeks}}'. See other *_TIME_AMOUNT strings"); + } duration = durationSeconds / secondsPerWeek; } @@ -152,7 +198,7 @@ const uint32_t OWSDisappearingMessagesConfigurationDefaultExpirationDuration = k - (NSString *)durationString { - return [self.class stringForDurationSeconds:self.durationSeconds]; + return [self.class stringForDurationSeconds:self.durationSeconds useShortFormat:NO]; } #pragma mark - Dirty Tracking diff --git a/SignalServiceKit/src/Messages/Interactions/OWSDisappearingConfigurationUpdateInfoMessage.m b/SignalServiceKit/src/Messages/Interactions/OWSDisappearingConfigurationUpdateInfoMessage.m index 96f03bb7e..eec9f356b 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSDisappearingConfigurationUpdateInfoMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/OWSDisappearingConfigurationUpdateInfoMessage.m @@ -1,5 +1,6 @@ -// Created by Michael Kirk on 9/25/16. -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// #import "OWSDisappearingConfigurationUpdateInfoMessage.h" #import "OWSDisappearingMessagesConfiguration.h" @@ -57,7 +58,7 @@ NS_ASSUME_NONNULL_BEGIN @"strings for context."); NSString *durationString = - [OWSDisappearingMessagesConfiguration stringForDurationSeconds:self.configurationDurationSeconds]; + [OWSDisappearingMessagesConfiguration stringForDurationSeconds:self.configurationDurationSeconds useShortFormat:NO]; return [NSString stringWithFormat:infoFormat, self.createdByRemoteName, durationString]; } else { NSString *infoFormat = NSLocalizedString(@"OTHER_DISABLED_DISAPPEARING_MESSAGES_CONFIGURATION", @@ -70,7 +71,7 @@ NS_ASSUME_NONNULL_BEGIN @"Info message embedding a {{time amount}}, see the *_TIME_AMOUNT strings for context."); NSString *durationString = - [OWSDisappearingMessagesConfiguration stringForDurationSeconds:self.configurationDurationSeconds]; + [OWSDisappearingMessagesConfiguration stringForDurationSeconds:self.configurationDurationSeconds useShortFormat:NO]; return [NSString stringWithFormat:infoFormat, durationString]; } else { return NSLocalizedString(@"YOU_DISABLED_DISAPPEARING_MESSAGES_CONFIGURATION", From 886c0174a836b8ba50f6844074811870d349748b Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Mon, 22 Jan 2018 16:53:55 -0500 Subject: [PATCH 4/4] Rename color per code review // FREEBIE --- .../src/ViewControllers/OWSConversationSettingsViewController.m | 2 +- SignalMessaging/categories/UIColor+OWS.h | 2 +- SignalMessaging/categories/UIColor+OWS.m | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Signal/src/ViewControllers/OWSConversationSettingsViewController.m b/Signal/src/ViewControllers/OWSConversationSettingsViewController.m index 8e33c08df..0f493de33 100644 --- a/Signal/src/ViewControllers/OWSConversationSettingsViewController.m +++ b/Signal/src/ViewControllers/OWSConversationSettingsViewController.m @@ -735,7 +735,7 @@ NS_ASSUME_NONNULL_BEGIN OWSAssert(icon); UIImageView *iconView = [UIImageView new]; iconView.image = [icon imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - iconView.tintColor = [UIColor ows_blackIconColor]; + iconView.tintColor = [UIColor ows_darkIconColor]; iconView.contentMode = UIViewContentModeScaleAspectFit; iconView.layer.minificationFilter = kCAFilterTrilinear; iconView.layer.magnificationFilter = kCAFilterTrilinear; diff --git a/SignalMessaging/categories/UIColor+OWS.h b/SignalMessaging/categories/UIColor+OWS.h index de19f3b5d..1daeb73b6 100644 --- a/SignalMessaging/categories/UIColor+OWS.h +++ b/SignalMessaging/categories/UIColor+OWS.h @@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN @property (class, readonly, nonatomic) UIColor *ows_greenColor; @property (class, readonly, nonatomic) UIColor *ows_redColor; @property (class, readonly, nonatomic) UIColor *ows_blackColor; -@property (class, readonly, nonatomic) UIColor *ows_blackIconColor; +@property (class, readonly, nonatomic) UIColor *ows_darkIconColor; @property (class, readonly, nonatomic) UIColor *ows_errorMessageBorderColor; @property (class, readonly, nonatomic) UIColor *ows_infoMessageBorderColor; @property (class, readonly, nonatomic) UIColor *ows_inputToolbarBackgroundColor; diff --git a/SignalMessaging/categories/UIColor+OWS.m b/SignalMessaging/categories/UIColor+OWS.m index d48b14435..1fa45ec6f 100644 --- a/SignalMessaging/categories/UIColor+OWS.m +++ b/SignalMessaging/categories/UIColor+OWS.m @@ -27,7 +27,7 @@ NS_ASSUME_NONNULL_BEGIN return [UIColor colorWithRed:8.f / 255.f green:10.f / 255.f blue:0. / 255.f alpha:1.f]; } -+ (UIColor *)ows_blackIconColor ++ (UIColor *)ows_darkIconColor { return [UIColor colorWithRGBHex:0x505050]; }