Merge "Move Bluetooth remove service record handler to the app main thread"
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user