Merge "Move Bluetooth remove service record handler to the app main thread"

This commit is contained in:
Matthew Xie
2011-08-29 16:27:54 -07:00
committed by Android (Google) Code Review
2 changed files with 27 additions and 13 deletions

View File

@@ -22,6 +22,7 @@ import android.content.Context;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelUuid;
import android.os.RemoteException;
@@ -348,6 +349,8 @@ public final class BluetoothAdapter {
private final IBluetooth mService;
private Handler mServiceRecordHandler;
/**
* Get a handle to the default local Bluetooth adapter.
* <p>Currently Android only supports one Bluetooth adapter, but the API
@@ -376,6 +379,7 @@ public final class BluetoothAdapter {
throw new IllegalArgumentException("service is null");
}
mService = service;
mServiceRecordHandler = null;
}
/**
@@ -1011,7 +1015,21 @@ public final class BluetoothAdapter {
} catch (IOException e) {}
throw new IOException("Not able to register SDP record for " + name);
}
socket.setCloseHandler(mHandler, handle);
if (mServiceRecordHandler == null) {
mServiceRecordHandler = new Handler(Looper.getMainLooper()) {
public void handleMessage(Message msg) {
/* handle socket closing */
int handle = msg.what;
try {
if (DBG) Log.d(TAG, "Removing service record " +
Integer.toHexString(handle));
mService.removeServiceRecord(handle);
} catch (RemoteException e) {Log.e(TAG, "", e);}
}
};
}
socket.setCloseHandler(mServiceRecordHandler, handle);
return socket;
}
@@ -1243,17 +1261,6 @@ public final class BluetoothAdapter {
return Collections.unmodifiableSet(devices);
}
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
/* handle socket closing */
int handle = msg.what;
try {
if (DBG) Log.d(TAG, "Removing service record " + Integer.toHexString(handle));
mService.removeServiceRecord(handle);
} catch (RemoteException e) {Log.e(TAG, "", e);}
}
};
/**
* Validate a Bluetooth address, such as "00:43:A8:23:10:F0"
* <p>Alphabetic characters must be uppercase to be valid.

View File

@@ -117,6 +117,7 @@ public class BluetoothService extends IBluetooth.Stub {
private static final int MESSAGE_UUID_INTENT = 1;
private static final int MESSAGE_AUTO_PAIRING_FAILURE_ATTEMPT_DELAY = 2;
private static final int MESSAGE_REMOVE_SERVICE_RECORD = 3;
private static final int RFCOMM_RECORD_REAPER = 10;
private static final int STATE_CHANGE_REAPER = 11;
@@ -537,6 +538,10 @@ public class BluetoothService extends IBluetooth.Stub {
}
if (attempt > 0) mBondState.clearPinAttempts(address);
break;
case MESSAGE_REMOVE_SERVICE_RECORD:
Pair<Integer, Integer> pair = (Pair<Integer, Integer>) msg.obj;
checkAndRemoveRecord(pair.first, pair.second);
break;
}
}
};
@@ -1542,7 +1547,9 @@ public class BluetoothService extends IBluetooth.Stub {
public void removeServiceRecord(int handle) {
mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM,
"Need BLUETOOTH permission");
checkAndRemoveRecord(handle, Binder.getCallingPid());
Message message = mHandler.obtainMessage(MESSAGE_REMOVE_SERVICE_RECORD);
message.obj = new Pair<Integer, Integer>(handle, Binder.getCallingPid());
mHandler.sendMessage(message);
}
private synchronized void checkAndRemoveRecord(int handle, int pid) {