/*
* 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 "ChatConversationImdnView.h"
#import "PhoneMainView.h"
#import "UIChatBubbleTextCell.h"
#import "UIChatConversationImdnTableViewCell.h"
@implementation ChatConversationImdnView
static UICompositeViewDescription *compositeDescription = nil;
+ (UICompositeViewDescription *)compositeViewDescription {
if (compositeDescription == nil) {
compositeDescription = [[UICompositeViewDescription alloc] init:self.class
statusBar:StatusBarView.class
tabBar:TabBarView.class
sideMenu:SideMenuView.class
fullscreen:false
isLeftFragment:NO
fragmentWith:ChatsListView.class];
}
return compositeDescription;
}
- (UICompositeViewDescription *)compositeViewDescription {
return self.class.compositeViewDescription;
}
- (void)viewDidLoad {
[super viewDidLoad];
_msg = NULL;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
const LinphoneAddress *addr = linphone_chat_message_get_from_address(_msg);
BOOL outgoing = linphone_chat_message_is_outgoing(_msg);
_msgDateLabel.text = [NSString stringWithFormat:@"%@ - %@",
[LinphoneUtils timeToString:linphone_chat_message_get_time(_msg) withFormat:LinphoneDateChatBubble],
[FastAddressBook displayNameForAddress:addr]];
_msgAvatarImage.image = outgoing ? [LinphoneUtils selfAvatar] : [FastAddressBook imageForAddress:addr];
_msgText.text = messageText;
_msgBackgroundColorImage.image = _msgBottomBar.image = [UIImage imageNamed:(outgoing ? @"color_A.png" : @"color_D.png")];
_msgDateLabel.textColor = [UIColor colorWithPatternImage:_msgBackgroundColorImage.image];
_tableView.delegate = self;
_tableView.dataSource = self;
[self updateImdnList];
}
- (void)updateImdnList {
if (_msg && linphone_chat_message_get_chat_room(_msg)) {
_displayedList = linphone_chat_message_get_participants_by_imdn_state(_msg, LinphoneChatMessageStateDisplayed);
_receivedList = linphone_chat_message_get_participants_by_imdn_state(_msg, LinphoneChatMessageStateDeliveredToUser);
_notReceivedList = linphone_chat_message_get_participants_by_imdn_state(_msg, LinphoneChatMessageStateDelivered);
_errorList = linphone_chat_message_get_participants_by_imdn_state(_msg, LinphoneChatMessageStateNotDelivered);
[_tableView reloadData];
}
}
- (void)fitContent {
[self setMessageText];
BOOL outgoing = linphone_chat_message_is_outgoing(_msg);
_msgBackgroundColorImage.image = _msgBottomBar.image = [UIImage imageNamed:(outgoing ? @"color_A.png" : @"color_D.png")];
_msgDateLabel.textColor = [UIColor colorWithPatternImage:_msgBackgroundColorImage.image];
[_msgView setFrame:CGRectMake(_msgView.frame.origin.x,
_msgView.frame.origin.y,
_msgView.frame.size.width,
[UIChatBubbleTextCell ViewHeightForMessageText:_msg withWidth:self.view.frame.size.width textForImdn:messageText].height)];
[_tableView setFrame:CGRectMake(_tableView.frame.origin.x,
_msgView.frame.origin.y + _msgView.frame.size.height + 10,
_tableView.frame.size.width,
self.view.frame.size.height - (_msgView.frame.origin.y + _msgView.frame.size.height))];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[self fitContent];
}
- (void)setMessageText {
const char *utf8Text= linphone_chat_message_get_text_content(_msg);
LinphoneContent *fileContent = linphone_chat_message_get_file_transfer_information(_msg);
messageText = nil;
if (utf8Text) {
messageText = [NSString stringWithUTF8String:utf8Text];
if (fileContent)
messageText = [NSString stringWithFormat:@"%@\n%@", messageText, [NSString stringWithUTF8String: linphone_content_get_name(fileContent)]];
} else {
messageText = [NSString stringWithUTF8String: linphone_content_get_name(fileContent)];
}
}
#pragma mark - TableView
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
NSInteger numberOfSection = 0;
if (_displayedList) numberOfSection++;
if (_receivedList) numberOfSection++;
if (_notReceivedList) numberOfSection++;
if (_errorList) numberOfSection++;
return numberOfSection;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 23.0;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
return 44.0;
}
- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
label.numberOfLines = 1;
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 23)];
UIImage *image = NULL;
if (section == 0) {
if (_displayedList) {
label.text = NSLocalizedString(@"Read", nil);
label.textColor = [UIColor colorWithRed:(24 / 255.0) green:(167 / 255.0) blue:(175 / 255.0) alpha:1.0];
image = [UIImage imageNamed:@"chat_read"];
} else if (_receivedList) {
label.text = NSLocalizedString(@"Delivered", nil);
label.textColor = [UIColor grayColor];
image = [UIImage imageNamed:@"chat_delivered"];
} else if (_notReceivedList) {
label.text = NSLocalizedString(@"Sent", nil);
label.textColor = [UIColor grayColor];
} else if (_errorList) {
label.text = NSLocalizedString(@"Error", nil);
label.textColor = [UIColor redColor];
image = [UIImage imageNamed:@"chat_error"];
}
} else if (section == 1) {
if (_displayedList && _receivedList) {
label.text = NSLocalizedString(@"Delivered", nil);
label.textColor = [UIColor grayColor];
image = [UIImage imageNamed:@"chat_delivered"];
} else if (_notReceivedList) {
label.text = NSLocalizedString(@"Sent", nil);
label.textColor = [UIColor grayColor];
} else if (_errorList) {
label.text = NSLocalizedString(@"Error", nil);
label.textColor = [UIColor redColor];
image = [UIImage imageNamed:@"chat_error"];
}
} else if (section == 2) {
if (_displayedList && _receivedList && _notReceivedList) {
label.text = NSLocalizedString(@"Sent", nil);
label.textColor = [UIColor grayColor];
} else if (_errorList) {
label.text = NSLocalizedString(@"Error", nil);
label.textColor = [UIColor redColor];
image = [UIImage imageNamed:@"chat_error"];
}
} else if (section == 3) {
label.text = NSLocalizedString(@"Error", nil);
label.textColor = [UIColor redColor];
image = [UIImage imageNamed:@"chat_error"];
}
[view addSubview:label];
[label sizeToFit];
[label setCenter:view.center];
if (image) {
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[view addSubview:imageView];
[imageView setFrame:CGRectMake(label.frame.origin.x + label.frame.size.width + 5, 2, 19, 19)];
}
if (@available(iOS 13, *)) {
[view setBackgroundColor:[UIColor secondarySystemBackgroundColor]];
} else {
[view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"color_G.png"]]];
}
return view;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (section == 0) {
if (_displayedList)
return bctbx_list_size(_displayedList);
else if (_receivedList)
return bctbx_list_size(_receivedList);
else if (_notReceivedList)
return bctbx_list_size(_notReceivedList);
else if (_errorList)
return bctbx_list_size(_errorList);
} else if (section == 1) {
if (_displayedList &&_receivedList)
return bctbx_list_size(_receivedList);
else if (_notReceivedList)
return bctbx_list_size(_notReceivedList);
else if (_errorList)
return bctbx_list_size(_errorList);
} else if (section == 2) {
if (_displayedList && _receivedList && _notReceivedList)
return bctbx_list_size(_notReceivedList);
else if (_errorList)
return bctbx_list_size(_errorList);
} else if (section == 3)
return bctbx_list_size(_errorList);
return 0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
bctbx_list_t *list = NULL;
if (indexPath.section == 0) {
if (_displayedList)
list = _displayedList;
else if (_receivedList)
list = _receivedList;
else if (_notReceivedList)
list = _notReceivedList;
else if (_errorList)
list = _errorList;
} else if (indexPath.section == 1) {
if (_displayedList &&_receivedList)
list = _receivedList;
else if (_notReceivedList)
list = _notReceivedList;
else if (_errorList)
list = _errorList;
} else if (indexPath.section == 2) {
if (_displayedList && _receivedList && _notReceivedList)
list = _notReceivedList;
else if (_errorList)
list = _errorList;
} else if (indexPath.section == 3)
list = _errorList;
if (!list)
return nil;
NSString *kCellId = NSStringFromClass(UIChatConversationImdnTableViewCell.class);
UIChatConversationImdnTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId];
if (cell == nil) {
cell = [[UIChatConversationImdnTableViewCell alloc] initWithIdentifier:kCellId];
}
LinphoneParticipantImdnState *state = bctbx_list_nth_data(list, (int)indexPath.row);
const LinphoneParticipant *participant = linphone_participant_imdn_state_get_participant(state);
time_t time = linphone_participant_imdn_state_get_state_change_time(state);
const LinphoneAddress *addr = linphone_participant_get_address(participant);
cell.displayName.text = [FastAddressBook displayNameForAddress:addr];
cell.avatar.image = [FastAddressBook imageForAddress:addr];
cell.dateLabel.text = [LinphoneUtils timeToString:time withFormat:LinphoneDateChatBubble];
cell.userInteractionEnabled = false;
return cell;
}
- (IBAction)onBackClick:(id)sender {
[PhoneMainView.instance popCurrentView];
}
@end