package com.ccf.feige.activity; import java.io.File; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import com.ccf.feige.adapter.ChatListAdapter; import com.ccf.feige.data.ChatMessage; import com.ccf.feige.interfaces.ReceiveMsgListener; import com.ccf.feige.net.NetTcpFileSendThread; import com.ccf.feige.utils.IpMessageConst; import com.ccf.feige.utils.IpMessageProtocol; import com.ccf.feige.utils.UsedConst; import android.content.Intent; import android.os.Bundle; import android.os.Message; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; /** * ���촰��activity * @author ccf * * 2012/2/21 * */ public class MyFeiGeChatActivity extends MyFeiGeBaseActivity implements OnClickListener,ReceiveMsgListener{ // private NetThreadHelper netThreadHelper; // private ImageView chat_item_head; //ͷ�� private TextView chat_name; //���ּ�IP private TextView chat_mood; //���� private Button chat_quit; //�˳���ť private ListView chat_list; //�����б� private EditText chat_input; //��������� private Button chat_send; //���Ͱ�ť private List<ChatMessage> msgList; //������ʾ����Ϣlist private String receiverName; //Ҫ���ձ�activity�����͵���Ϣ���û����� private String receiverIp; //Ҫ���ձ�activity�����͵���Ϣ���û�IP private String receiverGroup; //Ҫ���ձ�activity�����͵���Ϣ���û����� private ChatListAdapter adapter; //ListView��Ӧ��adapter private String selfName; private String selfGroup; private final static int MENU_ITEM_SENDFILE = Menu.FIRST; //�����ļ� private final static int MENU_ITEM_EXIT = Menu.FIRST + 1; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.chat); findViews(); // netThreadHelper = NetThreadHelper.newInstance(); msgList = new ArrayList<ChatMessage>(); Intent intent = getIntent(); Bundle bundle = intent.getExtras(); receiverName = bundle.getString("receiverName"); receiverIp = bundle.getString("receiverIp"); receiverGroup = bundle.getString("receiverGroup"); selfName = "android�ɸ�"; selfGroup = "android"; chat_name.setText(receiverName + "(" + receiverIp + ")"); chat_mood.setText("������" + receiverGroup); chat_quit.setOnClickListener(this); chat_send.setOnClickListener(this); Iterator<ChatMessage> it = netThreadHelper.getReceiveMsgQueue().iterator(); while(it.hasNext()){ //ѭ����Ϣ���У���ȡ�������뱾����activity�����Ϣ ChatMessage temp = it.next(); //����Ϣ�����еķ������뱾activity����Ϣ������IP��ͬ���������Ϣ�ó�����ӵ���activityҪ��ʾ����Ϣlist�� if(receiverIp.equals(temp.getSenderIp())){ msgList.add(temp); //��ӵ���ʾlist it.remove(); //������Ϣ����Ϣ�������Ƴ� } } adapter = new ChatListAdapter(this, msgList); chat_list.setAdapter(adapter); netThreadHelper.addReceiveMsgListener(this); //ע�ᵽlisteners } private void findViews(){ // chat_item_head = (ImageView) findViewById(R.id.chat_item_head); chat_name = (TextView) findViewById(R.id.chat_name); chat_mood = (TextView) findViewById(R.id.chat_mood); chat_quit = (Button) findViewById(R.id.chat_quit); chat_list = (ListView) findViewById(R.id.chat_list); chat_input = (EditText) findViewById(R.id.chat_input); chat_send = (Button) findViewById(R.id.chat_send); } @Override public void processMessage(Message msg) { // TODO Auto-generated method stub switch(msg.what){ case IpMessageConst.IPMSG_SENDMSG: adapter.notifyDataSetChanged(); //ˢ��ListView break; case IpMessageConst.IPMSG_RELEASEFILES:{ //�ܾ������ļ�,ֹͣ�����ļ��߳� if(NetTcpFileSendThread.server != null){ try { NetTcpFileSendThread.server.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } break; case UsedConst.FILESENDSUCCESS:{ //�ļ����ͳɹ� makeTextShort("�ļ����ͳɹ�"); } break; } //end of switch } @Override public boolean receive(ChatMessage msg) { // TODO Auto-generated method stub if(receiverIp.equals(msg.getSenderIp())){ //����Ϣ�뱾activity�йأ������ msgList.add(msg); //������Ϣ��ӵ���ʾlist�� sendEmptyMessage(IpMessageConst.IPMSG_SENDMSG); //ʹ��handle֪ͨ��������UI MyFeiGeBaseActivity.playMsg(); return true; } return false; } @Override public void finish() { // TODO Auto-generated method stub //һ��Ҫ�Ƴ�����Ȼ��Ϣ���ջ�������� netThreadHelper.removeReceiveMsgListener(this); super.finish(); } @Override public void onClick(View v) { // TODO Auto-generated method stub if(v == chat_send){ sendAndAddMessage(); }else if(v == chat_quit){ finish(); } } /** * ������Ϣ��������Ϣ��ӵ�UI��ʾ */ private void sendAndAddMessage(){ String msgStr = chat_input.getText().toString().trim(); if(!"".equals(msgStr)){ //������Ϣ IpMessageProtocol sendMsg = new IpMessageProtocol(); sendMsg.setVersion(String.valueOf(IpMessageConst.VERSION)); sendMsg.setSenderName(selfName); sendMsg.setSenderHost(selfGroup); sendMsg.setCommandNo(IpMessageConst.IPMSG_SENDMSG); sendMsg.setAdditionalSection(msgStr); InetAddress sendto = null; try { sendto = InetAddress.getByName(receiverIp); } catch (UnknownHostException e) { // TODO Auto-generated catch block Log.e("MyFeiGeChatActivity", "���͵�ַ����"); } if(sendto != null) netThreadHelper.sendUdpData(sendMsg.getProtocolString() + "\0", sendto, IpMessageConst.PORT); //�����Ϣ����ʾlist ChatMessage selfMsg = new ChatMessage("localhost", selfName, msgStr, new Date()); selfMsg.setSelfMsg(true); //����Ϊ������Ϣ msgList.add(selfMsg); }else{ makeTextShort("���ܷ��Ϳ�����"); } chat_input.setText(""); adapter.notifyDataSetChanged();//����UI } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub super.onCreateOptionsMenu(menu); menu.add(0, MENU_ITEM_SENDFILE, 0, "�����ļ�"); menu.add(0, MENU_ITEM_EXIT, 0, "�˳�"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch(item.getItemId()){ case MENU_ITEM_SENDFILE: Intent intent = new Intent(this, MyFeiGeFileActivity.class); startActivityForResult(intent, 0); break; case MENU_ITEM_EXIT: finish(); break; } return super.onOptionsItemSelected(item); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if(resultCode == RESULT_OK){ //�õ������ļ���·�� Bundle bundle = data.getExtras(); String filePaths = bundle.getString("filePaths"); //�����ļ���Ϣ��,����ļ�ʹ��"\0"���зָ� // Toast.makeText(this, filePaths, Toast.LENGTH_SHORT).show(); String[] filePathArray = filePaths.split("\0"); //���ʹ����ļ�UDP���ݱ� IpMessageProtocol sendPro = new IpMessageProtocol(); sendPro.setVersion("" +IpMessageConst.VERSION); sendPro.setCommandNo(IpMessageConst.IPMSG_SENDMSG | IpMessageConst.IPMSG_FILEATTACHOPT); sendPro.setSenderName(selfName); sendPro.setSenderHost(selfGroup); String msgStr = ""; //���͵���Ϣ StringBuffer additionInfoSb = new StringBuffer(); //������ϸ����ļ���ʽ��sb for(String path:filePathArray){ File file = new File(path); additionInfoSb.append("0:"); additionInfoSb.append(file.getName() + ":"); additionInfoSb.append(Long.toHexString(file.length()) + ":"); //�ļ���Сʮ�����Ʊ�ʾ additionInfoSb.append(Long.toHexString(file.lastModified()) + ":"); //�ļ�����ʱ�䣬������ʱ������޸�ʱ����� additionInfoSb.append(IpMessageConst.IPMSG_FILE_REGULAR + ":"); byte[] bt = {0x07}; //���ڷָ���������ļ����ַ� String splitStr = new String(bt); additionInfoSb.append(splitStr); } sendPro.setAdditionalSection(msgStr + "\0" + additionInfoSb.toString() + "\0"); InetAddress sendto = null; try { sendto = InetAddress.getByName(receiverIp); } catch (UnknownHostException e) { // TODO Auto-generated catch block Log.e("MyFeiGeChatActivity", "���͵�ַ����"); } if(sendto != null) netThreadHelper.sendUdpData(sendPro.getProtocolString(), sendto, IpMessageConst.PORT); //����2425�˿ڣ�׼������TCP�������� Thread netTcpFileSendThread = new Thread(new NetTcpFileSendThread(filePathArray)); netTcpFileSendThread.start(); //�����߳� } } }