| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- //
- // TUIImageMessageCellData.m
- // TXIMSDK_TUIKit_iOS
- //
- // Created by annidyfeng on 2019/5/21.
- // Copyright © 2023 Tencent. All rights reserved.
- //
- #import "TUIImageMessageCellData.h"
- #import <TIMCommon/TIMDefine.h>
- #import <TUICore/NSString+TUIUtil.h>
- @interface TUIImageMessageCellData ()
- @property(nonatomic, assign) BOOL isDownloading;
- @property(nonatomic, copy) TUIImageMessageDownloadCallback onFinish;
- @end
- @implementation TUIImageMessageCellData
- + (TUIMessageCellData *)getCellData:(V2TIMMessage *)message {
- V2TIMImageElem *elem = message.imageElem;
- TUIImageMessageCellData *imageData = [[TUIImageMessageCellData alloc] initWithDirection:(message.isSelf ? MsgDirectionOutgoing : MsgDirectionIncoming)];
- imageData.path = [elem.path safePathString];
- imageData.items = [NSMutableArray array];
- for (V2TIMImage *item in elem.imageList) {
- TUIImageItem *itemData = [[TUIImageItem alloc] init];
- itemData.uuid = item.uuid;
- itemData.size = CGSizeMake(item.width, item.height);
- // itemData.url = item.url;
- if (item.type == V2TIM_IMAGE_TYPE_THUMB) {
- itemData.type = TImage_Type_Thumb;
- } else if (item.type == V2TIM_IMAGE_TYPE_LARGE) {
- itemData.type = TImage_Type_Large;
- } else if (item.type == V2TIM_IMAGE_TYPE_ORIGIN) {
- itemData.type = TImage_Type_Origin;
- }
- [imageData.items addObject:itemData];
- }
- imageData.reuseId = TImageMessageCell_ReuseId;
- return imageData;
- }
- + (NSString *)getDisplayString:(V2TIMMessage *)message {
- return TIMCommonLocalizableString(TUIkitMessageTypeImage); // @"[Image]";
- }
- - (Class)getReplyQuoteViewDataClass {
- return NSClassFromString(@"TUIImageReplyQuoteViewData");
- }
- - (Class)getReplyQuoteViewClass {
- return NSClassFromString(@"TUIImageReplyQuoteView");
- }
- - (instancetype)initWithDirection:(TMsgDirection)direction {
- self = [super initWithDirection:direction];
- if (self) {
- _uploadProgress = 100;
- if (direction == MsgDirectionIncoming) {
- self.cellLayout = [TUIMessageCellLayout incommingImageMessageLayout];
- } else {
- self.cellLayout = [TUIMessageCellLayout outgoingImageMessageLayout];
- }
- }
- return self;
- }
- - (NSString *)getImagePath:(TUIImageType)type isExist:(BOOL *)isExist {
- NSString *path = nil;
- BOOL isDir = NO;
- *isExist = NO;
- if (self.direction == MsgDirectionOutgoing) {
- path = [NSString stringWithFormat:@"%@%@", TUIKit_Image_Path, _path.lastPathComponent];
- if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]) {
- if (!isDir) {
- *isExist = YES;
- }
- }
- }
- if (!*isExist) {
- TUIImageItem *tImageItem = [self getTImageItem:type];
- path = [NSString stringWithFormat:@"%@%@_%ld", TUIKit_Image_Path, tImageItem.uuid, (long)tImageItem.type];
- if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]) {
- if (!isDir) {
- *isExist = YES;
- }
- }
- }
- return path;
- }
- - (void)downloadImage:(TUIImageType)type finish:(TUIImageMessageDownloadCallback)finish {
- self.onFinish = finish;
- [self downloadImage:type];
- }
- - (void)downloadImage:(TUIImageType)type {
- BOOL isExist = NO;
- NSString *path = [self getImagePath:type isExist:&isExist];
- if (isExist) {
- [self decodeImage:type];
- return;
- }
- if (self.isDownloading) {
- return;
- }
- self.isDownloading = YES;
- V2TIMImage *imImage = [self getIMImage:type];
- @weakify(self);
- [imImage downloadImage:path
- progress:^(NSInteger curSize, NSInteger totalSize) {
- @strongify(self);
- NSInteger progress = curSize * 100 / totalSize;
- [self updateProgress:MIN(progress, 99) withType:type];
- }
- succ:^{
- @strongify(self);
- self.isDownloading = NO;
- [self updateProgress:100 withType:type];
- [self decodeImage:type];
- }
- fail:^(int code, NSString *msg) {
- @strongify(self);
- self.isDownloading = NO;
- /**
- * If the uuid of the picture is the same (the same user sends
- * the same picture continuously), the same path may trigger multiple download operations. Except for the first time, subsequent downloads will report
- * an error. At this time, it is necessary to judge whether the local file exists.
- */
- [self decodeImage:type];
- }];
- }
- - (void)updateProgress:(NSUInteger)progress withType:(TUIImageType)type {
- dispatch_async(dispatch_get_main_queue(), ^{
- if (type == TImage_Type_Thumb) self.thumbProgress = progress;
- if (type == TImage_Type_Large) self.largeProgress = progress;
- if (type == TImage_Type_Origin) self.originProgress = progress;
- });
- }
- - (void)decodeImage:(TUIImageType)type {
- BOOL isExist = NO;
- NSString *path = [self getImagePath:type isExist:&isExist];
- if (!isExist) {
- return;
- }
- __weak typeof(self) weakSelf = self;
- void (^finishBlock)(UIImage *) = ^(UIImage *image) {
- if (type == TImage_Type_Thumb) {
- weakSelf.thumbImage = image;
- weakSelf.thumbProgress = 100;
- weakSelf.uploadProgress = 100;
- }
- if (type == TImage_Type_Large) {
- weakSelf.largeImage = image;
- weakSelf.largeProgress = 100;
- }
- if (type == TImage_Type_Origin) {
- weakSelf.originImage = image;
- weakSelf.originProgress = 100;
- }
- if (weakSelf.onFinish) {
- weakSelf.onFinish();
- }
- };
- NSString *cacheKey = [path substringFromIndex:TUIKit_Image_Path.length];
- UIImage *cacheImage = [[SDImageCache sharedImageCache] imageFromCacheForKey:cacheKey];
- if (cacheImage) {
- finishBlock(cacheImage);
- } else {
- [TUITool asyncDecodeImage:path
- complete:^(NSString *path, UIImage *image) {
- dispatch_async(dispatch_get_main_queue(), ^{
- NSLog(@"image.sd_imageFormat: %ld path:%@ image.sd_imageData.length :%lu",(long)image.sd_imageFormat,path,(unsigned long)image.sd_imageData.length);
- if (![path tui_containsString:@".gif"] || (image.sd_imageFormat != SDImageFormatGIF) ) {
- [[SDImageCache sharedImageCache] storeImageToMemory:image forKey:cacheKey];
- }
- else {
- /**
- * The gif image is too large to be cached in memory
- * Only cache images less than 1M
- */
- if (image.sd_imageData.length < 1 * 1024 * 1024) {
- [[SDImageCache sharedImageCache] storeImageToMemory:image forKey:cacheKey];
- }
- }
- finishBlock(image);
- });
- }];
- }
- }
- - (TUIImageItem *)getTImageItem:(TUIImageType)type {
- for (TUIImageItem *item in self.items) {
- if (item.type == type) {
- return item;
- }
- }
- return nil;
- }
- - (V2TIMImage *)getIMImage:(TUIImageType)type {
- V2TIMMessage *imMsg = self.innerMessage;
- if (imMsg.elemType == V2TIM_ELEM_TYPE_IMAGE) {
- for (V2TIMImage *imImage in imMsg.imageElem.imageList) {
- if (type == TImage_Type_Thumb && imImage.type == V2TIM_IMAGE_TYPE_THUMB) {
- return imImage;
- } else if (type == TImage_Type_Origin && imImage.type == V2TIM_IMAGE_TYPE_ORIGIN) {
- return imImage;
- } else if (type == TImage_Type_Large && imImage.type == V2TIM_IMAGE_TYPE_LARGE) {
- return imImage;
- }
- }
- }
- return nil;
- }
- @end
|