/**
*
*/
package com.d3.d3xmpp.activites;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.d3.d3xmpp.R;
import com.d3.d3xmpp.adapter.ChatAdapter;
import com.d3.d3xmpp.constant.Constants;
import com.d3.d3xmpp.constant.MyApplication;
import com.d3.d3xmpp.d3View.D3Activity;
import com.d3.d3xmpp.d3View.D3View;
import com.d3.d3xmpp.d3View.MyListView;
import com.d3.d3xmpp.d3View.MyListView.OnRefreshListener;
import com.d3.d3xmpp.d3View.RecordButton;
import com.d3.d3xmpp.d3View.RecordButton.OnFinishedRecordListener;
import com.d3.d3xmpp.d3View.expression.ExpressionListener;
import com.d3.d3xmpp.d3View.expression.ExpressionView;
import com.d3.d3xmpp.dao.MsgDbHelper;
import com.d3.d3xmpp.dao.NewMsgDbHelper;
import com.d3.d3xmpp.model.ChatItem;
import com.d3.d3xmpp.util.FileUtil;
import com.d3.d3xmpp.util.ImageUtil;
import com.d3.d3xmpp.util.Tool;
import com.d3.d3xmpp.xmpp.XmppConnection;
/**
* @author MZH
*
*/
@SuppressLint("NewApi")
public class ChatActivity extends D3Activity {
@D3View(click="onClick") ImageView leftBtn,rightBtn,sendBtn,picBtn,expBtn,moreBtn;
@D3View(click="onClick") Button takePicBtn,chosePicBtn,fileBtn,adrBtn;
@D3View LinearLayout moreLayout;
@D3View RecordButton recordBtn;
@D3View ExpressionView expView;
@D3View EditText msgText;
@D3View TextView titleView;
@D3View MyListView listView;
private ChatAdapter adapter;
private List<ChatItem> chatItems = new ArrayList<ChatItem>();
private UpMessageReceiver mUpMessageReceiver;
private String chatName; //Ⱥ��ʱ����Ⱥ����
private int chatType = ChatItem.CHAT;
public LocationClient mLocationClient;
public static boolean isExit = false;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.acti_chat);
chatName = getIntent().getStringExtra("chatName");
chatType = getIntent().getIntExtra("chatType",ChatItem.CHAT);
initView();
initData();
titleView.setText(chatName);
mLocationClient = new LocationClient(this.getApplicationContext());
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// ��gps
option.setCoorType("bd09ll"); // ������������
option.setScanSpan(1000);
mLocationClient.setLocOption(option);
mLocationClient.registerLocationListener(new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
//Receive Location
String adr = "[/a0,"+location.getLatitude() +"," + location.getLongitude();
try {
XmppConnection.getInstance().sendMsg(adr,chatType);
} catch (Exception e) {
autoSendIfFail(adr);
e.printStackTrace();
}
Log.i("BaiduLocationApiDem", adr);
// Tool.initToast(getApplicationContext(), adr);
mLocationClient.stop();
MyApplication.lat = location.getLatitude();
MyApplication.lon = location.getLongitude();
}
});
}
private void initView() {
adapter = new ChatAdapter(getApplicationContext(), chatName);
listView.setAdapter(adapter);
listView.setonRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(0);
}
}).start();
}
});
msgText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
expView.setVisibility(View.GONE);
}
});
msgText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if("".equals(msgText.getText().toString())){
sendBtn.setImageResource(R.drawable.icon_voice);
}
else
sendBtn.setImageResource(R.drawable.icon_send_w);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
recordBtn.setOnFinishedRecordListener(new OnFinishedRecordListener() {
@Override
public void onFinishedRecord(String audioPath, int time) {
if (audioPath != null) {
try {
XmppConnection.getInstance().sendMsgWithParms(FileUtil.getFileName(audioPath),
new String[]{"imgData"}, new Object[]{ImageUtil.getBase64StringFromFile(audioPath)},chatType);
} catch (Exception e) {
autoSendIfFail(FileUtil.getFileName(audioPath),new String[]{"imgData"}, new Object[]{ImageUtil.getBase64StringFromFile(audioPath)});
e.printStackTrace();
}
} else {
Tool.initToast(ChatActivity.this, "����ʧ��");
}
}
});
expView.setEditText(msgText);
expView.setGifListener(new ExpressionListener() {
@Override
public void clickGif(String msg) {
try {
XmppConnection.getInstance().sendMsg(msg,chatType);
} catch (Exception e) {
autoSendIfFail(msg);
e.printStackTrace();
}
}
});
// �Ự���ݸı䣬���ܹ㲥
mUpMessageReceiver = new UpMessageReceiver();
registerReceiver(mUpMessageReceiver, new IntentFilter("ChatNewMsg"));
registerReceiver(mUpMessageReceiver, new IntentFilter("LeaveRoom"));
XmppConnection.getInstance().setRecevier(chatName,chatType);
}
private void initData(){
chatItems = MsgDbHelper.getInstance(getApplicationContext()).getChatMsg(chatName);
adapter.clear();
adapter.addAll(chatItems);
listView.setSelection(adapter.getCount() + 1);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
listView.onRefreshComplete();
List<ChatItem> moreChatItems = MsgDbHelper.getInstance(getApplicationContext()).getChatMsgMore(
listView.getCount()-1, chatName);
for (int i = 0; i < moreChatItems.size(); i++) {
chatItems.add(i, moreChatItems.get(i));
}
adapter.clear();
adapter.addAll(chatItems);
adapter.notifyDataSetChanged();
}
}
};
public void onClick(View v){
switch (v.getId()) {
case R.id.leftBtn:
finish();
break;
case R.id.rightBtn:
Intent intent = new Intent();
if (chatType == ChatItem.CHAT) {
intent.setClass(getApplicationContext(), FriendActivity.class);
intent.putExtra("username", chatName);
startActivity(intent);
}
else if(chatType == ChatItem.GROUP_CHAT){
intent.setClass(getApplicationContext(), RoomMemActivity.class);
intent.putExtra("roomName", chatName);
startActivity(intent);
}
break;
case R.id.sendBtn:
String msg = msgText.getText().toString(); // ��ȡtext�ı�
if(!msg.isEmpty()){ //�ı���Ϊ�գ�ֱ�ӷ��ı���Ϣ
try {
XmppConnection.getInstance().sendMsg(msg,chatType);
} catch (Exception e) {
autoSendIfFail(msg);
e.printStackTrace();
}
msgText.setText("");
}
else if(recordBtn.getVisibility() == View.GONE){ //�ı�Ϊ�գ����ı�����ģʽ�л�����������ģʽ
msgText.setVisibility(View.GONE);
recordBtn.setVisibility(View.VISIBLE);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(msgText.getWindowToken(), 0);
sendBtn.setImageResource(R.drawable.icon_keyboard);
}
else if(msgText.getVisibility() == View.GONE){ //�ı�Ϊ�գ�����������ģʽ�л����ı�����ģʽ
msgText.setVisibility(View.VISIBLE);
recordBtn.setVisibility(View.GONE);
sendBtn.setImageResource(R.drawable.icon_voice);
}
break;
case R.id.msgText: //ѡ���ı��������¼�������һ��
expView.setVisibility(View.GONE);
listView.setSelection(adapter.getCount()); // ȥ�����һ��
break;
case R.id.moreBtn: //�������������,ѡͼ�����࣬����λ��
if (moreLayout.getVisibility() == View.GONE) {
InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus()
.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
moreLayout.setVisibility(View.VISIBLE);
expView.setVisibility(View.GONE);
} else {
moreLayout.setVisibility(View.GONE);
}
break;
case R.id.takePicBtn: //����
Intent intent1 = new Intent();
CropImageActivity.isAutoSend = true;
intent1.setClass(this, PicSrcPickerActivity.class);
intent1.putExtra("type", PicSrcPickerActivity.TAKE_PIC);
startActivityForResult(intent1,PicSrcPickerActivity.CROP);
break;
case R.id.chosePicBtn: //ͼ��
Intent intent2 = new Intent();
CropImageActivity.isAutoSend = true;
intent2.setClass(this, PicSrcPickerActivity.class);
intent2.putExtra("type", PicSrcPickerActivity.CHOSE_PIC);
startActivityForResult(intent2,PicSrcPickerActivity.CROP);
break;
case R.id.adrBtn: //�����
mLocationClient.start();
break;
case R.id.expBtn: //�������icon
if (expView.getVisibility() == View.GONE) {
InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus()
.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
expView.setVisibility(View.VISIBLE);
moreLayout.setVisibility(View.GONE);
} else {
expView.setVisibility(View.GONE);
}
//Determine the voice
if(msgText.getVisibility() == View.GONE){
msgText.setVisibility(View.VISIBLE);
recordBtn.setVisibility(View.GONE);
if("".equals(msgText.getText().toString()))
sendBtn.setImageResource(R.drawable.icon_voice);
else
sendBtn.setImageResource(R.drawable.icon_send_w);
}
break;
default:
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (RESULT_OK == resultCode) {
switch (requestCode) { //ѡͼ�ص�
case PicSrcPickerActivity.CROP:
String imgName = data.getStringExtra("imgName");
String base64String = data.getStringExtra("base64String");
if (imgName != null) {
try {
XmppConnection.getInstance().sendMsgWithParms(imgName, new String[]{"imgData"}, new Object[]{base64String},chatType);
} catch (Exception e) {
autoSendIfFail(imgName,new String[]{"imgData"}, new Object[]{base64String});
e.printStackTrace();
}
}
break;
default:
break;
}
}
}
@Override
protected void onDestroy() {
try {
adapter.mping.stop();
if (MyApplication.getInstance() != null) {
unregisterReceiver(mUpMessageReceiver);
}
} catch (Exception e) {
e.printStackTrace();
}
clearMsgCount();
finish();
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
msgText.clearFocus();
if (isExit) {
isExit = false;
finish();
}
}
private void clearMsgCount() {
NewMsgDbHelper.getInstance(getApplicationContext()).delNewMsg(chatName);
MyApplication.getInstance().sendBroadcast(new Intent("ChatNewMsg"));
}
private class UpMessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// �յ��V���������ǵĽ���
if (intent.getAction().equals("LeaveRoom")) {
finish();
}
else{
initData();
}
}
}
//�����Ƕ��߷���������ʱ�Զ��ط�
public static boolean isLeaving = false;
public void autoSendIfFail(final String msg){
Tool.initToast(MyApplication.getInstance(), "������..");
final Timer timer = new Timer();
timer.schedule(new TimerTask() { //1���ʼ
int count = 0;
@Override
public void run() {
try {
count++;
if (!isLeaving) {
XmppConnection.getInstance().setRecevier(chatName, chatType);
XmppConnection.getInstance().sendMsg(msg,chatType);
timer.cancel();
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
Log.e("muc", "autosend "+count);
if (count > 8) {
Tool.initToast(MyApplication.getInstance(), "����ʧ��");
timer.cancel();
}
}
}
}, 1000,1000);
}
public void autoSendIfFail(final String msg,final String[] s,final Object[] obj){
Tool.initToast(MyApplication.getInstance(), "������..");
final Timer timer = new Timer();
timer.schedule(new TimerTask() { //1���ʼ
int count = 0;
@Override
public void run() {
try {
count++;
if (!isLeaving) {
XmppConnection.getInstance().setRecevier(chatName, chatType);
XmppConnection.getInstance().sendMsgWithParms(msg, s, obj,chatType);
timer.cancel();
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
Log.e("muc", "autosend "+count);
if (count > 8) {
Tool.initToast(MyApplication.getInstance(), "����ʧ��");
timer.cancel();
}
}
}
}, 1000,1000);
}
}