EaseConversationListViewController.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. /************************************************************
  2. * * Hyphenate CONFIDENTIAL
  3. * __________________
  4. * Copyright (C) 2016 Hyphenate Inc. All rights reserved.
  5. *
  6. * NOTICE: All information contained herein is, and remains
  7. * the property of Hyphenate Inc.
  8. * Dissemination of this information or reproduction of this material
  9. * is strictly forbidden unless prior written permission is obtained
  10. * from Hyphenate Inc.
  11. */
  12. #import "EaseConversationListViewController.h"
  13. #import "EaseEmotionEscape.h"
  14. #import "EaseConversationCell.h"
  15. #import "EaseConvertToCommonEmoticonsHelper.h"
  16. #import "EaseMessageViewController.h"
  17. #import "NSDate+Category.h"
  18. #import "EaseLocalDefine.h"
  19. @interface EaseConversationListViewController ()<EMChatManagerDelegate>
  20. @end
  21. @implementation EaseConversationListViewController
  22. -(void)viewWillAppear:(BOOL)animated
  23. {
  24. [super viewWillAppear:animated];
  25. [self registerNotifications];
  26. }
  27. -(void)viewWillDisappear:(BOOL)animated
  28. {
  29. [super viewWillDisappear:animated];
  30. [self unregisterNotifications];
  31. }
  32. - (void)viewDidLoad {
  33. [super viewDidLoad];
  34. // Do any additional setup after loading the view.
  35. [[EMClient sharedClient].chatManager addDelegate:self delegateQueue:dispatch_get_main_queue()];
  36. [self tableViewDidTriggerHeaderRefresh];
  37. }
  38. - (void)messagesDidReceive:(NSArray *)aMessages
  39. {
  40. }
  41. - (void)didReceiveMemoryWarning {
  42. [super didReceiveMemoryWarning];
  43. // Dispose of any resources that can be recreated.
  44. }
  45. #pragma mark - Table view data source
  46. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  47. {
  48. // Return the number of sections.
  49. return 1;
  50. }
  51. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  52. {
  53. // Return the number of rows in the section.
  54. return [self.dataArray count];
  55. }
  56. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  57. {
  58. NSString *CellIdentifier = [EaseConversationCell cellIdentifierWithModel:nil];
  59. EaseConversationCell *cell = (EaseConversationCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  60. // Configure the cell...
  61. if (cell == nil) {
  62. cell = [[EaseConversationCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  63. }
  64. if ([self.dataArray count] <= indexPath.row) {
  65. return cell;
  66. }
  67. id<IConversationModel> model = [self.dataArray objectAtIndex:indexPath.row];
  68. cell.model = model;
  69. if (_dataSource && [_dataSource respondsToSelector:@selector(conversationListViewController:latestMessageTitleForConversationModel:)]) {
  70. NSMutableAttributedString *attributedText = [[_dataSource conversationListViewController:self latestMessageTitleForConversationModel:model] mutableCopy];
  71. [attributedText addAttributes:@{NSFontAttributeName : cell.detailLabel.font} range:NSMakeRange(0, attributedText.length)];
  72. cell.detailLabel.attributedText = attributedText;
  73. } else {
  74. cell.detailLabel.attributedText = [[EaseEmotionEscape sharedInstance] attStringFromTextForChatting:[self _latestMessageTitleForConversationModel:model]textFont:cell.detailLabel.font];
  75. }
  76. if (_dataSource && [_dataSource respondsToSelector:@selector(conversationListViewController:latestMessageTimeForConversationModel:)]) {
  77. cell.timeLabel.text = [_dataSource conversationListViewController:self latestMessageTimeForConversationModel:model];
  78. } else {
  79. cell.timeLabel.text = [self _latestMessageTimeForConversationModel:model];
  80. }
  81. return cell;
  82. }
  83. #pragma mark - Table view delegate
  84. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  85. {
  86. return [EaseConversationCell cellHeightWithModel:nil];
  87. }
  88. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  89. {
  90. [tableView deselectRowAtIndexPath:indexPath animated:YES];
  91. if (_delegate && [_delegate respondsToSelector:@selector(conversationListViewController:didSelectConversationModel:)]) {
  92. EaseConversationModel *model = [self.dataArray objectAtIndex:indexPath.row];
  93. [_delegate conversationListViewController:self didSelectConversationModel:model];
  94. } else {
  95. EaseConversationModel *model = [self.dataArray objectAtIndex:indexPath.row];
  96. EaseMessageViewController *viewController = [[EaseMessageViewController alloc] initWithConversationChatter:model.conversation.conversationId conversationType:model.conversation.type];
  97. viewController.title = model.title;
  98. [self.navigationController pushViewController:viewController animated:YES];
  99. }
  100. }
  101. -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
  102. return YES;
  103. }
  104. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
  105. if (editingStyle == UITableViewCellEditingStyleDelete) {
  106. EaseConversationModel *model = [self.dataArray objectAtIndex:indexPath.row];
  107. [[EMClient sharedClient].chatManager deleteConversation:model.conversation.conversationId isDeleteMessages:YES completion:nil];
  108. [self.dataArray removeObjectAtIndex:indexPath.row];
  109. [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
  110. }
  111. }
  112. #pragma mark - data
  113. -(void)refreshAndSortView
  114. {
  115. if ([self.dataArray count] > 1) {
  116. if ([[self.dataArray objectAtIndex:0] isKindOfClass:[EaseConversationModel class]]) {
  117. NSArray* sorted = [self.dataArray sortedArrayUsingComparator:
  118. ^(EaseConversationModel *obj1, EaseConversationModel* obj2){
  119. EMMessage *message1 = [obj1.conversation latestMessage];
  120. EMMessage *message2 = [obj2.conversation latestMessage];
  121. if(message1.timestamp > message2.timestamp) {
  122. return(NSComparisonResult)NSOrderedAscending;
  123. }else {
  124. return(NSComparisonResult)NSOrderedDescending;
  125. }
  126. }];
  127. [self.dataArray removeAllObjects];
  128. [self.dataArray addObjectsFromArray:sorted];
  129. }
  130. }
  131. [self.tableView reloadData];
  132. }
  133. /*!
  134. @method
  135. @brief 加载会话列表
  136. @discussion
  137. @result
  138. */
  139. - (void)tableViewDidTriggerHeaderRefresh
  140. {
  141. NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations];
  142. NSArray* sorted = [conversations sortedArrayUsingComparator:
  143. ^(EMConversation *obj1, EMConversation* obj2){
  144. EMMessage *message1 = [obj1 latestMessage];
  145. EMMessage *message2 = [obj2 latestMessage];
  146. if(message1.timestamp > message2.timestamp) {
  147. return(NSComparisonResult)NSOrderedAscending;
  148. }else {
  149. return(NSComparisonResult)NSOrderedDescending;
  150. }
  151. }];
  152. [self.dataArray removeAllObjects];
  153. for (EMConversation *converstion in sorted) {
  154. EaseConversationModel *model = nil;
  155. if (self.dataSource && [self.dataSource respondsToSelector:@selector(conversationListViewController:modelForConversation:)]) {
  156. model = [self.dataSource conversationListViewController:self
  157. modelForConversation:converstion];
  158. }
  159. else{
  160. model = [[EaseConversationModel alloc] initWithConversation:converstion];
  161. }
  162. if (model) {
  163. [self.dataArray addObject:model];
  164. }
  165. }
  166. [self.tableView reloadData];
  167. [self tableViewDidFinishTriggerHeader:YES reload:NO];
  168. }
  169. #pragma mark - EMGroupManagerDelegate
  170. - (void)didUpdateGroupList:(NSArray *)groupList
  171. {
  172. [self tableViewDidTriggerHeaderRefresh];
  173. }
  174. #pragma mark - registerNotifications
  175. -(void)registerNotifications{
  176. [self unregisterNotifications];
  177. [[EMClient sharedClient].chatManager addDelegate:self delegateQueue:nil];
  178. [[EMClient sharedClient].groupManager addDelegate:self delegateQueue:nil];
  179. }
  180. -(void)unregisterNotifications{
  181. [[EMClient sharedClient].chatManager removeDelegate:self];
  182. [[EMClient sharedClient].groupManager removeDelegate:self];
  183. }
  184. - (void)dealloc{
  185. [self unregisterNotifications];
  186. }
  187. #pragma mark - private
  188. /*!
  189. @method
  190. @brief 获取会话最近一条消息内容提示
  191. @discussion
  192. @param conversationModel 会话model
  193. @result 返回传入会话model最近一条消息提示
  194. */
  195. - (NSString *)_latestMessageTitleForConversationModel:(id<IConversationModel>)conversationModel
  196. {
  197. NSString *latestMessageTitle = @"";
  198. EMMessage *lastMessage = [conversationModel.conversation latestMessage];
  199. if (lastMessage) {
  200. EMMessageBody *messageBody = lastMessage.body;
  201. switch (messageBody.type) {
  202. case EMMessageBodyTypeImage:{
  203. latestMessageTitle = NSEaseLocalizedString(@"message.image1", @"[image]");
  204. } break;
  205. case EMMessageBodyTypeText:{
  206. NSString *didReceiveText = [EaseConvertToCommonEmoticonsHelper
  207. convertToSystemEmoticons:((EMTextMessageBody *)messageBody).text];
  208. latestMessageTitle = didReceiveText;
  209. } break;
  210. case EMMessageBodyTypeVoice:{
  211. latestMessageTitle = NSEaseLocalizedString(@"message.voice1", @"[voice]");
  212. } break;
  213. case EMMessageBodyTypeLocation: {
  214. latestMessageTitle = NSEaseLocalizedString(@"message.location1", @"[location]");
  215. } break;
  216. case EMMessageBodyTypeVideo: {
  217. latestMessageTitle = NSEaseLocalizedString(@"message.video1", @"[video]");
  218. } break;
  219. case EMMessageBodyTypeFile: {
  220. latestMessageTitle = NSEaseLocalizedString(@"message.file1", @"[file]");
  221. } break;
  222. default: {
  223. } break;
  224. }
  225. }
  226. return latestMessageTitle;
  227. }
  228. /*!
  229. @method
  230. @brief 获取会话最近一条消息时间
  231. @discussion
  232. @param conversationModel 会话model
  233. @result 返回传入会话model最近一条消息时间
  234. */
  235. - (NSString *)_latestMessageTimeForConversationModel:(id<IConversationModel>)conversationModel
  236. {
  237. NSString *latestMessageTime = @"";
  238. EMMessage *lastMessage = [conversationModel.conversation latestMessage];;
  239. if (lastMessage) {
  240. double timeInterval = lastMessage.timestamp ;
  241. if(timeInterval > 140000000000) {
  242. timeInterval = timeInterval / 1000;
  243. }
  244. NSDateFormatter* formatter = [[NSDateFormatter alloc]init];
  245. [formatter setDateFormat:@"YYYY-MM-dd"];
  246. latestMessageTime = [formatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:timeInterval]];
  247. }
  248. return latestMessageTime;
  249. }
  250. @end