package com.mogujie.tt.biz;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.LinkedList;
import java.util.Queue;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import com.mogujie.tt.cache.BlockTargetCache;
import com.mogujie.tt.cache.biz.CacheHub;
import com.mogujie.tt.config.HandlerConstant;
import com.mogujie.tt.config.SysConstant;
import com.mogujie.tt.entity.MessageInfo;
import com.mogujie.tt.entity.User;
import com.mogujie.tt.imlib.IMMessageManager;
import com.mogujie.tt.log.Logger;
import com.mogujie.tt.packet.action.ActionCallback;
import com.mogujie.tt.packet.base.Packet;
import com.mogujie.tt.task.TaskCallback;
import com.mogujie.tt.task.TaskManager;
import com.mogujie.tt.task.biz.CheckUserBlockTask;
import com.mogujie.tt.ui.activity.MessageActivity;
import com.mogujie.tt.ui.utils.IMServiceHelper;
import com.mogujie.tt.utils.CommonUtil;
import com.mogujie.tt.utils.FileUtil;
/**
* @Description 消息界面的公用业务逻辑处理
* @author Nana
* @date 2014-7-11
*/
public class MessageHelper {
private static Logger logger = Logger.getLogger(MessageHelper.class);
private static int customServiceType = SysConstant.DEFAULT_CUSTOM_SERVICE_TYPE;
/**
* @Description 连上消息服务器之后,如果用户信息不全就重新获取
* @param msgHandler
* @param uiHandler
*/
public static void onConnectedMsgServer(Handler msgHandler,
Handler uiHandler) {
User chatUser = CacheHub.getInstance().getChatUser();
if (null != chatUser) {
Message msg = uiHandler.obtainMessage();
msg.what = HandlerConstant.SET_TITLE;
msg.obj = chatUser;
uiHandler.sendMessage(msg);
boolean invalidName = TextUtils.isEmpty(chatUser.getName())
|| "null".equals(chatUser.getName());
boolean invalidNickName = TextUtils.isEmpty(chatUser.getNickName())
|| "null".equals(chatUser.getNickName());
if (invalidName && invalidNickName) {
MessageHelper.requestUserInfo(chatUser.getUserId(), msgHandler);
}
}
}
/**
* @Description 请求客服使用的回调
*/
public static ActionCallback getCallbackForRqsCustomService(
final Handler uiHandler) {
ActionCallback callback = new ActionCallback() {
@Override
public void onSuccess(Packet packet) {
}
@Override
public void onTimeout(Packet packet) {
uiHandler.sendEmptyMessage(HandlerConstant.REQUEST_CUSTOM_SERVICE_FAILED);
}
@Override
public void onFaild(Packet packet) {
onTimeout(packet);
}
};
return callback;
}
/**
* @Description 服务端返回用户信息
* @param obj
*/
public static void onGetUserInfo(Object obj, Handler uiHandler,
Context context) {
MessageActivity.requestingUserInfo = false;
if (obj == null) {
return;
}
// Queue<User> userList = ((QueryUsersInfoResponse) (((Packet) obj)
// .getResponse())).getUserList();
// if (userList.size() != 0) {
//
// User user = userList.poll();
// if (user == null) {
// return;
// }
// CacheHub.getInstance().setChatUser(user);
// CacheHub.getInstance().setUser(user, context);
// Message msg = uiHandler.obtainMessage();
// msg.what = HandlerConstant.SET_TITLE;
// msg.obj = user;
// uiHandler.sendMessage(msg);
// }
}
public static void onReceiveMessage2(MessageInfo messageInfo,
IMServiceHelper imServiceHelper) {
// // MessageSplitResult msr = new MessageSplitResult(msg.msgInfo,
// // msg.msgData);
// //
// // msr.decode();
// //
// // Queue<MessageInfo> msgListInfos = msr.getMsgList();
//
//
// MessageInfo messageInfo = msg.msgInfo;
if (messageInfo != null) {
if (messageInfo.getDisplayType() != SysConstant.DISPLAY_TYPE_IMAGE) {
messageInfo.setMsgLoadState(SysConstant.MESSAGE_STATE_FINISH_SUCCESSED);
// CacheHub.getInstance().updateMsgStatus(messageInfo.getMsgId(),
// SysConstant.MESSAGE_STATE_FINISH_SUCCESSED);
} else {
if (!FileUtil.isSdCardAvailuable()) {
messageInfo.setMsgLoadState(SysConstant.MESSAGE_STATE_FINISH_FAILED);
// CacheHub.getInstance().updateMsgStatus(
// messageInfo.getMsgId(),
// SysConstant.MESSAGE_STATE_FINISH_FAILED);
}
}
logger.d("chat#start addItem");
MessageActivity.addItem(messageInfo);
}
}
// /**
// * @Description 收到聊天对象发来的新消息
// * @param obj
// */
// public static void onReceiveMessage(Object obj) {
// if (obj == null)
// return;
//
// RecvMessagePacket _packet = (RecvMessagePacket) obj;
// RecvMesageResponse res = (RecvMesageResponse) _packet.getResponse();
// if (res == null) {
// return;
// }
// MessageSplitResult msr = res.getMsgSpliteResult();
// if (msr == null)
// return;
//
// Queue<MessageInfo> msgListInfos = msr.getMsgList();
//
// while (!msgListInfos.isEmpty()) {
// MessageInfo messageInfo = msgListInfos.poll();
//
// if (messageInfo != null) {
// User chatUser = CacheHub.getInstance().getChatUser();
// if (chatUser != null
// && messageInfo.getMsgFromUserId().equals(
// chatUser.getUserId())) {
//
// messageInfo
// .setMsgReadStatus(SysConstant.MESSAGE_ALREADY_READ);
// CacheHub.getInstance().updateMsgReadStatus(
// messageInfo.getMsgId(),
// SysConstant.MESSAGE_ALREADY_READ);
//
// if (messageInfo.getDisplayType() != SysConstant.DISPLAY_TYPE_IMAGE) {
// messageInfo
// .setMsgLoadState(SysConstant.MESSAGE_STATE_FINISH_SUCCESSED);
// CacheHub.getInstance().updateMsgStatus(
// messageInfo.getMsgId(),
// SysConstant.MESSAGE_STATE_FINISH_SUCCESSED);
// } else {
// if (!FileUtil.isSdCardAvailuable()) {
// messageInfo
// .setMsgLoadState(SysConstant.MESSAGE_STATE_FINISH_FAILED);
// CacheHub.getInstance().updateMsgStatus(
// messageInfo.getMsgId(),
// SysConstant.MESSAGE_STATE_FINISH_FAILED);
// }
// }
//
// MessageActivity.addItem(messageInfo);
// }
// }
// }
//
// }
// /**
// * @Description 服务端在接收到消息后会回复个消息确认
// * @param obj
// */
// public static void onReceiveMsgACK(Object obj) {
// if (obj == null)
// return;
//
// MessagePacket packet = (MessagePacket) obj;
// SendMessageAckResponse response = (SendMessageAckResponse) packet
// .getResponse();
// if (response == null)
// return;
// int nMsgId = response.getSeqNo();
// MessageActivity.updateMessageState(nMsgId,
// SysConstant.MESSAGE_STATE_FINISH_SUCCESSED);
//
// SendMessageRequest request = (SendMessageRequest) (packet.getRequest());
// if (null == request)
// return;
// MessageInfo messageInfo = request.getMsgInfo();
// if (null == messageInfo)
// return;
//
// if (messageInfo.getDisplayType() == SysConstant.DISPLAY_TYPE_IMAGE) {
// MessageActivity.updateMessageState(messageInfo,
// SysConstant.MESSAGE_STATE_FINISH_SUCCESSED);
// }
// }
public static void onReceiveMsgACK2(Intent intent) {
if (intent == null) {
return;
}
String msgId = intent.getStringExtra(SysConstant.MSG_ID_KEY);
logger.d("chat#onReceiveMsgACK2, msgId:%s", msgId);
MessageActivity.updateMessageState(msgId, SysConstant.MESSAGE_STATE_FINISH_SUCCESSED);
// MessageInfo messageInfo = msg.msgInfo;
// if (null == messageInfo)
// return;
//
// if (messageInfo.getDisplayType() == SysConstant.DISPLAY_TYPE_IMAGE) {
// MessageActivity.updateMessageState(messageInfo, SysConstant.MESSAGE_STATE_FINISH_SUCCESSED);
// }
}
/**
* @Description 检查是否是黑名单用户(15分钟检测一次)
* @param shopId
* @param uiHandler
*/
public static void blockUserCheck(String shopId, final Handler uiHandler) {
if (!BlockTargetCache.getInstance().needCheckBlock(shopId)) {
return;
}
if (true) {
uiHandler.sendEmptyMessage(HandlerConstant.START_BLOCK_CHECK);
CheckUserBlockTask checkTask = new CheckUserBlockTask(shopId);
checkTask.setCallBack(new TaskCallback() {
@Override
public void callback(Object result) {
boolean isBlcok = (Boolean) result;
if (isBlcok) {
uiHandler.sendEmptyMessage(HandlerConstant.SHOULD_BLOCK_USER);
} else {
uiHandler.sendEmptyMessage(HandlerConstant.SHOULD_NOT_BLOCK_USER);
}
}
});
try {
TaskManager.getInstance().trigger(checkTask);
} catch (Exception e) {
uiHandler.sendEmptyMessage(HandlerConstant.SHOULD_NOT_BLOCK_USER);
logger.e(e.getMessage());
}
}
}
/**
* @Description 请求用户信息
* @param userId
* @param msgHandler
*/
public static void requestUserInfo(String userId, final Handler msgHandler) {
if (MessageActivity.requestingUserInfo)
return;
MessageActivity.requestingUserInfo = true;
Queue<String> userList = new LinkedList<String>();
userList.add(userId);
// //sendTaskForUserInfo(userList, new ActionCallback() {
//
// @Override
// public void onSuccess(Packet packet) {
// MessageHelper.sendMessageToMsgHandler(packet, msgHandler);
// MessageActivity.requestingUserInfo = false;
// }
//
// @Override
// public void onTimeout(Packet packet) {
// MessageActivity.requestingUserInfo = false;
// }
//
// @Override
// public void onFaild(Packet packet) {
// MessageActivity.requestingUserInfo = false;
// }
// });
}
/**
* @Description 图片上传到文件服务器后执行
* @param obj
* @param uiHandler
* @param msgHandler
*/
public static void onImageUploadFinish(Object obj, Handler uiHandler,
Handler msgHandler, IMMessageManager msgManager, int sessionType) {
logger.d("chat#pic#onImageUploadFinish");
if (null == obj)
return;
if (msgManager == null) {
logger.e("chat#null msgManager");
}
MessageInfo messageInfo = (MessageInfo) obj;
String imageUrl = messageInfo.getUrl();
logger.d("pic#imageUrl:%s", imageUrl);
String realImageURL = "";
try {
realImageURL = URLDecoder.decode(imageUrl, "utf-8");
logger.d("pic#realImageUrl:%s", realImageURL);
} catch (UnsupportedEncodingException e) {
logger.e(e.toString());
}
messageInfo.setUrl(realImageURL);
if (realImageURL.equals("")) {
Message msg = uiHandler.obtainMessage();
msg.what = HandlerConstant.HANDLER_SEND_MESSAGE_FAILED;
msg.obj = messageInfo;
uiHandler.sendMessage(msg);
return;
}
messageInfo.setMsgLoadState(SysConstant.MESSAGE_STATE_FINISH_SUCCESSED);
messageInfo.setMsgContent(SysConstant.MESSAGE_IMAGE_LINK_START
+ realImageURL + SysConstant.MESSAGE_IMAGE_LINK_END);
// MessageHelper.doSendTask(messageInfo, uiHandler, msgHandler);
logger.d("pic#send pic message, content:%s", messageInfo.getMsgContent());
msgManager.sendText(messageInfo.getTargetId(), messageInfo.getMsgContent(), sessionType, messageInfo);
}
/**
* @Description 向服务器发送消息
* @param msgInfo
* @param uiHandler
* @param msgHandler
*/
// public static void doSendTask(MessageInfo msgInfo, final Handler
// uiHandler,
// final Handler msgHandler) {
//
// Object[] objs = new Object[1];
// objs[0] = msgInfo;
// Packet packet = PacketDistinguisher.make(ProtocolConstant.SID_MSG,
// ProtocolConstant.CID_MSG_DATA, objs, true);
// ActionCallback callback = new ActionCallback() {
//
// @Override
// public void onSuccess(Packet packet) {
// sendMessageToMsgHandler(packet, msgHandler);
// }
//
// @Override
// public void onTimeout(Packet packet) {
// if (null == packet)
// return;
//
// SendMessageRequest request = (SendMessageRequest) packet
// .getRequest();
// if (null == request)
// return;
//
// MessageInfo info = request.getMsgInfo();
// if (null == info)
// return;
//
// Message msg = uiHandler.obtainMessage();
// msg.what = HandlerConstant.HANDLER_SEND_MESSAGE_TIMEOUT;
// msg.obj = info;
// uiHandler.sendMessage(msg);
// }
//
// @Override
// public void onFaild(Packet packet) {
// onTimeout(packet);
// }
// };
// PushActionToQueueTask task = new PushActionToQueueTask(packet, callback);
// TaskManager.getInstance().trigger(task);
// }
/**
* @Description 向msg handler发送消息
* @param packet
* @param msgHandler
*/
public static void sendMessageToMsgHandler(Packet packet, Handler msgHandler) {
if (packet == null || msgHandler == null)
return;
int serviceId = packet.getResponse().getHeader().getServiceId();
int commandId = packet.getResponse().getHeader().getCommandId();
Message msg = new Message();
msg.what = serviceId * 1000 + commandId;
msg.obj = packet;
msgHandler.sendMessage(msg);
}
// /**
// * @Description 获取用户信息
// * @param userIdList
// * @param callback
// */
// public static void sendTaskForUserInfo(Queue<String> userIdList,
// ActionCallback callback) {
//
// Object[] obj = new Object[1];
// obj[0] = userIdList;
//
// Packet packet = PacketDistinguisher.make(
// ProtocolConstant.SID_BUDDY_LIST,
// ProtocolConstant.CID_GET_USER_INFO_REQUEST, obj, true);
// PushActionToQueueTask task = new PushActionToQueueTask(packet, callback);
// TaskManager.getInstance().trigger(task);
//
// }
//
/**
* @Description 设置消息的基本信息
* @param userId
* @param msgDisplayType
* @param msg
* @return
*/
private static MessageInfo setMsgBaseInfo(String userId,
int msgDisplayType, MessageInfo msg) {
if (msg == null || TextUtils.isEmpty(userId)) {
return null;
}
msg.setMsgFromUserId(CacheHub.getInstance().getLoginUserId());
msg.setIsSend(true);
int createTime = (int) (System.currentTimeMillis() / 1000);
msg.setMsgCreateTime(createTime);
msg.setTargetId(userId);
msg.setDisplayType(msgDisplayType);
msg.setMsgType(SysConstant.MESSAGE_TYPE_TELETEXT); // 1语音或文本消息
// 100 语音消息
msg.setMsgLoadState(SysConstant.MESSAGE_STATE_LOADDING);
msg.setMsgReadStatus(SysConstant.MESSAGE_ALREADY_READ);
byte msgType = 1;
msg.setMsgType(msgType);
msg.setMsgAttachContent("");
// int messageSendRequestNo = CacheHub.getInstance().obtainMsgId();
// msg.setMsgId(messageSendRequestNo);
return msg;
}
/**
* @Description 生成消息对象
* @param targetUserId
* @param content
* @return
*/
public static MessageInfo obtainTextMessage(String targetUserId,
String content) {
logger.d("chat#text#generating text message, toId:%s, content:%s", targetUserId, content);
if (TextUtils.isEmpty(content) || TextUtils.isEmpty(targetUserId)) {
return null;
}
MessageInfo msg = new MessageInfo();
msg.setMsgContent(content);
msg = setMsgBaseInfo(targetUserId, SysConstant.DISPLAY_TYPE_TEXT, msg);
CacheHub.getInstance().pushMsg(msg);
return msg;
}
/**
* @Description 设置语音消息内容
* @param msg
*/
public static void setMsgAudioContent(MessageInfo msg) {
if (null == msg) {
return;
}
int tLen = msg.getPlayTime();
if (tLen < 0) {
return;
}
byte[] result = new byte[4];
result = CommonUtil.intToBytes(tLen);
String msgAudioSavePath = msg.getSavePath();
if (msgAudioSavePath == null) {
return;
}
byte[] bytes = FileUtil.getFileContent(msgAudioSavePath);
if (bytes == null) {
return;
}
int contentLength = bytes.length;
byte[] byteAduioContent = new byte[4 + contentLength];
System.arraycopy(result, 0, byteAduioContent, 0, 4);
System.arraycopy(bytes, 0, byteAduioContent, 4, contentLength);
msg.setAudioContent(byteAduioContent);
}
public static int getCustomServiceType() {
return customServiceType;
}
}