package com.andbase.im.activity;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.jivesoftware.smack.packet.Message;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import com.ab.activity.AbActivity;
import com.ab.db.storage.AbSqliteStorage;
import com.ab.db.storage.AbSqliteStorageListener.AbDataInsertListener;
import com.ab.db.storage.AbSqliteStorageListener.AbDataSelectListener;
import com.ab.db.storage.AbSqliteStorageListener.AbDataUpdateListener;
import com.ab.db.storage.AbStorageQuery;
import com.ab.util.AbDateUtil;
import com.ab.util.AbDialogUtil;
import com.ab.util.AbStrUtil;
import com.ab.util.AbToastUtil;
import com.ab.view.titlebar.AbTitleBar;
import com.andbase.R;
import com.andbase.friend.UserDao;
import com.andbase.global.Constant;
import com.andbase.global.MyApplication;
import com.andbase.im.adapter.ChatMsgViewAdapter;
import com.andbase.im.dao.IMMsgDao;
import com.andbase.im.model.IMMessage;
import com.andbase.im.util.IMRecordListener;
import com.andbase.im.util.IMRecorder;
import com.andbase.model.User;
public class ChatActivity extends AbActivity {
private static final String TAG = "ChartActivity";
private static final boolean D = Constant.DEBUG;
private MyApplication application;
private AbTitleBar mAbTitleBar = null;
private ChatMsgViewAdapter mChatMsgViewAdapter = null;
private List<IMMessage> mChatMsgList = null;
private ListView mMsgListView = null;
private EditText mContentEdit = null;
private Button mSendBtn = null;
private ImageButton mAddBtn = null;
private ImageButton mVoiceBtn = null;
private Button mVoiceSendBtn = null;
//发送选项面板
private LinearLayout chatAppPanel = null;
//推送内容
private String mContentStr = null;
//是否可以发送下一条
private boolean isSendEnable = true;
private final String action = "com.baidu.android.pushservice.action.MESSAGE";
//数据库操作类
public AbSqliteStorage mAbSqliteStorage = null;
public UserDao mUserDao = null;
private IMMsgDao mIMMsgDao = null;
private int pageSize = 10;
// 登录用户
protected String userName;
// 和谁聊天
protected String toUserName;
//我的录音类
private IMRecorder mIMRecorder = null;
//创建BroadcastReceiver
private BroadcastReceiver mDataReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
IMMessage mIMMessage = (IMMessage)intent.getParcelableExtra("MESSAGE");
if(mIMMessage!=null){
if(D) Log.d(TAG, "收到了消息:" + mIMMessage.getContent());
//mIMMessage.setSendState(IMMessage.READ);
if(application.mUser!=null){
if(mIMMessage.getToUserName().equals(application.mUser.getUserName())){
mChatMsgList.add(mIMMessage);
mChatMsgViewAdapter.notifyDataSetChanged();
}
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setAbContentView(R.layout.chat);
application = (MyApplication) abApplication;
//初始化AbSqliteStorage
mAbSqliteStorage = AbSqliteStorage.getInstance(this);
//初始化数据库操作实现类
mUserDao = new UserDao(this);
mIMMsgDao = new IMMsgDao(this);
mAbTitleBar = this.getTitleBar();
mAbTitleBar.setLogo(R.drawable.button_selector_back);
mAbTitleBar.setTitleBarBackground(R.drawable.top_bg);
mAbTitleBar.setTitleTextMargin(10, 0, 0, 0);
mAbTitleBar.setLogoLine(R.drawable.line);
mAbTitleBar.setTitleTextBold(false);
mAbTitleBar.setTitleBarGravity(Gravity.CENTER,Gravity.CENTER);
//设置AbTitleBar在最上
this.setTitleBarOverlay(true);
//获取传递的参数
Intent mIntent = this.getIntent();
//聊天对象
toUserName = mIntent.getStringExtra("USERNAME");
if(application.mUser!=null){
userName = application.mUser.getUserName();
}
mAbTitleBar.setTitleText("与"+toUserName+"的会话");
mContentEdit = (EditText)findViewById(R.id.content);
mSendBtn = (Button)findViewById(R.id.sendBtn);
mAddBtn = (ImageButton)findViewById(R.id.addBtn);
mVoiceBtn = (ImageButton)findViewById(R.id.voiceBtn);
mVoiceSendBtn= (Button)findViewById(R.id.voiceSendBtn);
mContentEdit.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
String str = mContentEdit.getText().toString().trim();
int length = str.length();
if (length > 0) {
mSendBtn.setVisibility(View.VISIBLE);
mAddBtn.setVisibility(View.GONE);
} else {
mSendBtn.setVisibility(View.GONE);
mAddBtn.setVisibility(View.VISIBLE);
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
}
});
mVoiceBtn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
if(mVoiceSendBtn.getVisibility() == View.VISIBLE){
mVoiceSendBtn.setVisibility(View.GONE);
mContentEdit.setVisibility(View.VISIBLE);
mVoiceBtn.setBackgroundResource(R.drawable.button_selector_chat_voice);
}else{
mVoiceSendBtn.setVisibility(View.VISIBLE);
mContentEdit.setVisibility(View.GONE);
mVoiceBtn.setBackgroundResource(R.drawable.button_selector_chat_key);
}
}
});
//按住录音
mVoiceSendBtn.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event){
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//开始录音
startRecording();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
//结束录音
stopRecording(false);
break;
}
return false;
}
});
mSendBtn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(application.mUser == null){
AbToastUtil.showToast(ChatActivity.this,"请先返回登录");
return;
}
mContentStr = mContentEdit.getText().toString().trim();
if(!AbStrUtil.isEmpty(mContentStr)){
if(!isSendEnable){
AbToastUtil.showToast(ChatActivity.this,"上一条正在发送,请稍等");
return;
}
//发送通知
isSendEnable = false;
//清空文本框
mContentEdit.setText("");
String time = AbDateUtil.getCurrentDate(AbDateUtil.dateFormatYMDHMS);
IMMessage mIMMessage = new IMMessage();
//mIMMessage.setType(IMMessage.CHAT_MSG);
//mIMMessage.setSendState(IMMessage.UNSEND);
//mIMMessage.setContent(mContentStr);
//mIMMessage.setTime(time);
//mIMMessage.setUserName(userName);
mIMMessage.setToUserName(toUserName);
//mIMMessage.setTime(time);
saveMessageData(mIMMessage);
mChatMsgList.add(mIMMessage);
mChatMsgViewAdapter.notifyDataSetChanged();
sendMessage(mIMMessage);
}
}
});
mMsgListView = (ListView)this.findViewById(R.id.mListView);
mChatMsgList = new ArrayList<IMMessage>();
mChatMsgViewAdapter = new ChatMsgViewAdapter(this,mChatMsgList);
mMsgListView.setAdapter(mChatMsgViewAdapter);
//面板选项
chatAppPanel = (LinearLayout)this.findViewById(R.id.chatAppPanel);
ImageButton addBtn = (ImageButton)this.findViewById(R.id.addBtn);
addBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if(chatAppPanel.getVisibility()==View.GONE){
chatAppPanel.setVisibility(View.VISIBLE);
}else{
chatAppPanel.setVisibility(View.GONE);
}
}
});
if(application.mUser != null){
//查询历史消息
queryMsgList();
}
}
private void initTitleRightLayout() {
}
@Override
protected void onStart() {
// 注册广播接收器
IntentFilter mIntentFilter = new IntentFilter(action);
//mIntentFilter.addAction(IMConstant.ACTION_NEW_MESSAGE);
//mIntentFilter.addAction(IMConstant.ACTION_CHAT_MESSAGE);
registerReceiver(mDataReceiver, mIntentFilter);
super.onStart();
}
@Override
protected void onStop() {
// 取消注册的广播接收器
unregisterReceiver(mDataReceiver);
super.onStop();
}
@Override
public void finish() {
mAbSqliteStorage.release();
super.finish();
}
/**
*
* 描述:发消息
* @param message
* @throws
*/
protected void sendMessage(IMMessage mIMMessage){
//mIMMessage.setSendState(IMMessage.SENDING);
mChatMsgViewAdapter.notifyDataSetChanged();
try{
Message mMessage = new Message();
mMessage.setSubject("会话消息");
// mMessage.setProperty(IMMessage.KEY_TIME, mIMMessage.getTime());
mMessage.setBody(mIMMessage.getContent());
//chat.sendMessage(mMessage);
// mIMMessage.setSendState(IMMessage.SENDED);
mChatMsgViewAdapter.notifyDataSetChanged();
updateData(mIMMessage);
}catch (Exception e){
e.printStackTrace();
// mIMMessage.setSendState(IMMessage.FAILED);
mChatMsgViewAdapter.notifyDataSetChanged();
}
isSendEnable = true;
}
@Override
protected void onResume() {
super.onResume();
}
/**
* 保存消息数据
* @param chatMsg
*/
public void saveMessageData(final IMMessage chatMsg){
mAbSqliteStorage.insertData(chatMsg, mIMMsgDao, new AbDataInsertListener(){
@Override
public void onSuccess(long id) {
//showToast("插入数据成功id="+id);
chatMsg.set_id((int)id);
}
@Override
public void onFailure(int errorCode, String errorMessage) {
AbToastUtil.showToast(ChatActivity.this,errorMessage);
}
});
}
/**
* 查询消息数据
*/
public void queryMsgList(){
//查询数据
AbStorageQuery mAbStorageQuery1 = new AbStorageQuery();
//第一组条件
mAbStorageQuery1.equals("user_name",application.mUser.getUserName());
mAbStorageQuery1.equals("to_user_name",toUserName);
//第二组条件
AbStorageQuery mAbStorageQuery2 = new AbStorageQuery();
mAbStorageQuery2.equals("to_user_name",application.mUser.getUserName());
mAbStorageQuery2.equals("user_name",toUserName);
//组合查询
AbStorageQuery mAbStorageQuery = mAbStorageQuery1.or(mAbStorageQuery2);
//查询
mAbSqliteStorage.findData(mAbStorageQuery, mIMMsgDao, new AbDataSelectListener(){
@Override
public void onFailure(int errorCode, String errorMessage) {
AbToastUtil.showToast(ChatActivity.this,errorMessage);
}
@Override
public void onSuccess(List<?> paramList) {
mChatMsgList.addAll((List<IMMessage>)paramList);
mChatMsgViewAdapter.notifyDataSetChanged();
}
});
}
/**
* 更新消息数据
* @param chatMsg
*/
public void updateData(IMMessage mChatMsg){
mAbSqliteStorage.updateData(mChatMsg, mIMMsgDao, new AbDataUpdateListener(){
@Override
public void onFailure(int errorCode, String errorMessage) {
AbToastUtil.showToast(ChatActivity.this,errorMessage);
}
@Override
public void onSuccess(int rows) {
}
});
}
public void queryUserByName(String userName,final int position){
//查询数据
AbStorageQuery mAbStorageQuery = new AbStorageQuery();
mAbStorageQuery.equals("user_name",userName);
//查询
mAbSqliteStorage.findData(mAbStorageQuery, mUserDao, new AbDataSelectListener(){
@Override
public void onFailure(int errorCode, String errorMessage) {
AbToastUtil.showToast(ChatActivity.this,errorMessage);
}
@Override
public void onSuccess(List<?> paramList) {
if(paramList!=null && paramList.size()>0){
User user = (User)paramList.get(0);
if(user!=null){
IMMessage msg = mChatMsgList.get(position);
//msg.setUser(user);
mChatMsgViewAdapter.notifyDataSetChanged();
}
}
}
});
}
public void startRecording(){
if(mIMRecorder == null){
mIMRecorder = new IMRecorder(this, new IMRecordListener(){
@Override
public void onRecording(){
AbToastUtil.showToast(ChatActivity.this,"正在录音");
}
@Override
public void onPreRecording(){
AbToastUtil.showToast(ChatActivity.this,"准备录音");
}
@Override
public void onFinish(File file, long time){
AbDialogUtil.showAlertDialog(ChatActivity.this,"录音完成", "录音完成,文件在"+file.getPath()+",长度为:"+AbDateUtil.getTimeDescription(time));
}
@Override
public void onError(int errorCode, String errorMessage){
AbToastUtil.showToast(ChatActivity.this,"提示:"+errorMessage);
}
@Override
public void onCancel(){
// TODO Auto-generated method stub
}
});
}
//开始录音
mIMRecorder.startRecording();
}
public void stopRecording(boolean isCancel){
mIMRecorder.stopRecording(isCancel);
}
}