From 9cc4521d077f64aa91f42d55220f626fc60c0e29 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 26 Oct 2017 12:09:36 -0400 Subject: [PATCH] Respond to CR. // FREEBIE --- Signal.xcodeproj/project.pbxproj | 20 +++++++------- .../ConversationViewController.m | 26 ++++++++++--------- .../ConversationView/ConversationViewItem.h | 13 +--------- .../ConversationView/ConversationViewItem.m | 25 ++++++++---------- .../src/ViewControllers/InboxTableViewCell.m | 2 +- ...wift => MessageDetailViewController.swift} | 6 ++--- ...TextFilter.swift => DisplayableText.swift} | 26 ++++++++++++++----- .../test/util/DisplayableTextFilterTest.swift | 8 +++--- 8 files changed, 64 insertions(+), 62 deletions(-) rename Signal/src/ViewControllers/{MessageMetadataViewController.swift => MessageDetailViewController.swift} (99%) rename Signal/src/util/{DisplayableTextFilter.swift => DisplayableText.swift} (57%) diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 3f418be51..4795aec08 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -75,7 +75,7 @@ 34C6B0AC1FA0E46F00D35993 /* test-mp4.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 34C6B0A81FA0E46F00D35993 /* test-mp4.mp4 */; }; 34C6B0AE1FA0E4AA00D35993 /* test-jpg.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 34C6B0AD1FA0E4AA00D35993 /* test-jpg.jpg */; }; 34CA1C251F706B5400E51C51 /* NSAttributedString+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CA1C241F706B5400E51C51 /* NSAttributedString+OWS.m */; }; - 34CA1C271F7156F300E51C51 /* MessageMetadataViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CA1C261F7156F300E51C51 /* MessageMetadataViewController.swift */; }; + 34CA1C271F7156F300E51C51 /* MessageDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CA1C261F7156F300E51C51 /* MessageDetailViewController.swift */; }; 34CA1C291F7164F700E51C51 /* MediaMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CA1C281F7164F700E51C51 /* MediaMessageView.swift */; }; 34CCAF381F0C0599004084F4 /* AppUpdateNag.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CCAF371F0C0599004084F4 /* AppUpdateNag.m */; }; 34CCAF3B1F0C2748004084F4 /* OWSAddToContactViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CCAF3A1F0C2748004084F4 /* OWSAddToContactViewController.m */; }; @@ -239,8 +239,8 @@ 45DF5DF31DDB843F00C936C7 /* CompareSafetyNumbersActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45DF5DF11DDB843F00C936C7 /* CompareSafetyNumbersActivity.swift */; }; 45E2E9201E153B3D00457AA0 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E2E91F1E153B3D00457AA0 /* Strings.swift */; }; 45E5A6991F61E6DE001E4A8A /* MarqueeLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E5A6981F61E6DD001E4A8A /* MarqueeLabel.swift */; }; - 45E615161E8C590B0018AD52 /* DisplayableTextFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E615151E8C590B0018AD52 /* DisplayableTextFilter.swift */; }; - 45E615171E8C59100018AD52 /* DisplayableTextFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E615151E8C590B0018AD52 /* DisplayableTextFilter.swift */; }; + 45E615161E8C590B0018AD52 /* DisplayableText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E615151E8C590B0018AD52 /* DisplayableText.swift */; }; + 45E615171E8C59100018AD52 /* DisplayableText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E615151E8C590B0018AD52 /* DisplayableText.swift */; }; 45E7A6A81E71CA7E00D44FB5 /* DisplayableTextFilterTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E7A6A61E71CA7E00D44FB5 /* DisplayableTextFilterTest.swift */; }; 45F170AC1E2F0351003FC1F2 /* CallAudioSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F170AB1E2F0351003FC1F2 /* CallAudioSession.swift */; }; 45F170AD1E2F0351003FC1F2 /* CallAudioSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F170AB1E2F0351003FC1F2 /* CallAudioSession.swift */; }; @@ -519,7 +519,7 @@ 34C6B0AD1FA0E4AA00D35993 /* test-jpg.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "test-jpg.jpg"; sourceTree = ""; }; 34CA1C231F706B5400E51C51 /* NSAttributedString+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSAttributedString+OWS.h"; sourceTree = ""; }; 34CA1C241F706B5400E51C51 /* NSAttributedString+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSAttributedString+OWS.m"; sourceTree = ""; }; - 34CA1C261F7156F300E51C51 /* MessageMetadataViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageMetadataViewController.swift; sourceTree = ""; }; + 34CA1C261F7156F300E51C51 /* MessageDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageDetailViewController.swift; sourceTree = ""; }; 34CA1C281F7164F700E51C51 /* MediaMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaMessageView.swift; sourceTree = ""; }; 34CCAF361F0C0599004084F4 /* AppUpdateNag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppUpdateNag.h; sourceTree = ""; }; 34CCAF371F0C0599004084F4 /* AppUpdateNag.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppUpdateNag.m; sourceTree = ""; }; @@ -707,7 +707,7 @@ 45E2E91E1E13EE3500457AA0 /* OWSCallNotificationsAdaptee.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = OWSCallNotificationsAdaptee.h; path = UserInterface/OWSCallNotificationsAdaptee.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 45E2E91F1E153B3D00457AA0 /* Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = Strings.swift; path = UserInterface/Strings.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 45E5A6981F61E6DD001E4A8A /* MarqueeLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarqueeLabel.swift; sourceTree = ""; }; - 45E615151E8C590B0018AD52 /* DisplayableTextFilter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisplayableTextFilter.swift; sourceTree = ""; }; + 45E615151E8C590B0018AD52 /* DisplayableText.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisplayableText.swift; sourceTree = ""; }; 45E7A6A61E71CA7E00D44FB5 /* DisplayableTextFilterTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisplayableTextFilterTest.swift; sourceTree = ""; }; 45F170AB1E2F0351003FC1F2 /* CallAudioSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallAudioSession.swift; sourceTree = ""; }; 45F170AE1E2F0393003FC1F2 /* CallAudioSessionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallAudioSessionTest.swift; sourceTree = ""; }; @@ -1034,7 +1034,7 @@ 34B3F84D1E8DF1700035BE1A /* LockInteractionController.h */, 34B3F84E1E8DF1700035BE1A /* LockInteractionController.m */, 34CA1C281F7164F700E51C51 /* MediaMessageView.swift */, - 34CA1C261F7156F300E51C51 /* MessageMetadataViewController.swift */, + 34CA1C261F7156F300E51C51 /* MessageDetailViewController.swift */, 34D9134C1F66DB7C00722898 /* ModalActivityIndicatorViewController.swift */, 34B3F84F1E8DF1700035BE1A /* NewContactThreadViewController.h */, 34B3F8501E8DF1700035BE1A /* NewContactThreadViewController.m */, @@ -1457,7 +1457,7 @@ B90418E4183E9DD40038554A /* DateUtil.h */, B90418E5183E9DD40038554A /* DateUtil.m */, 348F2EAD1F0D21BC00D4ECE0 /* DeviceSleepManager.swift */, - 45E615151E8C590B0018AD52 /* DisplayableTextFilter.swift */, + 45E615151E8C590B0018AD52 /* DisplayableText.swift */, 76EB04EA18170B33006006FC /* FunctionalUtil.h */, 76EB04EB18170B33006006FC /* FunctionalUtil.m */, 455AC69A1F4F79E500134004 /* ImageCache.swift */, @@ -2283,7 +2283,7 @@ 45855F371D9498A40084F340 /* OWSContactAvatarBuilder.m in Sources */, 45A6DAD61EBBF85500893231 /* ReminderView.swift in Sources */, 45666EC61D99483D008FE134 /* OWSAvatarBuilder.m in Sources */, - 45E615161E8C590B0018AD52 /* DisplayableTextFilter.swift in Sources */, + 45E615161E8C590B0018AD52 /* DisplayableText.swift in Sources */, 34B3F88A1E8DF1700035BE1A /* OWSLinkDeviceViewController.m in Sources */, 34D1F0881F8678AA0066283D /* ConversationViewLayout.m in Sources */, 76EB068618170B34006006FC /* ContactTableViewCell.m in Sources */, @@ -2291,7 +2291,7 @@ 452314A01F7E9E18003A428C /* DirectionalPanGestureRecognizer.swift in Sources */, 34330AA31E79686200DF2FB9 /* OWSProgressView.m in Sources */, 34B3F8A21E8EA6040035BE1A /* ViewControllerUtils.m in Sources */, - 34CA1C271F7156F300E51C51 /* MessageMetadataViewController.swift in Sources */, + 34CA1C271F7156F300E51C51 /* MessageDetailViewController.swift in Sources */, 34D5CCA91EAE3D30005515DB /* AvatarViewHelper.m in Sources */, 45F170AC1E2F0351003FC1F2 /* CallAudioSession.swift in Sources */, 34D1F0B71F87F8850066283D /* OWSGenericAttachmentView.m in Sources */, @@ -2466,7 +2466,7 @@ 451DA3CB1F148AAD008E2423 /* CallViewController.swift in Sources */, 456F6E201E2411A000FD2210 /* CallService.swift in Sources */, 45A663C61F92EC760027B59E /* GroupTableViewCell.swift in Sources */, - 45E615171E8C59100018AD52 /* DisplayableTextFilter.swift in Sources */, + 45E615171E8C59100018AD52 /* DisplayableText.swift in Sources */, B660F6BB1C29868000687D6E /* OWSContactsManagerTest.m in Sources */, 45A6DAD71EBBF85500893231 /* ReminderView.swift in Sources */, B660F6D21C29868000687D6E /* PushManagerTest.m in Sources */, diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 0d9a8a5c3..328ee074c 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -2044,12 +2044,13 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { { OWSAssert([NSThread isMainThread]); OWSAssert(conversationItem); + OWSAssert([conversationItem.interaction isKindOfClass:[TSMessage class]]); TSMessage *message = (TSMessage *)conversationItem.interaction; - MessageMetadataViewController *view = - [[MessageMetadataViewController alloc] initWithViewItem:conversationItem - message:message - mode:MessageMetadataViewModeFocusOnMessage]; + MessageDetailViewController *view = + [[MessageDetailViewController alloc] initWithViewItem:conversationItem + message:message + mode:MessageMetadataViewModeFocusOnMessage]; [self.navigationController pushViewController:view animated:YES]; } @@ -2077,12 +2078,13 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { { OWSAssert([NSThread isMainThread]); OWSAssert(conversationItem); + OWSAssert([conversationItem.interaction isKindOfClass:[TSMessage class]]); TSMessage *message = (TSMessage *)conversationItem.interaction; - MessageMetadataViewController *view = - [[MessageMetadataViewController alloc] initWithViewItem:conversationItem - message:message - mode:MessageMetadataViewModeFocusOnMetadata]; + MessageDetailViewController *view = + [[MessageDetailViewController alloc] initWithViewItem:conversationItem + message:message + mode:MessageMetadataViewModeFocusOnMetadata]; [self.navigationController pushViewController:view animated:YES]; } @@ -4088,10 +4090,10 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { // want to inadvertently clobber it here. OWSAssert(self.navigationController.delegate == nil) self.navigationController.delegate = self; TSMessage *message = (TSMessage *)interaction; - MessageMetadataViewController *view = - [[MessageMetadataViewController alloc] initWithViewItem:conversationItem - message:message - mode:MessageMetadataViewModeFocusOnMetadata]; + MessageDetailViewController *view = + [[MessageDetailViewController alloc] initWithViewItem:conversationItem + message:message + mode:MessageMetadataViewModeFocusOnMetadata]; [self.navigationController pushViewController:view animated:YES]; } else { OWSFail(@"%@ Can't show message metadata for message of type: %@", self.tag, [interaction class]); diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h index 45ed5c93d..3423b51c7 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h @@ -24,19 +24,8 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType); #pragma mark - -@interface DisplayableText : NSObject - -@property (nonatomic) NSString *fullText; - -@property (nonatomic) NSString *displayText; - -@property (nonatomic) BOOL isTextTruncated; - -@end - -#pragma mark - - @class ConversationViewCell; +@class DisplayableText; @class OWSAudioMessageView; @class TSAttachmentPointer; @class TSAttachmentStream; diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m index 58a5a385a..59f9fcc01 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m @@ -39,12 +39,6 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) #pragma mark - -@implementation DisplayableText - -@end - -#pragma mark - - @interface ConversationViewItem () @property (nonatomic, nullable) NSValue *cachedCellSize; @@ -312,28 +306,31 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) // Only show up to 2kb of text. const NSUInteger kMaxTextDisplayLength = 2 * 1024; text = [text ows_stripped]; - NSString *fullText = [[[DisplayableTextFilter new] displayableText:text] ows_stripped]; - displayableText = [DisplayableText new]; + NSString *_Nullable fullText = [DisplayableText displayableText:text]; + BOOL isTextTruncated = NO; if (!fullText) { - displayableText.fullText = @""; + fullText = @""; } else { - displayableText.fullText = fullText; + fullText = fullText; } - NSString *displayText = fullText; + NSString *_Nullable displayText = fullText; if (displayText.length > kMaxTextDisplayLength) { // Trim whitespace before _AND_ after slicing the snipper from the string. NSString *snippet = [[displayText substringWithRange:NSMakeRange(0, kMaxTextDisplayLength)] ows_stripped]; displayText = [NSString stringWithFormat:NSLocalizedString(@"OVERSIZE_TEXT_DISPLAY_FORMAT", @"A display format for oversize text messages."), snippet]; - displayableText.isTextTruncated = YES; + isTextTruncated = YES; } if (!displayText) { - displayableText.displayText = @""; + displayText = @""; } else { - displayableText.displayText = displayText; + displayText = displayText; } + displayableText = + [[DisplayableText alloc] initWithFullText:fullText displayText:displayText isTextTruncated:isTextTruncated]; + [[self displayableTextCache] setObject:displayableText forKey:interactionId]; } return displayableText; diff --git a/Signal/src/ViewControllers/InboxTableViewCell.m b/Signal/src/ViewControllers/InboxTableViewCell.m index 693dfa43d..615539744 100644 --- a/Signal/src/ViewControllers/InboxTableViewCell.m +++ b/Signal/src/ViewControllers/InboxTableViewCell.m @@ -188,7 +188,7 @@ const NSUInteger kAvatarViewDiameter = 52; : [UIColor lightGrayColor]), }]]; } - NSString *displayableText = [[DisplayableTextFilter new] displayableText:thread.lastMessageLabel]; + NSString *displayableText = [DisplayableText displayableText:thread.lastMessageLabel]; if (displayableText) { [snippetText appendAttributedString:[[NSAttributedString alloc] initWithString:displayableText diff --git a/Signal/src/ViewControllers/MessageMetadataViewController.swift b/Signal/src/ViewControllers/MessageDetailViewController.swift similarity index 99% rename from Signal/src/ViewControllers/MessageMetadataViewController.swift rename to Signal/src/ViewControllers/MessageDetailViewController.swift index fd9334ae5..8e7f52a09 100644 --- a/Signal/src/ViewControllers/MessageMetadataViewController.swift +++ b/Signal/src/ViewControllers/MessageDetailViewController.swift @@ -10,10 +10,10 @@ enum MessageMetadataViewMode: UInt { case focusOnMetadata } -class MessageMetadataViewController: OWSViewController { +class MessageDetailViewController: OWSViewController { - static let TAG = "[MessageMetadataViewController]" - let TAG = "[MessageMetadataViewController]" + static let TAG = "[MessageDetailViewController]" + let TAG = "[MessageDetailViewController]" // MARK: Properties diff --git a/Signal/src/util/DisplayableTextFilter.swift b/Signal/src/util/DisplayableText.swift similarity index 57% rename from Signal/src/util/DisplayableTextFilter.swift rename to Signal/src/util/DisplayableText.swift index ab2258fa6..11daa20e0 100644 --- a/Signal/src/util/DisplayableTextFilter.swift +++ b/Signal/src/util/DisplayableText.swift @@ -4,12 +4,26 @@ import Foundation -@objc class DisplayableTextFilter: NSObject { +@objc class DisplayableText: NSObject { - let TAG = "[DisplayableTextFilter]" + static let TAG = "[DisplayableText]" + + let fullText: String + let displayText: String + let isTextTruncated: Bool + + // MARK: Initializers + + init(fullText: String, displayText: String, isTextTruncated: Bool) { + self.fullText = fullText + self.displayText = displayText + self.isTextTruncated = isTextTruncated + } + + // MARK: Filter Methods @objc - func displayableText(_ text: String?) -> String? { + class func displayableText(_ text: String?) -> String? { guard let text = text else { return nil } @@ -17,13 +31,13 @@ import Foundation if (self.hasExcessiveDiacriticals(text: text)) { Logger.warn("\(TAG) filtering text for excessive diacriticals.") let filteredText = text.folding(options: .diacriticInsensitive, locale: .current) - return filteredText + return filteredText.ows_stripped() } - return text + return text.ows_stripped() } - private func hasExcessiveDiacriticals(text: String) -> Bool { + private class func hasExcessiveDiacriticals(text: String) -> Bool { // discard any zalgo style text, by detecting maximum number of glyphs per character for char in text.characters.enumerated() { let scalarCount = String(char.element).unicodeScalars.count diff --git a/Signal/test/util/DisplayableTextFilterTest.swift b/Signal/test/util/DisplayableTextFilterTest.swift index 5a94660bb..39dd329ac 100644 --- a/Signal/test/util/DisplayableTextFilterTest.swift +++ b/Signal/test/util/DisplayableTextFilterTest.swift @@ -4,13 +4,13 @@ import XCTest -class DisplayableTextFilterTest: XCTestCase { - +class DisplayableTextTest: XCTestCase { + override func setUp() { super.setUp() // Put setup code here. This method is called before the invocation of each test method in the class. } - + override func tearDown() { // Put teardown code here. This method is called after the invocation of each test method in the class. super.tearDown() @@ -18,7 +18,7 @@ class DisplayableTextFilterTest: XCTestCase { func testDisplayableText() { // Ignore default byte size limitations to test other filtering behaviors - let filter = DisplayableTextFilter() + let filter = DisplayableText() // show plain text let boringText = "boring text"