From af2ca32986c63137fc1797268b83cdc70723ee44 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Wed, 5 Aug 2020 16:55:55 +1000 Subject: [PATCH] fix mention in PNs --- .../NotificationServiceExtension.swift | 28 ++++++++++++++++--- .../src/Loki/Utilities/MentionUtilities.swift | 1 + .../Notifications/AppNotifications.swift | 2 +- .../Protocol/Mentions/MentionsManager.swift | 2 +- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/LokiPushNotificationService/NotificationServiceExtension.swift b/LokiPushNotificationService/NotificationServiceExtension.swift index 7d7e87c7a..4692cba63 100644 --- a/LokiPushNotificationService/NotificationServiceExtension.swift +++ b/LokiPushNotificationService/NotificationServiceExtension.swift @@ -71,15 +71,15 @@ final class NotificationServiceExtension : UNNotificationServiceExtension { } let group: SSKProtoGroupContext = contentProto!.dataMessage!.group! let oldGroupModel = (thread as! TSGroupThread).groupModel - var removedMembers = Set(arrayLiteral: oldGroupModel.groupMemberIds) + let removedMembers = NSMutableSet(array: oldGroupModel.groupMemberIds) let newGroupModel = TSGroupModel.init(title: group.name, memberIds:group.members, image: oldGroupModel.groupImage, groupId: group.id, groupType: oldGroupModel.groupType, adminIds: group.admins) - removedMembers.subtract(Set(arrayLiteral: newGroupModel.groupMemberIds)) - newGroupModel.removedMembers = NSMutableSet(set: removedMembers) + removedMembers.minus(Set(newGroupModel.groupMemberIds)) + newGroupModel.removedMembers = removedMembers switch contentProto?.dataMessage?.group?.type { case .update: newNotificationBody = oldGroupModel.getInfoStringAboutUpdate(to: newGroupModel, contactsManager: SSKEnvironment.shared.contactsManager) @@ -100,7 +100,8 @@ final class NotificationServiceExtension : UNNotificationServiceExtension { notificationContent.userInfo = userInfo notificationContent.badge = 1 if newNotificationBody.count < 1 { - newNotificationBody = contentProto?.dataMessage?.body ?? "You've got a new message" + let rawMessageBody = contentProto?.dataMessage?.body ?? "You've got a new message" + newNotificationBody = handleMentionIfNecessary(rawMessageBody: rawMessageBody, threadID: thread.uniqueId!, transaction: transaction) } notificationContent.body = newNotificationBody if notificationContent.body.count < 1 { @@ -109,6 +110,25 @@ final class NotificationServiceExtension : UNNotificationServiceExtension { self.contentHandler!(notificationContent) } } + + func handleMentionIfNecessary(rawMessageBody: String, threadID: String, transaction: YapDatabaseReadWriteTransaction) -> String { + var string = rawMessageBody + let regex = try! NSRegularExpression(pattern: "@[0-9a-fA-F]*", options: []) + var outerMatch = regex.firstMatch(in: string, options: .withoutAnchoringBounds, range: NSRange(location: 0, length: string.count)) + while let match = outerMatch { + let hexEncodedPublicKey = String((string as NSString).substring(with: match.range).dropFirst()) // Drop the @ + let matchEnd: Int + let displayName: String? = OWSProfileManager.shared().profileNameForRecipient(withID: hexEncodedPublicKey, transaction: transaction) + if let displayName = displayName { + string = (string as NSString).replacingCharacters(in: match.range, with: "@\(displayName)") + matchEnd = match.range.location + displayName.count + } else { + matchEnd = match.range.location + match.range.length + } + outerMatch = regex.firstMatch(in: string, options: .withoutAnchoringBounds, range: NSRange(location: matchEnd, length: string.count - matchEnd)) + } + return string + } func setUpIfNecessary(completion: @escaping () -> Void) { AssertIsOnMainThread() diff --git a/Signal/src/Loki/Utilities/MentionUtilities.swift b/Signal/src/Loki/Utilities/MentionUtilities.swift index 3c865b8cd..92481a704 100644 --- a/Signal/src/Loki/Utilities/MentionUtilities.swift +++ b/Signal/src/Loki/Utilities/MentionUtilities.swift @@ -13,6 +13,7 @@ public final class MentionUtilities : NSObject { var publicChat: PublicChat? OWSPrimaryStorage.shared().dbReadConnection.read { transaction in publicChat = LokiDatabaseUtilities.getPublicChat(for: threadID, in: transaction) + MentionsManager.populateUserPublicKeyCacheIfNeeded(for: threadID, in: transaction) } var string = string let regex = try! NSRegularExpression(pattern: "@[0-9a-fA-F]*", options: []) diff --git a/Signal/src/UserInterface/Notifications/AppNotifications.swift b/Signal/src/UserInterface/Notifications/AppNotifications.swift index 525e801f9..bd74ea59f 100644 --- a/Signal/src/UserInterface/Notifications/AppNotifications.swift +++ b/Signal/src/UserInterface/Notifications/AppNotifications.swift @@ -357,7 +357,7 @@ public class NotificationPresenter: NSObject, NotificationsProtocol { // it must be escaped. // see https://developer.apple.com/documentation/uikit/uilocalnotification/1616646-alertbody // for more details. - let messageText = DisplayableText.filterNotificationText(rawMessageText) + let messageText = MentionUtilities.highlightMentions(in: DisplayableText.filterNotificationText(rawMessageText)!, threadID: thread.uniqueId!) let senderName = OWSUserProfile.fetch(uniqueId: incomingMessage.authorId, transaction: transaction)?.profileName ?? contactsManager.displayName(forPhoneIdentifier: incomingMessage.authorId) diff --git a/SignalServiceKit/src/Loki/Protocol/Mentions/MentionsManager.swift b/SignalServiceKit/src/Loki/Protocol/Mentions/MentionsManager.swift index b0318404e..29beb779d 100644 --- a/SignalServiceKit/src/Loki/Protocol/Mentions/MentionsManager.swift +++ b/SignalServiceKit/src/Loki/Protocol/Mentions/MentionsManager.swift @@ -75,8 +75,8 @@ public final class MentionsManager : NSObject { guard let message = object as? TSIncomingMessage, index < userIDScanLimit else { return } result.insert(message.authorId) } - result.insert(getUserHexEncodedPublicKey()) } + result.insert(getUserHexEncodedPublicKey()) } if let transaction = transaction { populate(in: transaction)