am 20d4ce13: am f50b88a5: am aac04a4f: Merge "Add a default impelementation of IBluetoothGattCallback(1/2)." into lmp-dev

* commit '20d4ce1313635143e862b30aa65277e7802c7cba':
  Add a default impelementation of IBluetoothGattCallback(1/2).
This commit is contained in:
Wei Wang
2014-08-01 21:55:47 +00:00
committed by Android Git Automerger
5 changed files with 165 additions and 299 deletions

View File

@@ -16,7 +16,6 @@
package android.bluetooth;
import android.bluetooth.le.ScanResult;
import android.content.Context;
import android.os.ParcelUuid;
import android.os.RemoteException;
@@ -130,10 +129,10 @@ public final class BluetoothGatt implements BluetoothProfile {
/*package*/ static final int AUTHENTICATION_MITM = 2;
/**
* Bluetooth GATT interface callbacks
* Bluetooth GATT callbacks. Overrides the default BluetoothGattCallback implementation.
*/
private final IBluetoothGattCallback mBluetoothGattCallback =
new IBluetoothGattCallback.Stub() {
new BluetoothGattCallbackWrapper() {
/**
* Application interface registered - app is ready to go
* @hide
@@ -197,14 +196,6 @@ public final class BluetoothGatt implements BluetoothProfile {
}
}
/**
* Callback reporting an LE scan result.
* @hide
*/
public void onScanResult(String address, int rssi, byte[] advData) {
// no op
}
/**
* A new GATT service has been discovered.
* The service is added to the internal list and the search
@@ -599,23 +590,6 @@ public final class BluetoothGatt implements BluetoothProfile {
}
}
/**
* Advertise state change callback
* @hide
*/
public void onAdvertiseStateChange(int state, int status) {
if (DBG) Log.d(TAG, "onAdvertiseStateChange() - state = "
+ state + " status=" + status);
}
/**
* @hide
*/
@Override
public void onMultiAdvertiseCallback(int status) {
// no op.
}
/**
* Callback invoked when the MTU for a given connection changes
* @hide
@@ -647,20 +621,6 @@ public final class BluetoothGatt implements BluetoothProfile {
Log.w(TAG, "Unhandled exception in callback", ex);
}
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
// no op
}
/**
* @hide
*/
@Override
public void onFoundOrLost(boolean onFound, String address, int rssi,
byte[] advData) {
// no op.
}
};
/*package*/ BluetoothGatt(Context context, IBluetoothGatt iGatt, BluetoothDevice device,

View File

@@ -0,0 +1,131 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.bluetooth;
import android.bluetooth.le.AdvertiseSettings;
import android.bluetooth.le.ScanResult;
import android.os.ParcelUuid;
import android.os.RemoteException;
import java.util.List;
/**
* Wrapper class for default implementation of IBluetoothGattCallback.
*
* @hide
*/
public class BluetoothGattCallbackWrapper extends IBluetoothGattCallback.Stub {
@Override
public void onClientRegistered(int status, int clientIf) throws RemoteException {
}
@Override
public void onClientConnectionState(int status, int clientIf, boolean connected, String address)
throws RemoteException {
}
@Override
public void onScanResult(ScanResult scanResult) throws RemoteException {
}
@Override
public void onBatchScanResults(List<ScanResult> batchResults) throws RemoteException {
}
@Override
public void onGetService(String address, int srvcType, int srvcInstId, ParcelUuid srvcUuid)
throws RemoteException {
}
@Override
public void onGetIncludedService(String address, int srvcType, int srvcInstId,
ParcelUuid srvcUuid, int inclSrvcType, int inclSrvcInstId, ParcelUuid inclSrvcUuid)
throws RemoteException {
}
@Override
public void onGetCharacteristic(String address, int srvcType, int srvcInstId,
ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, int charProps)
throws RemoteException {
}
@Override
public void onGetDescriptor(String address, int srvcType, int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid, int descrInstId, ParcelUuid descrUuid)
throws RemoteException {
}
@Override
public void onSearchComplete(String address, int status) throws RemoteException {
}
@Override
public void onCharacteristicRead(String address, int status, int srvcType, int srvcInstId,
ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, byte[] value)
throws RemoteException {
}
@Override
public void onCharacteristicWrite(String address, int status, int srvcType, int srvcInstId,
ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid) throws RemoteException {
}
@Override
public void onExecuteWrite(String address, int status) throws RemoteException {
}
@Override
public void onDescriptorRead(String address, int status, int srvcType, int srvcInstId,
ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, int descrInstId,
ParcelUuid descrUuid, byte[] value) throws RemoteException {
}
@Override
public void onDescriptorWrite(String address, int status, int srvcType, int srvcInstId,
ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, int descrInstId,
ParcelUuid descrUuid) throws RemoteException {
}
@Override
public void onNotify(String address, int srvcType, int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid, byte[] value) throws RemoteException {
}
@Override
public void onReadRemoteRssi(String address, int rssi, int status) throws RemoteException {
}
@Override
public void onMultiAdvertiseCallback(int status, boolean isStart,
AdvertiseSettings advertiseSettings) throws RemoteException {
}
@Override
public void onConfigureMTU(String address, int mtu, int status) throws RemoteException {
}
@Override
public void onConnectionCongested(String address, boolean congested) throws RemoteException {
}
@Override
public void onFoundOrLost(boolean onFound, String address, int rssi, byte[] advData)
throws RemoteException {
}
}

View File

@@ -16,6 +16,7 @@
package android.bluetooth;
import android.os.ParcelUuid;
import android.bluetooth.le.AdvertiseSettings;
import android.bluetooth.le.ScanResult;
/**
@@ -26,7 +27,7 @@ oneway interface IBluetoothGattCallback {
void onClientRegistered(in int status, in int clientIf);
void onClientConnectionState(in int status, in int clientIf,
in boolean connected, in String address);
void onScanResult(in String address, in int rssi, in byte[] advData);
void onScanResult(in ScanResult scanResult);
void onBatchScanResults(in List<ScanResult> batchResults);
void onGetService(in String address, in int srvcType, in int srvcInstId,
in ParcelUuid srvcUuid);
@@ -64,7 +65,8 @@ oneway interface IBluetoothGattCallback {
in int charInstId, in ParcelUuid charUuid,
in byte[] value);
void onReadRemoteRssi(in String address, in int rssi, in int status);
void onMultiAdvertiseCallback(in int status);
void onMultiAdvertiseCallback(in int status, boolean isStart,
in AdvertiseSettings advertiseSettings);
void onConfigureMTU(in String address, in int mtu, in int status);
void onConnectionCongested(in String address, in boolean congested);
void onFoundOrLost(in boolean onFound, in String address, in int rssi,

View File

@@ -18,6 +18,7 @@ package android.bluetooth.le;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallbackWrapper;
import android.bluetooth.BluetoothUuid;
import android.bluetooth.IBluetoothGatt;
import android.bluetooth.IBluetoothGattCallback;
@@ -233,7 +234,7 @@ public final class BluetoothLeAdvertiser {
/**
* Bluetooth GATT interface callbacks for advertising.
*/
private static class AdvertiseCallbackWrapper extends IBluetoothGattCallback.Stub {
private static class AdvertiseCallbackWrapper extends BluetoothGattCallbackWrapper {
private static final int LE_CALLBACK_TIMEOUT_MILLIS = 2000;
private final AdvertiseCallback mAdvertiseCallback;
private final AdvertiseData mAdvertisement;
@@ -245,7 +246,7 @@ public final class BluetoothLeAdvertiser {
// -1: scan stopped
// >0: registered and scan started
private int mClientIf;
private boolean isAdvertising = false;
private boolean mIsAdvertising = false;
public AdvertiseCallbackWrapper(AdvertiseCallback advertiseCallback,
AdvertiseData advertiseData, AdvertiseData scanResponse,
@@ -270,7 +271,7 @@ public final class BluetoothLeAdvertiser {
} catch (InterruptedException e) {
Log.e(TAG, "Callback reg wait interrupted: ", e);
}
started = (mClientIf > 0 && isAdvertising);
started = (mClientIf > 0 && mIsAdvertising);
}
return started;
}
@@ -282,7 +283,7 @@ public final class BluetoothLeAdvertiser {
} catch (InterruptedException e) {
Log.e(TAG, "Callback reg wait interrupted: " + e);
}
return !isAdvertising;
return !mIsAdvertising;
}
}
@@ -312,155 +313,35 @@ public final class BluetoothLeAdvertiser {
}
@Override
public void onClientConnectionState(int status, int clientIf,
boolean connected, String address) {
// no op
}
@Override
public void onScanResult(String address, int rssi, byte[] advData) {
// no op
}
@Override
public void onGetService(String address, int srvcType,
int srvcInstId, ParcelUuid srvcUuid) {
// no op
}
@Override
public void onGetIncludedService(String address, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int inclSrvcType, int inclSrvcInstId,
ParcelUuid inclSrvcUuid) {
// no op
}
@Override
public void onGetCharacteristic(String address, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid,
int charProps) {
// no op
}
@Override
public void onGetDescriptor(String address, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid,
int descInstId, ParcelUuid descUuid) {
// no op
}
@Override
public void onSearchComplete(String address, int status) {
// no op
}
@Override
public void onCharacteristicRead(String address, int status, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid, byte[] value) {
// no op
}
@Override
public void onCharacteristicWrite(String address, int status, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid) {
// no op
}
@Override
public void onNotify(String address, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid,
byte[] value) {
// no op
}
@Override
public void onDescriptorRead(String address, int status, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid,
int descInstId, ParcelUuid descrUuid, byte[] value) {
// no op
}
@Override
public void onDescriptorWrite(String address, int status, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid,
int descInstId, ParcelUuid descrUuid) {
// no op
}
@Override
public void onExecuteWrite(String address, int status) {
// no op
}
@Override
public void onReadRemoteRssi(String address, int rssi, int status) {
// no op
}
@Override
public void onMultiAdvertiseCallback(int status) {
// TODO: This logic needs to be re-visited to account
// for whether the scan has actually been started
// or not. Toggling the isAdvertising does not seem
// correct.
public void onMultiAdvertiseCallback(int status, boolean isStart,
AdvertiseSettings settings) {
synchronized (this) {
if (status == AdvertiseCallback.ADVERTISE_SUCCESS) {
isAdvertising = !isAdvertising;
if (!isAdvertising) {
try {
mBluetoothGatt.unregisterClient(mClientIf);
mClientIf = -1;
} catch (RemoteException e) {
Log.e(TAG, "remote exception when unregistering", e);
}
if (isStart) {
if (status == AdvertiseCallback.ADVERTISE_SUCCESS) {
// Start success
mAdvertiseCallback.onStartSuccess(settings);
mIsAdvertising = true;
} else {
mAdvertiseCallback.onStartSuccess(null);
// Start failure.
mAdvertiseCallback.onStartFailure(status);
}
} else {
if (!isAdvertising)
mAdvertiseCallback.onStartFailure(status);
// unregister client for stop.
try {
mBluetoothGatt.unregisterClient(mClientIf);
mClientIf = -1;
mIsAdvertising = false;
} catch (RemoteException e) {
Log.e(TAG, "remote exception when unregistering", e);
}
}
notifyAll();
}
}
/**
* Callback reporting LE ATT MTU.
*
* @hide
*/
@Override
public void onConfigureMTU(String address, int mtu, int status) {
// no op
}
@Override
public void onConnectionCongested(String address, boolean congested) {
// no op
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
// no op
}
@Override
public void onFoundOrLost(boolean onFound, String address, int rssi,
byte[] advData) {
// no op
}
}
//TODO: move this api to a common util class.
// TODO: move this api to a common util class.
private void checkAdapterState() {
if (mBluetoothAdapter.getState() != mBluetoothAdapter.STATE_ON) {
throw new IllegalStateException("BT Adapter is not turned ON");

View File

@@ -19,6 +19,7 @@ package android.bluetooth.le;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallbackWrapper;
import android.bluetooth.IBluetoothGatt;
import android.bluetooth.IBluetoothGattCallback;
import android.bluetooth.IBluetoothManager;
@@ -186,7 +187,7 @@ public final class BluetoothLeScanner {
/**
* Bluetooth GATT interface callbacks
*/
private static class BleScanCallbackWrapper extends IBluetoothGattCallback.Stub {
private static class BleScanCallbackWrapper extends BluetoothGattCallbackWrapper {
private static final int REGISTRATION_CALLBACK_TIMEOUT_SECONDS = 5;
private final ScanCallback mScanCallback;
@@ -284,37 +285,26 @@ public final class BluetoothLeScanner {
}
}
@Override
public void onClientConnectionState(int status, int clientIf,
boolean connected, String address) {
// no op
}
/**
* Callback reporting an LE scan result.
*
* @hide
*/
@Override
public void onScanResult(String address, int rssi, byte[] advData) {
public void onScanResult(final ScanResult scanResult) {
if (DBG)
Log.d(TAG, "onScanResult() - Device=" + address + " RSSI=" + rssi);
Log.d(TAG, "onScanResult() - " + scanResult.toString());
// Check null in case the scan has been stopped
synchronized (this) {
if (mClientIf <= 0)
return;
}
BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(
address);
long scanNanos = SystemClock.elapsedRealtimeNanos();
final ScanResult result = new ScanResult(device, ScanRecord.parseFromBytes(advData),
rssi, scanNanos);
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, result);
mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, scanResult);
}
});
@@ -331,104 +321,6 @@ public final class BluetoothLeScanner {
});
}
@Override
public void onGetService(String address, int srvcType,
int srvcInstId, ParcelUuid srvcUuid) {
// no op
}
@Override
public void onGetIncludedService(String address, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int inclSrvcType, int inclSrvcInstId,
ParcelUuid inclSrvcUuid) {
// no op
}
@Override
public void onGetCharacteristic(String address, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid,
int charProps) {
// no op
}
@Override
public void onGetDescriptor(String address, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid,
int descInstId, ParcelUuid descUuid) {
// no op
}
@Override
public void onSearchComplete(String address, int status) {
// no op
}
@Override
public void onCharacteristicRead(String address, int status, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid, byte[] value) {
// no op
}
@Override
public void onCharacteristicWrite(String address, int status, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid) {
// no op
}
@Override
public void onNotify(String address, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid,
byte[] value) {
// no op
}
@Override
public void onDescriptorRead(String address, int status, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid,
int descInstId, ParcelUuid descrUuid, byte[] value) {
// no op
}
@Override
public void onDescriptorWrite(String address, int status, int srvcType,
int srvcInstId, ParcelUuid srvcUuid,
int charInstId, ParcelUuid charUuid,
int descInstId, ParcelUuid descrUuid) {
// no op
}
@Override
public void onExecuteWrite(String address, int status) {
// no op
}
@Override
public void onReadRemoteRssi(String address, int rssi, int status) {
// no op
}
@Override
public void onMultiAdvertiseCallback(int status) {
// no op
}
@Override
public void onConfigureMTU(String address, int mtu, int status) {
// no op
}
@Override
public void onConnectionCongested(String address, boolean congested) {
// no op
}
@Override
public void onFoundOrLost(boolean onFound, String address, int rssi,
byte[] advData) {