/* * Copyright (c) 2010-2020 Belledonne Communications SARL. * * This file is part of linphone-iphone * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #import #import "UIChatContentView.h" #import "ChatConversationView.h" #import "PhoneMainView.h" @implementation UIChatContentView static NSMutableDictionary *instances; - (void)setContent:(LinphoneContent *)content message:(LinphoneChatMessage *)message { if (!instances) instances = [[NSMutableDictionary alloc] init]; _content = content; _message = message; self.userInteractionEnabled = YES; if(!linphone_chat_message_is_outgoing(_message) && linphone_content_is_file_transfer(_content)) { // has not yet downloaded NSString *name = [NSString stringWithUTF8String:linphone_content_get_name(content)] ; UIImage *image = [UIChatBubbleTextCell getImageFromFileName:name forReplyBubble:false]; [self setImage:image]; _downloadButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_downloadButton addTarget:self action:@selector(onDownloadClick:) forControlEvents:UIControlEventTouchUpInside]; UIFont *boldFont = [UIFont systemFontOfSize:12]; NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.alignment = NSTextAlignmentCenter; NSMutableAttributedString *boldText = [[NSMutableAttributedString alloc] initWithString:@"Download" attributes:@{ NSFontAttributeName : boldFont, NSParagraphStyleAttributeName:paragraphStyle,NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle) }]; [_downloadButton setAttributedTitle:boldText forState:UIControlStateNormal]; _downloadButton.frame = CGRectMake(0, 90, 120, 30); [self addSubview:_downloadButton]; _progress = [[UIProgressView alloc] initWithFrame:CGRectMake(5, 75, 110, 30)]; _progress.tintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"color_A.png"]]; _progress.hidden = true; [self addSubview:_progress]; } else { if (_filePath == NULL) { NSString *name = [NSString stringWithUTF8String:linphone_content_get_name(content)]; _filePath = [LinphoneManager validFilePath:name]; } UIImage *image = [UIChatBubbleTextCell getImageFromContent:content filePath:_filePath forReplyBubble:false]; [self setImage:image]; UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onMultiPartClick:)]; tapGestureRecognizer.numberOfTapsRequired = 1; tapGestureRecognizer.enabled = YES; [self addGestureRecognizer:tapGestureRecognizer]; self.userInteractionEnabled = true; } } -(IBAction)onMultiPartClick:(id)sender { ChatConversationView *view = VIEW(ChatConversationView); [view openFileWithURLs:_fileUrls index:_position]; } -(IBAction)onDownloadClick:(id)sender { _downloadButton.enabled = NO; linphone_content_set_file_path(_content, [[LinphoneManager imagesDirectory] stringByAppendingPathComponent:[NSString stringWithUTF8String:linphone_content_get_name(_content)]].UTF8String); linphone_chat_message_cbs_set_file_transfer_progress_indication(linphone_chat_message_get_callbacks(_message), file_transfer_progress_indication_recv); _progress.hidden = false; _downloadButton.enabled = false; [instances setValue:self forKey:[NSString stringWithUTF8String:linphone_content_get_name(_content)]]; linphone_chat_message_download_content(_message, _content); } static void file_transfer_progress_indication_recv(LinphoneChatMessage *message, LinphoneContent* content, size_t offset, size_t total) { CGFloat p = offset * 1.f / total; dispatch_async(dispatch_get_main_queue(), ^{ UIChatContentView *thiz = [instances objectForKey:[NSString stringWithUTF8String:linphone_content_get_name(content)]]; if (offset == total) { thiz.progress.hidden = true; } else { thiz.progress.hidden = false; thiz.progress.progress = p; LOGD(@"Transfer of %s (%d bytes): already %ld recv progress = %f", linphone_content_get_name(content), total, p); } }); } @end