package com.ty.winchat.ui;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Queue;
import java.util.Set;
import net.youmi.android.AdManager;
import net.youmi.android.banner.AdSize;
import net.youmi.android.banner.AdView;
import net.youmi.android.spot.SpotManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.location.Location;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.ty.winchat.R;
import com.ty.winchat.WinChatApplication;
import com.ty.winchat.listener.Listener;
import com.ty.winchat.listener.TCPFileListener;
import com.ty.winchat.listener.inter.IconReceived;
import com.ty.winchat.model.UDPMessage;
import com.ty.winchat.model.User;
import com.ty.winchat.service.ChatService;
import com.ty.winchat.service.ChatService.MyBinder;
import com.ty.winchat.util.Constant;
import com.ty.winchat.util.LocalMemoryCache;
import com.ty.winchat.util.Util;
import com.ty.winchat.widget.PullToRefreshExpandableListView;
import com.ty.winchat.widget.PullToRefreshExpandableListView.OnRefreshListener;
public class Main extends Base implements IconReceived{
private PullToRefreshExpandableListView listView;
private List<User> users=new ArrayList<User>();
private Map<String, Queue<UDPMessage>> messages;
MyServiceConnection connection;
public static MyBinder binder;
private boolean binded;
private MyAdapter adapter;
private UserBroadcastReceiver receiver=new UserBroadcastReceiver();
private Map<String, Message> iconMap=new HashMap<String, Message>();
public static final String ACTION_ADD_USER="com.ty.winchat.adduser";
private TCPFileListener fileListener;
private Handler handler=new Handler(){
public void handleMessage(Message msg) {
try {
//刷新头像
((ImageView)msg.obj).setImageBitmap(Util.getRoundedCornerBitmap(LocalMemoryCache.getInstance().get(msg.getData().getString("key"))));
} catch (Exception e) {
e.printStackTrace();
}
};
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
fileListener=TCPFileListener.getInstance();
if(!fileListener.isRunning()) {
try {
fileListener.open();
fileListener.setIconReceived(this);
} catch (IOException e) {
e.printStackTrace();
}
}
// 加载插播资源
SpotManager.getInstance(this).loadSpotAds();
my();
}
private void my(){
}
@Override
protected void onStart() {
super.onStart();
// SpotManager.getInstance(this).showSpotAds(this);
// SpotManager.getInstance(this).getSpotDialog();
listView.setAdapter(adapter=new MyAdapter());
adapter.notifyDataSetChanged();
if(fileListener!=null)
fileListener.setOnProgressUpdate(null);
}
/**
* 做一些初始化的动作
*/
private void init(){
Intent intent=new Intent(Main.this,ChatService.class);
startService(intent);
bindService(intent, connection=new MyServiceConnection(), Context.BIND_AUTO_CREATE);
IntentFilter filter=new IntentFilter(ACTION_ADD_USER);
registerReceiver(receiver, filter);
listView=(PullToRefreshExpandableListView) findViewById(R.id.main_listview);
TextView view=(TextView) findViewById(R.id.toptextView);
Button set=(Button) findViewById(R.id.right_btn);
view.setText("Wifi-Chat");
set.setText("设置");
set.setVisibility(View.VISIBLE);
set.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(Main.this,com.ty.winchat.ui.Set.class));
}
});
listView.setGroupIndicator(getResources().getDrawable(R.drawable.listview_open_selector));
listView.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
if(binded){
unbindService(connection);
binded=false;
}
Intent intent=new Intent(Main.this,MessageChat.class );
switch (groupPosition) {
case 0:
String ip=WinChatApplication.mainInstance.getLocalIp();
if(ip==null){
showToast("请检测wifi");
return false;
}
intent.putExtra("IP",ip);
intent.putExtra("DeviceCode", WinChatApplication.mainInstance.getDeviceCode());
intent.putExtra("name", WinChatApplication.mainInstance.getMyName());
break;
case 1:
User user=users.get(childPosition);
intent.putExtra("IP",user .getIp());
intent.putExtra("DeviceCode", user.getDeviceCode());
intent.putExtra("name", user.getUserName());
break;
case 2:
intent=new Intent(Main.this,RoomChat.class );
}
startActivity(intent);//跳转到个人聊天界面
return false;
}
});
listView.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
new AsyncTask<Void, Void, Void>() {
protected Void doInBackground(Void... params) {
try {
if(binder!=null)
binder.noticeOnline();
Thread.sleep(300);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
listView.onRefreshComplete();
}
}.execute();
}
});
initad();
}
/**
* 初始化广告
*/
private void initad(){
AdManager.getInstance(this).init(Constant.id,Constant.key, false);
LinearLayout adLayout = (LinearLayout) findViewById(R.id.adLayout);
AdView adView = new AdView(this, AdSize.SIZE_320x50);
adLayout.addView(adView);
}
long oldTime;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
long currentTime=System.currentTimeMillis();
if(currentTime-oldTime<3*1000){
finish();
}else{
showToast("再按一次退出");
oldTime=currentTime;
}
}
return true;
}
@Override
protected void onDestroy() {
super.onDestroy();
if(binded)
unbindService(connection);
stopService(new Intent(Main.this,ChatService.class));
unregisterReceiver(receiver);
if(fileListener!=null)
try {
fileListener.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 用来通知刷新列表
*/
class UserBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(binder!=null){
users.clear();
Set<Entry<String,User>> set=binder.getUsers().entrySet();
for(Entry<String,User> entry:set)
users.add(entry.getValue());
if(adapter==null) {
adapter=new MyAdapter();
listView.setAdapter(adapter);
}
adapter.notifyDataSetChanged();
}else {
unbindService(connection);
binded=false;
bindService(new Intent(Main.this,ChatService.class), connection=new MyServiceConnection(), Context.BIND_AUTO_CREATE);
}
}
}
public class MyServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder=(MyBinder) service;
messages=binder.getMessages();
binded=true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
class MyAdapter extends BaseExpandableListAdapter{
String[] group={"自己","在线","聊天室"};
@Override
public Object getChild(int arg0, int arg1) {
return null;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
holder=new ViewHolder();
convertView=getLayoutInflater().inflate(R.layout.main_listview_child_item, null);
holder.userName=(TextView) convertView.findViewById(R.id.main_listview_child_item_name);
holder.ip=(TextView) convertView.findViewById(R.id.main_listview_child_item_ip);
holder.msgNum=(TextView) convertView.findViewById(R.id.main_listview_child_item_msg_num);
holder.icon=(ImageView) convertView.findViewById(R.id.main_listview_child_item_icon);
convertView.setTag(holder);
}else {
holder=(ViewHolder) convertView.getTag();
}
switch (groupPosition) {
case 0://自己
holder.userName.setText(WinChatApplication.mainInstance.getMyName());
holder.ip.setText(WinChatApplication.mainInstance.getLocalIp());
holder.msgNum.setVisibility(View.INVISIBLE);
Bitmap bitmap=LocalMemoryCache.getInstance().get(com.ty.winchat.ui.Set.iconName);
if(bitmap==null){
bitmap=BitmapFactory.decodeFile(WinChatApplication.iconPath com.ty.winchat.ui.Set.iconName);
if(bitmap!=null){
holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap));
LocalMemoryCache.getInstance().put(com.ty.winchat.ui.Set.iconName, bitmap);
}else {
holder.icon.setImageResource(R.drawable.ic_launcher);
}
}else{
holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap));
}
break;
case 1://在线
User user=users.get(childPosition);
holder.userName.setText(user.getUserName());
holder.ip.setText(user.getIp());
Queue<UDPMessage> msgs=messages.get(user.getIp());
if(msgs!=null&&msgs.size()>0){
holder.msgNum.setVisibility(View.VISIBLE);
holder.msgNum.setText(msgs.size() "");
}else {
holder.msgNum.setVisibility(View.INVISIBLE);
}
Bitmap bitmap1=LocalMemoryCache.getInstance().get(user.getDeviceCode());//用设备id来标识唯一头像
if(bitmap1==null){//内存中没有
bitmap1=BitmapFactory.decodeFile(WinChatApplication.iconPath user.getDeviceCode());//从硬盘上获取
if(bitmap1!=null){
holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap1));
LocalMemoryCache.getInstance().put(user.getDeviceCode(), bitmap1);//放进缓存
if(!user.isRefreshIcon()){//第一次展示则再次请求刷新
reFreashIcon(user, holder.icon);
}
}else {//磁盘也没有,则发送消息获取
holder.icon.setImageResource(R.drawable.ic_launcher);
reFreashIcon(user, holder.icon);
}
}else {
holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap1));
if(!user.isRefreshIcon()){//第一次展示则再次请求刷新
reFreashIcon(user, holder.icon);
}
}
break;
case 2://聊天室
Bitmap bitmap2=BitmapFactory.decodeResource(getResources(), R.drawable.all_people_icon);
holder.icon.setImageBitmap(Util.getRoundedCornerBitmap(bitmap2));
holder.userName.setText("所有");
holder.ip.setText("接收所有在线人消息");
msgs=messages.get(Constant.ALL_ADDRESS);
if(msgs!=null&&msgs.size()>0){
holder.msgNum.setVisibility(View.VISIBLE);
holder.msgNum.setText(msgs.size() "");
}else {
holder.msgNum.setVisibility(View.INVISIBLE);
}
break;
}
return convertView;
}
/**
* 请求图片
* @param user
* @param view
*/
private void reFreashIcon(User user,ImageView view){
if(binder!=null)
try {
UDPMessage message=WinChatApplication.mainInstance.getMyUdpMessage("", Listener.REQUIRE_ICON);
binder.sendMsg(message, InetAddress.getByName(user.getIp()));
Message msg=handler.obtainMessage();
msg.obj=view;
iconMap.put(user.getDeviceCode(), msg);//记录当前位置的ImageView对象
user.setRefreshIcon(true);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
@Override
public int getChildrenCount(int groupPosition) {
switch (groupPosition) {
case 0:
return 1;
case 1:
return users.size();
case 2:
return 1;
}
return 0;
}
@Override
public Object getGroup(int groupPosition) {
return null;
}
@Override
public int getGroupCount() {
return group.length;
}
@Override
public long getGroupId(int groupPosition) {
return 0;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
holder=new ViewHolder();
convertView=getLayoutInflater().inflate(R.layout.main_listview_group_item, null);
holder.userName=(TextView) convertView.findViewById(R.id.txt);
holder.ip=(TextView) convertView.findViewById(R.id.num);
convertView.setTag(holder);
}else {
holder=(ViewHolder) convertView.getTag();
}
holder.userName.setText(group[groupPosition]);
if(groupPosition==0){
holder.ip.setText("[1]");
}else if(groupPosition==1){
holder.ip.setText("[" users.size() "]");
}else if(groupPosition==2){
holder.ip.setText("[1]");
}
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
class ViewHolder{
TextView userName;
TextView ip;
TextView msgNum;
ImageView icon;
}
@Override
public void iconReceived(String fileName) {
Message msg=iconMap.get(fileName);
if(msg!=null){
Bitmap bitmap=BitmapFactory.decodeFile(WinChatApplication.iconPath fileName);
if(bitmap!=null){
LocalMemoryCache.getInstance().put(fileName, bitmap);
Bundle bundle=new Bundle();
bundle.putString("key", fileName);
msg.setData(bundle);
handler.sendMessage(msg);
}
}
}
}
评论