diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 3e1ac21389..e96fbd0aeb 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -694,8 +694,6 @@ 880BFFEA234590FA00F6FAB1 /* ConversationSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 880BFFE82345907600F6FAB1 /* ConversationSplitViewController.swift */; }; 880C0FF7233D3F7C00386FB8 /* playPauseButton.json in Resources */ = {isa = PBXBuildFile; fileRef = 880C0FF6233D3F7C00386FB8 /* playPauseButton.json */; }; 880C2E02262A19DE006650B6 /* InteractiveSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 880C2E01262A19DE006650B6 /* InteractiveSheetViewController.swift */; }; - 880D9025247F8841003D2B14 /* Emoji+Name.swift in Sources */ = {isa = PBXBuildFile; fileRef = 880D9024247F8841003D2B14 /* Emoji+Name.swift */; }; - 880D9027247F90CC003D2B14 /* Emoji+Available.swift in Sources */ = {isa = PBXBuildFile; fileRef = 880D9026247F90CC003D2B14 /* Emoji+Available.swift */; }; 880D902A2480887F003D2B14 /* EmojiPickerSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 880D90292480887F003D2B14 /* EmojiPickerSheet.swift */; }; 880D902C2480889B003D2B14 /* EmojiPickerCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 880D902B2480889B003D2B14 /* EmojiPickerCollectionView.swift */; }; 880D902E2480A23E003D2B14 /* EmojiPickerSectionToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 880D902D2480A23E003D2B14 /* EmojiPickerSectionToolbar.swift */; }; @@ -713,9 +711,6 @@ 88238EA224E9DDB700F28079 /* LocalVideoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88238EA124E9DDB700F28079 /* LocalVideoView.swift */; }; 88238EA424E9DDE900F28079 /* CallButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88238EA324E9DDE900F28079 /* CallButton.swift */; }; 88238EAF24EB798900F28079 /* ConversationViewController+GestureRecognizers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88238EAE24EB798900F28079 /* ConversationViewController+GestureRecognizers.swift */; }; - 88238EB224F19D0B00F28079 /* Emoji+SkinTones.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88238EB124F19D0900F28079 /* Emoji+SkinTones.swift */; }; - 88238EB824F20F1600F28079 /* EmojiWithSkinTones.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88238EB724F20F1500F28079 /* EmojiWithSkinTones.swift */; }; - 88238EBA24F2130300F28079 /* EmojiWithSkinTones+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88238EB924F2130300F28079 /* EmojiWithSkinTones+String.swift */; }; 88238EBC24F21EE400F28079 /* EmojiSkinTonePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88238EBB24F21EE400F28079 /* EmojiSkinTonePicker.swift */; }; 8827004C232071C500F01C46 /* OWSWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8827004B232071C500F01C46 /* OWSWindow.swift */; }; 8827004E23208A1900F01C46 /* AppearanceSettingsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8827004D23208A1900F01C46 /* AppearanceSettingsTableViewController.swift */; }; @@ -788,8 +783,6 @@ 8871B17125F0139D00D4E070 /* ProfileNameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8871B17025F0139D00D4E070 /* ProfileNameViewController.swift */; }; 8876CE4A26A914B8002217ED /* SentMediaQualitySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8876CE4926A914B7002217ED /* SentMediaQualitySettingsViewController.swift */; }; 887889A52476E999001B5FCF /* OWSPinConfirmationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 887889A42476E999001B5FCF /* OWSPinConfirmationViewController.swift */; }; - 887889B1247F2E72001B5FCF /* Emoji+Category.swift in Sources */ = {isa = PBXBuildFile; fileRef = 887889AF247F2E72001B5FCF /* Emoji+Category.swift */; }; - 887889B2247F2E72001B5FCF /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = 887889B0247F2E72001B5FCF /* Emoji.swift */; }; 887B380825F0355700685845 /* ChatsSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 887B380725F0355700685845 /* ChatsSettingsViewController.swift */; }; 887B380A25F0427F00685845 /* NotificationSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 887B380925F0427F00685845 /* NotificationSettingsViewController.swift */; }; 887B380D25F042BE00685845 /* NotificationSettingsContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 887B380C25F042BE00685845 /* NotificationSettingsContentViewController.swift */; }; @@ -1812,8 +1805,6 @@ 880BFFE82345907600F6FAB1 /* ConversationSplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationSplitViewController.swift; sourceTree = ""; }; 880C0FF6233D3F7C00386FB8 /* playPauseButton.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = playPauseButton.json; sourceTree = ""; }; 880C2E01262A19DE006650B6 /* InteractiveSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InteractiveSheetViewController.swift; sourceTree = ""; }; - 880D9024247F8841003D2B14 /* Emoji+Name.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Emoji+Name.swift"; sourceTree = ""; }; - 880D9026247F90CC003D2B14 /* Emoji+Available.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Emoji+Available.swift"; sourceTree = ""; }; 880D90292480887F003D2B14 /* EmojiPickerSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPickerSheet.swift; sourceTree = ""; }; 880D902B2480889B003D2B14 /* EmojiPickerCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPickerCollectionView.swift; sourceTree = ""; }; 880D902D2480A23E003D2B14 /* EmojiPickerSectionToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPickerSectionToolbar.swift; sourceTree = ""; }; @@ -1834,9 +1825,6 @@ 88238EA324E9DDE900F28079 /* CallButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallButton.swift; sourceTree = ""; }; 88238EAE24EB798900F28079 /* ConversationViewController+GestureRecognizers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ConversationViewController+GestureRecognizers.swift"; sourceTree = ""; }; 88238EB024EE29F400F28079 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = translations/hr.lproj/InfoPlist.strings; sourceTree = ""; }; - 88238EB124F19D0900F28079 /* Emoji+SkinTones.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Emoji+SkinTones.swift"; sourceTree = ""; }; - 88238EB724F20F1500F28079 /* EmojiWithSkinTones.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmojiWithSkinTones.swift; sourceTree = ""; }; - 88238EB924F2130300F28079 /* EmojiWithSkinTones+String.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "EmojiWithSkinTones+String.swift"; sourceTree = ""; }; 88238EBB24F21EE400F28079 /* EmojiSkinTonePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiSkinTonePicker.swift; sourceTree = ""; }; 8827004B232071C500F01C46 /* OWSWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWSWindow.swift; sourceTree = ""; }; 8827004D23208A1900F01C46 /* AppearanceSettingsTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceSettingsTableViewController.swift; sourceTree = ""; }; @@ -1907,8 +1895,6 @@ 887889A7247718DE001B5FCF /* af */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = af; path = translations/af.lproj/Localizable.strings; sourceTree = ""; }; 887889A8247718F7001B5FCF /* jv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = jv; path = translations/jv.lproj/Localizable.strings; sourceTree = ""; }; 887889AB247E09B7001B5FCF /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kk; path = translations/kk.lproj/Localizable.strings; sourceTree = ""; }; - 887889AF247F2E72001B5FCF /* Emoji+Category.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Emoji+Category.swift"; sourceTree = ""; }; - 887889B0247F2E72001B5FCF /* Emoji.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Emoji.swift; sourceTree = ""; }; 887B380725F0355700685845 /* ChatsSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatsSettingsViewController.swift; sourceTree = ""; }; 887B380925F0427F00685845 /* NotificationSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsViewController.swift; sourceTree = ""; }; 887B380C25F042BE00685845 /* NotificationSettingsContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsContentViewController.swift; sourceTree = ""; }; @@ -3483,7 +3469,6 @@ 4C751BE423FA0284002A8AF1 /* ContactSupportAlert.swift */, 3498AC882513896400B1F315 /* Dependencies+MainApp.swift */, 88C4E38124671F9D009C9B97 /* Device Transfer */, - 887889AE247F2E72001B5FCF /* Emoji */, 34B0796C1FCF46B000E248C2 /* MainAppContext.h */, 34B0796B1FCF46B000E248C2 /* MainAppContext.m */, 88D23D1123CEBFB200B0E74B /* NotificationActionHandler.swift */, @@ -3696,20 +3681,6 @@ path = Profile; sourceTree = ""; }; - 887889AE247F2E72001B5FCF /* Emoji */ = { - isa = PBXGroup; - children = ( - 887889B0247F2E72001B5FCF /* Emoji.swift */, - 880D9026247F90CC003D2B14 /* Emoji+Available.swift */, - 887889AF247F2E72001B5FCF /* Emoji+Category.swift */, - 880D9024247F8841003D2B14 /* Emoji+Name.swift */, - 88238EB124F19D0900F28079 /* Emoji+SkinTones.swift */, - 88238EB724F20F1500F28079 /* EmojiWithSkinTones.swift */, - 88238EB924F2130300F28079 /* EmojiWithSkinTones+String.swift */, - ); - path = Emoji; - sourceTree = ""; - }; 887B380B25F042A300685845 /* Notifications */ = { isa = PBXGroup; children = ( @@ -5616,7 +5587,6 @@ 889DFA12264EE77C00D03921 /* GroupDescriptionViewController.swift in Sources */, 88905E9E229CCA96004E4234 /* ExpirationNagView.swift in Sources */, 34A4D8812677B2AB00A794E7 /* ConversationViewController+Calls.swift in Sources */, - 887889B2247F2E72001B5FCF /* Emoji.swift in Sources */, 3405C06E25435048008B24EF /* ConversationViewController+Banners.swift in Sources */, 881D85B822D92C2B00E118DF /* OWSPinSetupViewController.swift in Sources */, 340FC8BA204DAC8D007AEB0F /* FingerprintViewScanController.m in Sources */, @@ -5664,7 +5634,6 @@ 3496955D219B605E00DCFE74 /* PhotoCollectionPickerController.swift in Sources */, 34955A73260A366600F3789A /* OnboardingDroppedYdbViewController.swift in Sources */, 34A4D8852677DF6B00A794E7 /* ConversationViewController+ConversationInputToolbarDelegate.swift in Sources */, - 880D9027247F90CC003D2B14 /* Emoji+Available.swift in Sources */, 8835DDFD230CEE8900DC6B66 /* RecipientPickerDelegate.swift in Sources */, 3465947E2434CCC100E5C510 /* NewGroupConfirmViewController.swift in Sources */, 3470C8742554926200F5847C /* QuotedMessageView.swift in Sources */, @@ -5678,7 +5647,6 @@ 34B0796D1FCF46B100E248C2 /* MainAppContext.m in Sources */, 34E3EF101EFC2684007F6822 /* DebugUIPage.m in Sources */, 349767E325B8744700ECE1B0 /* ManageStickersViewController.swift in Sources */, - 887889B1247F2E72001B5FCF /* Emoji+Category.swift in Sources */, 34A8B3512190A40E00218A25 /* CVMediaAlbumView.swift in Sources */, 4C4AEC4520EC343B0020E72B /* DismissableTextField.swift in Sources */, 4CB5F26720F6E1E2004D1B42 /* MessageActionsViewController.swift in Sources */, @@ -5739,7 +5707,6 @@ 88D23D1223CEBFB200B0E74B /* NotificationActionHandler.swift in Sources */, 880C2E02262A19DE006650B6 /* InteractiveSheetViewController.swift in Sources */, 347C3844252CE6C900F3D941 /* CVComponentFooter.swift in Sources */, - 88238EB824F20F1600F28079 /* EmojiWithSkinTones.swift in Sources */, 349A5C5425CD7A6C00B30EE8 /* DebugContactsUtils.swift in Sources */, 45C0DC1E1E69011F00E04C47 /* UIStoryboard+OWS.swift in Sources */, 4556FA681F54AA9500AF40DD /* DebugUIProfile.swift in Sources */, @@ -5754,7 +5721,6 @@ 349439D624360C30001045F7 /* AddGroupMembersViewController.swift in Sources */, 45A6DAD61EBBF85500893231 /* ReminderView.swift in Sources */, 347C382A252CE69400F3D941 /* CVLoadCoordinator.swift in Sources */, - 88238EB224F19D0B00F28079 /* Emoji+SkinTones.swift in Sources */, 348815C2255341F300D4F4C4 /* CVComponentAudioAttachment.swift in Sources */, 347C384B252D085900F3D941 /* CVComponentUnreadIndicator.swift in Sources */, 4CA485BB2232339F004B9E7D /* PhotoCaptureViewController.swift in Sources */, @@ -5819,7 +5785,6 @@ 34A4D87F2677B23100A794E7 /* ConversationViewController+MessageActions.swift in Sources */, 4517642B1DE939FD00EDB8B9 /* ContactCell.swift in Sources */, 887CD47F247307D900FDD265 /* DeviceTransferService+Restore.swift in Sources */, - 880D9025247F8841003D2B14 /* Emoji+Name.swift in Sources */, 8829883925B979F900DEE1E3 /* ThemeSettingsTableViewController.swift in Sources */, 888B6D4D25B2523800E2A662 /* ConversationViewController+Wallpaper.swift in Sources */, 347C3847252CE6C900F3D941 /* CVComponentBodyMedia.swift in Sources */, @@ -5912,7 +5877,6 @@ 34A6C28021E503E700B5B12E /* OWSImagePickerController.swift in Sources */, 88A9729222FA5D4B004B4FBF /* AttachmentFormatPickerView.swift in Sources */, 346C19E125ACE9AE00061D3A /* MediaDownloadSettingsViewController.swift in Sources */, - 88238EBA24F2130300F28079 /* EmojiWithSkinTones+String.swift in Sources */, 8827004E23208A1900F01C46 /* AppearanceSettingsTableViewController.swift in Sources */, 344A761324B36C8C009D69A5 /* TestingViewController.swift in Sources */, 3495FF0D25F934C500959D6E /* PaymentsRestoreWalletCompleteViewController.swift in Sources */, diff --git a/Signal/src/ViewControllers/ConversationView/InteractionReactionState.swift b/Signal/src/ViewControllers/ConversationView/InteractionReactionState.swift index 84d39769cb..1c777f951a 100644 --- a/Signal/src/ViewControllers/ConversationView/InteractionReactionState.swift +++ b/Signal/src/ViewControllers/ConversationView/InteractionReactionState.swift @@ -33,7 +33,7 @@ public class InteractionReactionState: NSObject { reactionsByEmoji = allReactions.reduce( into: [Emoji: [OWSReaction]]() ) { result, reaction in - guard let emoji = Emoji(reaction.emoji) else { + guard let emoji = Emoji(rawValue: reaction.emoji) else { return owsFailDebug("Skipping reaction with unknown emoji \(reaction.emoji)") } diff --git a/Signal/src/ViewControllers/ConversationView/Reactions Details/ReactionsDetailSheet.swift b/Signal/src/ViewControllers/ConversationView/Reactions Details/ReactionsDetailSheet.swift index 64d5026178..7831367894 100644 --- a/Signal/src/ViewControllers/ConversationView/Reactions Details/ReactionsDetailSheet.swift +++ b/Signal/src/ViewControllers/ConversationView/Reactions Details/ReactionsDetailSheet.swift @@ -21,7 +21,7 @@ class ReactionsDetailSheet: InteractiveSheetViewController { } private var allEmoji: [Emoji] { - return emojiCounts.compactMap { Emoji($0.emoji) } + return emojiCounts.compactMap { Emoji(rawValue: $0.emoji) } } init(reactionState: InteractionReactionState, message: TSMessage) { @@ -96,7 +96,7 @@ class ReactionsDetailSheet: InteractiveSheetViewController { emojiCountsCollectionView.items = [allReactionsItem] + emojiCounts.map { (emojiCount) in EmojiItem(emoji: emojiCount.emoji, count: emojiCount.count) { [weak self] in - self?.setSelectedEmoji(Emoji(emojiCount.emoji)) + self?.setSelectedEmoji(Emoji(rawValue: emojiCount.emoji)) } } } diff --git a/Signal/src/util/Emoji/Emoji+Available.swift b/SignalServiceKit/src/Util/Emoji/Emoji+Available.swift similarity index 99% rename from Signal/src/util/Emoji/Emoji+Available.swift rename to SignalServiceKit/src/Util/Emoji/Emoji+Available.swift index 7e43b78eb1..85739d96c6 100644 --- a/Signal/src/util/Emoji/Emoji+Available.swift +++ b/SignalServiceKit/src/Util/Emoji/Emoji+Available.swift @@ -8,7 +8,7 @@ extension Emoji { private static let availableStore = SDSKeyValueStore(collection: "Emoji+availableStore") private static let iosVersionKey = "iosVersion" - static func warmAvailableCache() { + public static func warmAvailableCache() { owsAssertDebug(!Thread.isMainThread) guard CurrentAppContext().hasUI else { return } diff --git a/Signal/src/util/Emoji/Emoji+Category.swift b/SignalServiceKit/src/Util/Emoji/Emoji+Category.swift similarity index 99% rename from Signal/src/util/Emoji/Emoji+Category.swift rename to SignalServiceKit/src/Util/Emoji/Emoji+Category.swift index d65e9aa2d7..44e6e8fe5f 100644 --- a/Signal/src/util/Emoji/Emoji+Category.swift +++ b/SignalServiceKit/src/Util/Emoji/Emoji+Category.swift @@ -5,7 +5,7 @@ // This file is generated by EmojiGenerator.swift, do not manually edit it. extension Emoji { - enum Category: String, CaseIterable, Equatable { + public enum Category: String, CaseIterable, Equatable { case smileysAndPeople = "Smileys & People" case animals = "Animals & Nature" case food = "Food & Drink" @@ -15,7 +15,7 @@ extension Emoji { case symbols = "Symbols" case flags = "Flags" - var localizedName: String { + public var localizedName: String { switch self { case .smileysAndPeople: return NSLocalizedString("EMOJI_CATEGORY_SMILEYSANDPEOPLE_NAME", diff --git a/Signal/src/util/Emoji/Emoji+Name.swift b/SignalServiceKit/src/Util/Emoji/Emoji+Name.swift similarity index 100% rename from Signal/src/util/Emoji/Emoji+Name.swift rename to SignalServiceKit/src/Util/Emoji/Emoji+Name.swift diff --git a/Signal/src/util/Emoji/Emoji+SkinTones.swift b/SignalServiceKit/src/Util/Emoji/Emoji+SkinTones.swift similarity index 99% rename from Signal/src/util/Emoji/Emoji+SkinTones.swift rename to SignalServiceKit/src/Util/Emoji/Emoji+SkinTones.swift index a5524aee7d..005651415f 100644 --- a/Signal/src/util/Emoji/Emoji+SkinTones.swift +++ b/SignalServiceKit/src/Util/Emoji/Emoji+SkinTones.swift @@ -5,7 +5,7 @@ // This file is generated by EmojiGenerator.swift, do not manually edit it. extension Emoji { - enum SkinTone: String, CaseIterable, Equatable { + public enum SkinTone: String, CaseIterable, Equatable { case light = "🏻" case mediumLight = "🏼" case medium = "🏽" @@ -13,10 +13,10 @@ extension Emoji { case dark = "🏿" } - var hasSkinTones: Bool { return emojiPerSkinTonePermutation != nil } - var allowsMultipleSkinTones: Bool { return hasSkinTones && skinToneComponentEmoji != nil } + public var hasSkinTones: Bool { return emojiPerSkinTonePermutation != nil } + public var allowsMultipleSkinTones: Bool { return hasSkinTones && skinToneComponentEmoji != nil } - var skinToneComponentEmoji: [Emoji]? { + public var skinToneComponentEmoji: [Emoji]? { switch self { case .peopleHoldingHands: return [.standingPerson, .standingPerson] case .twoWomenHoldingHands: return [.womanStanding, .womanStanding] @@ -25,7 +25,7 @@ extension Emoji { } } - var emojiPerSkinTonePermutation: [[SkinTone]: String]? { + public var emojiPerSkinTonePermutation: [[SkinTone]: String]? { switch self { case .wave: return [ diff --git a/Signal/src/util/Emoji/Emoji.swift b/SignalServiceKit/src/Util/Emoji/Emoji.swift similarity index 99% rename from Signal/src/util/Emoji/Emoji.swift rename to SignalServiceKit/src/Util/Emoji/Emoji.swift index df0512420d..902dc6e039 100644 --- a/Signal/src/util/Emoji/Emoji.swift +++ b/SignalServiceKit/src/Util/Emoji/Emoji.swift @@ -6,7 +6,7 @@ /// A sorted representation of all available emoji // swiftlint:disable all -enum Emoji: String, CaseIterable, Equatable { +public enum Emoji: String, CaseIterable, Equatable { case grinning = "😀" case smiley = "😃" case smile = "😄" diff --git a/Signal/src/util/Emoji/EmojiWithSkinTones.swift b/SignalServiceKit/src/Util/Emoji/EmojiWithSkinTones.swift similarity index 80% rename from Signal/src/util/Emoji/EmojiWithSkinTones.swift rename to SignalServiceKit/src/Util/Emoji/EmojiWithSkinTones.swift index fad079549f..7b227f3242 100644 --- a/Signal/src/util/Emoji/EmojiWithSkinTones.swift +++ b/SignalServiceKit/src/Util/Emoji/EmojiWithSkinTones.swift @@ -3,10 +3,10 @@ // public struct EmojiWithSkinTones: Hashable { - let baseEmoji: Emoji - let skinTones: [Emoji.SkinTone]? + public let baseEmoji: Emoji + public let skinTones: [Emoji.SkinTone]? - init(baseEmoji: Emoji, skinTones: [Emoji.SkinTone]? = nil) { + public init(baseEmoji: Emoji, skinTones: [Emoji.SkinTone]? = nil) { self.baseEmoji = baseEmoji // Deduplicate skin tones, while preserving order. This allows for @@ -19,7 +19,7 @@ public struct EmojiWithSkinTones: Hashable { } } - var rawValue: String { + public var rawValue: String { if let skinTones = skinTones { return baseEmoji.emojiPerSkinTonePermutation?[skinTones] ?? baseEmoji.rawValue } else { @@ -33,13 +33,13 @@ public struct EmojiWithSkinTones: Hashable { extension Emoji { private static let keyValueStore = SDSKeyValueStore(collection: "Emoji+PreferredSkinTonePermutation") - static func allAvailableEmojiByCategoryWithPreferredSkinTones(transaction: SDSAnyReadTransaction) -> [Category: [EmojiWithSkinTones]] { + public static func allAvailableEmojiByCategoryWithPreferredSkinTones(transaction: SDSAnyReadTransaction) -> [Category: [EmojiWithSkinTones]] { return Category.allCases.reduce(into: [Category: [EmojiWithSkinTones]]()) { result, category in result[category] = category.emoji.filter { $0.available }.map { $0.withPreferredSkinTones(transaction: transaction) } } } - func withPreferredSkinTones(transaction: SDSAnyReadTransaction) -> EmojiWithSkinTones { + public func withPreferredSkinTones(transaction: SDSAnyReadTransaction) -> EmojiWithSkinTones { guard let rawSkinTones = Self.keyValueStore.getObject(forKey: rawValue, transaction: transaction) as? [String] else { return EmojiWithSkinTones(baseEmoji: self, skinTones: nil) } @@ -47,7 +47,7 @@ extension Emoji { return EmojiWithSkinTones(baseEmoji: self, skinTones: rawSkinTones.compactMap { SkinTone(rawValue: $0) }) } - func setPreferredSkinTones(_ preferredSkinTonePermutation: [SkinTone]?, transaction: SDSAnyWriteTransaction) { + public func setPreferredSkinTones(_ preferredSkinTonePermutation: [SkinTone]?, transaction: SDSAnyWriteTransaction) { if let preferredSkinTonePermutation = preferredSkinTonePermutation { Self.keyValueStore.setObject(preferredSkinTonePermutation.map { $0.rawValue }, key: rawValue, transaction: transaction) } else { diff --git a/SignalServiceKit/src/Util/String+SSK.swift b/SignalServiceKit/src/Util/String+SSK.swift index 43890b922c..c03a32a145 100644 --- a/SignalServiceKit/src/Util/String+SSK.swift +++ b/SignalServiceKit/src/Util/String+SSK.swift @@ -551,6 +551,17 @@ public extension String { } var isSingleEmoji: Bool { + if CurrentAppContext().isNSE { + // It is not safe to use CoreText in the NSE. + return self.isSingleEmojiWithoutCoreText + } else { + // This implementation of isSingleEmoji is faster + // than isSingleEmojiWithoutCoreText. + return self.isSingleEmojiDefault + } + } + + private var isSingleEmojiDefault: Bool { glyphCount == 1 && containsEmoji }