package com.ztspeech.simutalk2.qa.message;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.Context;
import android.os.Environment;
import android.util.Log;
import cn.ac.ia.directtrans.json.AskTask;
import cn.ac.ia.directtrans.json.DefineRequestFlag;
import cn.ac.ia.directtrans.json.DefineType;
import cn.ac.ia.directtrans.json.Json;
import cn.ac.ia.directtrans.json.JsonData;
import cn.ac.ia.directtrans.json.JsonFunction;
import cn.ac.ia.directtrans.json.JsonGetMessage;
import cn.ac.ia.directtrans.json.JsonLogin;
import cn.ac.ia.directtrans.json.JsonMessage;
import cn.ac.ia.directtrans.json.JsonRequest;
import cn.ac.ia.directtrans.json.JsonRequestResult;
import cn.ac.ia.directtrans.json.MeetingInfo;
import cn.ac.ia.directtrans.json.QuestionInfo;
import cn.ac.ia.directtrans.json.ResultString;
import cn.ac.ia.directtrans.json.UserState;
import com.ztspeech.recognizer.PhoneInfo;
import com.ztspeech.recognizer.speak.OnTTSPlayerListener;
import com.ztspeech.simutalk2.data.AskTaskList;
import com.ztspeech.simutalk2.data.FriendData;
import com.ztspeech.simutalk2.data.FriendDataList;
import com.ztspeech.simutalk2.data.GlobalData;
import com.ztspeech.simutalk2.data.MeetingData;
import com.ztspeech.simutalk2.data.MeetingDataList;
import com.ztspeech.simutalk2.data.MsgDataList;
import com.ztspeech.simutalk2.data.MsgGroupList;
import com.ztspeech.simutalk2.data.MsgGroupTable;
import com.ztspeech.simutalk2.data.MsgInfoData;
import com.ztspeech.simutalk2.data.TransDataBase;
import com.ztspeech.simutalk2.data.TransTextTable;
import com.ztspeech.simutalk2.data.UserInfoList;
import com.ztspeech.simutalk2.data.MsgInfoData.Define;
import com.ztspeech.simutalk2.data.UserInfo;
import com.ztspeech.simutalk2.dictionary.util.PublicArithmetic;
import com.ztspeech.simutalk2.dictionary.util.Util;
import com.ztspeech.simutalk2.net.PostPackage;
import com.ztspeech.simutalk2.net.PostPackage.IHttpPostListener;
import com.ztspeech.simutalk2.net.RequestPackage;
import com.ztspeech.simutalk2.net.ResultPackage;
import com.ztspeech.simutalk2.qa.MainActivity;
public class ProcessMessage implements IHttpPostListener, Runnable, OnTTSPlayerListener {
public static boolean isAutoTTS = false;
private static ProcessMessage instance;
private UserInfo mUser = UserInfo.getInstanse();
private FriendDataList mFriends = FriendDataList.getInstance();;
private JsonGetMessage jsonGetMessage = new JsonGetMessage();
private RequestPackage message = new RequestPackage(jsonGetMessage);
private MsgGroupList mMsgGroupList = MsgGroupList.getInstance();
private UserInfoList mUserList = UserInfoList.getInstanse();
private PostPackage mPostPackage;
private Thread mTread = new Thread(this);
private boolean isStop = false;
private boolean isRuning = false;
private String host;
// private Context context;
// private static TransDataBase mDatabase;
//public static TransTextTable mTableTransText;
// ��Ե�ʴ���Ϣ֪ͨcheckʱ�䣺
// ������棺5�룻
// ��������棺30�룻
// ��̨��3���ӣ�
private final static int SLEEP_ACTIVE_TIME = 1000 * 30 ;
private final static int SLEEP_NO_ACTIVE_TIME = 1000 * 180 ;
private final static int SLEEP_TALKING_TIME = 1000 * 5;
private final static int RELOGINCOUNTTOSTOP=5;//���µ�¼����
private static boolean mSleepStateChanged = true;
private int mReloginCount = 0;
private boolean isTalking = false;
private static boolean isAppActive = true;
public boolean getIsRunning(){
return isRuning;
}
public static void setActiveState(boolean state){
mSleepStateChanged = true;
isAppActive = state;
}
public void setTalking(boolean state){
mSleepStateChanged = true;
isTalking = state;
}
public static ProcessMessage getInstance() {
if (instance == null) {
instance = new ProcessMessage();
}
return instance;
}
public void stop() {
isStop = true;
mTread.stop();
// mMessageLoop.removeCallbacks(mMessageRunnable);
}
public void set(Context context, String host) {
// mTtsPlayer = new TTSPlayer(context,"", this);
mPostPackage = new PostPackage(context, this);
this.host = host;
//this.context = context;
}
//private File file = null;//��־�ļ�
public void start() {
if (isRuning == false) {
//reLogin();
//file = createLog();//������־�ļ�
isStop = false;
mTread.start();
}
}
public void onNetPostResult(PostPackage owner, ResultPackage result) {
if (result.isNetSucceed()) {
if (DefineType.POST_TYPE_STR.equals(owner.type)) {
String json = result.getJson();
ResultString rs = Json.fromJson(json, ResultString.class);
if (rs != null) {
if (rs.succeed) {
processString(rs.function, json);
return;
} else {
if (rs.flag == DefineRequestFlag.NO_LOGIN) {
if (mReloginCount > 1) {
threadSleep(3000);
}
mReloginCount++;
/*printLog(file, "\n mReloginCountinPostResult():"+mReloginCount+"\n");*/
reLogin();
}
}
}
} else if (DefineType.POST_TYPE_BIN.equals(owner.type)) {
process(result);
}
} else {
mUser.setLogin(false);
}
// mMessageLoop.postDelayed(mMessageRunnable, 2000);
}
private void reLogin() {
JsonRequest request = new JsonRequest();
JsonLogin login = new JsonLogin();
request.function = JsonFunction.LOGIN;
login.version =UserInfo.version; // ����汾
login.imei = PhoneInfo.getInstance().getIMEI();
login.name = mUser.getUserName();
request.json = Json.toJson(login);
mUser.setLogin(false);
mPostPackage.post(request, host, false);
}
private void processString(String fun, String json) {
if (JsonFunction.LOGIN.equals(fun)) {
OnLogin(json);
mReloginCount = 1;//���ص�¼��������Ϊ1
} else {
JsonRequestResult messages = JsonRequestResult.fromJson(json, JsonRequestResult.class);
if (messages == null) {
return;
}
process(messages, true);
}
}
/**
* ��������ƽ������
*
* @param result
*/
private void process(ResultPackage result) {
if (JsonFunction.GET_PHOTO.equals(result.cmd)) {
//byte photo[] = result.getBytes();
}
}
private void OnLogin(String json) {
JsonRequestResult ret = JsonRequestResult.fromJson(json);
AskTaskList list = GlobalData.getAskInstance();
list.clear();
if (ret != null) {
if (ret.succeed == true) {
UserState state = Json.fromJson(ret.json, UserState.class);
mUser.setLogin(true);
mUser.setInfo(state);
process(ret,true);
}
}
}
/**
* ������Ϣ
* @param data
* @param updateId �Ƿ���� ��Ϣ��� ID��2012.11.27 ��ӣ�
*/
public void process(JsonData data,boolean updateId) {
if (data.json != null) {
if (data.json.length() > 0) {
if (JsonFunction.NO_LOGIN.equals(data.function)) {
} else if (JsonFunction.GET_MSG.equals(data.function)) {
getMessage(data,updateId);
} else if (JsonFunction.GET_MSG.equals(data.function)) {
} else if (JsonFunction.GET_MEETING.equals(data.function)) {
updateMeetings(data);
} else if (JsonFunction.DELETE_MEETING.equals(data.function)) {
deleteMeeting(data);
} else if (JsonFunction.EDIT_LINKMAN.equals(data.function)) {
} else if (JsonFunction.ONLINE_LINKMAN.equals(data.function)) {
updateOnLineState(data);
} else if (JsonMessage.Function.QUESTION.equals(data.function)) {
updateQusetion(data);
}
}
}
int nSize = data.count();
for (int i = 0; i < nSize; i++) {
process(data.get(i),updateId);
}
}
private void updateQusetion(JsonData data) {
QuestionInfo question = Json.fromJson(data.json, QuestionInfo.class);
MsgDataList msgList = mMsgGroupList.findItem(question.id, MsgInfoData.Define.TYPE_QA);
if (msgList == null) {
MsgInfoData info = new MsgInfoData();
info.text = question.text;
info.time = question.time;
info.senderId = question.senderId;
info.name = question.senderName;
info.setCmd(JsonMessage.Function.SOLVED);
info.vLen = question.vLen;
info.vId = question.vId;
info.state = question.state;
info.linkId = question.id;
info.look_over = Define.LOOK_OVER;
msgList = mMsgGroupList.addMsg(info);
mMsgGroupList.addMsgToDB(info);
mMsgGroupList.setMsgChanged(true);
}
mUserList.update(question);
msgList.updateState(question);
}
private void updateOnLineState(JsonData data) {
// UserInfo linkman = Json.fromJson(data.json, UserInfo.class);
}
/**
* �����û���Ƭ
*
* @param id
* @param photo
*/
private void deleteMeeting(JsonData data) {
long linkmanId = Long.valueOf(Json.fromJson(data.json, String.class));
// MeetingDataList list = MeetingDataList.getInstance();
// ����
// list.delete(meetingId);
// list.setChanged(true);
mFriends.delete(linkmanId);
mFriends.setChanged(true);
}
/**
* ������ִ����Ϣ����
* @param data
*/
private void getMessage(JsonData data, boolean updateId) {
JsonMessage msg = Json.fromJson(data.json, JsonMessage.class);
MsgInfoData d = new MsgInfoData(msg);
if (isShowMessage(msg)) {
if(updateId){
mUser.setMaxMsgId(msg.id); // ���汾�����
}
// ȥ���ظ����� 2012.11.26
if( null != mMsgGroupList.findMessage(d.senderId, d.linkId, d.time, d.type)){
return;
}
MsgDataList list = mMsgGroupList.findItem(d.linkId, d.type);
if (list == null) {
// ����û�н��ն������Ϣ
if (MsgInfoData.Define.TYPE_MSG == d.type) {
if (null == mFriends.findByLinkId(d.linkId)) {
return;
}
}
else {
return;
}
}
if (msg.senderId != UserInfo.state.id) {
if (JsonMessage.Function.SOLVED.equals(msg.function)) {
if (list != null) {
if (list.enabled() == false) {
list.setState(msg.linkId, QuestionInfo.STATE_MARK);
}
}
}
} else {
d.look_over = MsgInfoData.Define.LOOK_OVER;
}
if(msg.state == JsonMessage.State.RECEIVE){
d.look_over = MsgInfoData.Define.LOOK_OVER;
}
d.state = QuestionInfo.STATE_MARK;
list = mMsgGroupList.addMsg(d);
mMsgGroupList.addMsgToDB(d);
mMsgGroupList.setMsgChanged(true);
if (d.look_over != MsgInfoData.Define.LOOK_OVER) {
MainActivity.getInstance().showNotification(list, d);
} else {
// MainActivity.getInstance().showNotification(list,d);
}
}
doMessage(msg);
}
private boolean isShowMessage(JsonMessage a) {
String fun = a.function;
if (JsonMessage.Function.MEETING_ADD.equals(fun) || JsonMessage.Function.MEETING_DELETE.equals(fun)
|| JsonMessage.Function.MEETING_EDIT.equals(fun) || JsonMessage.Function.INVITE_ADD.equals(fun)
|| JsonMessage.Function.LINKMAN_DEL.equals(fun) || JsonMessage.Function.INVITE.equals(fun)
|| JsonMessage.Function.SOLVED.equals(fun) || JsonMessage.Function.SOLVED_QUIT.equals(fun)
|| JsonMessage.Function.SOLVED_CLOSE.equals(fun) || JsonMessage.Function.MSG.equals(fun)) {
return true;
}
return false;
}
/**
* ִ����Ϣ����
*
* @param a
*/
private void doMessage(JsonMessage msg) {
String fun = msg.function;
if (JsonMessage.Function.MEETING_ADD.equals(fun) || JsonMessage.Function.MEETING_DELETE.equals(fun)
|| JsonMessage.Function.MEETING_EDIT.equals(fun) || JsonMessage.Function.INVITE_ADD.equals(fun)
|| JsonMessage.Function.INVITE.equals(fun)) {
long time = msg.time.getTime();
if (time >= mUser.loginTime) {
JsonRequest requset = new JsonRequest();
requset.function = JsonFunction.GET_MEETING;
requset.json = msg.linkId + "";
mPostPackage.post(requset, host, false);
}
}
// ����������
else if(JsonMessage.Function.FISH.equals(fun)){
long time = msg.time.getTime();
if (time >= mUser.loginTime) {
updateFishList(msg);
}
} else if (JsonMessage.Function.ASK.equals(fun)) {
long time = msg.time.getTime();
if (time >= mUser.loginTime) {
updateAskList(msg);
}
} else if (JsonMessage.Function.SOLVED_QUIT.equals(fun)) {
// ��������
MsgDataList list = mMsgGroupList.findItem(msg.linkId, MsgInfoData.Define.TYPE_QA);
if (list != null) {
list.setState(msg.linkId, QuestionInfo.STATE_UNSOLVED);
list.setChanged(true);
}
} else if (JsonMessage.Function.SOLVED_CLOSE.equals(fun)) {
// �ر�����
MsgDataList list = mMsgGroupList.findItem(msg.linkId, MsgInfoData.Define.TYPE_QA);
if (list != null) {
list.setState(msg.linkId, QuestionInfo.STATE_SOLVED);
list.setChanged(true);
}
}
else if (JsonMessage.Function.LINKMAN_DEL.equals(fun)) {
// �ر�����
MsgDataList list = mMsgGroupList.findItem(msg.linkId, MsgInfoData.Define.TYPE_MSG);
if (list != null) {
list.setState(msg.linkId, QuestionInfo.STATE_CLOSE);
list.setChanged(true);
}
}
}
private void updateAskList(JsonMessage msg) {
AskTaskList list = GlobalData.getAskInstance();
list.clear();
int nCount = msg.items.size();
for (int i = 0; i < nCount; i++) {
JsonData data = msg.items.get(i);
AskTask task = Json.fromJson(data.json, AskTask.class);
if (task != null) {
list.AddTask(task);
}
}
}
private void updateFishList(JsonMessage msg) {
AskTaskList list = GlobalData.getFishInstance();
list.clear();
int nCount = msg.items.size();
for (int i = 0; i < nCount; i++) {
JsonData data = msg.items.get(i);
AskTask task = Json.fromJson(data.json, AskTask.class);
if (task != null) {
list.AddTask(task);
}
}
}
/**
* ������־�ļ�
*/
/*private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public File createLog(){
File fos = null;
long timestamp = System.currentTimeMillis();
formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String time = formatter.format(new Date());
String fileName = "log"+time + "-" + timestamp + ".zts";
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
String path = Util.ZTSPEECH_PATH+"/log/";
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
fos = new File(path + fileName);
}
return fos;
}*/
/**
* �����־��Ϣ
*/
/*public void printLog(File file,String content){
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file,true);
fos.write(content.getBytes());
Log.e("@@@@@@@@@@@@@@@@@@@", content);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}*/
public void run() {
isRuning = true;
while (false == isStop) {
RequestPackage request = getRequset();
if (request != null) {
mPostPackage.post(request, host, false);
}else{
//isStop = true;
/*printLog(file, "\n mReloginCountinRun():"+mReloginCount+"\n");*/
if(mReloginCount>=RELOGINCOUNTTOSTOP){
/*printLog(file, "\n"+"\n"+"\n"+"\n"+"!!!!!!!!!!�����쳣user�����գ�����ֹͣ����!!!!!!!!!!"+"\n"+"\n"+"\n"+"\n");*/
isStop = true;
}
}
/*StringBuffer sb = new StringBuffer();
sb.append("\n"+"\n"+"\n"+"-----------------------"+formatter.format(new Date())+"-----------------------"+"\n"+"\n");
sb.append("isregister:"+isRegister()+"\n");
sb.append("user:"+mUser.getUserName()+"\n");
sb.append("islogin:"+mUser.isLogin()+"\n");
sb.append("logintime:"+mUser.loginTime+"\n");
sb.append("online:"+mUser.state.online+"\n");
sb.append("isappactive:"+isAppActive+"\n");
sb.append("istalking:"+isTalking+"\n");
printLog(file, sb.toString());*/
}
isRuning = false;
}
private RequestPackage getRequset() {
// ����Sleepʱ��
mSleepStateChanged = false;
if (false == isRegister()) {
mUser.load();
/*StringBuffer sb = new StringBuffer();
sb.append("\n"+"\n"+"++++++++++"+formatter.format(new Date())+"++++++++++"+"\n");
sb.append("reload:");*/
if(false == isRegister()){
/*sb.append("reloadʧ��"+"\n");
sb.append("++++++++++++++++++++++++++++++++++++++++++++");
printLog(file, sb.toString());*/
threadSleep(2000);
return null;
}
/*sb.append("reload�ɹ�"+"\n");
sb.append("++++++++++++++++++++++++++++++++++++++++++++");
printLog(file, sb.toString());*/
}
if( isAppActive){
if(isTalking) {
threadSleep(SLEEP_TALKING_TIME);
}
else {
threadSleep(SLEEP_ACTIVE_TIME);
}
}
else {
threadSleep(SLEEP_NO_ACTIVE_TIME);
}
// ���������ϢID
jsonGetMessage.handkey = mUser.getMaxMsgId();
message.request = jsonGetMessage;
return message;
}
private boolean isRegister() {
if (mUser.getUserName().length() > 0) {
return true;
}
return false;
}
private void updateMeetings(JsonData data) {
MeetingInfo info = Json.fromJson(data.json, MeetingInfo.class);
MeetingDataList list = MeetingDataList.getInstance();
// ����
MeetingData meeting = list.findById(info.id);
if (meeting == null) {
meeting = new MeetingData(info.id, info.type, info.owner, info.name);
list.add(meeting);
} else {
if (MeetingInfo.TYPE_FRIEND == (meeting.type)) {
FriendDataList mtFriend = meeting.friendList;
int nFriend = mtFriend.size();
for (int i = 0; i < nFriend; i++) {
FriendData f = mtFriend.get(i);
mFriends.delete(f.id);
}
mFriends.setChanged(true);
}
}
int nCount = info.items.size();
if (nCount == 0) {
// ɾ������
FriendDataList mtFriend = meeting.friendList;
int nFriend = mtFriend.size();
for (int i = 0; i < nFriend; i++) {
FriendData f = mtFriend.get(i);
mFriends.delete(f.id);
}
mFriends.setChanged(true);
list.delete(info.id);
} else {
synchronized (meeting) {
meeting.clear();
for (int i = 0; i < nCount; i++) {
UserState user = info.items.get(i);
if (UserInfo.state.id != user.id) {
FriendData friend = mFriends.findByUserId(user.id);
if (friend == null) {
friend = new FriendData(user);
mFriends.add(friend);
friend.linkId = meeting.id;
}
meeting.add(friend);
}
}
}
}
list.setChanged(true);
}
private void threadSleep(int nTimer) {
try {
//���sleepʱ��
/*printLog(file, "sleeptime:"+nTimer+"\n");*/
while (false == isStop && nTimer > 0 && (false == mSleepStateChanged)) {
Thread.sleep(180);
nTimer -= 200;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public InputStream getPlayData(String arg0) {
return null;
}
public void onTtsPlayEnd() {
}
public void onTtsPlayError(int arg0) {
}
public void onTtsPlayStart() {
}
@Override
public void onTtsPlayLoadDataEnd() {
}
@Override
public void onTtsPlayLoadDataStart() {
}
@Override
public void isShowTipDialog(String msg) {
// TODO Auto-generated method stub
}
}