package com.ccf.feige.activity; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Queue; import org.apache.http.conn.util.InetAddressUtils; import com.ccf.feige.adapter.UserExpandableListAdapter; import com.ccf.feige.data.ChatMessage; import com.ccf.feige.data.User; import com.ccf.feige.utils.IpMessageConst; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.Message; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ExpandableListView; import android.widget.TextView; import android.widget.Toast; public class MyFeiGeActivity extends MyFeiGeBaseActivity implements OnClickListener{ public static String hostIp; private ExpandableListView userList; private UserExpandableListAdapter adapter; private List<String> strGroups; //����һ���˵����Ƽ��� private List<List<User>> children; private TextView totalUser; private Button refreshButton; private TextView ipTextView;; /** Called when the activity is first created. */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); if(!isWifiActive()){ //��wifiû�д򿪣���ʾ Toast.makeText(this, R.string.no_wifi, Toast.LENGTH_LONG).show(); } findViews(); strGroups = new ArrayList<String>(); //����һ���˵����Ƽ��� children = new ArrayList<List<User>>(); // netThreadHelper = NetThreadHelper.newInstance(); netThreadHelper.connectSocket(); //��ʼ�������� netThreadHelper.noticeOnline(); //�㲥���� adapter = new UserExpandableListAdapter(this, strGroups, children); userList.setAdapter(adapter); refreshButton.setOnClickListener(this); refreshViews(); } @Override public void finish() { // TODO Auto-generated method stub super.finish(); netThreadHelper.noticeOffline(); //֪ͨ���� netThreadHelper.disconnectSocket(); //ֹͣ���� } private void findViews() { // TODO Auto-generated method stub totalUser =(TextView) findViewById(R.id.totalUser); userList = (ExpandableListView) findViewById(R.id.userlist); refreshButton = (Button) findViewById(R.id.refresh); ipTextView = (TextView) findViewById(R.id.mymood); hostIp = getLocalIpAddress(); ipTextView.setText(hostIp); //����IP } @Override public void processMessage(Message msg) { // TODO Auto-generated method stub switch(msg.what){ case IpMessageConst.IPMSG_BR_ENTRY: case IpMessageConst.IPMSG_BR_EXIT: case IpMessageConst.IPMSG_ANSENTRY: case IpMessageConst.IPMSG_SENDMSG: refreshViews(); break; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_BACK) exit(); return true; } //�������ݺ�UI��ʾ private void refreshViews(){ //������� strGroups.clear(); children.clear(); Map<String,User> currentUsers = new HashMap<String, User>(); currentUsers.putAll(netThreadHelper.getUsers()); Queue<ChatMessage> msgQueue = netThreadHelper.getReceiveMsgQueue(); Map<String, Integer> ip2Msg = new HashMap<String, Integer>(); //IP��ַ��δ����Ϣ������map //������Ϣ���У����ip2Msg Iterator<ChatMessage> it = msgQueue.iterator(); while(it.hasNext()){ ChatMessage chatMsg = it.next(); String ip = chatMsg.getSenderIp(); //�õ���Ϣ������IP Integer tempInt = ip2Msg.get(ip); if(tempInt == null){ //��map��û��IP��Ӧ����Ϣ����,���IP��ӽ�ȥ,ֵΪ1 ip2Msg.put(ip, 1); }else{ //���Ѿ��ж�Ӧip������ֵ��һ ip2Msg.put(ip, ip2Msg.get(ip)+1); } } //����currentUsers,����strGroups��children Iterator<String> iterator = currentUsers.keySet().iterator(); while (iterator.hasNext()) { User user = currentUsers.get(iterator.next()); //����ÿ�������û���Ӧ��δ����Ϣ���� if(ip2Msg.get(user.getIp()) == null){ user.setMsgCount(0); }else{ user.setMsgCount(ip2Msg.get(user.getIp())); } String groupName = user.getGroupName(); int index = strGroups.indexOf(groupName); if(index == -1){ //û����Ӧ���飬����ӷ��飬����Ӷ�Ӧchild strGroups.add(groupName); // List<Map<String,String>> childData = new ArrayList<Map<String,String>>(); // Map<String, String> child = new HashMap<String,String>(); // child.put("userName", user.getUserName()); // childData.add(child); // children.add(childData); List<User> childData = new ArrayList<User>(); childData.add(user); children.add(childData); }else{ //�Ѵ��ڷ��飬�򽫶�Ӧchild��ӵ����Ӧ������ // Map<String,String> child = new HashMap<String,String>(); // child.put("userName", user.getUserName()); // children.get(index).add(child); children.get(index).add(user); } } //����groups // for(int i = 0; i < strGroups.size(); i++){ // Map<String,String> groupMap = new HashMap<String,String>(); // groupMap.put("group", strGroups.get(i)); // groups.add(groupMap); // } adapter.notifyDataSetChanged(); //����ExpandableListView String countStr = "��ǰ����" + currentUsers.size() +"���û�"; totalUser.setText(countStr); //����TextView } @Override public void onClick(View v) { // TODO Auto-generated method stub if(v.equals(refreshButton)){ //����ˢ�� netThreadHelper.refreshUsers(); refreshViews(); } } //�ж�wifi�Ƿ�� public boolean isWifiActive(){ ConnectivityManager mConnectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if(mConnectivity != null){ NetworkInfo[] infos = mConnectivity.getAllNetworkInfo(); if(infos != null){ for(NetworkInfo ni: infos){ if("WIFI".equals(ni.getTypeName()) && ni.isConnected()) return true; } } } return false; } //�õ�����IP��ַ public String getLocalIpAddress(){ try{ Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); while(en.hasMoreElements()){ NetworkInterface nif = en.nextElement(); Enumeration<InetAddress> enumIpAddr = nif.getInetAddresses(); while(enumIpAddr.hasMoreElements()){ InetAddress mInetAddress = enumIpAddr.nextElement(); if(!mInetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(mInetAddress.getHostAddress())){ return mInetAddress.getHostAddress().toString(); } } } }catch(SocketException ex){ Log.e("MyFeiGeActivity", "��ȡ����IP��ַʧ��"); } return null; } //��ȡ����MAC��ַ public String getLocalMacAddress(){ WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); return info.getMacAddress(); } }