/************************************************************ * * 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 #import #import #import "EaseRefreshTableViewController.h" #import "IMessageModel.h" #import "EaseMessageModel.h" #import "EaseBaseMessageCell.h" #import "EaseMessageTimeCell.h" #import "EaseChatToolbar.h" #import "EaseLocationViewController.h" #import "EMCDDeviceManager+Media.h" #import "EMCDDeviceManager+ProximitySensor.h" #import "UIViewController+HUD.h" #import "EaseSDKHelper.h" @interface EaseAtTarget : NSObject @property (nonatomic, copy) NSString *userId; @property (nonatomic, copy) NSString *nickname; - (instancetype)initWithUserId:(NSString*)userId andNickname:(NSString*)nickname; @end typedef void(^EaseSelectAtTargetCallback)(EaseAtTarget*); @class EaseMessageViewController; @protocol EaseMessageViewControllerDelegate @optional /*! @method @brief 获取消息自定义cell @discussion 用户根据messageModel判断是否显示自定义cell,返回nil显示默认cell,否则显示用户自定义cell @param tableView 当前消息视图的tableView @param messageModel 消息模型 @result 返回用户自定义cell */ - (UITableViewCell *)messageViewController:(UITableView *)tableView cellForMessageModel:(id)messageModel; /*! @method @brief 获取消息cell高度 @discussion 用户根据messageModel判断,是否自定义显示cell的高度 @param viewController 当前消息视图 @param messageModel 消息模型 @param cellWidth 视图宽度 @result 返回用户自定义cell */ - (CGFloat)messageViewController:(EaseMessageViewController *)viewController heightForMessageModel:(id)messageModel withCellWidth:(CGFloat)cellWidth; /*! @method @brief 接收到消息的已读回执 @discussion 接收到消息的已读回执的回调,用户可以自定义处理 @param viewController 当前消息视图 @param messageModel 消息模型 @result */ - (void)messageViewController:(EaseMessageViewController *)viewController didReceiveHasReadAckForModel:(id)messageModel; /*! @method @brief 选中消息 @discussion 选中消息的回调,用户可以自定义处理 @param viewController 当前消息视图 @param messageModel 消息模型 @result */ - (BOOL)messageViewController:(EaseMessageViewController *)viewController didSelectMessageModel:(id)messageModel; /*! @method @brief 点击消息头像 @discussion 获取用户点击头像回调 @param viewController 当前消息视图 @param messageModel 消息模型 @result */ - (void)messageViewController:(EaseMessageViewController *)viewController didSelectAvatarMessageModel:(id)messageModel; /*! @method @brief 选中底部功能按钮 @discussion 消息发送成功的回调,用户可以自定义处理 @param viewController 当前消息视图 @param messageModel 消息模型 @param index 选中底部功能按钮索引 @result */ - (void)messageViewController:(EaseMessageViewController *)viewController didSelectMoreView:(EaseChatBarMoreView *)moreView AtIndex:(NSInteger)index; /*! @method @brief 底部录音功能按钮状态回调 @discussion 获取底部录音功能按钮状态回调,根据EaseRecordViewType,用户自定义处理UI的逻辑 @param viewController 当前消息视图 @param recordView 录音视图 @param type 录音按钮当前状态 @result */ - (void)messageViewController:(EaseMessageViewController *)viewController didSelectRecordView:(UIView *)recordView withEvenType:(EaseRecordViewType)type; /*! @method @brief 获取要@的对象 @discussion 用户输入了@,选择要@的对象 @param selectedCallback 用于回调要@的对象的block @result */ - (void)messageViewController:(EaseMessageViewController *)viewController selectAtTarget:(EaseSelectAtTargetCallback)selectedCallback; @end @protocol EaseMessageViewControllerDataSource @optional /*! @method @brief 指定消息附件上传或者下载进度的监听者,默认self @discussion @param viewController 当前消息视图 @param messageBodyType @result */ - (id)messageViewController:(EaseMessageViewController *)viewController progressDelegateForMessageBodyType:(EMMessageBodyType)messageBodyType; /*! @method @brief 附件进度有更新 @discussion @param viewController 当前消息视图 @param progress @param messageModel @param messageBody @result */ - (void)messageViewController:(EaseMessageViewController *)viewController updateProgress:(float)progress messageModel:(id)messageModel messageBody:(EMMessageBody*)messageBody; /*! @method @brief 消息时间间隔描述 @discussion @param viewController 当前消息视图 @param NSDate 时间 @result 返回消息时间描述 */ - (NSString *)messageViewController:(EaseMessageViewController *)viewController stringForDate:(NSDate *)date; /*! @method @brief 将EMMessage类型转换为符合协议的类型 @discussion 将EMMessage类型转换为符合协议的类型,设置用户信息,消息显示用户昵称和头像 @param viewController 当前消息视图 @param EMMessage 聊天消息对象类型 @result 返回协议的类型 */ - (id)messageViewController:(EaseMessageViewController *)viewController modelForMessage:(EMMessage *)message; /*! @method @brief 是否允许长按 @discussion 获取是否允许长按的回调,默认是NO @param viewController 当前消息视图 @param indexPath 长按消息对应的indexPath @result */ - (BOOL)messageViewController:(EaseMessageViewController *)viewController canLongPressRowAtIndexPath:(NSIndexPath *)indexPath; /*! @method @brief 触发长按手势 @discussion 获取触发长按手势的回调,默认是NO @param viewController 当前消息视图 @param indexPath 长按消息对应的indexPath @result */ - (BOOL)messageViewController:(EaseMessageViewController *)viewController didLongPressRowAtIndexPath:(NSIndexPath *)indexPath; /*! @method @brief 是否标记为已读 @discussion 是否标记为已读的回调 @param viewController 当前消息视图 @result */ - (BOOL)messageViewControllerShouldMarkMessagesAsRead:(EaseMessageViewController *)viewController; /*! @method @brief 是否发送已读回执 @discussion @param viewController 当前消息视图 @param message 要发送已读回执的message @param read message是否已读 @result */ - (BOOL)messageViewController:(EaseMessageViewController *)viewController shouldSendHasReadAckForMessage:(EMMessage *)message read:(BOOL)read; /*! @method @brief 判断消息是否为表情消息 @discussion @param viewController 当前消息视图 @param message 要发送已读回执的message @param messageModel 消息模型 @result */ - (BOOL)isEmotionMessageFormessageViewController:(EaseMessageViewController *)viewController messageModel:(id)messageModel; /*! @method @brief 根据消息获取表情信息 @discussion @param viewController 当前消息视图 @param message 要发送已读回执的message @param messageModel 消息模型 @result */ - (EaseEmotion*)emotionURLFormessageViewController:(EaseMessageViewController *)viewController messageModel:(id)messageModel; /*! @method @brief 获取表情列表 @discussion @param viewController 当前消息视图 @result */ - (NSArray*)emotionFormessageViewController:(EaseMessageViewController *)viewController; /*! @method @brief 获取发送表情消息的扩展字段 @discussion @param viewController 当前消息视图 @param easeEmotion @result */ - (NSDictionary*)emotionExtFormessageViewController:(EaseMessageViewController *)viewController easeEmotion:(EaseEmotion*)easeEmotion; /*! @method @brief view标记已读 @discussion @param viewController 当前消息视图 @result */ - (void)messageViewControllerMarkAllMessagesAsRead:(EaseMessageViewController *)viewController; @end @interface EaseMessageViewController : EaseRefreshTableViewController @property (weak, nonatomic) id delegate; @property (weak, nonatomic) id dataSource; /*! @property @brief 聊天的会话对象 */ @property (strong, nonatomic) EMConversation *conversation; /*! @property @brief 时间间隔标记 */ @property (nonatomic) NSTimeInterval messageTimeIntervalTag; /*! @property @brief 如果conversation中没有任何消息,退出该页面时是否删除该conversation */ @property (nonatomic) BOOL deleteConversationIfNull; //default YES; /*! @property @brief 当前页面显示时,是否滚动到最后一条 */ @property (nonatomic) BOOL scrollToBottomWhenAppear; //default YES; /*! @property @brief 页面是否处于显示状态 */ @property (nonatomic) BOOL isViewDidAppear; /*! @property @brief 加载的每页message的条数 */ @property (nonatomic) NSInteger messageCountOfPage; //default 50 /*! @property @brief 时间分割cell的高度 */ @property (nonatomic) CGFloat timeCellHeight; /*! @property @brief 显示的EMMessage类型的消息列表 */ @property (strong, nonatomic) NSMutableArray *messsagesSource; /*! @property @brief 底部输入控件 */ @property (strong, nonatomic) UIView *chatToolbar; /*! @property @brief 底部功能控件 */ @property(strong, nonatomic) EaseChatBarMoreView *chatBarMoreView; /*! @property @brief 底部表情控件 */ @property(strong, nonatomic) EaseFaceView *faceView; /*! @property @brief 底部录音控件 */ @property(strong, nonatomic) EaseRecordView *recordView; /*! @property @brief 菜单(消息复制,删除) */ @property (strong, nonatomic) UIMenuController *menuController; /*! @property @brief 选中消息菜单索引 */ @property (strong, nonatomic) NSIndexPath *menuIndexPath; /*! @property @brief 图片选择器 */ @property (strong, nonatomic) UIImagePickerController *imagePicker; /*! @property @brief 是否已经加入聊天室 */ @property (nonatomic) BOOL isJoinedChatroom; /*! @method @brief 初始化聊天页面 @discussion @param conversationChatter 会话对方的用户名. 如果是群聊, 则是群组的id @param conversationType 会话类型 @result */ - (instancetype)initWithConversationChatter:(NSString *)conversationChatter conversationType:(EMConversationType)conversationType; /*! @method @brief 下拉加载更多 @discussion @result */ - (void)tableViewDidTriggerHeaderRefresh; /*! @method @brief 发送文本消息 @discussion @param text 文本消息 @result */ - (void)sendTextMessage:(NSString *)text; /*! @method @brief 发送文本消息 @discussion @param text 文本消息 @param ext 扩展信息 @result */ - (void)sendTextMessage:(NSString *)text withExt:(NSDictionary*)ext; /*! @method @brief 发送图片消息 @discussion @param image 发送图片 @result */ - (void)sendImageMessage:(UIImage *)image; /*! @method @brief 发送位置消息 @discussion @param latitude 经度 @param longitude 纬度 @param address 地址 @result */ - (void)sendLocationMessageLatitude:(double)latitude longitude:(double)longitude andAddress:(NSString *)address; /*! @method @brief 发送语音消息 @discussion @param localPath 语音本地地址 @param duration 时长 @result */ - (void)sendVoiceMessageWithLocalPath:(NSString *)localPath duration:(NSInteger)duration; /*! @method @brief 发送视频消息 @discussion @param url 视频url @result */ - (void)sendVideoMessageWithURL:(NSURL *)url; /*! @method @brief 发送视频消息 @discussion @param url 视频url @result */ - (void)sendFileMessageWith:(EMMessage *)message; /*! @method @brief 添加消息 @discussion @param message 聊天消息类 @param progress 聊天消息发送接收进度条 @result */ - (void)addMessageToDataSource:(EMMessage *)message progress:(id)progress; /*! @method @brief 显示消息长按菜单 @discussion @param showInView 菜单的父视图 @param showInView 索引 @param messageType 消息类型 @result */ - (void)showMenuViewController:(UIView *)showInView andIndexPath:(NSIndexPath *)indexPath messageType:(EMMessageBodyType)messageType; /*! @method @brief 判断消息是否要发送已读回执 @discussion @param message 聊天消息 @param read 是否附件消息已读 @result */ - (BOOL)shouldSendHasReadAckForMessage:(EMMessage *)message read:(BOOL)read; @end