GATT Server refactoring (2/4)

Bug: 27999121
Change-Id: Ia5f91298a4b01b62adebc8adc30f27f757259588
This commit is contained in:
Jakub Pawlowski
2016-04-01 07:51:45 -07:00
committed by Andre Eisenbach
parent 6eb30f2060
commit d75f512aa2
7 changed files with 126 additions and 155 deletions

View File

@ -250,9 +250,6 @@ public final class BluetoothGatt implements BluetoothProfile {
if (VDBG) Log.d(TAG, "onCharacteristicRead() - Device=" + address
+ " handle=" + handle + " Status=" + status);
Log.w(TAG, "onCharacteristicRead() - Device=" + address
+ " handle=" + handle + " Status=" + status);
if (!address.equals(mDevice.getAddress())) {
return;
}

View File

@ -321,10 +321,10 @@ public class BluetoothGattCharacteristic implements Parcelable {
}
/**
* Returns the deisred key size.
* Returns the desired key size.
* @hide
*/
/*package*/ int getKeySize() {
public int getKeySize() {
return mKeySize;
}
@ -392,6 +392,14 @@ public class BluetoothGattCharacteristic implements Parcelable {
return mInstance;
}
/**
* Force the instance ID.
* @hide
*/
public void setInstanceId(int instanceId) {
mInstance = instanceId;
}
/**
* Returns the properties of this characteristic.
*

View File

@ -226,6 +226,14 @@ public class BluetoothGattDescriptor implements Parcelable {
return mInstance;
}
/**
* Force the instance ID.
* @hide
*/
public void setInstanceId(int instanceId) {
mInstance = instanceId;
}
/**
* Returns the permissions for this descriptor.
*

View File

@ -52,6 +52,7 @@ public final class BluetoothGattServer implements BluetoothProfile {
private Object mServerIfLock = new Object();
private int mServerIf;
private int mTransport;
private BluetoothGattService mPendingService;
private List<BluetoothGattService> mServices;
private static final int CALLBACK_REG_TIMEOUT = 10000;
@ -109,17 +110,37 @@ public final class BluetoothGattServer implements BluetoothProfile {
* Service has been added
* @hide
*/
public void onServiceAdded(int status, int srvcType,
int srvcInstId, ParcelUuid srvcId) {
UUID srvcUuid = srvcId.getUuid();
if (DBG) Log.d(TAG, "onServiceAdded() - service=" + srvcUuid
+ "status=" + status);
public void onServiceAdded(int status, BluetoothGattService service) {
if (DBG) Log.d(TAG, "onServiceAdded() - handle=" + service.getInstanceId()
+ " uuid=" + service.getUuid() + " status=" + status);
BluetoothGattService service = getService(srvcUuid, srvcInstId, srvcType);
if (service == null) return;
if (mPendingService == null)
return;
BluetoothGattService tmp = mPendingService;
mPendingService = null;
// Rewrite newly assigned handles to existing service.
tmp.setInstanceId(service.getInstanceId());
List<BluetoothGattCharacteristic> temp_chars = tmp.getCharacteristics();
List<BluetoothGattCharacteristic> svc_chars = service.getCharacteristics();
for (int i=0; i<svc_chars.size(); i++) {
BluetoothGattCharacteristic temp_char = temp_chars.get(i);
BluetoothGattCharacteristic svc_char = svc_chars.get(i);
temp_char.setInstanceId(svc_char.getInstanceId());
List<BluetoothGattDescriptor> temp_descs = temp_char.getDescriptors();
List<BluetoothGattDescriptor> svc_descs = svc_char.getDescriptors();
for (int j=0; j<svc_descs.size(); j++) {
temp_descs.get(i).setInstanceId(svc_descs.get(i).getInstanceId());
}
}
mServices.add(tmp);
try {
mCallback.onServiceAdded((int)status, service);
mCallback.onServiceAdded((int)status, tmp);
} catch (Exception ex) {
Log.w(TAG, "Unhandled exception in callback", ex);
}
@ -130,19 +151,15 @@ public final class BluetoothGattServer implements BluetoothProfile {
* @hide
*/
public void onCharacteristicReadRequest(String address, int transId,
int offset, boolean isLong, int srvcType, int srvcInstId,
ParcelUuid srvcId, int charInstId, ParcelUuid charId) {
UUID srvcUuid = srvcId.getUuid();
UUID charUuid = charId.getUuid();
if (VDBG) Log.d(TAG, "onCharacteristicReadRequest() - "
+ "service=" + srvcUuid + ", characteristic=" + charUuid);
int offset, boolean isLong, int handle) {
if (VDBG) Log.d(TAG, "onCharacteristicReadRequest() - handle=" + handle);
BluetoothDevice device = mAdapter.getRemoteDevice(address);
BluetoothGattService service = getService(srvcUuid, srvcInstId, srvcType);
if (service == null) return;
BluetoothGattCharacteristic characteristic = service.getCharacteristic(charUuid);
if (characteristic == null) return;
BluetoothGattCharacteristic characteristic = getCharacteristicByHandle(handle);
if (characteristic == null) {
Log.w(TAG, "onCharacteristicReadRequest() no char for handle " + handle);
return;
}
try {
mCallback.onCharacteristicReadRequest(device, transId, offset, characteristic);
@ -156,25 +173,15 @@ public final class BluetoothGattServer implements BluetoothProfile {
* @hide
*/
public void onDescriptorReadRequest(String address, int transId,
int offset, boolean isLong, int srvcType, int srvcInstId,
ParcelUuid srvcId, int charInstId, ParcelUuid charId,
ParcelUuid descrId) {
UUID srvcUuid = srvcId.getUuid();
UUID charUuid = charId.getUuid();
UUID descrUuid = descrId.getUuid();
if (VDBG) Log.d(TAG, "onCharacteristicReadRequest() - "
+ "service=" + srvcUuid + ", characteristic=" + charUuid
+ "descriptor=" + descrUuid);
int offset, boolean isLong, int handle) {
if (VDBG) Log.d(TAG, "onCharacteristicReadRequest() - handle=" + handle);
BluetoothDevice device = mAdapter.getRemoteDevice(address);
BluetoothGattService service = getService(srvcUuid, srvcInstId, srvcType);
if (service == null) return;
BluetoothGattCharacteristic characteristic = service.getCharacteristic(charUuid);
if (characteristic == null) return;
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descrUuid);
if (descriptor == null) return;
BluetoothGattDescriptor descriptor = getDescriptorByHandle(handle);
if (descriptor == null) {
Log.w(TAG, "onDescriptorReadRequest() no desc for handle " + handle);
return;
}
try {
mCallback.onDescriptorReadRequest(device, transId, offset, descriptor);
@ -189,19 +196,15 @@ public final class BluetoothGattServer implements BluetoothProfile {
*/
public void onCharacteristicWriteRequest(String address, int transId,
int offset, int length, boolean isPrep, boolean needRsp,
int srvcType, int srvcInstId, ParcelUuid srvcId,
int charInstId, ParcelUuid charId, byte[] value) {
UUID srvcUuid = srvcId.getUuid();
UUID charUuid = charId.getUuid();
if (VDBG) Log.d(TAG, "onCharacteristicWriteRequest() - "
+ "service=" + srvcUuid + ", characteristic=" + charUuid);
int handle, byte[] value) {
if (VDBG) Log.d(TAG, "onCharacteristicWriteRequest() - handle=" + handle);
BluetoothDevice device = mAdapter.getRemoteDevice(address);
BluetoothGattService service = getService(srvcUuid, srvcInstId, srvcType);
if (service == null) return;
BluetoothGattCharacteristic characteristic = service.getCharacteristic(charUuid);
if (characteristic == null) return;
BluetoothGattCharacteristic characteristic = getCharacteristicByHandle(handle);
if (characteristic == null) {
Log.w(TAG, "onCharacteristicWriteRequest() no char for handle " + handle);
return;
}
try {
mCallback.onCharacteristicWriteRequest(device, transId, characteristic,
@ -216,28 +219,16 @@ public final class BluetoothGattServer implements BluetoothProfile {
* Remote client descriptor write request.
* @hide
*/
public void onDescriptorWriteRequest(String address, int transId,
int offset, int length, boolean isPrep, boolean needRsp,
int srvcType, int srvcInstId, ParcelUuid srvcId,
int charInstId, ParcelUuid charId, ParcelUuid descrId,
byte[] value) {
UUID srvcUuid = srvcId.getUuid();
UUID charUuid = charId.getUuid();
UUID descrUuid = descrId.getUuid();
if (VDBG) Log.d(TAG, "onDescriptorWriteRequest() - "
+ "service=" + srvcUuid + ", characteristic=" + charUuid
+ "descriptor=" + descrUuid);
public void onDescriptorWriteRequest(String address, int transId, int offset,
int length, boolean isPrep, boolean needRsp, int handle, byte[] value) {
if (VDBG) Log.d(TAG, "onDescriptorWriteRequest() - handle=" + handle);
BluetoothDevice device = mAdapter.getRemoteDevice(address);
BluetoothGattService service = getService(srvcUuid, srvcInstId, srvcType);
if (service == null) return;
BluetoothGattCharacteristic characteristic = service.getCharacteristic(charUuid);
if (characteristic == null) return;
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descrUuid);
if (descriptor == null) return;
BluetoothGattDescriptor descriptor = getDescriptorByHandle(handle);
if (descriptor == null) {
Log.w(TAG, "onDescriptorWriteRequest() no desc for handle " + handle);
return;
}
try {
mCallback.onDescriptorWriteRequest(device, transId, descriptor,
@ -317,6 +308,36 @@ public final class BluetoothGattServer implements BluetoothProfile {
mServices = new ArrayList<BluetoothGattService>();
}
/**
* Returns a characteristic with given handle.
* @hide
*/
/*package*/ BluetoothGattCharacteristic getCharacteristicByHandle(int handle) {
for(BluetoothGattService svc : mServices) {
for(BluetoothGattCharacteristic charac : svc.getCharacteristics()) {
if (charac.getInstanceId() == handle)
return charac;
}
}
return null;
}
/**
* Returns a descriptor with given handle.
* @hide
*/
/*package*/ BluetoothGattDescriptor getDescriptorByHandle(int handle) {
for(BluetoothGattService svc : mServices) {
for(BluetoothGattCharacteristic charac : svc.getCharacteristics()) {
for(BluetoothGattDescriptor desc : charac.getDescriptors()) {
if (desc.getInstanceId() == handle)
return desc;
}
}
}
return null;
}
/**
* Close this GATT server instance.
*
@ -537,9 +558,7 @@ public final class BluetoothGattServer implements BluetoothProfile {
try {
mService.sendNotification(mServerIf, device.getAddress(),
service.getType(), service.getInstanceId(),
new ParcelUuid(service.getUuid()), characteristic.getInstanceId(),
new ParcelUuid(characteristic.getUuid()), confirm,
characteristic.getInstanceId(), confirm,
characteristic.getValue());
} catch (RemoteException e) {
Log.e(TAG,"",e);
@ -568,39 +587,10 @@ public final class BluetoothGattServer implements BluetoothProfile {
if (DBG) Log.d(TAG, "addService() - service: " + service.getUuid());
if (mService == null || mServerIf == 0) return false;
mServices.add(service);
mPendingService = service;
try {
mService.beginServiceDeclaration(mServerIf, service.getType(),
service.getInstanceId(), service.getHandles(),
new ParcelUuid(service.getUuid()), service.isAdvertisePreferred());
List<BluetoothGattService> includedServices = service.getIncludedServices();
for (BluetoothGattService includedService : includedServices) {
mService.addIncludedService(mServerIf,
includedService.getType(),
includedService.getInstanceId(),
new ParcelUuid(includedService.getUuid()));
}
List<BluetoothGattCharacteristic> characteristics = service.getCharacteristics();
for (BluetoothGattCharacteristic characteristic : characteristics) {
int permission = ((characteristic.getKeySize() - 7) << 12)
+ characteristic.getPermissions();
mService.addCharacteristic(mServerIf,
new ParcelUuid(characteristic.getUuid()),
characteristic.getProperties(), permission);
List<BluetoothGattDescriptor> descriptors = characteristic.getDescriptors();
for (BluetoothGattDescriptor descriptor: descriptors) {
permission = ((characteristic.getKeySize() - 7) << 12)
+ descriptor.getPermissions();
mService.addDescriptor(mServerIf,
new ParcelUuid(descriptor.getUuid()), permission);
}
}
mService.endServiceDeclaration(mServerIf);
mService.addService(mServerIf, service);
} catch (RemoteException e) {
Log.e(TAG,"",e);
return false;
@ -626,8 +616,7 @@ public final class BluetoothGattServer implements BluetoothProfile {
if (intService == null) return false;
try {
mService.removeService(mServerIf, service.getType(),
service.getInstanceId(), new ParcelUuid(service.getUuid()));
mService.removeService(mServerIf, service.getInstanceId());
mServices.remove(intService);
} catch (RemoteException e) {
Log.e(TAG,"",e);

View File

@ -250,7 +250,6 @@ public class BluetoothGattService implements Parcelable {
/**
* Force the instance ID.
* This is needed for conformance testing only.
* @hide
*/
public void setInstanceId(int instanceId) {

View File

@ -17,6 +17,7 @@
package android.bluetooth;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGattService;
import android.bluetooth.le.AdvertiseSettings;
import android.bluetooth.le.AdvertiseData;
import android.bluetooth.le.ScanFilter;
@ -65,26 +66,14 @@ interface IBluetoothGatt {
void registerServer(in ParcelUuid appId, in IBluetoothGattServerCallback callback);
void unregisterServer(in int serverIf);
void serverConnect(in int servertIf, in String address, in boolean isDirect, in int transport);
void serverConnect(in int serverIf, in String address, in boolean isDirect, in int transport);
void serverDisconnect(in int serverIf, in String address);
void beginServiceDeclaration(in int serverIf, in int srvcType,
in int srvcInstanceId, in int minHandles,
in ParcelUuid srvcId, boolean advertisePreferred);
void addIncludedService(in int serverIf, in int srvcType,
in int srvcInstanceId, in ParcelUuid srvcId);
void addCharacteristic(in int serverIf, in ParcelUuid charId,
in int properties, in int permissions);
void addDescriptor(in int serverIf, in ParcelUuid descId,
in int permissions);
void endServiceDeclaration(in int serverIf);
void removeService(in int serverIf, in int srvcType,
in int srvcInstanceId, in ParcelUuid srvcId);
void addService(in int serverIf, in BluetoothGattService service);
void removeService(in int serverIf, in int handle);
void clearServices(in int serverIf);
void sendResponse(in int serverIf, in String address, in int requestId,
in int status, in int offset, in byte[] value);
void sendNotification(in int serverIf, in String address, in int srvcType,
in int srvcInstanceId, in ParcelUuid srvcId,
in int charInstanceId, in ParcelUuid charId,
void sendNotification(in int serverIf, in String address, in int handle,
in boolean confirm, in byte[] value);
void disconnectAll();
void unregAll();

View File

@ -15,8 +15,7 @@
*/
package android.bluetooth;
import android.os.ParcelUuid;
import android.bluetooth.BluetoothGattService;
/**
* Callback definitions for interacting with BLE / GATT
@ -27,36 +26,18 @@ oneway interface IBluetoothGattServerCallback {
void onScanResult(in String address, in int rssi, in byte[] advData);
void onServerConnectionState(in int status, in int serverIf,
in boolean connected, in String address);
void onServiceAdded(in int status, in int srvcType,
in int srvcInstId, in ParcelUuid srvcId);
void onCharacteristicReadRequest(in String address, in int transId,
in int offset, in boolean isLong,
in int srvcType,
in int srvcInstId, in ParcelUuid srvcId,
in int charInstId, in ParcelUuid charId);
void onServiceAdded(in int status, in BluetoothGattService service);
void onCharacteristicReadRequest(in String address, in int transId, in int offset,
in boolean isLong, in int handle);
void onDescriptorReadRequest(in String address, in int transId,
in int offset, in boolean isLong,
in int srvcType,
in int srvcInstId, in ParcelUuid srvcId,
in int charInstId, in ParcelUuid charId,
in ParcelUuid descrId);
void onCharacteristicWriteRequest(in String address, in int transId,
in int offset, in int length,
in boolean isPrep,
in boolean needRsp,
in int srvcType,
in int srvcInstId, in ParcelUuid srvcId,
in int charInstId, in ParcelUuid charId,
in byte[] value);
void onDescriptorWriteRequest(in String address, in int transId,
in int offset, in int length,
in boolean isPrep,
in boolean needRsp,
in int srvcType,
in int srvcInstId, in ParcelUuid srvcId,
in int charInstId, in ParcelUuid charId,
in ParcelUuid descrId,
in byte[] value);
in int handle);
void onCharacteristicWriteRequest(in String address, in int transId, in int offset,
in int length, in boolean isPrep, in boolean needRsp,
in int handle, in byte[] value);
void onDescriptorWriteRequest(in String address, in int transId, in int offset,
in int length, in boolean isPrep, in boolean needRsp,
in int handle, in byte[] value);
void onExecuteWrite(in String address, in int transId, in boolean execWrite);
void onNotificationSent(in String address, in int status);
void onMtuChanged(in String address, in int mtu);