1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-03 09:57:46 +01:00
Telegram/Telegraph/TGPhotoMessageViewModel.m
2016-02-25 01:03:51 +01:00

192 lines
8.3 KiB
Objective-C

#import "TGPhotoMessageViewModel.h"
#import "TGModernViewContext.h"
#import "TGModernRemoteImageView.h"
#import "TGMessageImageViewModel.h"
#import "TGModernRemoteImageViewModel.h"
#import "TGModernImageViewModel.h"
#import "TGModernColorViewModel.h"
#import "TGModernButtonViewModel.h"
#import "TGMessage.h"
#import "TGStringUtils.h"
@interface TGPhotoMessageViewModel ()
{
TGImageMediaAttachment *_imageMedia;
}
@end
@implementation TGPhotoMessageViewModel
- (instancetype)initWithMessage:(TGMessage *)message imageMedia:(TGImageMediaAttachment *)imageMedia authorPeer:(id)authorPeer context:(TGModernViewContext *)context forwardPeer:(id)forwardPeer forwardAuthor:(id)forwardAuthor forwardMessageId:(int32_t)forwardMessageId replyHeader:(TGMessage *)replyHeader replyAuthor:(id)replyAuthor viaUser:(TGUser *)viaUser
{
TGImageInfo *previewImageInfo = imageMedia.imageInfo;
CGSize largestSize = CGSizeZero;
NSString *legacyCacheUrl = [imageMedia.imageInfo closestImageUrlWithSize:CGSizeMake(1136, 1136) resultingSize:&largestSize pickLargest:true];
if (largestSize.width <= 90.0f + FLT_EPSILON || largestSize.height <= 90.0f + FLT_EPSILON) {
legacyCacheUrl = [imageMedia.imageInfo imageUrlForSizeLargerThanSize:CGSizeMake(1000.0f, 1000.0f) actualSize:&largestSize];
}
NSString *legacyThumbnailCacheUrl = [imageMedia.imageInfo closestImageUrlWithSize:CGSizeZero resultingSize:NULL];
int64_t localImageId = 0;
if (imageMedia.imageId == 0 && legacyCacheUrl.length != 0)
{
localImageId = murMurHash32(legacyCacheUrl);
}
if (legacyCacheUrl != nil && (imageMedia.imageId != 0 || localImageId != 0))
{
previewImageInfo = [[TGImageInfo alloc] init];
NSMutableString *previewUri = [[NSMutableString alloc] initWithString:@"photo-thumbnail://?"];
if (imageMedia.imageId != 0)
[previewUri appendFormat:@"id=%" PRId64 "", imageMedia.imageId];
else
[previewUri appendFormat:@"local-id=%" PRId64 "", localImageId];
CGSize thumbnailSize = CGSizeZero;
CGSize renderSize = CGSizeZero;
[TGImageMessageViewModel calculateImageSizesForImageSize:largestSize thumbnailSize:&thumbnailSize renderSize:&renderSize squareAspect:message.messageLifetime > 0 && message.messageLifetime <= 60 && message.layer >= 17];
[previewUri appendFormat:@"&width=%d&height=%d&renderWidth=%d&renderHeight=%d", (int)thumbnailSize.width, (int)thumbnailSize.height, (int)renderSize.width, (int)renderSize.height];
NSString *legacyFilePath = nil;
if ([legacyCacheUrl hasPrefix:@"file://"])
legacyFilePath = [legacyCacheUrl substringFromIndex:@"file://".length];
else
legacyFilePath = [[TGRemoteImageView sharedCache] pathForCachedData:legacyCacheUrl];
if (legacyFilePath != nil)
[previewUri appendFormat:@"&legacy-file-path=%@", legacyFilePath];
if (legacyThumbnailCacheUrl != nil)
[previewUri appendFormat:@"&legacy-thumbnail-cache-url=%@", [TGStringUtils stringByEscapingForURL:legacyThumbnailCacheUrl]];
if (message.messageLifetime > 0 && message.messageLifetime <= 60 && message.layer >= 17)
[previewUri appendString:@"&secret=1"];
[previewImageInfo addImageWithSize:thumbnailSize url:previewUri];
}
self = [super initWithMessage:message imageInfo:previewImageInfo authorPeer:authorPeer context:context forwardPeer:forwardPeer forwardAuthor:forwardAuthor forwardMessageId:forwardMessageId replyHeader:replyHeader replyAuthor:replyAuthor viaUser:viaUser caption:imageMedia.caption textCheckingResults:imageMedia.textCheckingResults];
if (self != nil)
{
_imageMedia = imageMedia;
_canDownload = _imageMedia.imageId != 0 || (![[imageMedia.imageInfo imageUrlForLargestSize:NULL] hasPrefix:@"http"]);
if (message.messageLifetime > 0 && message.messageLifetime <= 60 && message.layer >= 17)
{
self.isSecret = true;
[self enableInstantPreview];
}
if (self.isSecret)
[self.imageModel setAdditionalDataString:[self defaultAdditionalDataString]];
}
return self;
}
- (void)updateMessage:(TGMessage *)message viewStorage:(TGModernViewStorage *)viewStorage sizeUpdated:(bool *)sizeUpdated
{
[super updateMessage:message viewStorage:viewStorage sizeUpdated:sizeUpdated];
TGImageMediaAttachment *imageMedia = nil;
for (id attachment in message.mediaAttachments)
{
if ([attachment isKindOfClass:[TGImageMediaAttachment class]])
{
imageMedia = attachment;
break;
}
}
if (imageMedia != nil)
{
TGImageInfo *previewImageInfo = imageMedia.imageInfo;
CGSize largestSize = CGSizeZero;
NSString *legacyCacheUrl = [imageMedia.imageInfo closestImageUrlWithSize:CGSizeMake(1136, 1136) resultingSize:&largestSize pickLargest:true];
NSString *legacyThumbnailCacheUrl = [imageMedia.imageInfo closestImageUrlWithSize:CGSizeZero resultingSize:NULL];
int64_t localImageId = 0;
if (imageMedia.imageId == 0 && legacyCacheUrl.length != 0)
{
localImageId = murMurHash32(legacyCacheUrl);
}
if (legacyCacheUrl != nil && (imageMedia.imageId != 0 || localImageId != 0))
{
previewImageInfo = [[TGImageInfo alloc] init];
NSMutableString *previewUri = [[NSMutableString alloc] initWithString:@"photo-thumbnail://?"];
if (imageMedia.imageId != 0)
[previewUri appendFormat:@"id=%" PRId64 "", imageMedia.imageId];
else
[previewUri appendFormat:@"local-id=%" PRId64 "", localImageId];
CGSize thumbnailSize = CGSizeZero;
CGSize renderSize = CGSizeZero;
[TGImageMessageViewModel calculateImageSizesForImageSize:largestSize thumbnailSize:&thumbnailSize renderSize:&renderSize squareAspect:message.messageLifetime > 0 && message.messageLifetime <= 60 && message.layer >= 17];
[previewUri appendFormat:@"&width=%d&height=%d&renderWidth=%d&renderHeight=%d", (int)thumbnailSize.width, (int)thumbnailSize.height, (int)renderSize.width, (int)renderSize.height];
NSString *legacyFilePath = nil;
if ([legacyCacheUrl hasPrefix:@"file://"])
legacyFilePath = [legacyCacheUrl substringFromIndex:@"file://".length];
else
legacyFilePath = [[TGRemoteImageView sharedCache] pathForCachedData:legacyCacheUrl];
if (legacyFilePath != nil)
[previewUri appendFormat:@"&legacy-file-path=%@", legacyFilePath];
if (legacyThumbnailCacheUrl != nil)
[previewUri appendFormat:@"&legacy-thumbnail-cache-url=%@", [TGStringUtils stringByEscapingForURL:legacyThumbnailCacheUrl]];
if (message.messageLifetime > 0 && message.messageLifetime <= 60 && message.layer >= 17)
[previewUri appendString:@"&secret=1"];
[previewImageInfo addImageWithSize:renderSize url:previewUri];
}
[self updateImageInfo:previewImageInfo];
}
_canDownload = _imageMedia.imageId != 0 || (![[imageMedia.imageInfo imageUrlForLargestSize:NULL] hasPrefix:@"http"]);
}
- (void)updateMessageAttributes
{
[super updateMessageAttributes];
//_overlayIconModel.hidden = [_context isSecretMessageViewed:_mid];
//_overlayIconMaskLeftModel.hidden = [_context isSecretMessageScreenshotted:_mid];
//_overlayIconMaskRightModel.hidden = _overlayIconMaskLeftModel.hidden;
//_overlayIconMaskTopModel.hidden = _overlayIconMaskLeftModel.hidden;
//_overlayIconMaskBottomModel.hidden = _overlayIconMaskLeftModel.hidden;
}
- (bool)instantPreviewGesture
{
return false;
}
- (void)bindSpecialViewsToContainer:(UIView *)container viewStorage:(TGModernViewStorage *)viewStorage atItemPosition:(CGPoint)itemPosition
{
[super bindSpecialViewsToContainer:container viewStorage:viewStorage atItemPosition:itemPosition];
}
- (void)layoutForContainerSize:(CGSize)containerSize
{
[super layoutForContainerSize:containerSize];
}
@end