//activity
package wk.bluetooth;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;
import android.view.View.OnClickListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import wk.bluetooth.StartServer.ChatListItem;
public class StartClient extends Activity implements OnItemClickListener ,OnClickListener{
private ListView mListView;
ChatAdapter mAdapter;
private ArrayList<ChatListItem> list;
private EditText sendMessage;
private Button sendButton;
private TextView title;
private ImageButton back;
private String joinChatRoomName;
private String address;
private String nowTime;
private BluetoothSocket socket;
private BluetoothDevice device = null;
private clientThread startClient = null;
private readThread mreadThread = null;
private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Context mContext;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.chat);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.titlebar);
Bundle bundle = this.getIntent().getExtras();
joinChatRoomName = bundle.getString("joinChatRoomName");
address = bundle.getString("address");
mContext = this;
init();
}
private void init(){
device = mBluetoothAdapter.getRemoteDevice(address);
list = new ArrayList<ChatListItem>();
mAdapter = new ChatAdapter(mContext, list);
mListView = (ListView) findViewById(R.id.chat_list);
mListView.setAdapter(mAdapter);
//mListView.setOnItemClickListener(this);
mListView.setFastScrollEnabled(true);
title = (TextView) findViewById(R.id.title);
title.setText(joinChatRoomName);
back = (ImageButton) findViewById(R.id.back);
back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if(mreadThread!=null){
mreadThread.interrupt();
}
if(startClient != null){
startClient.interrupt();
}
list.clear();
StartClient.this.finish();
}
});
sendMessage = (EditText)findViewById(R.id.MessageText);
sendButton = (Button)findViewById(R.id.btn_msg_send);
sendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
String msg= sendMessage.getText().toString();
if(msg.length()>0){
SendMessageHandle(msg);
sendMessage.setText("");
sendMessage.clearFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(sendMessage.getWindowToken(), 0);
}else{
Toast.makeText(mContext, "消息发送失败", Toast.LENGTH_SHORT).show();
sendMessage.setText("");
sendMessage.clearFocus();
}
}
});
if(Bluetooth.joinChatRoom.get(address)) {
Log.d("StartClient","join again");
mreadThread = new readThread();
mreadThread.start();
}else{
Log.d("StartClient","first time join");
startClient = new clientThread();
startClient.start();
}
}
private class clientThread extends Thread {
@Override
public void run() {
try {
Message msg2 = new Message();
msg2.obj = "正在加入"+device.getName()+"的聊天室";
msg2.what = 2;
LinkDetectedHandler.sendMessage(msg2);
//创建一个Socket连接:只需要服务器在注册时的UUID号
socket = Bluetooth.joinChatRoomSocket.get(address);
//连接
socket.connect();
Bluetooth.joinChatRoomSocket.put(address,socket);
Bluetooth.joinChatRoom.put(address,true);
// new IsNotConnected().start();
//启动接受数据
mreadThread = new readThread();
mreadThread.start();
}
catch (IOException e)
{
Bluetooth.joinChatRoom.put(address,false);
Message msg = new Message();
msg.obj = "加入聊天室失败,请断开重试";
msg.what = 2;
LinkDetectedHandler.sendMessage(msg);
}
}
}
//读取数据
private class readThread extends Thread {
@Override
public void run() {
Log.d("StartClient","read buffer");
byte[] buffer = new byte[1024];
int bytes;
InputStream mmInStream = null;
try {
mmInStream = Bluetooth.joinChatRoomSocket.get(address).getInputStream();
} catch (IOException e1) {
e1.printStackTrace();
}
while (true) {
try {
// Read from the InputStream
if ((bytes = mmInStream.read(buffer)) > 0) {
byte[] buf_data = new byte[bytes];
for (int i = 0; i < bytes; i++) {
buf_data[i] = buffer[i];
}
String s = new String(buf_data);
Log.d("ReceiveMessage",s+"-------");
if(s.equals("MARLBORO")){
continue;
}
Message message = new Message();
message.obj = s;
message.what = 1;
LinkDetectedHandler.sendMessage(message);
}
} catch (IOException e) {
try {
mmInStream.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
break;
}
}
}
}
private Handler LinkDetectedHandler = new Handler() {
//what = 0发送的消息
//what = 1接受的消息
//what = 2公共消息
@Override
public void handleMessage(Message msg) {
Log.d("ReceiveMessage", msg.obj + " " + msg.what);
SimpleDateFormat formatter = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
nowTime = formatter.format(new Date(System.currentTimeMillis()));
list.add(new ChatListItem((String) msg.obj, nowTime, msg.what));
Log.d("ReceiveMessage","list size"+list.size());
Log.d("ReceiveMessage","adddddddddddd");
mAdapter.notifyDataSetChanged();
mListView.setSelection(list.size() - 1);
}
};
private void SendMessageHandle(String msg){
Log.d("StartClient","send message"+msg);
try {
OutputStream outputStream = Bluetooth.joinChatRoomSocket.get(address).getOutputStream();
outputStream.write(msg.getBytes());
} catch (Exception e) {}
Message m = new Message();
m.obj = msg;
m.what = 0;
LinkDetectedHandler.sendMessage(m);
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
public class joinChatListItem {
String message;
Integer flag;
public joinChatListItem(String msg, Integer f) {
message = msg;
flag = f;
}
}
}