/*
* 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