Merge "Separate LE scanner from GATT client (1/4)"

am: 87c997ca21

Change-Id: I8fdf97a457d7566b4e0048624d47a6cfea693f13
This commit is contained in:
Jakub Pawlowski
2016-10-28 02:50:54 +00:00
committed by android-build-merger
9 changed files with 69 additions and 140 deletions

View File

@@ -127,6 +127,7 @@ LOCAL_SRC_FILES += \
core/java/android/bluetooth/IBluetoothGattCallback.aidl \ core/java/android/bluetooth/IBluetoothGattCallback.aidl \
core/java/android/bluetooth/IBluetoothGattServerCallback.aidl \ core/java/android/bluetooth/IBluetoothGattServerCallback.aidl \
core/java/android/bluetooth/le/IAdvertiserCallback.aidl \ core/java/android/bluetooth/le/IAdvertiserCallback.aidl \
core/java/android/bluetooth/le/IScannerCallback.aidl \
core/java/android/content/IClipboard.aidl \ core/java/android/content/IClipboard.aidl \
core/java/android/content/IContentService.aidl \ core/java/android/content/IContentService.aidl \
core/java/android/content/IIntentReceiver.aidl \ core/java/android/content/IIntentReceiver.aidl \

View File

@@ -135,7 +135,7 @@ public final class BluetoothGatt implements BluetoothProfile {
* Bluetooth GATT callbacks. Overrides the default BluetoothGattCallback implementation. * Bluetooth GATT callbacks. Overrides the default BluetoothGattCallback implementation.
*/ */
private final IBluetoothGattCallback mBluetoothGattCallback = private final IBluetoothGattCallback mBluetoothGattCallback =
new BluetoothGattCallbackWrapper() { new IBluetoothGattCallback.Stub() {
/** /**
* Application interface registered - app is ready to go * Application interface registered - app is ready to go
* @hide * @hide

View File

@@ -1,96 +0,0 @@
/*
* 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.bluetooth.BluetoothGattService;
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 onSearchComplete(String address, List<BluetoothGattService> services,
int status) throws RemoteException {
}
@Override
public void onCharacteristicRead(String address, int status, int handle, byte[] value)
throws RemoteException {
}
@Override
public void onCharacteristicWrite(String address, int status, int handle) throws RemoteException {
}
@Override
public void onExecuteWrite(String address, int status) throws RemoteException {
}
@Override
public void onDescriptorRead(String address, int status, int handle, byte[] value) throws RemoteException {
}
@Override
public void onDescriptorWrite(String address, int status, int handle) throws RemoteException {
}
@Override
public void onNotify(String address, int handle, byte[] value) throws RemoteException {
}
@Override
public void onReadRemoteRssi(String address, int rssi, int status) throws RemoteException {
}
@Override
public void onConfigureMTU(String address, int mtu, int status) throws RemoteException {
}
@Override
public void onFoundOrLost(boolean onFound, ScanResult scanResult) throws RemoteException {
}
@Override
public void onScanManagerErrorCallback(int errorCode) throws RemoteException {
}
}

View File

@@ -29,6 +29,7 @@ import android.os.WorkSource;
import android.bluetooth.IBluetoothGattCallback; import android.bluetooth.IBluetoothGattCallback;
import android.bluetooth.IBluetoothGattServerCallback; import android.bluetooth.IBluetoothGattServerCallback;
import android.bluetooth.le.IAdvertiserCallback; import android.bluetooth.le.IAdvertiserCallback;
import android.bluetooth.le.IScannerCallback;
/** /**
* API for interacting with BLE / GATT * API for interacting with BLE / GATT
@@ -37,11 +38,12 @@ import android.bluetooth.le.IAdvertiserCallback;
interface IBluetoothGatt { interface IBluetoothGatt {
List<BluetoothDevice> getDevicesMatchingConnectionStates(in int[] states); List<BluetoothDevice> getDevicesMatchingConnectionStates(in int[] states);
void startScan(in int appIf, in boolean isServer, in ScanSettings settings, void registerScanner(in IScannerCallback callback);
in List<ScanFilter> filters, in WorkSource workSource, in List scanStorages, void unregisterScanner(in int scannerId);
in String callingPackage); void startScan(in int scannerId, in ScanSettings settings, in List<ScanFilter> filters,
void stopScan(in int appIf, in boolean isServer); in WorkSource workSource, in List scanStorages, in String callingPackage);
void flushPendingBatchResults(in int appIf, in boolean isServer); void stopScan(in int scannerId);
void flushPendingBatchResults(in int scannerId);
void registerAdvertiser(in IAdvertiserCallback callback); void registerAdvertiser(in IAdvertiserCallback callback);
void unregisterAdvertiser(in int advertiserId); void unregisterAdvertiser(in int advertiserId);

View File

@@ -17,8 +17,6 @@ package android.bluetooth;
import android.os.ParcelUuid; import android.os.ParcelUuid;
import android.bluetooth.BluetoothGattService; import android.bluetooth.BluetoothGattService;
import android.bluetooth.le.AdvertiseSettings;
import android.bluetooth.le.ScanResult;
/** /**
* Callback definitions for interacting with BLE / GATT * Callback definitions for interacting with BLE / GATT
@@ -28,8 +26,6 @@ oneway interface IBluetoothGattCallback {
void onClientRegistered(in int status, in int clientIf); void onClientRegistered(in int status, in int clientIf);
void onClientConnectionState(in int status, in int clientIf, void onClientConnectionState(in int status, in int clientIf,
in boolean connected, in String address); in boolean connected, in String address);
void onScanResult(in ScanResult scanResult);
void onBatchScanResults(in List<ScanResult> batchResults);
void onSearchComplete(in String address, in List<BluetoothGattService> services, in int status); void onSearchComplete(in String address, in List<BluetoothGattService> services, in int status);
void onCharacteristicRead(in String address, in int status, in int handle, in byte[] value); void onCharacteristicRead(in String address, in int status, in int handle, in byte[] value);
void onCharacteristicWrite(in String address, in int status, in int handle); void onCharacteristicWrite(in String address, in int status, in int handle);
@@ -38,7 +34,5 @@ oneway interface IBluetoothGattCallback {
void onDescriptorWrite(in String address, in int status, in int handle); void onDescriptorWrite(in String address, in int status, in int handle);
void onNotify(in String address, in int handle, in byte[] value); void onNotify(in String address, in int handle, in byte[] value);
void onReadRemoteRssi(in String address, in int rssi, in int status); void onReadRemoteRssi(in String address, in int rssi, in int status);
void onScanManagerErrorCallback(in int errorCode);
void onConfigureMTU(in String address, in int mtu, in int status); void onConfigureMTU(in String address, in int mtu, in int status);
void onFoundOrLost(in boolean onFound, in ScanResult scanResult);
} }

View File

@@ -23,7 +23,6 @@ import android.bluetooth.BluetoothGattService;
*/ */
oneway interface IBluetoothGattServerCallback { oneway interface IBluetoothGattServerCallback {
void onServerRegistered(in int status, in int serverIf); void onServerRegistered(in int status, in int serverIf);
void onScanResult(in String address, in int rssi, in byte[] advData);
void onServerConnectionState(in int status, in int serverIf, void onServerConnectionState(in int status, in int serverIf,
in boolean connected, in String address); in boolean connected, in String address);
void onServiceAdded(in int status, in BluetoothGattService service); void onServiceAdded(in int status, in BluetoothGattService service);

View File

@@ -18,7 +18,6 @@ package android.bluetooth.le;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallbackWrapper;
import android.bluetooth.BluetoothUuid; import android.bluetooth.BluetoothUuid;
import android.bluetooth.IBluetoothGatt; import android.bluetooth.IBluetoothGatt;
import android.bluetooth.IBluetoothManager; import android.bluetooth.IBluetoothManager;

View File

@@ -22,9 +22,9 @@ import android.annotation.SystemApi;
import android.app.ActivityThread; import android.app.ActivityThread;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallbackWrapper;
import android.bluetooth.IBluetoothGatt; import android.bluetooth.IBluetoothGatt;
import android.bluetooth.IBluetoothManager; import android.bluetooth.IBluetoothManager;
import android.bluetooth.le.IScannerCallback;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.ParcelUuid; import android.os.ParcelUuid;
@@ -267,7 +267,7 @@ public final class BluetoothLeScanner {
/** /**
* Bluetooth GATT interface callbacks * Bluetooth GATT interface callbacks
*/ */
private class BleScanCallbackWrapper extends BluetoothGattCallbackWrapper { private class BleScanCallbackWrapper extends IScannerCallback.Stub {
private static final int REGISTRATION_CALLBACK_TIMEOUT_MILLIS = 2000; private static final int REGISTRATION_CALLBACK_TIMEOUT_MILLIS = 2000;
private final ScanCallback mScanCallback; private final ScanCallback mScanCallback;
@@ -280,7 +280,7 @@ public final class BluetoothLeScanner {
// mLeHandle 0: not registered // mLeHandle 0: not registered
// -1: scan stopped or registration failed // -1: scan stopped or registration failed
// > 0: registered and scan started // > 0: registered and scan started
private int mClientIf; private int mScannerId;
public BleScanCallbackWrapper(IBluetoothGatt bluetoothGatt, public BleScanCallbackWrapper(IBluetoothGatt bluetoothGatt,
List<ScanFilter> filters, ScanSettings settings, List<ScanFilter> filters, ScanSettings settings,
@@ -291,28 +291,27 @@ public final class BluetoothLeScanner {
mSettings = settings; mSettings = settings;
mWorkSource = workSource; mWorkSource = workSource;
mScanCallback = scanCallback; mScanCallback = scanCallback;
mClientIf = 0; mScannerId = 0;
mResultStorages = resultStorages; mResultStorages = resultStorages;
} }
public void startRegisteration() { public void startRegisteration() {
synchronized (this) { synchronized (this) {
// Scan stopped. // Scan stopped.
if (mClientIf == -1) return; if (mScannerId == -1) return;
try { try {
UUID uuid = UUID.randomUUID(); mBluetoothGatt.registerScanner(this);
mBluetoothGatt.registerClient(new ParcelUuid(uuid), this);
wait(REGISTRATION_CALLBACK_TIMEOUT_MILLIS); wait(REGISTRATION_CALLBACK_TIMEOUT_MILLIS);
} catch (InterruptedException | RemoteException e) { } catch (InterruptedException | RemoteException e) {
Log.e(TAG, "application registeration exception", e); Log.e(TAG, "application registeration exception", e);
postCallbackError(mScanCallback, ScanCallback.SCAN_FAILED_INTERNAL_ERROR); postCallbackError(mScanCallback, ScanCallback.SCAN_FAILED_INTERNAL_ERROR);
} }
if (mClientIf > 0) { if (mScannerId > 0) {
mLeScanClients.put(mScanCallback, this); mLeScanClients.put(mScanCallback, this);
} else { } else {
// Registration timed out or got exception, reset clientIf to -1 so no // Registration timed out or got exception, reset scannerId to -1 so no
// subsequent operations can proceed. // subsequent operations can proceed.
if (mClientIf == 0) mClientIf = -1; if (mScannerId == 0) mScannerId = -1;
postCallbackError(mScanCallback, postCallbackError(mScanCallback,
ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED); ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED);
} }
@@ -321,28 +320,28 @@ public final class BluetoothLeScanner {
public void stopLeScan() { public void stopLeScan() {
synchronized (this) { synchronized (this) {
if (mClientIf <= 0) { if (mScannerId <= 0) {
Log.e(TAG, "Error state, mLeHandle: " + mClientIf); Log.e(TAG, "Error state, mLeHandle: " + mScannerId);
return; return;
} }
try { try {
mBluetoothGatt.stopScan(mClientIf, false); mBluetoothGatt.stopScan(mScannerId);
mBluetoothGatt.unregisterClient(mClientIf); mBluetoothGatt.unregisterScanner(mScannerId);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Failed to stop scan and unregister", e); Log.e(TAG, "Failed to stop scan and unregister", e);
} }
mClientIf = -1; mScannerId = -1;
} }
} }
void flushPendingBatchResults() { void flushPendingBatchResults() {
synchronized (this) { synchronized (this) {
if (mClientIf <= 0) { if (mScannerId <= 0) {
Log.e(TAG, "Error state, mLeHandle: " + mClientIf); Log.e(TAG, "Error state, mLeHandle: " + mScannerId);
return; return;
} }
try { try {
mBluetoothGatt.flushPendingBatchResults(mClientIf, false); mBluetoothGatt.flushPendingBatchResults(mScannerId);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Failed to get pending scan results", e); Log.e(TAG, "Failed to get pending scan results", e);
} }
@@ -353,28 +352,28 @@ public final class BluetoothLeScanner {
* Application interface registered - app is ready to go * Application interface registered - app is ready to go
*/ */
@Override @Override
public void onClientRegistered(int status, int clientIf) { public void onScannerRegistered(int status, int scannerId) {
Log.d(TAG, "onClientRegistered() - status=" + status + Log.d(TAG, "onScannerRegistered() - status=" + status +
" clientIf=" + clientIf + " mClientIf=" + mClientIf); " scannerId=" + scannerId + " mScannerId=" + mScannerId);
synchronized (this) { synchronized (this) {
if (status == BluetoothGatt.GATT_SUCCESS) { if (status == BluetoothGatt.GATT_SUCCESS) {
try { try {
if (mClientIf == -1) { if (mScannerId == -1) {
// Registration succeeds after timeout, unregister client. // Registration succeeds after timeout, unregister client.
mBluetoothGatt.unregisterClient(clientIf); mBluetoothGatt.unregisterClient(scannerId);
} else { } else {
mClientIf = clientIf; mScannerId = scannerId;
mBluetoothGatt.startScan(mClientIf, false, mSettings, mFilters, mBluetoothGatt.startScan(mScannerId, mSettings, mFilters,
mWorkSource, mResultStorages, mWorkSource, mResultStorages,
ActivityThread.currentOpPackageName()); ActivityThread.currentOpPackageName());
} }
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "fail to start le scan: " + e); Log.e(TAG, "fail to start le scan: " + e);
mClientIf = -1; mScannerId = -1;
} }
} else { } else {
// registration failed // registration failed
mClientIf = -1; mScannerId = -1;
} }
notifyAll(); notifyAll();
} }
@@ -391,7 +390,7 @@ public final class BluetoothLeScanner {
// Check null in case the scan has been stopped // Check null in case the scan has been stopped
synchronized (this) { synchronized (this) {
if (mClientIf <= 0) return; if (mScannerId <= 0) return;
} }
Handler handler = new Handler(Looper.getMainLooper()); Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() { handler.post(new Runnable() {
@@ -423,7 +422,7 @@ public final class BluetoothLeScanner {
// Check null in case the scan has been stopped // Check null in case the scan has been stopped
synchronized (this) { synchronized (this) {
if (mClientIf <= 0) if (mScannerId <= 0)
return; return;
} }
Handler handler = new Handler(Looper.getMainLooper()); Handler handler = new Handler(Looper.getMainLooper());
@@ -447,7 +446,7 @@ public final class BluetoothLeScanner {
Log.d(TAG, "onScanManagerErrorCallback() - errorCode = " + errorCode); Log.d(TAG, "onScanManagerErrorCallback() - errorCode = " + errorCode);
} }
synchronized (this) { synchronized (this) {
if (mClientIf <= 0) if (mScannerId <= 0)
return; return;
} }
postCallbackError(mScanCallback, errorCode); postCallbackError(mScanCallback, errorCode);

View File

@@ -0,0 +1,31 @@
/*
* Copyright (C) 2016 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.le;
import android.bluetooth.le.ScanResult;
/**
* Callback definitions for interacting with Advertiser
* @hide
*/
oneway interface IScannerCallback {
void onScannerRegistered(in int status, in int scannerId);
void onScanResult(in ScanResult scanResult);
void onBatchScanResults(in List<ScanResult> batchResults);
void onFoundOrLost(in boolean onFound, in ScanResult scanResult);
void onScanManagerErrorCallback(in int errorCode);
}