diff --git a/Signal/Images.xcassets/contact-avatar.imageset/Contents.json b/Signal/Images.xcassets/contact-avatar-1024.imageset/Contents.json similarity index 68% rename from Signal/Images.xcassets/contact-avatar.imageset/Contents.json rename to Signal/Images.xcassets/contact-avatar-1024.imageset/Contents.json index 731480b4c..8ffbcdfbb 100644 --- a/Signal/Images.xcassets/contact-avatar.imageset/Contents.json +++ b/Signal/Images.xcassets/contact-avatar-1024.imageset/Contents.json @@ -2,17 +2,15 @@ "images" : [ { "idiom" : "universal", - "filename" : "profile-28@1x.png", + "filename" : "contact-avatar-1024.png", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "profile-28@2x.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "profile-28@3x.png", "scale" : "3x" } ], diff --git a/Signal/Images.xcassets/contact-avatar-1024.imageset/contact-avatar-1024.png b/Signal/Images.xcassets/contact-avatar-1024.imageset/contact-avatar-1024.png new file mode 100644 index 000000000..e4c5a734a Binary files /dev/null and b/Signal/Images.xcassets/contact-avatar-1024.imageset/contact-avatar-1024.png differ diff --git a/Signal/Images.xcassets/contact-avatar-84.imageset/Contents.json b/Signal/Images.xcassets/contact-avatar-84.imageset/Contents.json new file mode 100644 index 000000000..d347f46e9 --- /dev/null +++ b/Signal/Images.xcassets/contact-avatar-84.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "contact-avatar-84.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Signal/Images.xcassets/contact-avatar-84.imageset/contact-avatar-84.png b/Signal/Images.xcassets/contact-avatar-84.imageset/contact-avatar-84.png new file mode 100644 index 000000000..8a0e5924b Binary files /dev/null and b/Signal/Images.xcassets/contact-avatar-84.imageset/contact-avatar-84.png differ diff --git a/Signal/Images.xcassets/contact-avatar.imageset/profile-28@1x.png b/Signal/Images.xcassets/contact-avatar.imageset/profile-28@1x.png deleted file mode 100644 index 6064b87bc..000000000 Binary files a/Signal/Images.xcassets/contact-avatar.imageset/profile-28@1x.png and /dev/null differ diff --git a/Signal/Images.xcassets/contact-avatar.imageset/profile-28@2x.png b/Signal/Images.xcassets/contact-avatar.imageset/profile-28@2x.png deleted file mode 100644 index 82223704a..000000000 Binary files a/Signal/Images.xcassets/contact-avatar.imageset/profile-28@2x.png and /dev/null differ diff --git a/Signal/Images.xcassets/contact-avatar.imageset/profile-28@3x.png b/Signal/Images.xcassets/contact-avatar.imageset/profile-28@3x.png deleted file mode 100644 index 6cc4daf05..000000000 Binary files a/Signal/Images.xcassets/contact-avatar.imageset/profile-28@3x.png and /dev/null differ diff --git a/SignalMessaging/utils/OWSContactAvatarBuilder.m b/SignalMessaging/utils/OWSContactAvatarBuilder.m index 450b33adf..2a3528148 100644 --- a/SignalMessaging/utils/OWSContactAvatarBuilder.m +++ b/SignalMessaging/utils/OWSContactAvatarBuilder.m @@ -100,9 +100,8 @@ NS_ASSUME_NONNULL_BEGIN - (nullable UIImage *)buildDefaultImage { - UIImage *_Nullable cachedAvatar = nil; - [OWSContactAvatarBuilder.contactsManager.avatarCache imageForKey:self.cacheKey - diameter:(CGFloat)self.diameter]; + UIImage *_Nullable cachedAvatar = + [OWSContactAvatarBuilder.contactsManager.avatarCache imageForKey:self.cacheKey diameter:(CGFloat)self.diameter]; if (cachedAvatar) { return cachedAvatar; } @@ -135,10 +134,18 @@ NS_ASSUME_NONNULL_BEGIN if (initials.length == 0) { // We don't have a name for this contact, so we can't make an "initials" image. - UIImage *icon = [UIImage imageNamed:@"contact-avatar"]; - // The contact-avatar asset is designed for the kStandardAvatarSize. + UIImage *icon; + if (self.diameter > kStandardAvatarSize) { + icon = [UIImage imageNamed:@"contact-avatar-1024"]; + } else { + icon = [UIImage imageNamed:@"contact-avatar-84"]; + } + CGFloat assetWidthPixels = CGImageGetWidth(icon.CGImage); + // The contact-avatar asset is designed to be 28pt if the avatar is kStandardAvatarSize. // Adjust its size to reflect the actual output diameter. - CGFloat scaling = self.diameter / (CGFloat)kStandardAvatarSize; + // We use an oversize 1024px version of the asset to ensure quality results for larger avatars. + CGFloat scaling = (self.diameter / (CGFloat)kStandardAvatarSize) * (28 / assetWidthPixels); + CGSize iconSize = CGSizeScale(icon.size, scaling); image = [OWSAvatarBuilder avatarImageWithIcon:icon iconSize:iconSize backgroundColor:color diameter:self.diameter];