From c958c7909c39b76883e9f942f40b376208522d94 Mon Sep 17 00:00:00 2001 From: Matthew Douglass Date: Tue, 18 Oct 2016 21:32:48 -0700 Subject: [PATCH] Unifies bubble sizes for media bubbles Media bubbles (for photo, video and animated) sizes are calculated using shared logic. The bubbles are fixed width and their height is calculated based on the aspect ratio of the underlying image (clamped to a reasonable min/max height). Fixes #1270 // FREEBIE --- Signal.xcodeproj/project.pbxproj | 6 +++ .../TSMessageAdapaters/JSQMediaItem+OWS.h | 15 +++++++ .../TSMessageAdapaters/JSQMediaItem+OWS.m | 26 ++++++++++++ .../TSMessageAdapaters/TSAnimatedAdapter.m | 41 +------------------ .../TSMessageAdapaters/TSPhotoAdapter.m | 40 +----------------- .../TSVideoAttachmentAdapter.m | 3 ++ 6 files changed, 54 insertions(+), 77 deletions(-) create mode 100644 Signal/src/Models/TSMessageAdapaters/JSQMediaItem+OWS.h create mode 100644 Signal/src/Models/TSMessageAdapaters/JSQMediaItem+OWS.m diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index b66ca5c94..a6198a246 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 0DD55B166906AF3368995978 /* libPods-Signal.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 80CD5E19DD23200E7926EEA7 /* libPods-Signal.a */; }; 30209C98DABCE82064B4EAF5 /* libPods-SignalTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A33D3C7EB4B17BDBD47F0FCC /* libPods-SignalTests.a */; }; + 341BB7491DB727EE001E2975 /* JSQMediaItem+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 341BB7481DB727EE001E2975 /* JSQMediaItem+OWS.m */; }; 450873C31D9D5149006B54F2 /* OWSExpirationTimerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 450873C21D9D5149006B54F2 /* OWSExpirationTimerView.m */; }; 450873C41D9D5149006B54F2 /* OWSExpirationTimerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 450873C21D9D5149006B54F2 /* OWSExpirationTimerView.m */; }; 450873C71D9D867B006B54F2 /* OWSIncomingMessageCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 450873C61D9D867B006B54F2 /* OWSIncomingMessageCollectionViewCell.m */; }; @@ -526,6 +527,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 341BB7471DB727EE001E2975 /* JSQMediaItem+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "JSQMediaItem+OWS.h"; sourceTree = ""; }; + 341BB7481DB727EE001E2975 /* JSQMediaItem+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "JSQMediaItem+OWS.m"; sourceTree = ""; }; 450873C11D9D5149006B54F2 /* OWSExpirationTimerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSExpirationTimerView.h; sourceTree = ""; }; 450873C21D9D5149006B54F2 /* OWSExpirationTimerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSExpirationTimerView.m; sourceTree = ""; }; 450873C51D9D867B006B54F2 /* OWSIncomingMessageCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSIncomingMessageCollectionViewCell.h; sourceTree = ""; }; @@ -1844,6 +1847,8 @@ B62D53F51A23CCAD009AAF82 /* TSMessageAdapter.h */, B62D53F61A23CCAD009AAF82 /* TSMessageAdapter.m */, B6D3CBCE1C1376BE00C039DF /* TSContentAdapters.h */, + 341BB7471DB727EE001E2975 /* JSQMediaItem+OWS.h */, + 341BB7481DB727EE001E2975 /* JSQMediaItem+OWS.m */, 4526BD481CA61C8D00166BC8 /* OWSMessageEditing.h */, 45666ECE1D995B94008FE134 /* OWSMessageData.h */, ); @@ -2869,6 +2874,7 @@ E197B60E18BBEC1A00F073E5 /* CallAudioManager.m in Sources */, FCC81A981A44558300DFEC7D /* UIDevice+TSHardwareVersion.m in Sources */, 76EB054018170B33006006FC /* AppDelegate.m in Sources */, + 341BB7491DB727EE001E2975 /* JSQMediaItem+OWS.m in Sources */, 76EB05D018170B33006006FC /* ZrtpHandshakeSocket.m in Sources */, 45F2B1941D9C9F48000D2C69 /* OWSOutgoingMessageCollectionViewCell.m in Sources */, B63761EF19E1FBE8005735D1 /* HttpResponse.m in Sources */, diff --git a/Signal/src/Models/TSMessageAdapaters/JSQMediaItem+OWS.h b/Signal/src/Models/TSMessageAdapaters/JSQMediaItem+OWS.h new file mode 100644 index 000000000..0ab6fbc5c --- /dev/null +++ b/Signal/src/Models/TSMessageAdapaters/JSQMediaItem+OWS.h @@ -0,0 +1,15 @@ +// +// JSQMediaItem+OWS.h +// Signal +// +// Created by Matthew Douglass on 10/18/16. +// Copyright © 2016 Open Whisper Systems. All rights reserved. +// + +#import + +@interface JSQMediaItem (OWS) + +- (CGSize)ows_adjustBubbleSize:(CGSize)bubbleSize forImage:(UIImage *)image; + +@end diff --git a/Signal/src/Models/TSMessageAdapaters/JSQMediaItem+OWS.m b/Signal/src/Models/TSMessageAdapaters/JSQMediaItem+OWS.m new file mode 100644 index 000000000..f95eb1251 --- /dev/null +++ b/Signal/src/Models/TSMessageAdapaters/JSQMediaItem+OWS.m @@ -0,0 +1,26 @@ +// +// JSQMediaItem+OWS.m +// Signal +// +// Created by Matthew Douglass on 10/18/16. +// Copyright © 2016 Open Whisper Systems. All rights reserved. +// + +#import "JSQMediaItem+OWS.h" +#import "UIDevice+TSHardwareVersion.h" +#import "NumberUtil.h" + +@implementation JSQMediaItem (OWS) + +- (CGSize)ows_adjustBubbleSize:(CGSize)bubbleSize forImage:(UIImage *)image { + if ([[UIDevice currentDevice] isiPhoneVersionSixOrMore]) { + bubbleSize.width *= 1.1; + } else { + bubbleSize.width *= 0.7; + } + double aspectRatio = image.size.height / image.size.width; + bubbleSize.height = (CGFloat)(bubbleSize.width * [NumberUtil clamp:aspectRatio toMin:0.5 andMax:1.5]); + return bubbleSize; +} + +@end diff --git a/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m index 17c0affee..5beb00343 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m @@ -9,7 +9,7 @@ #import "TSAnimatedAdapter.h" #import "FLAnimatedImage.h" #import "TSAttachmentStream.h" -#import "UIDevice+TSHardwareVersion.h" +#import "JSQMediaItem+OWS.h" #import #import #import @@ -84,7 +84,7 @@ } - (CGSize)mediaViewDisplaySize { - return [self getBubbleSizeForImage:self.image]; + return [self ows_adjustBubbleSize:[super mediaViewDisplaySize] forImage:self.image]; } - (BOOL)isImage { @@ -130,41 +130,4 @@ } } - -#pragma mark - Utility - -- (CGSize)getBubbleSizeForImage:(UIImage *)image { - CGFloat aspectRatio = image.size.height / image.size.width; - - if ([[UIDevice currentDevice] isiPhoneVersionSixOrMore]) { - return [self getLargeSizeForAspectRatio:aspectRatio]; - } else { - return [self getSmallSizeForAspectRatio:aspectRatio]; - } -} - -- (CGSize)getLargeSizeForAspectRatio:(CGFloat)ratio { - return ratio > 1.0f ? [self largePortraitSize] : [self largeLandscapeSize]; -} - -- (CGSize)getSmallSizeForAspectRatio:(CGFloat)ratio { - return ratio > 1.0f ? [self smallPortraitSize] : [self smallLandscapeSize]; -} - -- (CGSize)largePortraitSize { - return CGSizeMake(220.0f, 310.0f); -} - -- (CGSize)smallPortraitSize { - return CGSizeMake(150.0f, 210.0f); -} - -- (CGSize)largeLandscapeSize { - return CGSizeMake(310.0f, 220.0f); -} - -- (CGSize)smallLandscapeSize { - return CGSizeMake(210.0f, 150.0f); -} - @end diff --git a/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m index cd12927c3..15d269dc8 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m @@ -3,7 +3,7 @@ #import "TSPhotoAdapter.h" #import "TSAttachmentStream.h" -#import "UIDevice+TSHardwareVersion.h" +#import "JSQMediaItem+OWS.h" #import @interface TSPhotoAdapter () @@ -59,7 +59,7 @@ } - (CGSize)mediaViewDisplaySize { - return [self getBubbleSizeForImage:self.image]; + return [self ows_adjustBubbleSize:[super mediaViewDisplaySize] forImage:self.image]; } - (BOOL)isImage { @@ -106,40 +106,4 @@ DDLogError(@"'%@' action unsupported for %@: attachmentId=%@", actionString, self.class, self.attachmentId); } -#pragma mark - Utility - -- (CGSize)getBubbleSizeForImage:(UIImage *)image { - CGFloat aspectRatio = image.size.height / image.size.width; - - if ([[UIDevice currentDevice] isiPhoneVersionSixOrMore]) { - return [self getLargeSizeForAspectRatio:aspectRatio]; - } else { - return [self getSmallSizeForAspectRatio:aspectRatio]; - } -} - -- (CGSize)getLargeSizeForAspectRatio:(CGFloat)ratio { - return ratio > 1.0f ? [self largePortraitSize] : [self largeLandscapeSize]; -} - -- (CGSize)getSmallSizeForAspectRatio:(CGFloat)ratio { - return ratio > 1.0f ? [self smallPortraitSize] : [self smallLandscapeSize]; -} - -- (CGSize)largePortraitSize { - return CGSizeMake(220.0f, 310.0f); -} - -- (CGSize)smallPortraitSize { - return CGSizeMake(150.0f, 210.0f); -} - -- (CGSize)largeLandscapeSize { - return CGSizeMake(310.0f, 220.0f); -} - -- (CGSize)smallLandscapeSize { - return CGSizeMake(210.0f, 150.0f); -} - @end diff --git a/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m index 9ec46933e..35c887694 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m @@ -6,6 +6,7 @@ #import "TSAttachmentStream.h" #import "TSMessagesManager.h" #import "TSStorageManager+keyingMaterial.h" +#import "JSQMediaItem+OWS.h" #import #import #import @@ -200,6 +201,8 @@ CGSize size = [super mediaViewDisplaySize]; if ([self isAudio]) { size.height = AUDIO_BAR_HEIGHT; + } else if ([self isVideo]) { + return [self ows_adjustBubbleSize:size forImage:self.image]; } return size; }