Activity

来源:互联网 发布:php微信开发流程 编辑:程序博客网 时间:2024/06/09 17:14
package activity;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import org.json.JSONException;import org.json.JSONObject;import com.example.chatsysdemo.R;import synProcess.LocalDataProcess;import messageClasses.ChatContentMessage;import messageClasses.Friends;import messageClasses.Message;import messageClasses.MsgViewContainer;import messageClasses.MyAdapter;import messageClasses.OnlineStatusChangeMessage;import commontool.CommonFunctions;import commontool.Constants;import commontool.Controller;import commontool.DataController;import ServerInteract.HttpRequestServer;import ServerInteract.SocketInteractServer;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.view.KeyEvent;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.TextView;public class ActChat extends Activity {public static final String TAG = "ActChat";private final static int TIMEINTEVAL=15;  //5秒没人操作则自动获取服务器的数据发private final static int GETRESPONSE=1;    private int autoMsgNum;    private Friends friend;    private EditText edtMsg;private TextView tvGuest;private TextView tvStatus;private Button btnSend;private ListView lvMessage;    private String lastMsgString="";    private boolean isReportGenerated=false;//private SimpleAdapter listItemAdapter;//private ArrayList<HashMap<String, Object>> listItem;private MyAdapter myAdapter;private ImageView ivHead;private boolean isResponsed=false;  //  private ArrayList<String> topicList;    private String selectedTopic="null";    SocketInteractServer msgSocket = null;private MySMSReceiver smsReceiver = null;AutoSendMsg autoSendMsg;// 保存新的消息,用于之后将新的消息记录保存到数据库中private ArrayList<ChatContentMessage> newMessageList = new ArrayList<ChatContentMessage>();    private  int times=TIMEINTEVAL;//无操作时间三十秒则选择自聊天    private boolean timeLock=true;        public synchronized boolean isTimeLocked()    {    return timeLock;    }        public synchronized void  lock()    {    timeLock=true;    }        public synchronized void  unlock()    {    timeLock=false;    }    public  synchronized void resetTime(){times=TIMEINTEVAL;}public  synchronized void resetTime(int t){times=t;}public  synchronized void minusTime(){times--;}Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {if(msg.what==GETRESPONSE){String content=msg.obj.toString();Log.v(TAG, "handle接受到自动聊天内荣:(待发送)"+content);sendMsg(content);    autoMsgNum--;    if(0==autoMsgNum)    {    sendMsg("/*/over/*/");    autoSendMsg.endThread();    generateChatReport();    }}}};public class AutoSendMsg implements Runnable{private boolean isContinue=true;@Overridepublic void run() {// TODO Auto-generated method stubwhile (isContinue) {try {    Thread.sleep(1000);//线程暂停10秒,单位毫秒if(isTimeLocked())continue;minusTime();if(times==0 || isResponsed==true){if(isResponsed==true){   //  isResponsed=false;  //等待从服务器获得数据发送数lock(); //停止计数器    new Thread(new GetServerMsgThread()).run();}resetTime();}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}CommonFunctions.generateLogV(TAG, "停止AutoSendMsg线程");}public void endThread(){isContinue=false;}}public class  GetServerMsgThread implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stub//向服务器请求获得自聊天消息Log.v(TAG, "向服务器请求聊天内容");HttpRequestServer requestServer = new HttpRequestServer();JSONObject jobj = null;try {if(selectedTopic.equals("null")){Log.v(TAG,"所选话题为空!");selectedTopic="天气";}jobj=requestServer.getAutoChatMsg(Controller.getUserId(), selectedTopic, lastMsgString);Log.v(TAG, "获得聊天内容:"+jobj.toString());} catch (Exception e) {// TODO Auto-generated catch blockLog.v(TAG, "error");e.printStackTrace();unlock();}if(jobj==null)return ;String content="null";try {content = (String) jobj.get(Constants.MESSAGE_CONTENT);CommonFunctions.generateLogV(TAG, content);} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();unlock();}int len=CommonFunctions.generateRandamNum(6, 12);try {Thread.sleep(len*1000);  //延迟} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}handler.obtainMessage(GETRESPONSE, content).sendToTarget();}}@Overrideprotected void onPause() {// TODO Auto-generated method stubLog.v(TAG, "onPause");super.onPause();}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.v(TAG, "onCreate");setContentView(R.layout.chat);getInstance();fillAdapter();// 添加并且显示//lvMessage.setAdapter(listItemAdapter);lvMessage.setAdapter(myAdapter);btnSend.setOnClickListener(new btnSendClickOmpl());IntentFilter myIntentFilter = new IntentFilter();myIntentFilter.addAction(Constants.SMS_RECEIVER_CHAT);smsReceiver = new MySMSReceiver();registerReceiver(smsReceiver, myIntentFilter);if(Controller.getChatStatus().equals("Positive"))isResponsed=true;//可主动发起聊天else {isResponsed=false;//不可主动发起聊天}if(friend!=null && friend.type!=1){autoMsgNum=5; //自动交流10句之后停止并生成报告unlock();autoSendMsg=new  AutoSendMsg();    new Thread(autoSendMsg).start();}    Controller.setCurrentActivity(TAG);}private void getInstance() {Intent requestIntent = getIntent();int userId = requestIntent.getIntExtra(Constants.USER_ID,-1);friend=Controller.getFriendbyId(userId);        if(friend==null)        {        friend=new Friends(userId, "null", "1", Constants.ONLINE);        friend.type=2;        }//还得设置头像tvGuest = (TextView) findViewById(R.id.tvguestName);tvStatus=(TextView) findViewById(R.id.tvguestStatus);tvStatus.setText(friend.status);ivHead=(ImageView)findViewById(R.id.guestImage);ivHead.setImageResource(DataController.head[Integer.parseInt(friend.headImageUrl)]);if(friend.status.equals(Constants.OFFLINE))ivHead.setImageAlpha(100);edtMsg = (EditText) findViewById(R.id.editMessage);btnSend = (Button) findViewById(R.id.buttonSend);lvMessage = (ListView) findViewById(R.id.lvMessage);myAdapter=new MyAdapter(this);String guestName=Controller.getNameById(userId);tvGuest.setText(guestName);// 获得与服务器的Socket连接(在主界面已经建立连接)msgSocket = Controller.getMsgSocket();   //获得自动聊天的话题,已经从服务器获得selectedTopic=Controller.getSelectedTopic();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overrideprotected void onDestroy() {// TODO Auto-generated method stub// 注销服务Log.v(TAG, "onDestroy");if(autoSendMsg!=null) autoSendMsg.endThread();if (smsReceiver != null)unregisterReceiver(smsReceiver);// 重置当前聊天对象if(1==friend.type){Controller.setCurrentChatObjId(-1);//Controller.setCurrentChatobjName("");}else{Controller.setCurrentMachChatObjId(-1);//Controller.setCurrentMachChatObjName("");}// 将聊天记录保存到本地数据库中LocalDataProcess localDataProcess=new LocalDataProcess();localDataProcess.upLocalNewMessageRecord(newMessageList);this.finish();super.onDestroy();}private class MySMSReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubString messageString;messageString = intent.getStringExtra(Constants.BROADCAST_MESSAGE);JSONObject jsonObject = null;try {jsonObject = new JSONObject(messageString);} catch (JSONException e) {// TODO Auto-generated catch blockCommonFunctions.generateLogV(TAG,"new JSONObject(messageString);", "JSONException");e.printStackTrace();}Message message = CommonFunctions.castJsonToMessage(jsonObject);parseMessage(message);}}/** * 解析接收到的消息 * @param message */protected void parseMessage(Message message){Log.v(TAG,"接收到广播消息:"+message.toString());String typeString=message.type;if(typeString.equals(Constants.CHAT_MESSAGE)){ChatContentMessage chatContentMessage=(ChatContentMessage)message;lastMsgString=chatContentMessage.msg;if(lastMsgString.equals("/*/over/*/")){autoSendMsg.endThread();//自动聊天结束,生成报告generateChatReport();return ;}    appendMsg(chatContentMessage);isResponsed=true;  //收到回复之后标记置为trueLog.v(TAG, String.valueOf(isResponsed));    resetTime();//handler.obtainMessage(1, lastMsgString).sendToTarget();}else if(typeString.equals(Constants.FRIEND_ONLINE_STATUS_CHANGE)){OnlineStatusChangeMessage onlineStatusChangeMessage=(OnlineStatusChangeMessage)message;if(onlineStatusChangeMessage.userId==friend.userId){friend.status=onlineStatusChangeMessage.status;if(friend.status.equals(Constants.ONLINE))ivHead.setImageAlpha(0);elseivHead.setImageAlpha(100);    tvStatus.setText("["+friend.status+"]");}}}private void generateChatReport() {// TODO Auto-generated method stubif(isReportGenerated==false){ isReportGenerated=true;  CommonFunctions.showMessage(ActChat.this, "自动聊天结束,显示聊天结果"); Intent intent=new Intent(ActChat.this,ActReport.class); startActivity(intent);}}public class btnSendClickOmpl implements android.view.View.OnClickListener {@Overridepublic void onClick(View v) {String msg = edtMsg.getText().toString().trim();sendMsg(msg);}}private void fillAdapter() {//listItem = new ArrayList<HashMap<String, Object>>();// 生成适配器的Item和动态数组对应的元素//listItemAdapter = new SimpleAdapter(this, listItem,// 数据源//R.layout.chat_message_item,// ListItem的XML实现// 动态数组与ImageItem对应的子项//new String[] { Constants.USER_NAME, Constants.SEND_TIME,//Constants.MESSAGE_CONTENT,Constants.USER_ID },// ImageItem的XML文件里面的一个ImageView,两个TextView ID//new int[] { R.id.MsgSender, R.id.MsgDateTime, R.id.MsgContent }); //先从数据库获得历史记录,addHistoryMessage();// 获得未读消息ArrayList<ChatContentMessage> messageList = (ArrayList<ChatContentMessage>) Controller.getUnreadMessage(friend.userId);if (messageList != null)addUnreadMessage(messageList);// 这句不要往,不然列表控件显示不会更新//listItemAdapter.notifyDataSetChanged();myAdapter.notifyDataSetChanged();// 清除未读消息Controller.clearUnreadMessage(friend.userId);}protected void sendMsg(String msg) {// TODO Auto-generated method stub// 发送送消息,默认消息类型为Constants.CHAT_MESSAGE//resetTime();  //自动发送消息计时器重新计时//if (msg == "")//return;////if (false == msgSocket.isConnected()) {//CommonFunctions.showMessage(ActChat.this,//"发送数据的SOCKET尚未连接到服务器!");//return;//}//if(friend.status.equals(Constants.OFFLINE)) {//CommonFunctions.showMessage(ActChat.this,//"当前用户已离线!");//return;//}    ChatContentMessage message = new ChatContentMessage(Constants.CHAT_MESSAGE,Controller.getUserId(), friend.userId,msg, CommonFunctions.getSysTime());String msgPackage = null;try {msgPackage = CommonFunctions.castMessageclassToJsonStr(message);} catch (JSONException e) {// TODO Auto-generated catch blockLog.v(TAG,"CommonFunctions.castMessageclassToJsonStr(message)失败:JSONException");e.printStackTrace();}boolean result = msgSocket.writeStr(msgPackage);isResponsed=false;//发送消息之后是否已经回复标记置为false;if (result == true) {// 将数据更新到消息界面......................................appendMsg(message);// 清空数据edtMsg.setText("");edtMsg.requestFocus();} else {CommonFunctions.showMessage(ActChat.this, "消息发送失败,请重试");edtMsg.requestFocus();}}public void appendMsg(ChatContentMessage message) {ifnewMessageList.add(message);/*HashMap<String, Object> map = new HashMap<String, Object>();String name=Controller.getNameById(message.senderId);map.put(Constants.USER_ID, message.senderId);map.put(Constants.USER_NAME, name);map.put(Constants.SEND_TIME, message.time);map.put(Constants.MESSAGE_CONTENT, message.msg);listItem.add(map);    listItemAdapter.notifyDataSetChanged();*/Log.v("MESSAGE", message.msg);MsgViewContainer msg=null;    if(message.senderId==friend.userId)    {    msg =new MsgViewContainer(1, DataController.head[Integer.parseInt(friend.headImageUrl)],    friend.userName, message.time, message.msg);    }    else    {    //自己头像暂时写死    msg =new MsgViewContainer(2, DataController.head[Controller.getUserId()%8],    Controller.getUserName(), message.time, message.msg);    }   myAdapter.addMessage(msg);myAdapter.notifyDataSetChanged();resetTime();unlock();//}private void addUnreadMessage(ArrayList<ChatContentMessage> messageList) {if (messageList == null)return;Iterator<ChatContentMessage> iterator = messageList.iterator();ChatContentMessage message=null;while (iterator.hasNext()) {//HashMap<String, Object> map = new HashMap<String, Object>();    message = iterator.next();//map.put(Constants.USER_ID, message.senderId);//String name=Controller.getNameById(message.senderId);//map.put(Constants.USER_NAME, name);//map.put(Constants.MESSAGE_CONTENT, message.msg);//map.put(Constants.SEND_TIME, message.time);//listItem.add(map);        appendMsg(message);// 将未读消息加入到新消息队列,便于之后保存到数据库中//newMessageList.add(message);}if(message!=null)   lastMsgString=message.msg;}@Overrideprotected void onStop() {// TODO Auto-generated method stubLog.v(TAG, "onStop");super.onStop();}private void addHistoryMessage() {// 查询本地数据库获得聊天记录//List<ChatContentMessage> historyMsgList = dbManager//.queryMessagesRecord(hostName, friend.userName);List<ChatContentMessage> historyMsgList =null;LocalDataProcess localDataProcess=new LocalDataProcess();historyMsgList=localDataProcess.downLoadHistoryMessageRecord(Controller.getUserId(), friend.userId);Iterator<ChatContentMessage> iterator = historyMsgList.iterator();while (iterator.hasNext()) {ChatContentMessage messageClass = iterator.next();appendMsg(messageClass);/*HashMap<String, Object> map = new HashMap<String, Object>();int id=messageClass.senderId;String name=Controller.getNameById(id);map.put(Constants.USER_ID, id);map.put(Constants.USER_NAME, name);map.put(Constants.MESSAGE_CONTENT, messageClass.msg);map.put(Constants.SEND_TIME, messageClass.time);listItem.add(map);*/}}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubLog.v(TAG, "keydown"); if (keyCode == KeyEvent.KEYCODE_BACK) {   if(autoSendMsg!=null) autoSendMsg.endThread();  this.finish();    return super.onKeyDown(keyCode, event);  } else if(keyCode == KeyEvent.KEYCODE_F10) { if(autoSendMsg!=null) autoSendMsg.endThread(); } return false;}}

package activity;import java.util.ArrayList;import java.util.HashMap;import messageClasses.OnlineStatusChangeMessage;import messageClasses.OpenSessionMessage;import org.json.JSONException;import org.json.JSONObject;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.Vibrator;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.widget.AdapterView;import android.widget.ImageView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.AdapterView.OnItemClickListener;import android.widget.Toast;import com.example.chatsysdemo.R;import commontool.CommonFunctions;import commontool.Constants;import commontool.Controller;import commontool.DataController;public class ActFinding extends Activity {public final static String TAG = "ActFinding";private SensorManager sensorManager;private Vibrator vibrator;private final static int SENSOR_SHAKE=10;private final static int GetServerData=8;private final static int StartChat=6;private final static int TIMEINTEVAL=15;//private Button btnSearch;private ImageView ivNotice;privateString userName;private int userId;private ListView lvfoundFriends;private ArrayList<HashMap<String, Object>> listItem;private SimpleAdapter listItemAdapter;private MySMSReceiver smsReceiver = null;private  static  int times=TIMEINTEVAL;//无操作时间三十秒则选择自聊天private ChoseObjThread choseObjThread=null;private FillDataThread fillDataThread=null;public static synchronized void resetTime(){times=TIMEINTEVAL;}public static synchronized void minusTime(){times--;}Handler handler = new Handler() {public void handleMessage(Message Message) {//要做的事情switch(Message.what){case SENSOR_SHAKE:if(choseObjThread==null){    CommonFunctions.showMessage(ActFinding.this, "开启自动聊天模式,再摇一次关闭自动聊天模式");fillDataThread=new FillDataThread();new Thread(fillDataThread).start();}else{ CommonFunctions.showMessage(ActFinding.this, "关闭启自动聊天模式,再摇一次开启自动聊天模式");Log.v(TAG, "关闭启自动聊天模式,再摇一次开启闭自动聊天模式");choseObjThread.endThread();choseObjThread=null;}break;case GetServerData :if(listItem.size()<=0 || Controller.getChatStatus().equals("Negative") || Controller.getCurrentMachChatObjId()!=-1)break;fillData();if(choseObjThread!=null){//开启定时自动聊线程choseObjThread.endThread();choseObjThread=null;}Log.v(TAG, "开启自动聊天模式,再摇一次关闭自动聊天模式");                    choseObjThread = new ChoseObjThread();new Thread(choseObjThread).start();break;case StartChat:if(Controller.getChatStatus().equals("Negative") || Controller.getCurrentMachChatObjId()!=-1)return ;if(Controller.getOthersFriendsList()!=null && Controller.getOthersFriendsList().size()>0){autoChat(0);//  默认找第一个人聊}break;default:break;}}};public class FillDataThread implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubtry {listItem=DataController.fillData(ActFinding.this, userId,2);} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}Message message=new Message();message.what=GetServerData;handler.sendMessage(message);//发送消息}}public class ChoseObjThread implements Runnable{private boolean isContinue=true;@Overridepublic void run() {// TODO Auto-generated method stubwhile (isContinue) {try {if(Controller.getChatStatus().equals("Negative"))    {resetTime();continue;//被动方式,不主动发起会话,但保持循环监听是否设置为Positive模式    }    Thread.sleep(1000);//线程暂停1秒minusTime();if(times==0){Message message=new Message();message.what=StartChat;handler.sendMessage(message);//发送消息resetTime();}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}CommonFunctions.generateLogV(TAG, "停止ChoseObjThread");}public void  endThread(){isContinue=false;}}public boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubLog.v(TAG, "keydown"); return false;   // return super.onKeyDown(keyCode, event);  }@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.v(TAG, "onCreate");setContentView(R.layout.finding_list);//if(自动机器人聊天)//   fillData();getInstance();//if(Controller.getChatStatus().equals("Positive"))//lz12/21choseObjThread=new ChoseObjThread();//lz12/21new Thread(choseObjThread).start();//btnSearch.setOnClickListener(new OnClickListener() {//@Override//public void onClick(View arg0) {//// TODO Auto-generated method stub//fillData();//}//});lvfoundFriends.setOnItemClickListener(new lvItemClickListener());IntentFilter myIntentFilter = new IntentFilter();//myIntentFilter.addAction(Constants.SMS_RECEIVER_GUEST);myIntentFilter.addAction(Constants.SMS_RECEIVER_Finding);smsReceiver = new MySMSReceiver();registerReceiver(smsReceiver, myIntentFilter);if(sensorManager!=null){Log.v(TAG, "regist");sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);}}public class lvItemClickListener implements OnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> lv, View view, int position,long id) {times=60;HashMap<String, Object> map = (HashMap<String, Object>) listItem.get(position); int userId = (Integer) map.get("fi_user_id");  Intent intent=new Intent(ActFinding.this,ActPersonalInfo.class); intent.putExtra(Constants.USER_ID, userId); startActivity(intent);}}private void autoChat(int position){ HashMap<String, Object> map = (HashMap<String, Object>) listItem.get(position); int id=(Integer)map.get("fi_user_id");     OpenSessionMessage opMessage=new OpenSessionMessage();     opMessage.type=Constants.OPEN_SESSION;     opMessage.friendType=2;  //非好友     opMessage.time=CommonFunctions.getSysTime();     opMessage.userId=id;         String messageString = null;try {messageString = CommonFunctions.castMessageclassToJsonStr(opMessage);} catch (JSONException e) {CommonFunctions.generateLogV(TAG, "CommonFunctions.castMessageclassToJsonStr(opMessage);", "JSONException");e.printStackTrace();}    CommonFunctions.sendMyBroadcast(ActFinding.this, messageString, Constants.SMS_RECEIVER_SESSION);    startChat(id,position);}private void startChat(int _id,int position) {// TODO Auto-generated method stubIntent intentAct = new Intent(ActFinding.this, ActChat.class);intentAct.putExtra(Constants.USER_ID, _id);intentAct.putExtra("type", 2);// 设置当前聊天对象Controller.setCurrentMachChatObjId(_id);startActivity(intentAct);}private class MySMSReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubString messageString;messageString = intent.getStringExtra(Constants.BROADCAST_MESSAGE);JSONObject jsonObject = null;try {jsonObject = new JSONObject(messageString);} catch (JSONException e) {CommonFunctions.generateLogV(TAG,"new JSONObject(messageString)", "JSONException");e.printStackTrace();}messageClasses.Message message = CommonFunctions.castJsonToMessage(jsonObject);parseMessage(message);}}private void parseMessage(messageClasses.Message message) {//String typeString=message.type;///if (typeString.equals(Constants.FRIEND_ONLINE_STATUS_CHANGE)) {//OnlineStatusChangeMessage onlineStatusChangeMessage=(OnlineStatusChangeMessage)message;//int position = 0;//position=DataController.findTheListPositon(listItem,"fi_user_id", onlineStatusChangeMessage.userId);//if(position==-1)//return ;////改变在线状态//DataController.changeListItemValue(2,onlineStatusChangeMessage.userId ,position,"fi_user_status", onlineStatusChangeMessage.status, listItem);//Controller.changeUserStatus(onlineStatusChangeMessage.userId,onlineStatusChangeMessage.status);//}//if(listItemAdapter!=null)//   listItemAdapter.notifyDataSetChanged();}private void fillData(){// TODO Auto-generated method stubif(listItem==null)return;String[] froms=new String[] {"fi_user_image", "fi_user_name","fi_user_status","fi_user_location","fi_user_locDes","fi_user_id"};int[] tos=new int[] { R.id.fi_user_image, R.id.fi_user_name,R.id.fi_user_status,R.id.fi_user_location,R.id.fi_user_locDes};//try {//listItem=DataController.fillData(ActFinding.this, userId,2);//} catch (JSONException e) {//// TODO Auto-generated catch block//CommonFunctions.generateLogV(TAG, "friendslistPro.fillData(ActFriendsList.this, userId,2)", "JSONException");//e.printStackTrace();//}if(listItem.size()>0){ivNotice.setVisibility(View.GONE);}listItemAdapter = new SimpleAdapter(this,listItem,// 数据源R.layout.finding_list_item,// ListItem的XML实现froms,// 动态数组与ImageItem对应的子项tos);// ImageItem的XML文件里面的一个ImageView,两个TextView IDlvfoundFriends.setAdapter(listItemAdapter);}private void getInstance() {lvfoundFriends = (ListView) findViewById(R.id.lvfoundFriends);userName = Controller.getUserName(); userId = Controller.getUserId();//btnSearch=(Button)findViewById(R.id.btnSearch);ivNotice=(ImageView)findViewById(R.id.ivNotice);sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);vibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE);}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();if(sensorManager!=null){sensorManager.unregisterListener(sensorEventListener);}if (smsReceiver != null)unregisterReceiver(smsReceiver);if(choseObjThread!=null)choseObjThread.endThread();}@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();Log.v(TAG, "onPause");}@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();Log.v(TAG, "onResume");}@Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();Log.v(TAG, "onResume");}private SensorEventListener sensorEventListener =new SensorEventListener(){@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stubif(Controller.getCurrentActivity()!=TAG)  //只有当停 留在当前窗口时才触发摇一摇事件{return ;}float[] values=event.values;float x=values[0];float y=values[1];float z=values[2];//Log.v(TAG, "X方向加速度"+x+";Y方向加速度"+y+";Z方向加速度"+z);int medumValue=19;if(Math.abs(x)>medumValue || Math.abs(y)>medumValue || Math.abs(z)>medumValue){vibrator.vibrate(200);Message msg=new Message();msg.what=SENSOR_SHAKE;handler.sendMessage(msg);}}};}

 

 

package activity;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import messageClasses.AddFriendMessage;import messageClasses.ChatContentMessage;import messageClasses.Friends;import messageClasses.Message;import messageClasses.OnlineStatusChangeMessage;import messageClasses.OpenSessionMessage;import messageClasses.Session;import messageProcessPackage.SocketCommunicationService;import messageProcessPackage.SocketCommunicationService.LocalBinder;import org.apache.http.client.ClientProtocolException;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import sqliteDB.DBManager;import com.example.chatsysdemo.R;import commontool.*;import android.R.integer;import android.app.Activity;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.content.BroadcastReceiver;import android.content.ComponentName;import android.content.Context;import android.content.DialogInterface;import android.content.ServiceConnection;import android.content.DialogInterface.OnClickListener;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.os.IBinder;import android.util.Log;import android.view.KeyEvent;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.TextView;import ServerInteract.HttpRequestServer;public class ActFriendsList extends Activity{public final static String TAG = "ActFriendsList";private ListView lvFriends;privateString userName;private int userId;private ArrayList<HashMap<String, Object>> listItem;private SimpleAdapter listItemAdapter;private MySMSReceiver smsReceiver = null;@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubLog.v(TAG, "keydown");    return false; }@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.friends_list);Log.v(TAG, "onCreate");getInstance();        fillData();    // startService方式启动服务// Intent intent = new Intent("SocketCommunicationService");// startService(intent);// 启动广播接收器IntentFilter myIntentFilter = new IntentFilter();//myIntentFilter.addAction(Constants.SMS_RECEIVER_CHATMAIN);myIntentFilter.addAction(Constants.SMS_RECEIVER_FRIENDSLIST);smsReceiver = new MySMSReceiver();registerReceiver(smsReceiver, myIntentFilter);lvFriends.setOnItemClickListener(new lvItemClickListener());}private void fillData(){// TODO Auto-generated method stubString[] froms=new String[] { "fr_user_image", "fr_user_name","fr_user_status","fr_user_ivStatus","fr_user_id",};int[] tos=new int[] { R.id.fr_user_image, R.id.fr_user_name, R.id.fr_user_status,R.id.fr_user_ivStatus};try {listItem=DataController.fillData(ActFriendsList.this, userId,1);} catch (JSONException e) {// TODO Auto-generated catch blockCommonFunctions.generateLogV(TAG, "friendslistPro.fillData(ActFriendsList.this, userId,1)", "JSONException");e.printStackTrace();}listItemAdapter = new SimpleAdapter(this,listItem,// 数据源R.layout.friends_list_item,// ListItem的XML实现froms,// 动态数组与ImageItem对应的子项tos);// ImageItem的XML文件里面的一个ImageView,两个TextView ID    lvFriends.setAdapter(listItemAdapter);}private class MySMSReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubString messageString;messageString = intent.getStringExtra(Constants.BROADCAST_MESSAGE);JSONObject jsonObject = null;try {jsonObject = new JSONObject(messageString);} catch (JSONException e) {CommonFunctions.generateLogV(TAG,"new JSONObject(messageString)", "JSONException");e.printStackTrace();}Message message = CommonFunctions.castJsonToMessage(jsonObject);CommonFunctions.generateLogV("xxxxx11", message.toString());parseMessage(message);}}private void parseMessage(Message message) {String typeString=message.type;if (typeString.equals(Constants.FRIEND_ONLINE_STATUS_CHANGE)) {OnlineStatusChangeMessage onlineStatusChangeMessage=(OnlineStatusChangeMessage)message;CommonFunctions.generateLogV("status","change:"+onlineStatusChangeMessage.status);int position = 0;position=DataController.findTheListPositon(listItem, "fr_user_id",onlineStatusChangeMessage.userId);//改变在线状态if(-1==position)//非好友发送的消息return ;DataController.changeListItemValue(2,onlineStatusChangeMessage.userId, position,"fr_user_status", onlineStatusChangeMessage.status, listItem);CommonFunctions.generateLogV("status",onlineStatusChangeMessage.userId+","+ onlineStatusChangeMessage.status);Controller.changeUserStatus(onlineStatusChangeMessage.userId, onlineStatusChangeMessage.status);listItemAdapter.notifyDataSetChanged();}else if(typeString.equals(Constants.ADD_FRIEND)){AddFriendMessage adMsg=(AddFriendMessage)message;int guestId=adMsg.guestId;Friends friend=Controller.getFriendbyId(guestId);DataController.addItem(2, friend, listItem);listItemAdapter.notifyDataSetChanged();}}    public class lvItemClickListener implements OnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> lv, View view, int position,long id) {//应该打开用户信息界面并有一个按钮发送消息,点击发送消息后执行以下代码发送打开会话的session,并打开聊天窗口HashMap<String, Object> map = (HashMap<String, Object>) listItem.get(position); int guestId = (Integer) map.get("fr_user_id"); Intent intent=new Intent(ActFriendsList.this,ActPersonalInfo.class); intent.putExtra(Constants.USER_ID,  guestId ); startActivity(intent);}}private void getInstance() {lvFriends = (ListView) findViewById(R.id.lvFriends);userName = Controller.getUserName(); userId = Controller.getUserId();}@Overrideprotected void onPause() {// TODO Auto-generated method stubLog.v(TAG, "onPause");super.onPause();}@Overrideprotected void onDestroy() {Log.v(TAG, "onDestroy");super.onDestroy();}}


 

package activity;import org.json.JSONObject;import synProcess.LoadServerData;import synProcess.LocalDataProcess;import com.example.chatsysdemo.R;import commontool.CommonFunctions;import commontool.Constants;import commontool.Controller;import commontool.PreferenceService;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.SpannableString;import android.text.Spanned;import android.text.method.LinkMovementMethod;import android.text.style.ClickableSpan;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.Spinner;import android.widget.TextView;import ServerInteract.HttpRequestServer;public class ActLogin extends Activity {private Button btnLogin;private Button btnRegister;private Button btnConfig;private EditText edtName;private EditText edtPwd;private TextView tvTip;private TextView tvRegistLink;private Thread mThread;String name, pwd;int id;private Spinner spnStatus;private Handler mHandler = new Handler() {// message对象中包含了线程方法发过来的数据public void handleMessage(Message msg) {tvTip.setText("result:" + msg.obj);if ("SUCCESS".equals(msg.obj.toString())) {Intent intent = new Intent(ActLogin.this, ActTabHost.class);intent.putExtra(Constants.USER_NAME, name);intent.putExtra(Constants.USER_PASSWORD, pwd);startActivity(intent);ActLogin.this.finish();}}};// 这是一个被后台线程执行的方法,由bnt2的click事件 创建线程并启动Runnable httpRequest = new Runnable() {public void run() {// 执行结果通过obtainMessage消息机制发送给UI线程boolean result = false;try {result = loginCheck();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}if (false == result)return;mHandler.obtainMessage(100, "登录验证成功" + Controller.getUserStatus()).sendToTarget();connectServer();mHandler.obtainMessage(100,"SOCKET连接成功,设置在线状态:" + Controller.getUserStatus()).sendToTarget();mHandler.obtainMessage(100, "SUCCESS").sendToTarget();// CommonFunctions.showMessage(ActLogin.this, "SUCCESS");}};protected boolean loginCheck() throws Exception {String resultString = "";HttpRequestServer requestServer = new HttpRequestServer();JSONObject jobj = null;jobj = requestServer.login(name, pwd);if (jobj == null) {mHandler.obtainMessage(100, "网络连接失败").sendToTarget();return false;}resultString = jobj.getString(Constants.STATUS);if (resultString.equals(Constants.SUCCESS)) {id = jobj.getInt(Constants.USER_ID);mHandler.obtainMessage(100, "登录验证成功!").sendToTarget();Controller.setUserName(name);Controller.setUserId(id);Controller.addMapForIdName(id, name);return true;} else {mHandler.obtainMessage(100, "登录验证失败!").sendToTarget();return false;}}protected void connectServer() {// 必须在设置ID之后,建立SOCKET连接并发送check_inController.createMsgSocket();mHandler.obtainMessage(100, "成功与服务器建立SOCKET连接成功").sendToTarget();HttpRequestServer changeOnlineStatusrequest = new HttpRequestServer();// 发送状态信息boolean result = changeOnlineStatusrequest.changeOnlineStatus(id,Controller.getUserStatus());if (false == result) {// CommonFunctions.showMessage(ActLogin.this, "状态设置信息发送失败");// Controller.setUserStatus(Constants.OFFLINE);mHandler.obtainMessage(100, "状态设置信息发送失败").sendToTarget();} else {mHandler.obtainMessage(100, "状态设置信息发送成功").sendToTarget();// Controller.setUserStatus(Constants.ONLINE);}mHandler.obtainMessage(100, "设置在线状态成功:" + Controller.getUserStatus()).sendToTarget();// 从服务器获得好友列表并将其更新到本地数据库LoadServerData loaddata = new LoadServerData();if (loaddata.loadFriendsList(Controller.getUserId(), 1))mHandler.obtainMessage(100, "从服务器加载好友列表成功").sendToTarget();elsemHandler.obtainMessage(100, "从服务器加载好友列表失败").sendToTarget();// 从服务器获得好友列表并将其更新到本地数据库LoadServerData loadTopic = new LoadServerData();if (loadTopic.loadChatTopicList(Controller.getUserId()))mHandler.obtainMessage(100, "从服务器加载聊天主题成功").sendToTarget();elsemHandler.obtainMessage(100, "从服务器加载聊天主题失败").sendToTarget();// 加载本地数据库LocalDataProcess localDataProcess = new LocalDataProcess();localDataProcess.downLoadLocalData();mHandler.obtainMessage(100, "从本地数据库加载数据完成!").sendToTarget();}protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.login);getInstance();btnClickImpl impl = new btnClickImpl();btnLogin.setOnClickListener(impl);// btnRegister.setOnClickListener(impl);}class btnClickImpl implements OnClickListener {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub// getSysConfigParams();//获得系统参数// if (v.getId() == R.id.btnRegister) {// Intent intent = new Intent(ActLogin.this, ActRegist.class);// startActivity(intent);// return;// }name = edtName.getText().toString().trim();pwd = edtPwd.getText().toString().trim();if (name == "" || pwd == "") {CommonFunctions.showMessage(ActLogin.this, "用户名和密码不能为空!");edtName.requestFocus();return;}mThread = new Thread(httpRequest);mThread.start();// 线程启动tvTip.setText("loading...");}}private Spinner.OnItemSelectedListener spnStatusSelList = new Spinner.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View arg1, int arg2,long arg3) {// TODO Auto-generated method stubController.setChatStatus(parent.getSelectedItem().toString());}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {// TODO Auto-generated method stub}};private void getInstance() {// 还要设置弹出软键盘btnLogin = (Button) findViewById(R.id.btnLogin);// btnRegister = (Button) findViewById(R.id.btnRegister);// btnConfig = (Button) findViewById(R.id.btnConfig);edtName = (EditText) findViewById(R.id.edtUserName);edtPwd = (EditText) findViewById(R.id.edtPwd);tvTip = (TextView) findViewById(R.id.tip);tvRegistLink = (TextView) findViewById(R.id.tvLink);String linkTxt = "Not A Member Yet ?  Regist Now !";SpannableString spannableLinkStr = new SpannableString(linkTxt);spannableLinkStr.setSpan(new ClickableSpan() {@Overridepublic void onClick(View view) {Intent intent = new Intent(ActLogin.this, ActRegist.class);startActivity(intent);}}, 0, linkTxt.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);tvRegistLink.setText(spannableLinkStr);tvRegistLink.setMovementMethod(LinkMovementMethod.getInstance());spnStatus = (Spinner) findViewById(R.id.spnStatus);ArrayAdapter<CharSequence> adapStatusList = ArrayAdapter.createFromResource(this, R.array.spnStatusList,R.layout.spinner_layout_small);spnStatus.setAdapter(adapStatusList);Controller.setUserStatus(Constants.ONLINE); // ////////////////////////Controller.setChatStatus("Positive");spnStatus.setOnItemSelectedListener(spnStatusSelList);// btnConfig.setOnClickListener(new OnClickListener() {// @Override// public void onClick(View arg0) {// // TODO Auto-generated method stub// Intent intent = new Intent(ActLogin.this, ActSysParamManage.class);// startActivity(intent);// }// });}private void getSysConfigParams() {// PreferenceService service =new// PreferenceService(getApplicationContext(), "preference");// Controller.setServerCategoryStr(service.getString("serverCategoryStr"));// Controller.setServerIP(service.getString("serverIP"));// Controller.setServerPort(Integer.parseInt(service.getString("serverPort")));}}

 

package activity;import java.io.IOException;import messageClasses.AddFriendMessage;import messageClasses.Friends;import messageClasses.OpenSessionMessage;import org.apache.http.client.ClientProtocolException;import org.json.JSONException;import org.json.JSONObject;import com.example.chatsysdemo.R;import commontool.CommonFunctions;import commontool.Constants;import commontool.Controller;import commontool.DataController;import ServerInteract.HttpRequestServer;import android.app.Activity;import android.content.Intent;import android.opengl.Visibility;import android.os.AsyncTask;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;public class ActPersonalInfo extends Activity {public final String TAG = "ActPersonalInfo";private Button btnSendMsg;private ImageButton addFriend;private ImageView headImageView;private TextView tvName;private ImageView  ivSex;Friends friend;//private String name;private int id;//private int friendType;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.v(TAG, "onCreate");setContentView(R.layout.personal_info);getInstance();  Controller.setCurrentActivity(TAG);}private void getInstance() {tvName=(TextView)findViewById(R.id.info_user_name);//tvStatus=(TextView)findViewById(R.id.info_user_status);btnSendMsg = (Button) findViewById(R.id.btnInfoSendMsg);addFriend = (ImageButton) findViewById(R.id.btnInfoAddFriend);Intent requestIntent=getIntent();id=requestIntent.getIntExtra(Constants.USER_ID, -1);friend=Controller.getFriendbyId(id); if(friend==null)       {        friend=new Friends(id, "null", String.valueOf(R.drawable.head01), Constants.ONLINE);        friend.type=2;       } int r=Integer.parseInt(friend.headImageUrl);headImageView=(ImageView)findViewById(R.id.info_user_image);headImageView.setImageResource(DataController.head[r]);ivSex=(ImageView)findViewById(R.id.info_user_sex);if(friend.status.equals(Constants.OFFLINE))headImageView.setImageAlpha(100);tvName.setText(friend.userName);//tvStatus.setText("["+friend.status+"]");if(1==friend.type)addFriend.setVisibility(View.GONE);//需要设置头像btnSendMsg.setOnClickListener(new btnSendMsgOnclickImpl());addFriend.setOnClickListener(new btnAddFriendOnclickImpl());}public class btnSendMsgOnclickImpl implements OnClickListener{@Overridepublic void onClick(View v) {// TODO Auto-generated method stub  if((1==friend.type) && (Controller.getCurrentChatObjId()!=-1)){CommonFunctions.showMessage(ActPersonalInfo.this, "此类好友聊天窗口已打开!");return ;}    else if((2==friend.type) && Controller.getCurrentMachChatObjId()!=-1){    CommonFunctions.showMessage(ActPersonalInfo.this, "此类好友聊天窗口已打开!");return ;    }     OpenSessionMessage opMessage=new OpenSessionMessage();     opMessage.type=Constants.OPEN_SESSION;     opMessage.friendType=friend.type;     opMessage.time=CommonFunctions.getSysTime();     opMessage.userId=id;         String messageString = null;try {messageString = CommonFunctions.castMessageclassToJsonStr(opMessage);} catch (JSONException e) {CommonFunctions.generateLogV(TAG, "CommonFunctions.castMessageclassToJsonStr(opMessage);", "JSONException");e.printStackTrace();}   // CommonFunctions.sendMyBroadcast(ActPersonalInfo.this, messageString, Constants.SMS_RECEIVER_CHATMAIN);   //新增会话CommonFunctions.sendMyBroadcast(ActPersonalInfo.this, messageString, Constants.SMS_RECEIVER_SESSION);    startChat(id,friend.type);}}public class btnAddFriendOnclickImpl implements OnClickListener{@Overridepublic void onClick(View v) {//添加好友AddFriendThread dTask = new AddFriendThread();              dTask.execute(new Object());}}class AddFriendThread extends AsyncTask{@Overrideprotected Object doInBackground(Object... arg0) {// TODO Auto-generated method stubboolean isSuccess=false;HttpRequestServer requestServer = new HttpRequestServer();try {isSuccess=requestServer.addFriend(Controller.getUserId(), id);} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return isSuccess;}@Overrideprotected void onPostExecute(Object result) {// TODO Auto-generated method stubBoolean ans=(Boolean)result;CommonFunctions.generateLogV(TAG, String.valueOf(ans));if(true==ans){CommonFunctions.showMessage(ActPersonalInfo.this, "添加好友成功!");//ActPersonalInfo.this.finish(); AddFriendMessage adFriendMessage=new AddFriendMessage(); adFriendMessage.type=Constants.ADD_FRIEND; adFriendMessage.time=CommonFunctions.getSysTime(); adFriendMessage.hostId=Controller.getUserId(); adFriendMessage.guestId=id;     String messageString = null;try {messageString = CommonFunctions.castMessageclassToJsonStr(adFriendMessage);} catch (JSONException e) {CommonFunctions.generateLogV(TAG, "CommonFunctions.castMessageclassToJsonStr(opMessage);", "JSONException");e.printStackTrace();}   // CommonFunctions.sendMyBroadcast(ActPersonalInfo.this, messageString, Constants.SMS_RECEIVER_CHATMAIN);   //新增会话CommonFunctions.sendMyBroadcast(ActPersonalInfo.this, messageString, Constants.SMS_RECEIVER_FRIENDSLIST);   //将非好友转为好友Controller.addFriend(Controller.getFriendbyId(id));    Controller.deleteOtherFriendById(id);}else{CommonFunctions.showMessage(ActPersonalInfo.this, "添加好友失败!");}super.onPostExecute(result);}}//////////////未完private void startChat(int _id,int type) { //当有未读消息时应关心Actsession中的未读消息数目// TODO Auto-generated method stubIntent intentAct = new Intent(ActPersonalInfo.this, ActChat.class);intentAct.putExtra(Constants.USER_ID, _id);intentAct.putExtra("type", type);if(1==type)//好友{// 设置当前聊天对象Controller.setCurrentChatObjId(id);//Controller.setCurrentChatobjName(guestName);}else {//非好友Controller.setCurrentMachChatObjId(id);//Controller.setCurrentMachChatObjName(guestName);}startActivity(intentAct);}}


 

package activity;import java.util.ArrayList;import java.util.HashMap;import messageClasses.ChatContentMessage;import messageClasses.Friends;import messageClasses.Message;import messageClasses.OnlineStatusChangeMessage;import messageClasses.OpenSessionMessage;import messageClasses.Session;import org.json.JSONException;import org.json.JSONObject;import com.example.chatsysdemo.R;import commontool.CommonFunctions;import commontool.Constants;import commontool.Controller;import commontool.DataController;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.util.Log;import android.view.KeyEvent;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.AdapterView.OnItemClickListener;/** * 会话Activity *  * @author lz *  */public class ActSession extends Activity {public static final String TAG = "ActSession";private int userId = 0;// private String userName = "";// private String userPwd = "";private ListView lvSessions;private ArrayList<HashMap<String, Object>> listItem;private SimpleAdapter listItemAdapter;private MySMSReceiver smsReceiver = null;@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubLog.v(TAG, "keydown");return false;// return super.onKeyDown(keyCode, event);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.v(TAG, "onCreate");setContentView(R.layout.sessions_list);getInstance();fillData();lvSessions.setOnItemClickListener(new lvItemClickListener());// 启动广播接收器IntentFilter myIntentFilter = new IntentFilter();// myIntentFilter.addAction(Constants.SMS_RECEIVER_CHATMAIN);myIntentFilter.addAction(Constants.SMS_RECEIVER_SESSION);smsReceiver = new MySMSReceiver();registerReceiver(smsReceiver, myIntentFilter);// Controller.setCurrentActivity(TAG);}@Overrideprotected void onRestart() {// TODO Auto-generated method stubLog.v(TAG, "onRestart");super.onRestart();}@Overrideprotected void onStart() {// TODO Auto-generated method stubLog.v(TAG, "onStart");super.onStart();}private void fillData() {// TODO Auto-generated method stubString[] froms = new String[] { "se_user_image", "se_user_name","se_latest_msg", "se_message_num", "se_friend_type","se_user_id" };int[] tos = new int[] { R.id.se_user_image, R.id.se_user_name,R.id.se_latest_msg, R.id.se_message_num, R.id.se_friend_type };if (listItem != null)// 清空数据listItem = null;try {listItem = DataController.fillData(ActSession.this, userId, 3);} catch (JSONException e) {// TODO Auto-generated catch blockCommonFunctions.generateLogV(TAG,"friendslistPro.fillData(ActFriendsList.this, userId,1)","JSONException");e.printStackTrace();}listItemAdapter = new SimpleAdapter(this, listItem,// 数据源R.layout.sessions_list_item,// ListItem的XML实现froms, tos);lvSessions.setAdapter(listItemAdapter);}private class MySMSReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubString messageString;messageString = intent.getStringExtra(Constants.BROADCAST_MESSAGE);CommonFunctions.generateLogV(TAG, messageString);JSONObject jsonObject = null;try {jsonObject = new JSONObject(messageString);} catch (JSONException e) {CommonFunctions.generateLogV(TAG,"new JSONObject(messageString)", "JSONException");e.printStackTrace();}Message message = CommonFunctions.castJsonToMessage(jsonObject);if (message == null)return;parseMessage(message);}}private void parseMessage(Message message) {String typeString = message.type;CommonFunctions.generateLogV("gej", "receive message" + typeString);if (typeString.equals(Constants.CHAT_MESSAGE)) {// 与该用户的聊天窗口已经打开则不用提示未读消息ChatContentMessage chatContentMessage = (ChatContentMessage) message;// 该用户的对话窗口已打开则在主界面不做处理int position = DataController.findTheListPositon(listItem,"se_user_id", chatContentMessage.senderId);if (-1 == position)// 对方主动发送消息{Session session = new Session();session.userId = chatContentMessage.senderId;Friends friend = Controller.getFriendbyId(session.userId);if (friend == null) // 匿名消息{// 非好友且不是摇一摇摇到的好友,或还未摇一摇,otherFriendlist为空session.type = 2;session.userName = "null";friend=new Friends(session.userId,"null","2",Constants.ONLINE);Controller.addOtherFriend(friend);} else {session.userName = friend.userName;session.type = friend.type;}session.lastMessage = session.userName + ":"+ chatContentMessage.msg;session.time = chatContentMessage.time;// lz12/21 session.unReadMessageNum="1";session.unReadMessageNum = "0";// lz12/21addSession(session);position = 0;// lz12/21 新加的会话在第一个位置// lz12/21 Controller.addUnreadMessage(session.userId,// chatContentMessage);// lz12/21 return ;}// 更新最新消息提示DataController.changeListItemValue(3, chatContentMessage.senderId,position, "se_latest_msg", chatContentMessage.msg,listItem);if ((Controller.getCurrentChatObjId() != chatContentMessage.senderId)&& (Controller.getCurrentMachChatObjId() != chatContentMessage.senderId)) {// 未读消息数目加1DataController.changeListItemValue(1,chatContentMessage.senderId, position,"se_message_num", "", listItem);Controller.addUnreadMessage(chatContentMessage.senderId,chatContentMessage);}}// else if (typeString.equals(Constants.FRIEND_ONLINE_STATUS_CHANGE)) {// OnlineStatusChangeMessage// onlineStatusChangeMessage=(OnlineStatusChangeMessage)message;// int position = -1;// //position=findTheListPositon(onlineStatusChangeMessage.userName);// position=DataController.findTheListPositon(listItem, "se_user_name",// onlineStatusChangeMessage.userName);// //改变在线状态// if(position==-1)// return ;// DataController.changeListItemValue(2,onlineStatusChangeMessage.userName,// position, Constants.ONLINE_VALUE, onlineStatusChangeMessage.status,// listItem);//// Controller.changeUserStatus(onlineStatusChangeMessage.userName,// onlineStatusChangeMessage.status);//// //changeListItemValue(2, position, onlineStatusChangeMessage.status);// }else if (typeString.equals(Constants.OPEN_SESSION)) {OpenSessionMessage opMsgMessage = (OpenSessionMessage) message;Session session = new Session();session.userId = opMsgMessage.userId;session.userName = Controller.getNameById(session.userId);if (true == Controller.isSessionExist(session.userId))return;session.lastMessage = "";session.time = opMsgMessage.time;session.type = opMsgMessage.friendType;session.unReadMessageNum = "";addSession(session);}listItemAdapter.notifyDataSetChanged();}protected void addSession(Session session) {DataController.addItem(1, session, listItem);Controller.addSession(session);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onMenuItemSelected(int featureId, MenuItem item) {// TODO Auto-generated method stubreturn super.onMenuItemSelected(featureId, item);}@Overrideprotected void onDestroy() {Log.v(TAG, "onDestroy");super.onDestroy();}public class lvItemClickListener implements OnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> lv, View view, int position,long id) {HashMap<String, Object> map = (HashMap<String, Object>) listItem.get(position);int mId = (Integer) map.get("se_user_id");Integer friendType = (Integer) map.get("se_friend_type");startChat(mId, position, friendType);}private void startChat(int _id, int position, int type) {// TODO Auto-generated method stubIntent intentAct = new Intent(ActSession.this, ActChat.class);intentAct.putExtra(Constants.USER_ID, _id);// intentAct.putExtra("type", type);if (1 == type)// 好友{// 设置当前聊天对象Controller.setCurrentChatObjId(_id);// Controller.setCurrentChatobjName(guestName);} else {// 非好友Controller.setCurrentMachChatObjId(_id);// Controller.setCurrentMachChatObjName(guestName);}DataController.changeListItemValue(0, _id, position,"se_message_num", "", listItem);listItemAdapter.notifyDataSetChanged();startActivity(intentAct);}}private void getInstance() {lvSessions = (ListView) findViewById(R.id.lvSessionUsers);// userName = Controller.getUserName();userId = Controller.getUserId();listItem = new ArrayList<HashMap<String, Object>>();}@Overrideprotected void onPause() {// TODO Auto-generated method stubLog.v(TAG, "onPause");super.onPause();}@Overrideprotected void onResume() {// TODO Auto-generated method stubLog.v(TAG, "onResume");super.onResume();}@Overrideprotected void onStop() {// TODO Auto-generated method stubLog.v(TAG, "onStop");super.onStop();}}

 

 

package activity;import java.util.ArrayList;import java.util.Arrays;import synProcess.LocalDataProcess;import com.example.chatsysdemo.R;import commontool.CommonFunctions;import commontool.Constants;import commontool.Controller;import commontool.DataController;import ServerInteract.HttpRequestServer;import android.app.Activity;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.EditText;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.Spinner;import android.widget.Switch;import android.widget.TextView;public class ActSetting extends Activity {public final static String TAG = "ActSetting";private Button btnLogout;private ImageButton ibtnEditProfile;private ImageView ivHead;private Switch statusSwitch;private TextView tvUserName;private Spinner spnChatTopics;private Spinner spnStatus;public boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubLog.v(TAG, "keydown"); return false;   // return super.onKeyDown(keyCode, event);  }@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.v(TAG, "onCreate");setContentView(R.layout.setting);getInstance();setListener();}private void getInstance() {// 还要设置弹出软键盘    ibtnEditProfile=(ImageButton)findViewById(R.id.ibtnEditProfile);    tvUserName=(TextView)findViewById(R.id.tvUserName);    tvUserName.setText(Controller.getUserName());        ivHead=(ImageView)findViewById(R.id.ivHeadImage);    ivHead.setImageResource(DataController.head[Controller.getUserId()%8]);        statusSwitch=(Switch)findViewById(R.id.switchStatch);    if(Controller.getChatStatus().equals("Positive"))           statusSwitch.setChecked(true);    statusSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {// TODO Auto-generated method stubif(isChecked)Controller.setChatStatus("Positive");else Controller.setChatStatus("Negative"); CommonFunctions.generateLogV("OnCheckedChangeListener", Controller.getChatStatus());}});        spnChatTopics=(Spinner)findViewById(R.id.spnChatTopics);    spnStatus=(Spinner)findViewById(R.id.setSpnStatus);        ArrayList<String> topicList=Controller.getTopicList();    ArrayAdapter<CharSequence> adapter=new ArrayAdapter(getApplicationContext(),R.layout.spinner_layout, topicList.toArray());    spnChatTopics.setAdapter(adapter);        ArrayAdapter<CharSequence> adapStatusList = ArrayAdapter.createFromResource(this, R.array.spnUserStatusList,R.layout.spinner_layout);spnStatus.setAdapter(adapStatusList);        btnLogout=(Button)findViewById(R.id.setting_btn_logout);      }protected void setListener() { spnChatTopics.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){@Overridepublic void onItemSelected(AdapterView<?> parent, View arg1,int arg2, long arg3) {// TODO Auto-generated method stubController.setSelectedTopic(parent.getSelectedItem().toString());  }@Overridepublic void onNothingSelected(AdapterView<?> arg0) {// TODO Auto-generated method stub}  });  ibtnEditProfile.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubIntent intent=new Intent(ActSetting.this,ActProfile.class);startActivity(intent);}});  btnLogout.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubAlertDialog.Builder builder = new Builder(ActSetting.this);builder.setMessage("确认退出吗?");builder.setTitle("提示");builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {CommonFunctions.generateLogV(TAG, "确认退出");if (true == logout()) {Intent intent  = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);System.exit(0);dialog.dismiss();return;}dialog.dismiss();}});builder.create().show();}});}protected boolean logout() {HttpRequestServer requestServer = new HttpRequestServer();boolean result= requestServer.changeOnlineStatus(Controller.getUserId(), Constants.OFFLINE);if(true==result){//LocalDataProcess localDataProcess = new LocalDataProcess();//localDataProcess.upLocadLocalAllHistoryRecord();Controller.reset();}return result;}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubLog.v(TAG, "onDestroy");super.onDestroy();}@Overrideprotected void onPause() {// TODO Auto-generated method stubLog.v(TAG, "onPause");super.onPause();}@Overrideprotected void onResume() {// TODO Auto-generated method stubLog.v(TAG, "onResume");super.onResume();}}


 

package activity;import com.example.chatsysdemo.R;import activity.ActLogin.btnClickImpl;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;/** * 启动画面 * @author lz * */public class ActSplash extends Activity {private final int SPLASH_DISPLAY_LENGHT = 500; // 延迟2秒protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.splash);new Handler().postDelayed(new Runnable() {public void run() {Intent mainIntent = new Intent(ActSplash.this, ActLogin.class);ActSplash.this.startActivity(mainIntent);ActSplash.this.finish();}}, SPLASH_DISPLAY_LENGHT);}}


 

package activity;import java.util.ArrayList;import synProcess.LoadServerData;import synProcess.LocalDataProcess;import messageClasses.Friends;import messageProcessPackage.SocketCommunicationService;import messageProcessPackage.SocketCommunicationService.LocalBinder;import com.example.chatsysdemo.R;import commontool.CommonFunctions;import commontool.Constants;import commontool.Controller;import ServerInteract.HttpRequestServer;import activity.ActChat.btnSendClickOmpl;import android.app.Activity;import android.app.AlertDialog;import android.app.LocalActivityManager;import android.app.AlertDialog.Builder;import android.content.ComponentName;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.IntentFilter;import android.content.ServiceConnection;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.util.Log;import android.view.KeyEvent;import android.widget.RadioGroup;import android.widget.TextView;import android.widget.RadioGroup.OnCheckedChangeListener;import android.widget.TabHost;public class ActTabHost extends Activity implements OnCheckedChangeListener {private final String TAG = "ActTabHost";private TabHost tabHost;private Intent sessionIntent; // 会话private Intent friendsListIntent; // 好友@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubLog.v(TAG, "keydown");if (keyCode == KeyEvent.KEYCODE_BACK) {exit();return super.onKeyDown(keyCode, event);}return false;}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubLog.v(TAG, "onDestroy");if (true == logout()) {Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);System.exit(0);return;}super.onDestroy();}@Overrideprotected void onPause() {// TODO Auto-generated method stubLog.v(TAG, "onPause");super.onPause();}@Overrideprotected void onResume() {// TODO Auto-generated method stubLog.v(TAG, "onResume");super.onResume();}@Overrideprotected void onStop() {// TODO Auto-generated method stubLog.v(TAG, "onStop");super.onStop();}private void exit() {// TODO Auto-generated method stubAlertDialog.Builder builder = new Builder(ActTabHost.this);builder.setMessage("确认退出吗?");builder.setTitle("提示");builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {if (true == logout()) {Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);System.exit(0);dialog.dismiss();return;}dialog.dismiss();}});builder.create().show();}protected boolean logout() {HttpRequestServer requestServer = new HttpRequestServer();boolean result = requestServer.changeOnlineStatus(Controller.getUserId(), Constants.OFFLINE);if (true == result) {// LocalDataProcess localDataProcess = new LocalDataProcess();// localDataProcess.upLocadLocalAllHistoryRecord();Controller.reset();}return result;}private Intent findingIntent; // 发现private Intent settingIntent; // 设置private Thread mThread;private ServiceConnection mServiceConnection = null;private SocketCommunicationService myService = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.tabhost);Log.v(TAG, "onCreate");tabHost = (TabHost) findViewById(R.id.tabhost);LocalActivityManager groupActivity = new LocalActivityManager(this,false);groupActivity.dispatchCreate(savedInstanceState);tabHost.setup(groupActivity);// 绑定服务并启动接收消息的服务bindMyReceiveMsgService();// if(mThread == null) {// mThread = new Thread(loadData);// mThread.start();//线程启动// }initIntent();addSpec();((RadioGroup) findViewById(R.id.tab_radiogroup)).setOnCheckedChangeListener(this);};private Handler mHandler = new Handler() {// message对象中包含了线程方法发过来的数据public void handleMessage(Message msg) {}};// 这是一个被后台线程执行的方法,由bnt2的click事件 创建线程并启动Runnable loadData = new Runnable() {public void run() {LoadServerData loaddata = new LoadServerData();if (loaddata.loadFriendsList(Controller.getUserId(), 1))CommonFunctions.generateLogV("100", "从服务器加载好友列表成功!");elseCommonFunctions.generateLogV("100", "从服务器加载好友列表失败!");// 从本地数据库取数据LocalDataProcess localDataProcess = new LocalDataProcess();localDataProcess.downLoadLocalData();CommonFunctions.generateLogV("100", "从本地数据库加载数据完成!");}};/** * 初始化各个tab标签对应的intent */private void initIntent() {sessionIntent = new Intent(this, ActSession.class);friendsListIntent = new Intent(this, ActFriendsList.class);findingIntent = new Intent(this, ActFinding.class);settingIntent = new Intent(this, ActSetting.class);}/** * 为tabHost添加各个标签项 */private void addSpec() {tabHost.addTab(this.buildTagSpec("tab_session", "会话1", R.drawable.chat,sessionIntent));tabHost.addTab(this.buildTagSpec("tab_friendlist", "好友1",R.drawable.friends, friendsListIntent));tabHost.addTab(this.buildTagSpec("tab_finding", "发现1",R.drawable.discover, findingIntent));tabHost.addTab(this.buildTagSpec("tab_setting", "设置1",R.drawable.setting, settingIntent));}/** * 自定义创建标签项的方法 *  * @param tagName *            标签标识 * @param tagLable *            标签文字 * @param icon *            标签图标 * @param content *            标签对应的内容 * @return */private TabHost.TabSpec buildTagSpec(String tagName, String tagLable,int icon, Intent content) {return tabHost.newTabSpec(tagName).setIndicator(tagLable, getResources().getDrawable(icon)).setContent(content);}@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {// TODO Auto-generated method stubswitch (checkedId) {case R.id.radio_button_session:tabHost.setCurrentTabByTag("tab_session");Controller.setCurrentActivity(ActSession.TAG);break;case R.id.radio_button_friendlist:tabHost.setCurrentTabByTag("tab_friendlist");Controller.setCurrentActivity(ActFriendsList.TAG);break;case R.id.radio_button_find:tabHost.setCurrentTabByTag("tab_finding");Controller.setCurrentActivity(ActFinding.TAG);break;case R.id.radio_button_setting:tabHost.setCurrentTabByTag("tab_setting");Controller.setCurrentActivity(ActSetting.TAG);break;}}public void bindMyReceiveMsgService() {mServiceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubLocalBinder binder = (LocalBinder) service;myService = binder.getService();myService.startReceiveMsgThread();}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubCommonFunctions.generateLogV(TAG, "onServiceDisconnected");}};Intent intent = new Intent(ActTabHost.this,SocketCommunicationService.class);if (false == bindService(intent, mServiceConnection,Context.BIND_AUTO_CREATE)) {CommonFunctions.showMessage(ActTabHost.this, "接收消息服务绑定失败!");return;}}}



 


 

 


 

0 0
原创粉丝点击