package com.yarin.android.Examples_08_09;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.ContactsContract;
import android.util.Log;
public class OBEXActivity extends Activity
{
private static final String TAG = "@MainActivity";
private Handler _handler = new Handler();
private BluetoothServerSocket _server;
private BluetoothSocket _socket;
private static final int OBEX_CONNECT = 0x80;
private static final int OBEX_DISCONNECT = 0x81;
private static final int OBEX_PUT = 0x02;
private static final int OBEX_PUT_END = 0x82;
private static final int OBEX_RESPONSE_OK = 0xa0;
private static final int OBEX_RESPONSE_CONTINUE = 0x90;
private static final int BIT_MASK = 0x000000ff;
Thread t = new Thread()
{
public void run()
{
try
{
_server = BluetoothAdapter.getDefaultAdapter().listenUsingRfcommWithServiceRecord("OBEX", null);
new Thread()
{
public void run()
{
Log.d("@Rfcom", "begin close");
try
{
_socket.close();
}
catch (IOException e)
{
Log.e(TAG, "", e);
}
Log.d("@Rfcom", "end close");
};
}.start();
_socket = _server.accept();
reader.start();
Log.d(TAG, "shutdown thread");
}
catch (IOException e)
{
e.printStackTrace();
}
};
};
Thread reader = new Thread()
{
public void run()
{
try
{
Log.d(TAG, "getting inputstream");
InputStream inputStream = _socket.getInputStream();
OutputStream outputStream = _socket.getOutputStream();
Log.d(TAG, "got inputstream");
int read = -1;
byte[] bytes = new byte[2048];
ByteArrayOutputStream baos = new ByteArrayOutputStream(bytes.length);
while ((read = inputStream.read(bytes)) != -1)
{
baos.write(bytes, 0, read);
byte[] req = baos.toByteArray();
int op = req[0] & BIT_MASK;
Log.d(TAG, "read:" + Arrays.toString(req));
Log.d(TAG, "op:" + Integer.toHexString(op));
switch (op)
{
case OBEX_CONNECT:
outputStream.write(new byte[] { (byte) OBEX_RESPONSE_OK, 0, 7, 16, 0, 4, 0 });
break;
case OBEX_DISCONNECT:
outputStream.write(new byte[] { (byte) OBEX_RESPONSE_OK, 0, 3, 0 });
break;
case OBEX_PUT:
outputStream.write(new byte[] { (byte) OBEX_RESPONSE_CONTINUE, 0, 3, 0 });
break;
case OBEX_PUT_END:
outputStream.write(new byte[] { (byte) OBEX_RESPONSE_OK, 0, 3, 0 });
break;
default:
outputStream.write(new byte[] { (byte) OBEX_RESPONSE_OK, 0, 3, 0 });
}
Log.d(TAG, new String(baos.toByteArray(), "utf-8"));
baos = new ByteArrayOutputStream(bytes.length);
}
Log.d(TAG, new String(baos.toByteArray(), "utf-8"));
}
catch (IOException e)
{
e.printStackTrace();
}
};
};
private Thread put = new Thread() {
public void run()
{
};
};
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.obex_server_socket);
t.start();
}
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
Log.d(TAG, data.getData().toString());
switch (requestCode)
{
case (1):
if (resultCode == Activity.RESULT_OK)
{
Uri contactData = data.getData();
Cursor c = managedQuery(contactData, null, null, null, null);
for (; c.moveToNext();)
{
Log.d(TAG, "c1---------------------------------------");
dump(c);
Uri uri = Uri.withAppendedPath(data.getData(), ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
Cursor c2 = managedQuery(uri, null, null, null, null);
for (; c2.moveToNext();)
{
Log.d(TAG, "c2---------------------------------------");
dump(c2);
}
}
}
break;
}
}
private void dump(Cursor c)
{
for (int i = 0, size = c.getColumnCount(); i < size; ++i)
{
String col = c.getColumnName(i);
String s = c.getString(i);
Log.d(TAG, col + "=" + s);
}
}
}