package com.ztspeech.simutalk2.qa;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import cn.ac.ia.directtrans.json.AddQuestionReturn;
import cn.ac.ia.directtrans.json.Json;
import cn.ac.ia.directtrans.json.JsonMessage;
import cn.ac.ia.directtrans.json.JsonQuestion;
import cn.ac.ia.directtrans.json.JsonRequestResult;
import cn.ac.ia.directtrans.json.QuestionInfo;
import cn.ac.ia.files.RequestParam;
import com.ztspeech.recognizer.OnEngineListener;
import com.ztspeech.recognizer.speak.VoicePlayer;
import com.ztspeech.recognizer.speak.interf.OnPlayerListener;
import com.ztspeech.recognizerDialog.UnisayRecognizerDialog;
import com.ztspeech.simutalk2.R;
import com.ztspeech.simutalk2.data.MsgGroupList;
import com.ztspeech.simutalk2.data.MsgInfoData;
import com.ztspeech.simutalk2.data.MsgInfoData.Define;
import com.ztspeech.simutalk2.data.UserInfo;
import com.ztspeech.simutalk2.dictionary.util.LogInfo;
import com.ztspeech.simutalk2.dictionary.util.Util;
import com.ztspeech.simutalk2.net.AsyncHttpPost.AsyncHttpPostLisenter;
import com.ztspeech.simutalk2.net.PostPackageEngine;
import com.ztspeech.simutalk2.net.ResultPackage;
import com.ztspeech.simutalk2.qa.view.InterpretView;
public class AskQuestionActivity extends Activity implements OnClickListener, AsyncHttpPostLisenter {
// Intent param define
public static final int TYPE_NEW = 1;
public static final int TYPE_OLD = 2;
// view control
private EditText mEditMsg;
private Button mBtnSend;
private Button mBtnSpeak;
private Button mBtnCancel;
private Button mBtnChOrEn;
private UnisayRecognizerDialog mDialog = null;
private VoicePlayer mPlayer = null;
// data
private MsgGroupList mMsgGroupList = MsgGroupList.getInstance();
private UserInfo mUser = UserInfo.getInstanse();
private JsonQuestion mJsonMessage = new JsonQuestion();
// private PostPackage mPostPackage;
private int mVoiceLength = 0;
private String mVoiceId = "";
private static String language;
private PostVoiceDataToServerEngine mPostVoiceDataToServerEngine;
private Context context;
private PostPackageEngine mPostPackageEngine;
protected boolean mMessageChanged = true;
// =========================================================
// private PopupWindow mRecognizerWindow = null;
private InterpretView mInterpretView;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case Util.ON_RECORD_END:
mInterpretView.clearNoVoiceAnim();
mInterpretView.clearViewAnim();
mInterpretView.startViewAnim();
mInterpretView.setBtnRecordEnable(false);
break;
case Util.ON_RECORD_BEGIN:
mInterpretView.clearViewAnim();
mInterpretView.startNoVoiceAnim();
// btnDispProcess(true);
mInterpretView.setBtnRecordEnable(true);
break;
case Util.ON_RECORDER_ERROR:
mInterpretView.clearViewAnim();
mInterpretView.setBtnRecordEnable(true);
break;
case Util.ON_WAIT_BEGIN:
mInterpretView.setBtnRecordEnable(false);
mInterpretView.clearViewAnim();
mInterpretView.startViewAnim();
break;
case Util.ON_WAIT_END:
mInterpretView.setBtnRecordEnable(true);
// btnDispProcess(false);
mInterpretView.clearViewAnim();
break;
case Util.ON_RECOGNIZER_ERROR:
mInterpretView.clearViewAnim();
mInterpretView.setBtnRecordEnable(true);
mInterpretView.setTextStatusDisp(View.VISIBLE);
mDialog.close();
mInterpretView.setTextStatus((Integer) msg.obj);
setBtnEnable(true);
break;
case Util.ON_VOICE_VALUE:
mInterpretView.clearViewAnim();
mInterpretView.setBtnRecordEnable(false);
int value = (Integer) msg.obj;
mInterpretView.setBtnRecordBg(value);
break;
case Util.SET_LIST_VIEW:
mInterpretView.setBtnRecordEnable(true);
mInterpretView.clearViewAnim();
mDialog.close();
mInterpretView.dispRresultList((ArrayList<String>) msg.obj);
break;
case Util.SELECT_RESULT:
break;
case 100:
Toast.makeText(context, context.getString(R.string.cancelnet), Toast.LENGTH_LONG).show();
mPostVoiceDataToServerEngine.dismissLoading();
break;
case 101:
Toast.makeText(context, context.getString(R.string.qa_msg_download_error), Toast.LENGTH_LONG).show();
mPostVoiceDataToServerEngine.dismissLoading();
break;
case 102:
LogInfo.LogOutE("haitian", "AskQuestionActivity>>>>>>>>>>>>>>>>>>> msg.obj =" + (String) msg.obj);
postVoiceDataCallBack((String) msg.obj);
break;
case 104:
mPostVoiceDataToServerEngine.dismissLoading();
LogInfo.LogOutE("haitian", "AskQuestionActivity>>>>>>>>>>>>>>>>>>> dismissLoading");
break;
case 200:
postPackageCallBack((ResultPackage) msg.obj);
break;
case 404:
Toast.makeText(context, (String) msg.obj, Toast.LENGTH_LONG).show();
break;
default:
break;
}
};
};
private void btnDispProcess(boolean flag) {
if (flag) {
mInterpretView.setBtnCancelDisp(View.VISIBLE);
} else {
mInterpretView.setBtnCancelDisp(View.GONE);
}
}
private boolean btnClickflag = false;
private LayoutInflater inflater;
// =========================================================
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.activity_ask_question, null);
setContentView(v);
// getWindow().setFormat(PixelFormat.RGBA_8888);
context = this;
mInterpretView = new InterpretView(this, handler, v, this);
// mInterpretView = new InterpretView(this, handler, this);
mDialog = new UnisayRecognizerDialog(this, "", mRecognizerListener,
mInterpretView.mNewRecognizerViewListenerInterface);
mPlayer = new VoicePlayer(this);
mPlayer.setListener(mPlayerListener);
mPostVoiceDataToServerEngine = new PostVoiceDataToServerEngine(context, handler);
mBtnSend = (Button) findViewById(R.id.btnSend);
mBtnCancel = (Button) findViewById(R.id.btnCancel);
mBtnSpeak = (Button) findViewById(R.id.btnSpeak);
mBtnChOrEn = (Button) findViewById(R.id.btnChOrEn);
mEditMsg = (EditText) findViewById(R.id.editMsg);
if (language == null) {
language = mUser.s2sType;
}
if (language.equals(UserInfo.S2T_CH2EN)) {
mBtnChOrEn.setBackgroundResource(R.drawable.qa_btn_z_f);
mDialog.setToChineseEngine();
} else {
mBtnChOrEn.setBackgroundResource(R.drawable.qa_btn_e_f);
mDialog.setToEnglishEngine();
}
mBtnSend.setOnClickListener(this);
mBtnSpeak.setOnClickListener(this);
mBtnCancel.setOnClickListener(this);
mBtnChOrEn.setOnClickListener(this);
mEditMsg.addTextChangedListener(mOnTextChangedListener);
}
private OnPlayerListener mPlayerListener = new OnPlayerListener() {
public InputStream getPlayWaveData(String text) {
// TODO Auto-generated method stub
// InputStream in = getTTSInputStream(text);
// InputStream in = mTtsDownloader.getTTSInputStream(text);
return null;
}
public void onPlayStart() {
// TODO Auto-generated method stub
}
public void onPlayStop() {
// TODO Auto-generated method stub
}
public void onPlayLoadDataStart() {
// TODO Auto-generated method stub
}
public void onPlayLoadDataEnd() {
// TODO Auto-generated method stub
}
};
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
mDialog.close();
mInterpretView.setRecordLayoutDisp(View.GONE);
setBtnEnable(true);
// mInterpretView.dismissPopWindow();
}
return super.onKeyDown(keyCode, event);
}
private OnEngineListener mRecognizerListener = new OnEngineListener() {
public void onEngineResult(List list, int flag, String id) {
mDialog.close();
mInterpretView.setRecordLayoutDisp(View.GONE);
setBtnEnable(true);
// mInterpretView.dismissPopWindow();
if (list == null) {
mVoiceLength = 0;
return;
}
// String text = "";
for (int i = 0; i < list.size(); i++) {
mEditMsg.append((String) list.get(i));
}
// mEditMsg.setText(text);
if (list.size() > 0) {
byte[] voice = (byte[]) mDialog.getObject();
mVoiceLength = voice.length;
}
}
public void onEngineStart() {
// TODO Auto-generated method stub
}
public void onEngineEnd() {
setBtnEnable(true);
}
};
private void setBtnEnable(boolean flag) {
mBtnSpeak.setEnabled(flag);
mEditMsg.setClickable(flag);
mBtnChOrEn.setEnabled(flag);
}
public void onClick(View v) {
if (v == mBtnCancel) {
finish();
} else if (v == mBtnSend) {
sendMsg();
} else if (v == mBtnSpeak) {
hideViewInput(mEditMsg);
// mInterpretView.showPopWindowLocation();
mInterpretView.setRecordLayoutDisp(View.VISIBLE);
mDialog.show();
setBtnEnable(false);
} else if (v == mEditMsg) {
} else if (v == mBtnChOrEn) {
if (language.equals(UserInfo.S2T_CH2EN)) {
mBtnChOrEn.setBackgroundResource(R.drawable.qa_btn_e_f);
language = UserInfo.S2T_EN2CH;
mDialog.setToEnglishEngine();
} else {
mBtnChOrEn.setBackgroundResource(R.drawable.qa_btn_z_f);
language = UserInfo.S2T_CH2EN;
mDialog.setToChineseEngine();
}
} else if (v.getId() == R.id.btn_bg || v.getId() == R.id.imagenovoiceanim) {
mDialog.onRecognizerViewRecord();
LogInfo.LogOutE("haitian", "---------------stop record------------");
} else if (v.getId() == R.id.btn_cancel) {
mDialog.onRecognizerViewCancel();
mInterpretView.setRecordLayoutDisp(View.GONE);
setBtnEnable(true);
// mInterpretView.dismissPopWindow();
} else if (v.getId() == R.id.btn_record) {
if (!btnClickflag) {
btnClickflag = true;
mDialog.show();
mInterpretView.setBtnRecordEnable(true);
} else {
btnClickflag = false;
mDialog.close();
mInterpretView.setRecordLayoutDisp(View.GONE);
setBtnEnable(true);
}
LogInfo.LogOutE("haitian", "------------R.id.btn_record----------------");
}
}
private void setButtonsEnabled(boolean b) {
// mBtnSend.setEnabled(b);
// mBtnSpeak.setEnabled(b);
// mBtnCancel.setEnabled(b);
// mBtnChOrEn.setEnabled(b);
}
private void hideViewInput(View v) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
private TextWatcher mOnTextChangedListener = new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
mMessageChanged = true;
}
};
private void sendMsg() {
String msg = mEditMsg.getText().toString().trim();
if (msg.length() == 0) {
return;
}
if (mVoiceLength > 0) {
byte[] voice = (byte[]) mDialog.getObject();
mPostVoiceDataToServerEngine.httpRequestPostNewThread(voice, RequestParam.FILE_TYPE_VOICE);
// AsyncHttpPost post = new AsyncHttpPost(this);
// post.setHost(getString(R.string.file_host_ip), UserInfo.appId,
// UserInfo.state.id + "");
// post.postVoice(voice, RequestParam.FILE_TYPE_VOICE);
} else {
// mPostPackage = new PostPackage(this, mPostAskListener);
mJsonMessage.text = msg;
mJsonMessage.type = "";
mJsonMessage.vLen = 0;
mJsonMessage.cmd = JsonQuestion.ASK;
if (mMessageChanged) {
mMessageChanged = false;
Util.handkey++;
}
// ����Keyֵ
mJsonMessage.handkey = Util.handkey;
mPostPackageEngine = new PostPackageEngine(context, mJsonMessage, handler);
mPostPackageEngine.post();
// if (mPostPackage.post(mJsonMessage, getString(R.string.host_ip),
// true)) {
//
// WaitingActivity.waiting(this, 0);
// } else {
// setButtonsEnabled(true);
// }
}
}
private void postPackageCallBack(ResultPackage result) {
if (result.isNetSucceed()) {
JsonRequestResult ret = Json.fromJson(result.getJson(), JsonRequestResult.class);
if (ret != null) {
if (ret.succeed == true) {
AddQuestionReturn q = Json.fromJson(ret.json, AddQuestionReturn.class);
if (q != null) {
MsgInfoData data = new MsgInfoData();
data.text = mEditMsg.getText().toString().trim();
data.time = q.time;
data.senderId = UserInfo.state.id;
data.name = mUser.getUserName();
data.setCmd(JsonMessage.Function.SOLVED);
data.vLen = mVoiceLength;
data.vId = mVoiceId;
data.linkId = q.id;
data.state = QuestionInfo.STATE_UNSOLVED;
data.look_over = Define.LOOK_OVER;
UserInfo.state.ask = q.count;
mUser.isChange = true;
mMsgGroupList.addMsg(data);
mMsgGroupList.addMsgToDB(data);
}
LogInfo.LogOutE("haitian", "1-----------AskQuestionActivity----postPackageCallBack-------");
finish();
UserStateActivity.askSend();
mVoiceLength = 0;
mVoiceId = "";
return;
} else {
LogInfo.LogOutE("haitian", "2-----------AskQuestionActivity------postPackageCallBack-----");
new AlertDialog.Builder(AskQuestionActivity.this).setTitle("��ʾ").setMessage(ret.explain)
.setPositiveButton("ȷ��", null).show();
}
}
}
LogInfo.LogOutE("haitian", "3-----------AskQuestionActivity-------postPackageCallBack----");
}
private void postVoiceDataCallBack(String fileId) {
if (fileId == null) {
handler.sendEmptyMessage(104);
return;
}
if (fileId.length() == 0) {
handler.sendEmptyMessage(104);
return;
}
mVoiceId = fileId;
String msg = mEditMsg.getText().toString().trim();
// mPostPackage = new PostPackage(this, mPostAskListener);
mJsonMessage.text = msg;
mJsonMessage.type = RequestParam.FILE_TYPE_VOICE;
mJsonMessage.vId = fileId;
mJsonMessage.vLen = mVoiceLength;
mJsonMessage.cmd = JsonQuestion.ASK;
if (mMessageChanged) {
mMessageChanged = false;
Util.handkey++;
}
// ����keyֵ
mJsonMessage.handkey = Util.handkey;
mPostPackageEngine = new PostPackageEngine(context, mJsonMessage, handler);
mPostPackageEngine.post();
handler.sendEmptyMessage(104);
// if (mPostPackage.post(mJsonMessage, getString(R.string.host_ip),
// true)) {
// } else {
// LogInfo.LogOutE("haitian",
// "-----------setButtonsEnabled-----------");
// handler.sendEmptyMessage(104);
// }
}
@Override
public void onData(String fileId) {
if (fileId == null) {
return;
}
if (fileId.length() == 0) {
return;
}
mVoiceId = fileId;
String msg = mEditMsg.getText().toString().trim();
// mPostPackage = new PostPackage(this, mPostAskListener);
mJsonMessage.text = msg;
mJsonMessage.type = RequestParam.FILE_TYPE_VOICE;
mJsonMessage.vId = fileId;
mJsonMessage.vLen = mVoiceLength;
mJsonMessage.cmd = JsonQuestion.ASK;
mPostPackageEngine = new PostPackageEngine(context, mJsonMessage, handler);
mPostPackageEngine.post();
// if (mPostPackage.post(mJsonMessage, getString(R.string.host_ip),
// true)) {
//
// WaitingActivity.waiting(this, 0);
// } else {
// }
}
@Override
public void onBegin() {
WaitingActivity.waiting(this, 0);
}
@Override
public void onEnd() {
WaitingActivity.stop();
}
}