mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			130 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Matlab
		
	
		
		
			
		
	
	
			130 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Matlab
		
	
| 
											9 years ago
										 | // | ||
|  | //  Copyright (c) 2017 Open Whisper Systems. All rights reserved. | ||
|  | // | ||
| 
											9 years ago
										 | 
 | ||
|  | #import "OWSContactAvatarBuilder.h" | ||
|  | #import "OWSContactsManager.h" | ||
|  | #import "TSContactThread.h" | ||
|  | #import "TSGroupThread.h" | ||
|  | #import "TSThread.h" | ||
|  | #import "UIColor+OWS.h" | ||
|  | #import "UIFont+OWS.h" | ||
| 
											8 years ago
										 | #import <SignalMessaging/SignalMessaging-Swift.h> | ||
|  | // SHARINGEXTENSION FIXME | ||
|  | // intern or reimplement this so that SignalMessaging doesn't depend on JSQ | ||
| 
											9 years ago
										 | #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; | ||
| 
											9 years ago
										 | @property (nonatomic, readonly) NSUInteger diameter; | ||
| 
											9 years ago
										 | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | @implementation OWSContactAvatarBuilder | ||
|  | 
 | ||
| 
											8 years ago
										 | #pragma mark - Initializers | ||
|  | 
 | ||
| 
											9 years ago
										 | - (instancetype)initWithContactId:(NSString *)contactId | ||
|  |                              name:(NSString *)name | ||
|  |                          diameter:(NSUInteger)diameter | ||
| 
											8 years ago
										 |                   contactsManager:(OWSContactsManager *)contactsManager | ||
| 
											9 years ago
										 | { | ||
|  |     self = [super init]; | ||
|  |     if (!self) { | ||
|  |         return self; | ||
|  |     } | ||
| 
											8 years ago
										 | 
 | ||
| 
											9 years ago
										 |     _signalId = contactId; | ||
|  |     _contactName = name; | ||
| 
											9 years ago
										 |     _diameter = diameter; | ||
| 
											8 years ago
										 |     _contactsManager = contactsManager; | ||
| 
											8 years ago
										 | 
 | ||
| 
											9 years ago
										 |     return self; | ||
|  | } | ||
|  | 
 | ||
| 
											8 years ago
										 | - (instancetype)initWithSignalId:(NSString *)signalId | ||
|  |                         diameter:(NSUInteger)diameter | ||
|  |                  contactsManager:(OWSContactsManager *)contactsManager | ||
| 
											9 years ago
										 | { | ||
| 
											8 years ago
										 |     // Name for avatar initials. | ||
| 
											8 years ago
										 |     NSString *_Nullable name = [contactsManager nameFromSystemContactsForRecipientId:signalId]; | ||
|  |     if (name.length == 0) { | ||
|  |         name = [contactsManager profileNameForRecipientId:signalId]; | ||
|  |     } | ||
|  |     if (name.length == 0) { | ||
|  |         name = signalId; | ||
|  |     } | ||
| 
											8 years ago
										 |     return [self initWithContactId:signalId name:name diameter:diameter contactsManager:contactsManager]; | ||
| 
											9 years ago
										 | } | ||
|  | 
 | ||
| 
											8 years ago
										 | - (instancetype)initWithNonSignalName:(NSString *)nonSignalName | ||
|  |                             colorSeed:(NSString *)colorSeed | ||
|  |                              diameter:(NSUInteger)diameter | ||
|  |                       contactsManager:(OWSContactsManager *)contactsManager | ||
|  | { | ||
|  |     return [self initWithContactId:colorSeed name:nonSignalName diameter:diameter contactsManager:contactsManager]; | ||
|  | } | ||
|  | 
 | ||
|  | #pragma mark - Instance methods | ||
|  | 
 | ||
| 
											9 years ago
										 | - (nullable UIImage *)buildSavedImage | ||
|  | { | ||
|  |     return [self.contactsManager imageForPhoneIdentifier:self.signalId]; | ||
|  | } | ||
|  | 
 | ||
|  | - (UIImage *)buildDefaultImage | ||
|  | { | ||
| 
											8 years ago
										 |     UIImage *cachedAvatar = | ||
|  |         [self.contactsManager.avatarCache imageForKey:self.signalId diameter:(CGFloat)self.diameter]; | ||
| 
											9 years ago
										 |     if (cachedAvatar) { | ||
|  |         return cachedAvatar; | ||
|  |     } | ||
|  | 
 | ||
| 
											9 years ago
										 |     NSMutableString *initials = [NSMutableString string]; | ||
| 
											9 years ago
										 | 
 | ||
|  |     NSRange rangeOfLetters = [self.contactName rangeOfCharacterFromSet:[NSCharacterSet letterCharacterSet]]; | ||
|  |     if (rangeOfLetters.location != NSNotFound) { | ||
|  |         // Contact name contains letters, so it's probably not just a phone number. | ||
| 
											9 years ago
										 |         // Make an image from the contact's initials | ||
| 
											9 years ago
										 |         NSCharacterSet *excludeAlphanumeric = [NSCharacterSet alphanumericCharacterSet].invertedSet; | ||
| 
											9 years ago
										 |         NSArray *words = | ||
|  |             [self.contactName componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; | ||
|  |         for (NSString *word in words) { | ||
| 
											9 years ago
										 |             NSString *trimmedWord = [word stringByTrimmingCharactersInSet:excludeAlphanumeric]; | ||
|  |             if (trimmedWord.length > 0) { | ||
|  |                 NSString *firstLetter = [trimmedWord substringToIndex:1]; | ||
| 
											9 years ago
										 |                 [initials appendString:[firstLetter uppercaseString]]; | ||
|  |             } | ||
|  |         } | ||
| 
											8 years ago
										 | 
 | ||
| 
											9 years ago
										 |         NSRange stringRange = { 0, MIN([initials length], (NSUInteger)3) }; // Rendering max 3 letters. | ||
|  |         initials = [[initials substringWithRange:stringRange] mutableCopy]; | ||
| 
											9 years ago
										 |     } | ||
|  | 
 | ||
|  |     if (initials.length == 0) { | ||
| 
											9 years ago
										 |         // We don't have a name for this contact, so we can't make an "initials" image | ||
|  |         [initials appendString:@"#"]; | ||
| 
											9 years ago
										 |     } | ||
| 
											8 years ago
										 | 
 | ||
| 
											9 years ago
										 |     CGFloat fontSize = (CGFloat)self.diameter / 2.8; | ||
| 
											9 years ago
										 |     UIColor *backgroundColor = [UIColor backgroundColorForContact:self.signalId]; | ||
| 
											9 years ago
										 |     UIImage *image = [[JSQMessagesAvatarImageFactory avatarImageWithUserInitials:initials | ||
|  |                                                                  backgroundColor:backgroundColor | ||
|  |                                                                        textColor:[UIColor whiteColor] | ||
| 
											9 years ago
										 |                                                                             font:[UIFont ows_boldFontWithSize:fontSize] | ||
|  |                                                                         diameter:self.diameter] avatarImage]; | ||
| 
											8 years ago
										 | 
 | ||
|  |     [self.contactsManager.avatarCache setImage:image forKey:self.signalId diameter:self.diameter]; | ||
| 
											9 years ago
										 |     return image; | ||
| 
											9 years ago
										 | } | ||
|  | 
 | ||
|  | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | NS_ASSUME_NONNULL_END |