2016-09-21 14:37:51 +02:00
|
|
|
// Created by Michael Kirk on 9/22/16.
|
|
|
|
// Copyright © 2016 Open Whisper Systems. All rights reserved.
|
|
|
|
|
|
|
|
#import "OWSContactAvatarBuilder.h"
|
|
|
|
#import "OWSContactsManager.h"
|
|
|
|
#import "TSContactThread.h"
|
|
|
|
#import "TSGroupThread.h"
|
|
|
|
#import "TSThread.h"
|
|
|
|
#import "UIColor+OWS.h"
|
|
|
|
#import "UIFont+OWS.h"
|
|
|
|
#import <JSQMessagesViewController/JSQMessagesAvatarImageFactory.h>
|
|
|
|
|
|
|
|
NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
|
|
|
@interface OWSContactAvatarBuilder ()
|
|
|
|
|
|
|
|
@property (nonatomic, readonly) OWSContactsManager *contactsManager;
|
|
|
|
@property (nonatomic, readonly) NSString *signalId;
|
|
|
|
@property (nonatomic, readonly) NSString *contactName;
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation OWSContactAvatarBuilder
|
|
|
|
|
2016-11-18 23:11:56 +01:00
|
|
|
- (instancetype)initWithContactId:(NSString *)contactId
|
|
|
|
name:(NSString *)name
|
|
|
|
contactsManager:(OWSContactsManager *)contactsManager
|
2016-09-21 14:37:51 +02:00
|
|
|
{
|
|
|
|
self = [super init];
|
|
|
|
if (!self) {
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2016-11-18 23:11:56 +01:00
|
|
|
_signalId = contactId;
|
|
|
|
_contactName = name;
|
2016-09-21 14:37:51 +02:00
|
|
|
_contactsManager = contactsManager;
|
|
|
|
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2016-11-18 23:11:56 +01:00
|
|
|
|
|
|
|
- (instancetype)initWithThread:(TSContactThread *)thread contactsManager:(OWSContactsManager *)contactsManager
|
|
|
|
{
|
|
|
|
return [self initWithContactId:thread.contactIdentifier name:thread.name contactsManager:contactsManager];
|
|
|
|
}
|
|
|
|
|
2016-09-21 14:37:51 +02:00
|
|
|
- (nullable UIImage *)buildSavedImage
|
|
|
|
{
|
|
|
|
return [self.contactsManager imageForPhoneIdentifier:self.signalId];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (UIImage *)buildDefaultImage
|
|
|
|
{
|
2016-11-18 23:11:56 +01:00
|
|
|
UIImage *cachedAvatar = [self.contactsManager.avatarCache objectForKey:self.signalId];
|
|
|
|
if (cachedAvatar) {
|
|
|
|
return cachedAvatar;
|
|
|
|
}
|
|
|
|
|
2016-09-21 14:37:51 +02:00
|
|
|
NSMutableString *initials = [NSMutableString string];
|
2016-12-04 19:39:19 +01:00
|
|
|
|
|
|
|
NSRange rangeOfLetters = [self.contactName rangeOfCharacterFromSet:[NSCharacterSet letterCharacterSet]];
|
|
|
|
if (rangeOfLetters.location != NSNotFound) {
|
|
|
|
// Contact name contains letters, so it's probably not just a phone number.
|
2016-12-01 22:17:57 +01:00
|
|
|
// Make an image from the contact's initials
|
2016-09-21 14:37:51 +02:00
|
|
|
NSArray *words =
|
|
|
|
[self.contactName componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
|
|
|
for (NSString *word in words) {
|
|
|
|
if (word.length > 0) {
|
|
|
|
NSString *firstLetter = [word substringToIndex:1];
|
|
|
|
[initials appendString:[firstLetter uppercaseString]];
|
|
|
|
}
|
|
|
|
}
|
2016-12-01 22:17:57 +01:00
|
|
|
|
|
|
|
NSRange stringRange = { 0, MIN([initials length], (NSUInteger)3) }; // Rendering max 3 letters.
|
|
|
|
initials = [[initials substringWithRange:stringRange] mutableCopy];
|
2016-12-04 19:39:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (initials.length == 0) {
|
2016-12-01 22:17:57 +01:00
|
|
|
// We don't have a name for this contact, so we can't make an "initials" image
|
|
|
|
[initials appendString:@"#"];
|
2016-09-21 14:37:51 +02:00
|
|
|
}
|
2016-12-01 22:17:57 +01:00
|
|
|
|
2016-09-21 14:37:51 +02:00
|
|
|
UIColor *backgroundColor = [UIColor backgroundColorForContact:self.signalId];
|
2016-11-18 23:11:56 +01:00
|
|
|
UIImage *image = [[JSQMessagesAvatarImageFactory avatarImageWithUserInitials:initials
|
|
|
|
backgroundColor:backgroundColor
|
|
|
|
textColor:[UIColor whiteColor]
|
|
|
|
font:[UIFont ows_boldFontWithSize:36.0]
|
|
|
|
diameter:100] avatarImage];
|
|
|
|
[self.contactsManager.avatarCache setObject:image forKey:self.signalId];
|
|
|
|
return image;
|
2016-09-21 14:37:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
NS_ASSUME_NONNULL_END
|