From 103f0450a141f810d79448bc0855445ec76d4a26 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Sun, 4 Dec 2016 13:39:19 -0500 Subject: [PATCH] Build avatar from contact initials even if they don't have a phone number The invite contact picker was rendering the "#" avatar for contacts who had a name, but no phone number. In some ways this approach is dumber. But since we have "surprising" logic to set the contacts firstName to a phone number or maybe a company name when contacts are built from ABContacts, this approach is more on the level with the existing assumptions of what could be in that field (which is to say, pretty much anything). // FREEBIE --- Signal/src/Models/OWSContactAvatarBuilder.m | 10 +++++++--- Signal/src/contact/OWSContactsManager.h | 1 - Signal/src/contact/OWSContactsManager.m | 15 --------------- 3 files changed, 7 insertions(+), 19 deletions(-) diff --git a/Signal/src/Models/OWSContactAvatarBuilder.m b/Signal/src/Models/OWSContactAvatarBuilder.m index bc9d75ac1..e93d427fd 100644 --- a/Signal/src/Models/OWSContactAvatarBuilder.m +++ b/Signal/src/Models/OWSContactAvatarBuilder.m @@ -57,8 +57,10 @@ NS_ASSUME_NONNULL_BEGIN } NSMutableString *initials = [NSMutableString string]; - BOOL contactHasName = [self.contactsManager nameExistsForPhoneIdentifier:self.signalId]; - if (contactHasName) { + + NSRange rangeOfLetters = [self.contactName rangeOfCharacterFromSet:[NSCharacterSet letterCharacterSet]]; + if (rangeOfLetters.location != NSNotFound) { + // Contact name contains letters, so it's probably not just a phone number. // Make an image from the contact's initials NSArray *words = [self.contactName componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; @@ -71,7 +73,9 @@ NS_ASSUME_NONNULL_BEGIN NSRange stringRange = { 0, MIN([initials length], (NSUInteger)3) }; // Rendering max 3 letters. initials = [[initials substringWithRange:stringRange] mutableCopy]; - } else { + } + + if (initials.length == 0) { // We don't have a name for this contact, so we can't make an "initials" image [initials appendString:@"#"]; } diff --git a/Signal/src/contact/OWSContactsManager.h b/Signal/src/contact/OWSContactsManager.h index 928316c00..990d5030e 100644 --- a/Signal/src/contact/OWSContactsManager.h +++ b/Signal/src/contact/OWSContactsManager.h @@ -30,7 +30,6 @@ - (void)doAfterEnvironmentInitSetup; - (NSString * _Nonnull)displayNameForPhoneIdentifier:(NSString * _Nullable)identifier; -- (BOOL)nameExistsForPhoneIdentifier:(NSString * _Nullable)identifier; - (UIImage * _Nullable)imageForPhoneIdentifier:(NSString * _Nullable)identifier; + (NSComparator _Nonnull)contactComparator; diff --git a/Signal/src/contact/OWSContactsManager.m b/Signal/src/contact/OWSContactsManager.m index 9e73971c4..ba828d893 100644 --- a/Signal/src/contact/OWSContactsManager.m +++ b/Signal/src/contact/OWSContactsManager.m @@ -411,21 +411,6 @@ void onAddressBookChanged(ABAddressBookRef notifyAddressBook, CFDictionaryRef in return displayName; } -- (BOOL)nameExistsForPhoneIdentifier:(NSString * _Nullable)identifier { - Contact *contact = [self contactForPhoneIdentifier:identifier]; - NSString *name = contact.fullName; - - if (name.length <= 0) return NO; - - // OWSContactsManager::contactForRecord will use the first phone number as a name - // in absense of a name or business name during import. Make sure that's not happening here. - if ((contact.userTextPhoneNumbers.count > 0) && ([contact.userTextPhoneNumbers[0] isEqualToString:name])) { - return NO; - } - - return YES; -} - - (Contact * _Nullable)contactForPhoneIdentifier:(NSString * _Nullable)identifier { if (!identifier) { return nil;