package com.mailssenger.activity; import com.mailssenger.R; import java.util.ArrayList; import java.util.List; 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.KeyEvent; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnKeyListener; import android.view.View.OnTouchListener; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import com.google.gson.Gson; import com.mailssenger.CommonApplication; import com.mailssenger.adapter.MessageAdapter; import com.mailssenger.db.MsgDB; import com.mailssenger.db.ConvDB; import com.mailssenger.db.UserDB; import com.mailssenger.mail.MailSender; import com.mailssenger.model.ConvModel; import com.mailssenger.model.MsgModel; import com.mailssenger.model.UserModel; import com.mailssenger.push.MyPushMessageReceiver; import com.mailssenger.util.L; import com.mailssenger.util.SharedPreferencesUtil; import com.mailssenger.util.SendMsgAsyncTask; import com.mailssenger.util.T; import com.mailssenger.util.UIHelper; import com.mailssenger.xlistview.MsgListView; import com.mailssenger.xlistview.MsgListView.IXListViewListener; public class ChatActivity extends BaseActivity implements MyPushMessageReceiver.EventHandler, OnTouchListener, OnClickListener, IXListViewListener { private static String TAG = " >ChatActivity"; public static final int NEW_MESSAGE = 0x001;// 收到消息 private static int MsgPagerNum; // private Button sendBtn; private ImageButton mailBtn; private boolean isFaceShow; private EditText msgEt; //输入法管理器 private WindowManager.LayoutParams params; private InputMethodManager imm; private List<String> keys; private MessageAdapter msgAdapter; private MsgListView mMsgListView; private UserModel hisUserModel; private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { if (msg.what == NEW_MESSAGE) { } //收动新信息 // String message = (String) msg.obj; MsgModel chatMessage = (MsgModel) msg.obj; //如果能跟用户聊天,那么数据库中一定有该用户 String hisEmail = chatMessage.getReceiver(); //只处理自己的信息 if (!hisEmail.equals(hisUserModel.getEmail()))// 如果不是当前正在聊天对象的消息,不处理 return; if(chatMessage.getMsgType() == MsgModel.MESSAGE_TYPE_TEXT){ msgAdapter.upDateMsg(chatMessage); //信息 发给谁,谁发来 // 发出去的时候,email 存接收人邮箱地址,isCome =false // 接收信息的时候,email 为发送人地址, isCome = true //以上为错误思想,无法解决 当他接收我发送消息,他无法知道是谁发给他的 //发送消息的时候,写自己的地址 L.e(TAG,mGson.toJson(chatMessage)); L.e(TAG,"save msg"); mMsgDB.save(chatMessage); ConvModel recentItem = new ConvModel(); recentItem.setEmail(hisEmail); recentItem.setName(hisUserModel.getNickName()); recentItem.setMessage(chatMessage.getMessage()); recentItem.setNewNum(0); recentItem.setTime(System.currentTimeMillis()); mConvDB.saveOrUpdate(recentItem); } if(chatMessage.getMsgType() < MsgModel.MESSAGE_TYPE_MAIL){ } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.chat_main); hisUserModel = (UserModel) getIntent().getSerializableExtra("user"); if (hisUserModel == null) {// 如果为空,直接关闭 finish(); } setTitle(hisUserModel.getNickName()); MsgPagerNum = 0; msgAdapter = new MessageAdapter(this, initMsgData(),hisUserModel); initView(); L.e(mSpUtil.getEmail()); mUserDB =CommonApplication.getInstance().getUserDB(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } @Override public void onResume() { // TODO Auto-generated method stub super.onResume(); // mHomeWatcher = new HomeWatcher(this); // mHomeWatcher.setOnHomePressedListener(this); // mHomeWatcher.startWatch(); MyPushMessageReceiver.ehList.add(this);// 监听推送的消息 L.e(TAG,"I am resume"); System.out.println(MyPushMessageReceiver.ehList); } @Override public void onPause() { // TODO Auto-generated method stub imm.hideSoftInputFromWindow(msgEt.getWindowToken(), 0); super.onPause(); // mHomeWatcher.setOnHomePressedListener(null); // mHomeWatcher.stopWatch(); MyPushMessageReceiver.ehList.remove(this);// 移除监听 L.e(TAG,"I am paused"); System.out.println(MyPushMessageReceiver.ehList); } /** * 加载消息历史,从数据库中读出 */ private List<MsgModel> initMsgData() { List<MsgModel> list = mMsgDB.getAllMsgWith(hisUserModel.getEmail()); Log.i(TAG,"number of msg is "+list.size()); List<MsgModel> msgList = new ArrayList<MsgModel>();// 消息对象数组 // if (list.size() > 0) { // for (MessageModel entity : list) { // if (entity.getEmail().equals("")) { // entity.setEmail(hisUserModel.getEmail()); // } // if (entity.getHeadImg() < 0) { // entity.setHeadImg(hisUserModel.getHeadIcon()); // } // msgList.add(entity); // } // } return list; } private void initView() { // TODO Auto-generated method stub imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); params = getWindow().getAttributes(); mMsgListView = (MsgListView) findViewById(R.id.msg_listView); // 触摸ListView隐藏表情和输入法 mMsgListView.setOnTouchListener(this); mMsgListView.setPullLoadEnable(false); mMsgListView.setXListViewListener(this); mMsgListView.setAdapter(msgAdapter); mMsgListView.setSelection(msgAdapter.getCount() - 1); sendBtn = (Button) findViewById(R.id.send_btn); mailBtn = (ImageButton) findViewById(R.id.face_btn); msgEt = (EditText) findViewById(R.id.msg_et); //Action bar // msgEt.setOnTouchListener(this); // mTitle = (TextView) findViewById(R.id.ivTitleName); // mTitle.setText(hisUserModel.getNick()); // mTitleLeftBtn = (TextView) findViewById(R.id.ivTitleBtnLeft); // mTitleLeftBtn.setVisibility(View.VISIBLE); // // mTitleRightBtn = (TextView) findViewById(R.id.ivTitleBtnRigh); // mTitleLeftBtn.setOnClickListener(this); // mTitleRightBtn.setOnClickListener(this); msgEt.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_BACK) { if (params.softInputMode == WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) { // faceLinearLayout.setVisibility(View.GONE); // isFaceShow = false; // imm.showSoftInput(msgEt, 0); return true; } } return false; } }); msgEt.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } @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 if (s.length() > 0) { sendBtn.setEnabled(true); } else { sendBtn.setEnabled(false); } } }); mailBtn.setOnClickListener(this); sendBtn.setOnClickListener(this); } @Override public void onBind(String method, int errorCode, String content) { // TODO Auto-generated method stub } @Override public void onNotify(String title, String content) { // TODO Auto-generated method stub } @Override public void onNetChange(boolean isNetConnected) { // TODO Auto-generated method stub if (!isNetConnected) T.showShort(this, "网络连接已断开"); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.face_btn: if (!isFaceShow) { // imm.hideSoftInputFromWindow(msgEt.getWindowToken(), 0); // try { // Thread.sleep(80);// 解决此时会黑一下屏幕的问题 // } catch (InterruptedException e) { // e.printStackTrace(); // } // faceLinearLayout.setVisibility(View.VISIBLE); isFaceShow = true; mailBtn.setImageResource(R.drawable.unibirham_email); } else { // faceLinearLayout.setVisibility(View.GONE); isFaceShow = false; mailBtn.setImageResource(R.drawable.pop_btn_face_selector); } break; case R.id.send_btn:// 发送消息 String msg = msgEt.getText().toString(); //如果用户的user id 不为空,否则默认邮件发送 if((hisUserModel.getUserId() != null)){ if (isFaceShow) { new Thread(sendMailRunnable).start(); break; } //发送信息, //我发给对方,当然要写上自己的地址啊! //这样对方收到才知道是我发给她的啊 //但是在只有发送方的地址的情况下,必须分开表 MsgModel msgItem = new MsgModel(); msgItem.setSender(mSpUtil.getEmail()); msgItem.setReceiver(hisUserModel.getEmail()); msgItem.setMsgType(MsgModel.MESSAGE_TYPE_TEXT); msgItem.setMessage(msg); msgItem.setTime(System.currentTimeMillis()); msgAdapter.upDateMsg(msgItem); // if (msgAdapter.getCount() - 10 > 10) { // L.i("begin to remove..."); // msgAdapter.removeHeadMsg(); // MsgPagerNum--; // } mMsgListView.setSelection(msgAdapter.getCount() - 1); //存信息,为自己发的信息,email 设为对方的地址,isCome 为false mMsgDB.save(msgItem); msgEt.setText(""); L.e(mGson.toJson(msgItem)); //发送信息 new SendMsgAsyncTask(mGson.toJson(msgItem), hisUserModel.getUserId()) .send(); ConvModel recentItem = new ConvModel(hisUserModel.getEmail(), hisUserModel.getAvatar(), hisUserModel.getNickName(), msg, 0, System.currentTimeMillis()); mConvDB.saveOrUpdate(recentItem); }else{ // 直接邮件发送 new Thread(sendMailRunnable).start(); } break; // case R.id.ivTitleBtnLeft: // finish(); // break; // case R.id.ivTitleBtnRigh: // break; default: break; } } @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.msg_listView: // imm.hideSoftInputFromWindow(msgEt.getWindowToken(), 0); // faceLinearLayout.setVisibility(View.GONE); // isFaceShow = false; break; case R.id.msg_et: // imm.showSoftInput(msgEt, 0); // faceLinearLayout.setVisibility(View.GONE); // isFaceShow = false; break; default: break; } return false; } @Override public void onNewFriend(UserModel u) { // TODO Auto-generated method stub } @Override public void onRefresh() { // TODO Auto-generated method stub MsgPagerNum++; List<MsgModel> msgList = initMsgData(); int position = msgAdapter.getCount(); msgAdapter.setMessageList(msgList); mMsgListView.stopRefresh(); mMsgListView.setSelection(msgAdapter.getCount() - position - 1); L.i("MsgPagerNum = " + MsgPagerNum + ", msgAdapter.getCount() = " + msgAdapter.getCount()); } //下拉载入更多 @Override public void onLoadMore() { // TODO Auto-generated method stub } //收到聊天信息 @Override public void onChatMessage(MsgModel chatMessage) { //obtainMessage() //Value to assign to the returned Message.what field. Message handlerMsg = handler.obtainMessage(NEW_MESSAGE); handlerMsg.obj = chatMessage; handler.sendMessage(handlerMsg); } Runnable sendMailRunnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub //try to send email MailSender sender = new MailSender(CommonApplication.SACCOUNT,CommonApplication.PASSWORD); Log.e("Birham : sendMail", "I am in run"); String header = "Dear " +hisUserModel.getNickName() +"\n"; String content = msgEt.getText().toString(); String footer = "\n\nBest wishes\n" + mSpUtil.getNick() +"\n"; String infoString ="\n\n=======\n This mail is send by Mailssenger"; String mailContent = header +content +footer+infoString; try { String senderEmailAddr = "\""+mSpUtil.getNick()+"\"<"+mSpUtil.getEmail()+">"; String recieverEmailAddr = "\""+hisUserModel.getEmail()+"\"<"+hisUserModel.getEmail()+">"; sender.sendMail(" no topic ", mailContent, senderEmailAddr, recieverEmailAddr, "", ""); T.dShowLong(context, "Mail has been send successfully!"); // MailModel mailModel = new MailModel(); // mailModel.setSubject("no topic"); // mailModel.setContent( mailContent); // ChatMessageItem chatMessage = new ChatMessageItem(); // chatMessage.setEmail(mSpUtil.getEmail()); // chatMessage.setMsgType(ChatMessageItem.MESSAGE_TYPE_MAIL); // chatMessage.setCome(false); // chatMessage.setNew(false); // chatMessage.setTime(System.currentTimeMillis()); // chatMessage.setMessage(message); // // msgAdapter.upDateMsg(chatMessage); // // //信息 发给谁,谁发来 // // 发出去的时候,email 存接收人邮箱地址,isCome =false // // 接收信息的时候,email 为发送人地址, isCome = true // //以上为错误思想,无法解决 当他接收我发送消息,他无法知道是谁发给他的 // L.e(TAG,mGson.toJson(chatMessage)); // L.e(TAG,"save msg"); // mMsgDB.saveMsg(hisEmail, chatMessage); // // RecentConversationModel recentItem = new RecentConversationModel(); // recentItem.setEmail(hisEmail); // recentItem.setName(hisUserModel.getNickName()); // recentItem.setMessage(chatMessage.getMessage()); // recentItem.setNewNum(0); // recentItem.setTime(System.currentTimeMillis()); // // mConvDB.saveRecent(recentItem); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } // Toast.makeText(context, "Mail sending thread is running!", // Toast.LENGTH_LONG).show(); } }; @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case android.R.id.home: this.finish(); break; } return super.onOptionsItemSelected(item); } }