Fix emoji / CoreText crash.

This commit is contained in:
Matthew Chen 2021-08-05 18:16:08 -03:00
parent a60d244c6f
commit fa5e13c495
10 changed files with 30 additions and 55 deletions

View File

@ -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 = "<group>"; };
880C0FF6233D3F7C00386FB8 /* playPauseButton.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = playPauseButton.json; sourceTree = "<group>"; };
880C2E01262A19DE006650B6 /* InteractiveSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InteractiveSheetViewController.swift; sourceTree = "<group>"; };
880D9024247F8841003D2B14 /* Emoji+Name.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Emoji+Name.swift"; sourceTree = "<group>"; };
880D9026247F90CC003D2B14 /* Emoji+Available.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Emoji+Available.swift"; sourceTree = "<group>"; };
880D90292480887F003D2B14 /* EmojiPickerSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPickerSheet.swift; sourceTree = "<group>"; };
880D902B2480889B003D2B14 /* EmojiPickerCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPickerCollectionView.swift; sourceTree = "<group>"; };
880D902D2480A23E003D2B14 /* EmojiPickerSectionToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPickerSectionToolbar.swift; sourceTree = "<group>"; };
@ -1834,9 +1825,6 @@
88238EA324E9DDE900F28079 /* CallButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallButton.swift; sourceTree = "<group>"; };
88238EAE24EB798900F28079 /* ConversationViewController+GestureRecognizers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ConversationViewController+GestureRecognizers.swift"; sourceTree = "<group>"; };
88238EB024EE29F400F28079 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = translations/hr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
88238EB124F19D0900F28079 /* Emoji+SkinTones.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Emoji+SkinTones.swift"; sourceTree = "<group>"; };
88238EB724F20F1500F28079 /* EmojiWithSkinTones.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmojiWithSkinTones.swift; sourceTree = "<group>"; };
88238EB924F2130300F28079 /* EmojiWithSkinTones+String.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "EmojiWithSkinTones+String.swift"; sourceTree = "<group>"; };
88238EBB24F21EE400F28079 /* EmojiSkinTonePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiSkinTonePicker.swift; sourceTree = "<group>"; };
8827004B232071C500F01C46 /* OWSWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWSWindow.swift; sourceTree = "<group>"; };
8827004D23208A1900F01C46 /* AppearanceSettingsTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceSettingsTableViewController.swift; sourceTree = "<group>"; };
@ -1907,8 +1895,6 @@
887889A7247718DE001B5FCF /* af */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = af; path = translations/af.lproj/Localizable.strings; sourceTree = "<group>"; };
887889A8247718F7001B5FCF /* jv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = jv; path = translations/jv.lproj/Localizable.strings; sourceTree = "<group>"; };
887889AB247E09B7001B5FCF /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kk; path = translations/kk.lproj/Localizable.strings; sourceTree = "<group>"; };
887889AF247F2E72001B5FCF /* Emoji+Category.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Emoji+Category.swift"; sourceTree = "<group>"; };
887889B0247F2E72001B5FCF /* Emoji.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Emoji.swift; sourceTree = "<group>"; };
887B380725F0355700685845 /* ChatsSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatsSettingsViewController.swift; sourceTree = "<group>"; };
887B380925F0427F00685845 /* NotificationSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsViewController.swift; sourceTree = "<group>"; };
887B380C25F042BE00685845 /* NotificationSettingsContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsContentViewController.swift; sourceTree = "<group>"; };
@ -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 = "<group>";
};
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 = "<group>";
};
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 */,

View File

@ -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)")
}

View File

@ -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))
}
}
}

View File

@ -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 }

View File

@ -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",

View File

@ -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 [

View File

@ -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 = "😄"

View File

@ -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 {

View File

@ -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
}