/************************************************************ * * Hyphenate CONFIDENTIAL * __________________ * Copyright (C) 2016 Hyphenate Inc. All rights reserved. * * NOTICE: All information contained herein is, and remains * the property of Hyphenate Inc. * Dissemination of this information or reproduction of this material * is strictly forbidden unless prior written permission is obtained * from Hyphenate Inc. */ #import "EaseConversationListViewController.h" #import "EaseEmotionEscape.h" #import "EaseConversationCell.h" #import "EaseConvertToCommonEmoticonsHelper.h" #import "EaseMessageViewController.h" #import "NSDate+Category.h" #import "EaseLocalDefine.h" @interface EaseConversationListViewController () @end @implementation EaseConversationListViewController -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self registerNotifications]; } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self unregisterNotifications]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self tableViewDidTriggerHeaderRefresh]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. return [self.dataArray count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *CellIdentifier = [EaseConversationCell cellIdentifierWithModel:nil]; EaseConversationCell *cell = (EaseConversationCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // Configure the cell... if (cell == nil) { cell = [[EaseConversationCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } if ([self.dataArray count] <= indexPath.row) { return cell; } id model = [self.dataArray objectAtIndex:indexPath.row]; cell.model = model; if (_dataSource && [_dataSource respondsToSelector:@selector(conversationListViewController:latestMessageTitleForConversationModel:)]) { NSMutableAttributedString *attributedText = [[_dataSource conversationListViewController:self latestMessageTitleForConversationModel:model] mutableCopy]; [attributedText addAttributes:@{NSFontAttributeName : cell.detailLabel.font} range:NSMakeRange(0, attributedText.length)]; cell.detailLabel.attributedText = attributedText; } else { cell.detailLabel.attributedText = [[EaseEmotionEscape sharedInstance] attStringFromTextForChatting:[self _latestMessageTitleForConversationModel:model]textFont:cell.detailLabel.font]; } if (_dataSource && [_dataSource respondsToSelector:@selector(conversationListViewController:latestMessageTimeForConversationModel:)]) { cell.timeLabel.text = [_dataSource conversationListViewController:self latestMessageTimeForConversationModel:model]; } else { cell.timeLabel.text = [self _latestMessageTimeForConversationModel:model]; } return cell; } #pragma mark - Table view delegate - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return [EaseConversationCell cellHeightWithModel:nil]; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; if (_delegate && [_delegate respondsToSelector:@selector(conversationListViewController:didSelectConversationModel:)]) { EaseConversationModel *model = [self.dataArray objectAtIndex:indexPath.row]; [_delegate conversationListViewController:self didSelectConversationModel:model]; } else { EaseConversationModel *model = [self.dataArray objectAtIndex:indexPath.row]; EaseMessageViewController *viewController = [[EaseMessageViewController alloc] initWithConversationChatter:model.conversation.conversationId conversationType:model.conversation.type]; viewController.title = model.title; [self.navigationController pushViewController:viewController animated:YES]; } } -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{ return YES; } - (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath { return [self setupCellEditActions:indexPath]; } - (nullable NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { return [self setupCellEditActions:indexPath]; } #pragma mark - Action - (void)deleteCellAction:(NSIndexPath *)aIndexPath { EaseConversationModel *model = [self.dataArray objectAtIndex:aIndexPath.row]; [[EMClient sharedClient].chatManager deleteConversation:model.conversation.conversationId isDeleteMessages:YES completion:nil]; [self.dataArray removeObjectAtIndex:aIndexPath.row]; [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:aIndexPath] withRowAnimation:UITableViewRowAnimationFade]; } - (id)setupCellEditActions:(NSIndexPath *)aIndexPath { if ([UIDevice currentDevice].systemVersion.floatValue < 11.0) { UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:NSLocalizedString(@"delete",@"Delete") handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { [self deleteCellAction:indexPath]; }]; deleteAction.backgroundColor = [UIColor redColor]; return @[deleteAction]; } else { UIContextualAction *deleteAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:NSLocalizedString(@"delete",@"Delete") handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) { [self deleteCellAction:aIndexPath]; }]; deleteAction.backgroundColor = [UIColor redColor]; UISwipeActionsConfiguration *config = [UISwipeActionsConfiguration configurationWithActions:@[deleteAction]]; config.performsFirstActionWithFullSwipe = NO; return config; } } #pragma mark - data -(void)refreshAndSortView { if ([self.dataArray count] > 1) { if ([[self.dataArray objectAtIndex:0] isKindOfClass:[EaseConversationModel class]]) { NSArray* sorted = [self.dataArray sortedArrayUsingComparator: ^(EaseConversationModel *obj1, EaseConversationModel* obj2){ EMMessage *message1 = [obj1.conversation latestMessage]; EMMessage *message2 = [obj2.conversation latestMessage]; if(message1.timestamp > message2.timestamp) { return(NSComparisonResult)NSOrderedAscending; }else { return(NSComparisonResult)NSOrderedDescending; } }]; [self.dataArray removeAllObjects]; [self.dataArray addObjectsFromArray:sorted]; } } [self.tableView reloadData]; } /*! @method @brief 加载会话列表 @discussion @result */ - (void)tableViewDidTriggerHeaderRefresh { NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations]; NSArray* sorted = [conversations sortedArrayUsingComparator: ^(EMConversation *obj1, EMConversation* obj2){ EMMessage *message1 = [obj1 latestMessage]; EMMessage *message2 = [obj2 latestMessage]; if(message1.timestamp > message2.timestamp) { return(NSComparisonResult)NSOrderedAscending; }else { return(NSComparisonResult)NSOrderedDescending; } }]; [self.dataArray removeAllObjects]; for (EMConversation *converstion in sorted) { EaseConversationModel *model = nil; if (self.dataSource && [self.dataSource respondsToSelector:@selector(conversationListViewController:modelForConversation:)]) { model = [self.dataSource conversationListViewController:self modelForConversation:converstion]; } else{ model = [[EaseConversationModel alloc] initWithConversation:converstion]; } if (model) { [self.dataArray addObject:model]; } } [self.tableView reloadData]; [self tableViewDidFinishTriggerHeader:YES reload:NO]; } #pragma mark - EMGroupManagerDelegate - (void)didUpdateGroupList:(NSArray *)groupList { [self tableViewDidTriggerHeaderRefresh]; } #pragma mark - registerNotifications -(void)registerNotifications{ [self unregisterNotifications]; [[EMClient sharedClient].chatManager addDelegate:self delegateQueue:nil]; [[EMClient sharedClient].groupManager addDelegate:self delegateQueue:nil]; } -(void)unregisterNotifications{ [[EMClient sharedClient].chatManager removeDelegate:self]; [[EMClient sharedClient].groupManager removeDelegate:self]; } - (void)dealloc{ [self unregisterNotifications]; } #pragma mark - private /*! @method @brief 获取会话最近一条消息内容提示 @discussion @param conversationModel 会话model @result 返回传入会话model最近一条消息提示 */ - (NSString *)_latestMessageTitleForConversationModel:(id)conversationModel { NSString *latestMessageTitle = @""; EMMessage *lastMessage = [conversationModel.conversation latestMessage]; if (lastMessage) { EMMessageBody *messageBody = lastMessage.body; switch (messageBody.type) { case EMMessageBodyTypeImage:{ latestMessageTitle = NSEaseLocalizedString(@"message.image1", @"[image]"); } break; case EMMessageBodyTypeText:{ NSString *didReceiveText = [EaseConvertToCommonEmoticonsHelper convertToSystemEmoticons:((EMTextMessageBody *)messageBody).text]; latestMessageTitle = didReceiveText; } break; case EMMessageBodyTypeVoice:{ latestMessageTitle = NSEaseLocalizedString(@"message.voice1", @"[voice]"); } break; case EMMessageBodyTypeLocation: { latestMessageTitle = NSEaseLocalizedString(@"message.location1", @"[location]"); } break; case EMMessageBodyTypeVideo: { latestMessageTitle = NSEaseLocalizedString(@"message.video1", @"[video]"); } break; case EMMessageBodyTypeFile: { latestMessageTitle = NSEaseLocalizedString(@"message.file1", @"[file]"); } break; default: { } break; } } return latestMessageTitle; } /*! @method @brief 获取会话最近一条消息时间 @discussion @param conversationModel 会话model @result 返回传入会话model最近一条消息时间 */ - (NSString *)_latestMessageTimeForConversationModel:(id)conversationModel { NSString *latestMessageTime = @""; EMMessage *lastMessage = [conversationModel.conversation latestMessage];; if (lastMessage) { double timeInterval = lastMessage.timestamp ; if(timeInterval > 140000000000) { timeInterval = timeInterval / 1000; } NSDateFormatter* formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"YYYY-MM-dd"]; latestMessageTime = [formatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:timeInterval]]; } return latestMessageTime; } @end