Rework group avatars to reflect conversation colors.

pull/1/head
Matthew Chen 7 years ago
parent 7ab76551c3
commit 25d56b30c1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

@ -1,12 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "group-avi.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

File diff suppressed because one or more lines are too long

@ -2,15 +2,17 @@
"images" : [
{
"idiom" : "universal",
"filename" : "empty-group-avatar.png",
"filename" : "group-28-white@1x.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "group-28-white@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "group-28-white@3x.png",
"scale" : "3x"
}
],

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

@ -117,7 +117,7 @@ NS_ASSUME_NONNULL_BEGIN
@"BLOCK_LIST_BLOCKED_GROUPS_SECTION", @"Section header for groups that have been blocked");
for (TSGroupModel *blockedGroup in blockedGroups) {
UIImage *image = blockedGroup.groupImage ?: OWSGroupAvatarBuilder.defaultGroupImage;
UIImage *image = blockedGroup.groupImage ?: OWSGroupAvatarBuilder.defaultGroupAvatarImage;
NSString *groupName
= blockedGroup.groupName.length > 0 ? blockedGroup.groupName : TSGroupThread.defaultGroupName;

@ -449,7 +449,7 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver,
}
func updateAvatarImage() {
contactAvatarView.image = OWSAvatarBuilder.buildImage(thread: thread, diameter: 400, contactsManager: contactsManager)
contactAvatarView.image = OWSAvatarBuilder.buildImage(thread: thread, diameter: 400)
}
func createIncomingCallControls() {

@ -164,7 +164,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (CGFloat)iconSize
{
return 48.f;
return kStandardAvatarSize;
}
- (CGFloat)iconSize

@ -77,7 +77,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (CGFloat)iconSize
{
return 48.f;
return kStandardAvatarSize;
}
- (CGFloat)iconSize

@ -82,7 +82,7 @@ NS_ASSUME_NONNULL_BEGIN
- (CGFloat)iconHeight
{
return 48.f;
return kStandardAvatarSize;
}
- (void)createContentsWithConversationStyle:(ConversationStyle *)conversationStyle

@ -262,18 +262,11 @@ NS_ASSUME_NONNULL_BEGIN
return NO;
}
OWSContactsManager *contactsManager = self.delegate.contactsManager;
if (contactsManager == nil) {
OWSFailDebug(@"contactsManager should not be nil");
return NO;
}
TSIncomingMessage *incomingMessage = (TSIncomingMessage *)self.viewItem.interaction;
UIImage *_Nullable authorAvatarImage =
[[[OWSContactAvatarBuilder alloc] initWithSignalId:incomingMessage.authorId
colorName:self.viewItem.authorConversationColorName
diameter:self.avatarSize
contactsManager:contactsManager] build];
diameter:self.avatarSize] build];
self.avatarView.image = authorAvatarImage;
[self.contentView addSubview:self.avatarView];

@ -334,9 +334,7 @@ NS_ASSUME_NONNULL_BEGIN
return;
}
self.avatarView.image = [OWSAvatarBuilder buildImageForThread:thread.threadRecord
diameter:self.avatarSize
contactsManager:contactsManager];
self.avatarView.image = [OWSAvatarBuilder buildImageForThread:thread.threadRecord diameter:self.avatarSize];
}
- (NSAttributedString *)attributedSnippetForThread:(ThreadViewModel *)thread isBlocked:(BOOL)isBlocked
@ -427,7 +425,7 @@ NS_ASSUME_NONNULL_BEGIN
- (NSUInteger)avatarSize
{
return 48.f;
return kStandardAvatarSize;
}
- (NSUInteger)avatarHSpacing

@ -529,7 +529,7 @@ const NSUInteger kNewGroupViewControllerAvatarWidth = 68;
- (void)updateAvatarView
{
self.avatarView.image = (self.groupAvatar ?: [UIImage imageNamed:@"empty-group-avatar"]);
self.avatarView.image = (self.groupAvatar ?: [OWSGroupAvatarBuilder defaultGroupAvatarImage]);
}
#pragma mark - Event Handling

@ -759,8 +759,7 @@ const CGFloat kIconViewLength = 24;
[threadInfoView autoPinHeightToSuperviewWithMargin:16.f];
const NSUInteger kAvatarSize = 68;
UIImage *avatarImage =
[OWSAvatarBuilder buildImageForThread:self.thread diameter:kAvatarSize contactsManager:self.contactsManager];
UIImage *avatarImage = [OWSAvatarBuilder buildImageForThread:self.thread diameter:kAvatarSize];
OWSAssertDebug(avatarImage);
AvatarImageView *avatarView = [[AvatarImageView alloc] initWithImage:avatarImage];

@ -397,7 +397,7 @@ NS_ASSUME_NONNULL_BEGIN
- (void)updateAvatarView
{
self.avatarView.image = (self.groupAvatar ?: [UIImage imageNamed:@"empty-group-avatar"]);
self.avatarView.image = (self.groupAvatar ?: [OWSGroupAvatarBuilder defaultGroupAvatarImage]);
}
#pragma mark - Event Handling

@ -28,7 +28,7 @@ public class AvatarTableViewCell: UITableViewCell {
@objc
public override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
self.avatarView = AvatarImageView()
avatarView.autoSetDimensions(to: CGSize(width: CGFloat(kContactCellAvatarSize), height: CGFloat(kContactCellAvatarSize)))
avatarView.autoSetDimensions(to: CGSize(width: CGFloat(kStandardAvatarSize), height: CGFloat(kStandardAvatarSize)))
self._textLabel = UILabel()
self._detailTextLabel = UILabel()

@ -96,8 +96,7 @@ class ContactCell: UITableViewCell {
let avatarBuilder = OWSContactAvatarBuilder(nonSignalName: contact.fullName,
colorSeed: contactIdForDeterminingBackgroundColor,
diameter: ContactCell.kAvatarDiameter,
contactsManager: contactsManager)
diameter: ContactCell.kAvatarDiameter)
contactImageView.image = avatarBuilder.build()
}

@ -22,7 +22,7 @@ import SignalServiceKit
// Layout
avatarView.autoSetDimension(.width, toSize: CGFloat(kContactCellAvatarSize))
avatarView.autoSetDimension(.width, toSize: CGFloat(kStandardAvatarSize))
avatarView.autoPinToSquareAspectRatio()
let textRows = UIStackView(arrangedSubviews: [nameLabel, subtitleLabel])
@ -58,7 +58,7 @@ import SignalServiceKit
}.joined(separator: ", ")
self.subtitleLabel.text = groupMemberNames
self.avatarView.image = OWSAvatarBuilder.buildImage(thread: thread, diameter: kContactCellAvatarSize, contactsManager: contactsManager)
self.avatarView.image = OWSAvatarBuilder.buildImage(thread: thread, diameter: kStandardAvatarSize)
}
}

@ -65,8 +65,7 @@ public class ContactShareViewModel: NSObject {
let avatarBuilder = OWSContactAvatarBuilder(nonSignalName: displayName,
colorSeed: colorSeed,
diameter: UInt(diameter),
contactsManager: contactsManager)
diameter: UInt(diameter))
// Note: we use buildDefaultImage() and not build() so that contact
// share views always reflect the contents of the contact share.
// build() might return an avatar from a corresponding system

@ -153,6 +153,6 @@ public class ConversationAvatarImageView: AvatarImageView {
public func updateImage() {
Logger.debug("updateImage")
self.image = OWSAvatarBuilder.buildImage(thread: thread, diameter: diameter, contactsManager: contactsManager)
self.image = OWSAvatarBuilder.buildImage(thread: thread, diameter: diameter)
}
}

@ -4,7 +4,6 @@
NS_ASSUME_NONNULL_BEGIN
extern const NSUInteger kContactCellAvatarSize;
extern const CGFloat kContactCellAvatarTextMargin;
@class OWSContactsManager;

@ -15,7 +15,6 @@
NS_ASSUME_NONNULL_BEGIN
const NSUInteger kContactCellAvatarSize = 48;
const CGFloat kContactCellAvatarTextMargin = 12;
@interface ContactCellView ()
@ -53,8 +52,8 @@ const CGFloat kContactCellAvatarTextMargin = 12;
self.layoutMargins = UIEdgeInsetsZero;
_avatarView = [AvatarImageView new];
[_avatarView autoSetDimension:ALDimensionWidth toSize:kContactCellAvatarSize];
[_avatarView autoSetDimension:ALDimensionHeight toSize:kContactCellAvatarSize];
[_avatarView autoSetDimension:ALDimensionWidth toSize:kStandardAvatarSize];
[_avatarView autoSetDimension:ALDimensionHeight toSize:kStandardAvatarSize];
self.nameLabel = [UILabel new];
self.nameLabel.lineBreakMode = NSLineBreakByTruncatingTail;
@ -164,8 +163,7 @@ const CGFloat kContactCellAvatarTextMargin = 12;
object:nil];
[self updateProfileName];
}
self.avatarView.image =
[OWSAvatarBuilder buildImageForThread:thread diameter:kContactCellAvatarSize contactsManager:contactsManager];
self.avatarView.image = [OWSAvatarBuilder buildImageForThread:thread diameter:kStandardAvatarSize];
if (self.accessoryMessage) {
self.accessoryLabel.text = self.accessoryMessage;
@ -178,13 +176,6 @@ const CGFloat kContactCellAvatarTextMargin = 12;
- (void)updateAvatar
{
OWSContactsManager *contactsManager = self.contactsManager;
if (contactsManager == nil) {
OWSFailDebug(@"contactsManager should not be nil");
self.avatarView.image = nil;
return;
}
NSString *recipientId = self.recipientId;
if (recipientId.length == 0) {
OWSFailDebug(@"recipientId should not be nil");
@ -201,10 +192,9 @@ const CGFloat kContactCellAvatarTextMargin = 12;
}
}();
self.avatarView.image = [[[OWSContactAvatarBuilder alloc] initWithSignalId:recipientId
colorName:colorName
diameter:kContactCellAvatarSize
contactsManager:contactsManager] build];
self.avatarView.image =
[[[OWSContactAvatarBuilder alloc] initWithSignalId:recipientId colorName:colorName diameter:kStandardAvatarSize]
build];
}
- (void)updateProfileName

@ -173,6 +173,26 @@ CG_INLINE CGSize CGSizeMax(CGSize size1, CGSize size2)
return CGSizeMake(MAX(size1.width, size2.width), MAX(size1.height, size2.height));
}
CG_INLINE CGPoint CGPointAdd(CGPoint left, CGPoint right)
{
return CGPointMake(left.x + right.x, left.y + right.y);
}
CG_INLINE CGPoint CGPointSubtract(CGPoint left, CGPoint right)
{
return CGPointMake(left.x - right.x, left.y - right.y);
}
CG_INLINE CGPoint CGPointScale(CGPoint point, CGFloat factor)
{
return CGPointMake(point.x * factor, point.y * factor);
}
CG_INLINE CGSize CGSizeScale(CGSize size, CGFloat factor)
{
return CGSizeMake(size.width * factor, size.height * factor);
}
CGFloat CGHairlineWidth(void);
NS_ASSUME_NONNULL_END

@ -4,16 +4,15 @@
NS_ASSUME_NONNULL_BEGIN
@class OWSContactsManager;
extern const NSUInteger kStandardAvatarSize;
@class TSThread;
@class UIImage;
@interface OWSAvatarBuilder : NSObject
+ (nullable UIImage *)buildImageForThread:(TSThread *)thread
diameter:(NSUInteger)diameter
contactsManager:(OWSContactsManager *)contactsManager
NS_SWIFT_NAME(buildImage(thread:diameter:contactsManager:));
diameter:(NSUInteger)diameter NS_SWIFT_NAME(buildImage(thread:diameter:));
+ (nullable UIImage *)buildRandomAvatarWithDiameter:(NSUInteger)diameter;
@ -26,6 +25,7 @@ NS_ASSUME_NONNULL_BEGIN
diameter:(NSUInteger)diameter;
+ (nullable UIImage *)avatarImageWithIcon:(UIImage *)icon
iconSize:(CGSize)iconSize
backgroundColor:(UIColor *)backgroundColor
diameter:(NSUInteger)diameter;

@ -9,19 +9,20 @@
#import "TSGroupThread.h"
#import "UIColor+OWS.h"
#import "UIFont+OWS.h"
#import "UIView+OWS.h"
NS_ASSUME_NONNULL_BEGIN
const NSUInteger kStandardAvatarSize = 48;
typedef void (^OWSAvatarDrawBlock)(CGContextRef context);
@implementation OWSAvatarBuilder
+ (nullable UIImage *)buildImageForThread:(TSThread *)thread
diameter:(NSUInteger)diameter
contactsManager:(OWSContactsManager *)contactsManager
{
OWSAssertDebug(thread);
OWSAssertDebug(contactsManager);
OWSAvatarBuilder *avatarBuilder;
if ([thread isKindOfClass:[TSContactThread class]]) {
@ -29,10 +30,9 @@ typedef void (^OWSAvatarDrawBlock)(CGContextRef context);
NSString *colorName = thread.conversationColorName;
avatarBuilder = [[OWSContactAvatarBuilder alloc] initWithSignalId:contactThread.contactIdentifier
colorName:colorName
diameter:diameter
contactsManager:contactsManager];
diameter:diameter];
} else if ([thread isKindOfClass:[TSGroupThread class]]) {
avatarBuilder = [[OWSGroupAvatarBuilder alloc] initWithThread:(TSGroupThread *)thread];
avatarBuilder = [[OWSGroupAvatarBuilder alloc] initWithThread:(TSGroupThread *)thread diameter:diameter];
} else {
OWSLogError(@"called with unsupported thread: %@", thread);
}
@ -106,16 +106,19 @@ typedef void (^OWSAvatarDrawBlock)(CGContextRef context);
}
+ (nullable UIImage *)avatarImageWithIcon:(UIImage *)icon
iconSize:(CGSize)iconSize
backgroundColor:(UIColor *)backgroundColor
diameter:(NSUInteger)diameter
{
return [self avatarImageWithIcon:icon
iconSize:iconSize
iconColor:self.avatarForegroundColor
backgroundColor:backgroundColor
diameter:diameter];
}
+ (nullable UIImage *)avatarImageWithIcon:(UIImage *)icon
iconSize:(CGSize)iconSize
iconColor:(UIColor *)iconColor
backgroundColor:(UIColor *)backgroundColor
diameter:(NSUInteger)diameter
@ -126,7 +129,11 @@ typedef void (^OWSAvatarDrawBlock)(CGContextRef context);
return [self avatarImageWithDiameter:diameter
backgroundColor:backgroundColor
drawBlock:^(CGContextRef context) {
[self drawIconInAvatar:icon iconColor:iconColor diameter:diameter];
[self drawIconInAvatar:icon
iconSize:iconSize
iconColor:iconColor
diameter:diameter
context:context];
}];
}
@ -230,14 +237,34 @@ typedef void (^OWSAvatarDrawBlock)(CGContextRef context);
[initials drawAtPoint:drawPoint withAttributes:textAttributes];
}
+ (void)drawIconInAvatar:(UIImage *)icon iconColor:(UIColor *)iconColor diameter:(NSUInteger)diameter
+ (void)drawIconInAvatar:(UIImage *)icon
iconSize:(CGSize)iconSize
iconColor:(UIColor *)iconColor
diameter:(NSUInteger)diameter
context:(CGContextRef)context
{
OWSAssertDebug(icon);
OWSAssertDebug(iconColor);
OWSAssertDebug(diameter > 0);
CGPoint drawPoint = CGPointMake((diameter - icon.size.width) * 0.5f, (diameter - icon.size.height) * 0.5f);
[icon drawAtPoint:drawPoint];
OWSAssertDebug(context);
// UIKit uses an ULO coordinate system (upper-left-origin).
// Core Graphics uses an LLO coordinate system (lower-left-origin).
CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, diameter);
CGContextConcatCTM(context, flipVertical);
CGRect imageRect = CGRectZero;
imageRect.size = CGSizeMake(diameter, diameter);
// The programmatic equivalent of UIImageRenderingModeAlwaysTemplate/tintColor.
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGRect maskRect = CGRectZero;
maskRect.origin = CGPointScale(
CGPointSubtract(CGPointMake(diameter, diameter), CGPointMake(iconSize.width, iconSize.height)), 0.5f);
maskRect.size = iconSize;
CGContextClipToMask(context, maskRect, icon.CGImage);
CGContextSetFillColor(context, CGColorGetComponents(iconColor.CGColor));
CGContextFillRect(context, imageRect);
}
- (nullable UIImage *)build

@ -6,7 +6,6 @@
NS_ASSUME_NONNULL_BEGIN
@class OWSContactsManager;
@class TSContactThread;
@interface OWSContactAvatarBuilder : OWSAvatarBuilder
@ -15,18 +14,14 @@ NS_ASSUME_NONNULL_BEGIN
* Build an avatar for a Signal recipient
*/
- (instancetype)initWithSignalId:(NSString *)signalId
colorName:(NSString *)colorName
diameter:(NSUInteger)diameter
contactsManager:(OWSContactsManager *)contactsManager;
- (instancetype)initWithSignalId:(NSString *)signalId colorName:(NSString *)colorName diameter:(NSUInteger)diameter;
/**
* Build an avatar for a non-Signal recipient
*/
- (instancetype)initWithNonSignalName:(NSString *)nonSignalName
colorSeed:(NSString *)colorSeed
diameter:(NSUInteger)diameter
contactsManager:(OWSContactsManager *)contactsManager;
diameter:(NSUInteger)diameter;
@end

@ -10,12 +10,12 @@
#import "UIColor+OWS.h"
#import "UIFont+OWS.h"
#import <SignalMessaging/SignalMessaging-Swift.h>
#import <SignalServiceKit/SSKEnvironment.h>
NS_ASSUME_NONNULL_BEGIN
@interface OWSContactAvatarBuilder ()
@property (nonatomic, readonly) OWSContactsManager *contactsManager;
@property (nonatomic, readonly) NSString *signalId;
@property (nonatomic, readonly) NSString *contactName;
@property (nonatomic, readonly) NSString *colorName;
@ -31,7 +31,6 @@ NS_ASSUME_NONNULL_BEGIN
name:(NSString *)name
colorName:(NSString *)colorName
diameter:(NSUInteger)diameter
contactsManager:(OWSContactsManager *)contactsManager
{
self = [super init];
if (!self) {
@ -44,7 +43,6 @@ NS_ASSUME_NONNULL_BEGIN
_contactName = name;
_colorName = colorName;
_diameter = diameter;
_contactsManager = contactsManager;
return self;
}
@ -52,42 +50,37 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithSignalId:(NSString *)signalId
colorName:(NSString *)colorName
diameter:(NSUInteger)diameter
contactsManager:(OWSContactsManager *)contactsManager
{
// Name for avatar initials.
NSString *_Nullable name = [contactsManager nameFromSystemContactsForRecipientId:signalId];
NSString *_Nullable name = [OWSContactAvatarBuilder.contactsManager nameFromSystemContactsForRecipientId:signalId];
if (name.length == 0) {
name = [contactsManager profileNameForRecipientId:signalId];
name = [OWSContactAvatarBuilder.contactsManager profileNameForRecipientId:signalId];
}
if (name.length == 0) {
name = signalId;
}
return [self initWithContactId:signalId
name:name
colorName:colorName
diameter:diameter
contactsManager:contactsManager];
return [self initWithContactId:signalId name:name colorName:colorName diameter:diameter];
}
- (instancetype)initWithNonSignalName:(NSString *)nonSignalName
colorSeed:(NSString *)colorSeed
diameter:(NSUInteger)diameter
contactsManager:(OWSContactsManager *)contactsManager
{
NSString *colorName = [TSThread stableConversationColorNameForString:colorSeed];
return [self initWithContactId:colorSeed
name:nonSignalName
colorName:(NSString *)colorName
diameter:diameter
contactsManager:contactsManager];
return [self initWithContactId:colorSeed name:nonSignalName colorName:(NSString *)colorName diameter:diameter];
}
+ (OWSContactsManager *)contactsManager
{
return (OWSContactsManager *)SSKEnvironment.shared.contactsManager;
}
#pragma mark - Instance methods
- (nullable UIImage *)buildSavedImage
{
return [self.contactsManager imageForPhoneIdentifier:self.signalId];
return [OWSContactAvatarBuilder.contactsManager imageForPhoneIdentifier:self.signalId];
}
- (id)cacheKey
@ -98,7 +91,7 @@ NS_ASSUME_NONNULL_BEGIN
- (nullable UIImage *)buildDefaultImage
{
UIImage *cachedAvatar =
[self.contactsManager.avatarCache imageForKey:self.cacheKey diameter:(CGFloat)self.diameter];
[OWSContactAvatarBuilder.contactsManager.avatarCache imageForKey:self.cacheKey diameter:(CGFloat)self.diameter];
if (cachedAvatar) {
return cachedAvatar;
}
@ -139,7 +132,7 @@ NS_ASSUME_NONNULL_BEGIN
return nil;
}
[self.contactsManager.avatarCache setImage:image forKey:self.cacheKey diameter:self.diameter];
[OWSContactAvatarBuilder.contactsManager.avatarCache setImage:image forKey:self.cacheKey diameter:self.diameter];
return image;
}

@ -10,8 +10,9 @@ NS_ASSUME_NONNULL_BEGIN
@interface OWSGroupAvatarBuilder : OWSAvatarBuilder
- (instancetype)initWithThread:(TSGroupThread *)thread;
+ (UIImage *)defaultGroupImage;
- (instancetype)initWithThread:(TSGroupThread *)thread diameter:(NSUInteger)diameter;
+ (nullable UIImage *)defaultGroupAvatarImage;
@end

@ -3,19 +3,24 @@
//
#import "OWSGroupAvatarBuilder.h"
#import "OWSContactsManager.h"
#import "TSGroupThread.h"
#import "UIColor+OWS.h"
#import <SignalMessaging/SignalMessaging-Swift.h>
#import <SignalServiceKit/SSKEnvironment.h>
NS_ASSUME_NONNULL_BEGIN
@interface OWSGroupAvatarBuilder ()
@property (nonatomic, readonly) TSGroupThread *thread;
@property (nonatomic, readonly) NSUInteger diameter;
@end
@implementation OWSGroupAvatarBuilder
- (instancetype)initWithThread:(TSGroupThread *)thread
- (instancetype)initWithThread:(TSGroupThread *)thread diameter:(NSUInteger)diameter
{
self = [super init];
if (!self) {
@ -23,6 +28,7 @@ NS_ASSUME_NONNULL_BEGIN
}
_thread = thread;
_diameter = diameter;
return self;
}
@ -32,19 +38,60 @@ NS_ASSUME_NONNULL_BEGIN
return self.thread.groupModel.groupImage;
}
+ (OWSContactsManager *)contactsManager
{
return (OWSContactsManager *)SSKEnvironment.shared.contactsManager;
}
- (nullable UIImage *)buildDefaultImage
{
return self.class.defaultGroupImage;
NSString *cacheKey = self.thread.uniqueId;
UIImage *cachedAvatar =
[OWSGroupAvatarBuilder.contactsManager.avatarCache imageForKey:cacheKey diameter:(CGFloat)self.diameter];
if (cachedAvatar) {
return cachedAvatar;
}
UIColor *backgroundColor =
[UIColor ows_conversationColorForColorName:self.thread.conversationColorName isShaded:Theme.isDarkThemeEnabled];
UIImage *_Nullable image =
[OWSGroupAvatarBuilder groupAvatarImageWithBackgroundColor:backgroundColor diameter:self.diameter];
if (!image) {
return nil;
}
[OWSGroupAvatarBuilder.contactsManager.avatarCache setImage:image forKey:cacheKey diameter:self.diameter];
return image;
}
+ (nullable UIImage *)defaultGroupAvatarImage
{
NSUInteger diameter = 200;
NSString *cacheKey = @"default-group-avatar";
UIImage *cachedAvatar = [self.contactsManager.avatarCache imageForKey:cacheKey diameter:(CGFloat)diameter];
if (cachedAvatar) {
return cachedAvatar;
}
// TODO: Verify with Myles.
UIColor *backgroundColor = UIColor.ows_signalBlueColor;
UIImage *_Nullable image = [self groupAvatarImageWithBackgroundColor:backgroundColor diameter:diameter];
if (!image) {
return nil;
}
[self.contactsManager.avatarCache setImage:image forKey:cacheKey diameter:diameter];
return image;
}
+ (UIImage *)defaultGroupImage
+ (nullable UIImage *)groupAvatarImageWithBackgroundColor:(UIColor *)backgroundColor diameter:(NSUInteger)diameter
{
static UIImage *defaultGroupImage;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
defaultGroupImage = [UIImage imageNamed:@"empty-group-avatar"];
});
return defaultGroupImage;
UIImage *icon = [UIImage imageNamed:@"group-avatar"];
CGSize iconSize = CGSizeScale(icon.size, diameter / kStandardAvatarSize);
return
[OWSAvatarBuilder avatarImageWithIcon:icon iconSize:iconSize backgroundColor:backgroundColor diameter:diameter];
}
@end

Loading…
Cancel
Save