Merge pull request #1407 from mdouglass/fix-issue-1270

Unifies bubble sizes for media bubbles

// FREEBIE
pull/1/head
Michael Kirk 9 years ago committed by GitHub
commit ac996db258

@ -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 = "<group>"; };
341BB7481DB727EE001E2975 /* JSQMediaItem+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "JSQMediaItem+OWS.m"; sourceTree = "<group>"; };
450873C11D9D5149006B54F2 /* OWSExpirationTimerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSExpirationTimerView.h; sourceTree = "<group>"; };
450873C21D9D5149006B54F2 /* OWSExpirationTimerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSExpirationTimerView.m; sourceTree = "<group>"; };
450873C51D9D867B006B54F2 /* OWSIncomingMessageCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSIncomingMessageCollectionViewCell.h; sourceTree = "<group>"; };
@ -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 */,

@ -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 <JSQMessagesViewController/JSQMediaItem.h>
@interface JSQMediaItem (OWS)
- (CGSize)ows_adjustBubbleSize:(CGSize)bubbleSize forImage:(UIImage *)image;
@end

@ -0,0 +1,33 @@
//
// 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 {
double aspectRatio = image.size.height / image.size.width;
double clampedAspectRatio = [NumberUtil clamp:aspectRatio toMin:0.5 andMax:1.5];
if ([[UIDevice currentDevice] isiPhoneVersionSixOrMore]) {
bubbleSize.width *= 1.2;
bubbleSize.height = (CGFloat)(bubbleSize.width * clampedAspectRatio);
} else {
if (aspectRatio > 1) {
bubbleSize.height = bubbleSize.width;
bubbleSize.width = (CGFloat)(bubbleSize.height / clampedAspectRatio);
} else {
bubbleSize.height = (CGFloat)(bubbleSize.width * clampedAspectRatio);
}
}
return bubbleSize;
}
@end

@ -9,7 +9,7 @@
#import "TSAnimatedAdapter.h"
#import "FLAnimatedImage.h"
#import "TSAttachmentStream.h"
#import "UIDevice+TSHardwareVersion.h"
#import "JSQMediaItem+OWS.h"
#import <AssetsLibrary/AssetsLibrary.h>
#import <JSQMessagesViewController/JSQMessagesMediaViewBubbleImageMasker.h>
#import <MobileCoreServices/MobileCoreServices.h>
@ -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

@ -3,7 +3,7 @@
#import "TSPhotoAdapter.h"
#import "TSAttachmentStream.h"
#import "UIDevice+TSHardwareVersion.h"
#import "JSQMediaItem+OWS.h"
#import <JSQMessagesViewController/JSQMessagesMediaViewBubbleImageMasker.h>
@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

@ -6,6 +6,7 @@
#import "TSAttachmentStream.h"
#import "TSMessagesManager.h"
#import "TSStorageManager+keyingMaterial.h"
#import "JSQMediaItem+OWS.h"
#import <FFCircularProgressView.h>
#import <JSQMessagesViewController/JSQMessagesMediaViewBubbleImageMasker.h>
#import <MobileCoreServices/MobileCoreServices.h>
@ -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;
}

@ -14,32 +14,9 @@
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSUInteger, UIDeviceFamily) {
UIDeviceFamilyiPhone,
UIDeviceFamilyiPod,
UIDeviceFamilyiPad,
UIDeviceFamilyAppleTV,
UIDeviceFamilyUnknown,
};
@interface UIDevice (TSHardwareVersion)
/**
Returns a machine-readable model name in the format of "iPhone4,1"
*/
- (NSString *)modelIdentifier;
/**
Returns a human-readable model name in the format of "iPhone 4S". Fallback of the the `modelIdentifier` value.
*/
- (NSString *)modelName;
/**
Returns the device family as a `UIDeviceFamily`
*/
- (UIDeviceFamily)deviceFamily;
/*
* Returns true if device is iPhone 6 or 6+
*/

@ -17,151 +17,12 @@
@implementation UIDevice (TSHardwareVersion)
- (NSString *)getSysInfoByName:(char *)typeSpecifier {
size_t size;
sysctlbyname(typeSpecifier, NULL, &size, NULL, 0);
char *answer = malloc(size);
sysctlbyname(typeSpecifier, answer, &size, NULL, 0);
NSString *results = [NSString stringWithCString:answer encoding:NSUTF8StringEncoding];
free(answer);
return results;
}
- (NSString *)modelIdentifier {
return [self getSysInfoByName:"hw.machine"];
}
- (NSString *)modelName {
return [self modelNameForModelIdentifier:[self modelIdentifier]];
}
- (NSString *)modelNameForModelIdentifier:(NSString *)modelIdentifier {
// iPhone http://theiphonewiki.com/wiki/IPhone
if ([modelIdentifier isEqualToString:@"iPhone1,1"])
return @"iPhone 1G";
if ([modelIdentifier isEqualToString:@"iPhone1,2"])
return @"iPhone 3G";
if ([modelIdentifier isEqualToString:@"iPhone2,1"])
return @"iPhone 3GS";
if ([modelIdentifier isEqualToString:@"iPhone3,1"])
return @"iPhone 4 (GSM)";
if ([modelIdentifier isEqualToString:@"iPhone3,2"])
return @"iPhone 4 (GSM Rev A)";
if ([modelIdentifier isEqualToString:@"iPhone3,3"])
return @"iPhone 4 (CDMA)";
if ([modelIdentifier isEqualToString:@"iPhone4,1"])
return @"iPhone 4S";
if ([modelIdentifier isEqualToString:@"iPhone5,1"])
return @"iPhone 5 (GSM)";
if ([modelIdentifier isEqualToString:@"iPhone5,2"])
return @"iPhone 5 (Global)";
if ([modelIdentifier isEqualToString:@"iPhone5,3"])
return @"iPhone 5c (GSM)";
if ([modelIdentifier isEqualToString:@"iPhone5,4"])
return @"iPhone 5c (Global)";
if ([modelIdentifier isEqualToString:@"iPhone6,1"])
return @"iPhone 5s (GSM)";
if ([modelIdentifier isEqualToString:@"iPhone6,2"])
return @"iPhone 5s (Global)";
if ([modelIdentifier isEqualToString:@"iPhone7,1"])
return @"iPhone 6 Plus";
if ([modelIdentifier isEqualToString:@"iPhone7,2"])
return @"iPhone 6";
// iPad http://theiphonewiki.com/wiki/IPad
if ([modelIdentifier isEqualToString:@"iPad1,1"])
return @"iPad 1G";
if ([modelIdentifier isEqualToString:@"iPad2,1"])
return @"iPad 2 (Wi-Fi)";
if ([modelIdentifier isEqualToString:@"iPad2,2"])
return @"iPad 2 (GSM)";
if ([modelIdentifier isEqualToString:@"iPad2,3"])
return @"iPad 2 (CDMA)";
if ([modelIdentifier isEqualToString:@"iPad2,4"])
return @"iPad 2 (Rev A)";
if ([modelIdentifier isEqualToString:@"iPad3,1"])
return @"iPad 3 (Wi-Fi)";
if ([modelIdentifier isEqualToString:@"iPad3,2"])
return @"iPad 3 (GSM)";
if ([modelIdentifier isEqualToString:@"iPad3,3"])
return @"iPad 3 (Global)";
if ([modelIdentifier isEqualToString:@"iPad3,4"])
return @"iPad 4 (Wi-Fi)";
if ([modelIdentifier isEqualToString:@"iPad3,5"])
return @"iPad 4 (GSM)";
if ([modelIdentifier isEqualToString:@"iPad3,6"])
return @"iPad 4 (Global)";
if ([modelIdentifier isEqualToString:@"iPad4,1"])
return @"iPad Air (Wi-Fi)";
if ([modelIdentifier isEqualToString:@"iPad4,2"])
return @"iPad Air (Cellular)";
if ([modelIdentifier isEqualToString:@"iPad5,3"])
return @"iPad Air 2 (Wi-Fi)";
if ([modelIdentifier isEqualToString:@"iPad5,4"])
return @"iPad Air 2 (Cellular)";
// iPad Mini http://theiphonewiki.com/wiki/IPad_mini
if ([modelIdentifier isEqualToString:@"iPad2,5"])
return @"iPad mini 1G (Wi-Fi)";
if ([modelIdentifier isEqualToString:@"iPad2,6"])
return @"iPad mini 1G (GSM)";
if ([modelIdentifier isEqualToString:@"iPad2,7"])
return @"iPad mini 1G (Global)";
if ([modelIdentifier isEqualToString:@"iPad4,4"])
return @"iPad mini 2G (Wi-Fi)";
if ([modelIdentifier isEqualToString:@"iPad4,5"])
return @"iPad mini 2G (Cellular)";
if ([modelIdentifier isEqualToString:@"iPad4,7"])
return @"iPad mini 3G (Wi-Fi)";
if ([modelIdentifier isEqualToString:@"iPad4,8"])
return @"iPad mini 3G (Cellular)";
if ([modelIdentifier isEqualToString:@"iPad4,9"])
return @"iPad mini 3G (Cellular)";
// iPod http://theiphonewiki.com/wiki/IPod
if ([modelIdentifier isEqualToString:@"iPod1,1"])
return @"iPod touch 1G";
if ([modelIdentifier isEqualToString:@"iPod2,1"])
return @"iPod touch 2G";
if ([modelIdentifier isEqualToString:@"iPod3,1"])
return @"iPod touch 3G";
if ([modelIdentifier isEqualToString:@"iPod4,1"])
return @"iPod touch 4G";
if ([modelIdentifier isEqualToString:@"iPod5,1"])
return @"iPod touch 5G";
// Simulator
if ([modelIdentifier hasSuffix:@"86"] || [modelIdentifier isEqual:@"x86_64"]) {
BOOL smallerScreen = ([[UIScreen mainScreen] bounds].size.width < 768.0);
return (smallerScreen ? @"iPhone Simulator" : @"iPad Simulator");
}
return modelIdentifier;
}
- (UIDeviceFamily)deviceFamily {
NSString *modelIdentifier = [self modelIdentifier];
if ([modelIdentifier hasPrefix:@"iPhone"])
return UIDeviceFamilyiPhone;
if ([modelIdentifier hasPrefix:@"iPod"])
return UIDeviceFamilyiPod;
if ([modelIdentifier hasPrefix:@"iPad"])
return UIDeviceFamilyiPad;
return UIDeviceFamilyUnknown;
}
// FIXME this is probably broken for new iPhones =(
// Who could have guessed that there would ever be a new iPhone model?
// Look for phone-type devices with a width greater than or equal to the width
// of the original iPhone 6. Hopefully, this is somewhat future proof
- (BOOL)isiPhoneVersionSixOrMore {
return
[[self modelIdentifier] isEqualToString:@"iPhone7,1"] || [[self modelIdentifier] isEqualToString:@"iPhone7,2"];
self.userInterfaceIdiom == UIUserInterfaceIdiomPhone &&
([[UIScreen mainScreen] scale] * [[UIScreen mainScreen] bounds].size.width) >= 750;
}
@end

Loading…
Cancel
Save