单军华
2018-07-11 7b02207537d35bfa1714bf8beafc921f717d100a
screendisplay/Pods/EaseUI/EaseUI/EMUIKit/ViewController/EaseMessageViewController.h
New file
@@ -0,0 +1,519 @@
/************************************************************
 *  * 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 <MobileCoreServices/MobileCoreServices.h>
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>
#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 <NSObject>
@optional
/*!
 @method
 @brief 获取消息自定义cell
 @discussion 用户根据messageModel判断是否显示自定义cell,返回nil显示默认cell,否则显示用户自定义cell
 @param tableView 当前消息视图的tableView
 @param messageModel 消息模型
 @result 返回用户自定义cell
 */
- (UITableViewCell *)messageViewController:(UITableView *)tableView
                       cellForMessageModel:(id<IMessageModel>)messageModel;
/*!
 @method
 @brief 获取消息cell高度
 @discussion 用户根据messageModel判断,是否自定义显示cell的高度
 @param viewController 当前消息视图
 @param messageModel 消息模型
 @param cellWidth 视图宽度
 @result 返回用户自定义cell
 */
- (CGFloat)messageViewController:(EaseMessageViewController *)viewController
           heightForMessageModel:(id<IMessageModel>)messageModel
                   withCellWidth:(CGFloat)cellWidth;
/*!
  @method
  @brief 接收到消息的已读回执
  @discussion 接收到消息的已读回执的回调,用户可以自定义处理
  @param viewController 当前消息视图
  @param messageModel 消息模型
  @result
  */
- (void)messageViewController:(EaseMessageViewController *)viewController
 didReceiveHasReadAckForModel:(id<IMessageModel>)messageModel;
/*!
 @method
 @brief 选中消息
 @discussion 选中消息的回调,用户可以自定义处理
 @param viewController 当前消息视图
 @param messageModel 消息模型
 @result
 */
- (BOOL)messageViewController:(EaseMessageViewController *)viewController
        didSelectMessageModel:(id<IMessageModel>)messageModel;
/*!
 @method
 @brief 点击消息头像
 @discussion 获取用户点击头像回调
 @param viewController 当前消息视图
 @param messageModel 消息模型
 @result
 */
- (void)messageViewController:(EaseMessageViewController *)viewController
    didSelectAvatarMessageModel:(id<IMessageModel>)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 <NSObject>
@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<IMessageModel>)messageModel
                  messageBody:(EMMessageBody*)messageBody;
/*!
 @method
 @brief 消息时间间隔描述
 @discussion
 @param viewController 当前消息视图
 @param NSDate 时间
 @result 返回消息时间描述
 */
- (NSString *)messageViewController:(EaseMessageViewController *)viewController
                      stringForDate:(NSDate *)date;
/*!
 @method
 @brief 将EMMessage类型转换为符合<IMessageModel>协议的类型
 @discussion 将EMMessage类型转换为符合<IMessageModel>协议的类型,设置用户信息,消息显示用户昵称和头像
 @param viewController 当前消息视图
 @param EMMessage 聊天消息对象类型
 @result 返回<IMessageModel>协议的类型
 */
- (id<IMessageModel>)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<IMessageModel>)messageModel;
/*!
 @method
 @brief 根据消息获取表情信息
 @discussion
 @param viewController 当前消息视图
 @param message 要发送已读回执的message
 @param messageModel 消息模型
 @result
 */
- (EaseEmotion*)emotionURLFormessageViewController:(EaseMessageViewController *)viewController
                                      messageModel:(id<IMessageModel>)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<UINavigationControllerDelegate, UIImagePickerControllerDelegate, EMChatManagerDelegate, EMCDDeviceManagerDelegate, EMChatToolbarDelegate, EaseChatBarMoreViewDelegate, EMLocationViewDelegate,EMChatroomManagerDelegate, EaseMessageCellDelegate>
@property (weak, nonatomic) id<EaseMessageViewControllerDelegate> delegate;
@property (weak, nonatomic) id<EaseMessageViewControllerDataSource> 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