Loading framework/java/android/bluetooth/IBluetoothGatt.aidl +3 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.bluetooth.le.AdvertiseSettings; import android.bluetooth.le.AdvertiseData; import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanSettings; import android.bluetooth.le.ResultStorageDescriptor; import android.os.ParcelUuid; import android.bluetooth.IBluetoothGattCallback; Loading @@ -34,7 +35,8 @@ interface IBluetoothGatt { List<BluetoothDevice> getDevicesMatchingConnectionStates(in int[] states); void startScan(in int appIf, in boolean isServer, in ScanSettings settings, in List<ScanFilter> filters); in List<ScanFilter> filters, in List scanStorages); void stopScan(in int appIf, in boolean isServer); void flushPendingBatchResults(in int appIf, in boolean isServer); void startMultiAdvertising(in int appIf, Loading framework/java/android/bluetooth/le/BluetoothLeScanner.java +41 −11 Original line number Diff line number Diff line Loading @@ -16,20 +16,19 @@ package android.bluetooth.le; import android.annotation.SystemApi; 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; import android.os.Handler; import android.os.Looper; import android.os.ParcelUuid; import android.os.RemoteException; import android.os.SystemClock; import android.util.Log; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; Loading Loading @@ -100,6 +99,11 @@ public final class BluetoothLeScanner { */ public void startScan(List<ScanFilter> filters, ScanSettings settings, final ScanCallback callback) { startScan(filters, settings, callback, null); } private void startScan(List<ScanFilter> filters, ScanSettings settings, final ScanCallback callback, List<List<ResultStorageDescriptor>> resultStorages) { checkAdapterState(); if (settings == null || callback == null) { throw new IllegalArgumentException("settings or callback is null"); Loading @@ -125,7 +129,7 @@ public final class BluetoothLeScanner { return; } BleScanCallbackWrapper wrapper = new BleScanCallbackWrapper(gatt, filters, settings, callback); settings, callback, resultStorages); try { UUID uuid = UUID.randomUUID(); gatt.registerClient(new ParcelUuid(uuid), wrapper); Loading Loading @@ -155,7 +159,8 @@ public final class BluetoothLeScanner { synchronized (mLeScanClients) { BleScanCallbackWrapper wrapper = mLeScanClients.remove(callback); if (wrapper == null) { if (DBG) Log.d(TAG, "could not find callback wrapper"); if (DBG) Log.d(TAG, "could not find callback wrapper"); return; } wrapper.stopLeScan(); Loading Loading @@ -184,6 +189,25 @@ public final class BluetoothLeScanner { } } /** * Start truncated scan. * * @hide */ @SystemApi public void startTruncatedScan(List<TruncatedFilter> truncatedFilters, ScanSettings settings, final ScanCallback callback) { int filterSize = truncatedFilters.size(); List<ScanFilter> scanFilters = new ArrayList<ScanFilter>(filterSize); List<List<ResultStorageDescriptor>> scanStorages = new ArrayList<List<ResultStorageDescriptor>>(filterSize); for (TruncatedFilter filter : truncatedFilters) { scanFilters.add(filter.getFilter()); scanStorages.add(filter.getStorageDescriptors()); } startScan(scanFilters, settings, callback, scanStorages); } /** * Bluetooth GATT interface callbacks */ Loading @@ -194,6 +218,7 @@ public final class BluetoothLeScanner { private final List<ScanFilter> mFilters; private ScanSettings mSettings; private IBluetoothGatt mBluetoothGatt; private List<List<ResultStorageDescriptor>> mResultStorages; // mLeHandle 0: not registered // -1: scan stopped Loading @@ -202,12 +227,13 @@ public final class BluetoothLeScanner { public BleScanCallbackWrapper(IBluetoothGatt bluetoothGatt, List<ScanFilter> filters, ScanSettings settings, ScanCallback scanCallback) { ScanCallback scanCallback, List<List<ResultStorageDescriptor>> resultStorages) { mBluetoothGatt = bluetoothGatt; mFilters = filters; mSettings = settings; mScanCallback = scanCallback; mClientIf = 0; mResultStorages = resultStorages; } public boolean scanStarted() { Loading Loading @@ -272,7 +298,8 @@ public final class BluetoothLeScanner { if (status == BluetoothGatt.GATT_SUCCESS) { mClientIf = clientIf; try { mBluetoothGatt.startScan(mClientIf, false, mSettings, mFilters); mBluetoothGatt.startScan(mClientIf, false, mSettings, mFilters, mResultStorages); } catch (RemoteException e) { Log.e(TAG, "fail to start le scan: " + e); mClientIf = -1; Loading Loading @@ -330,16 +357,19 @@ public final class BluetoothLeScanner { // Check null in case the scan has been stopped synchronized (this) { if (mClientIf <= 0) return; if (mClientIf <= 0) return; } Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { if (onFound) { mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_FIRST_MATCH, scanResult); mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_FIRST_MATCH, scanResult); } else { mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_MATCH_LOST, scanResult); mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_MATCH_LOST, scanResult); } } }); Loading framework/java/android/bluetooth/le/ResultStorageDescriptor.aidl 0 → 100644 +23 −0 Original line number Diff line number Diff line /* * 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.le; /** * {@hide} */ parcelable ResultStorageDescriptor; framework/java/android/bluetooth/le/ResultStorageDescriptor.java 0 → 100644 +93 −0 Original line number Diff line number Diff line /* * 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.le; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; /** * Describes the way to store scan result. * * @hide */ @SystemApi public final class ResultStorageDescriptor implements Parcelable { private int mType; private int mOffset; private int mLength; public int getType() { return mType; } public int getOffset() { return mOffset; } public int getLength() { return mLength; } /** * Constructor of {@link ResultStorageDescriptor} * * @param type Type of the data. * @param offset Offset from start of the advertise packet payload. * @param length Byte length of the data */ public ResultStorageDescriptor(int type, int offset, int length) { mType = type; mOffset = offset; mLength = length; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mType); dest.writeInt(mOffset); dest.writeInt(mLength); } private ResultStorageDescriptor(Parcel in) { ReadFromParcel(in); } private void ReadFromParcel(Parcel in) { mType = in.readInt(); mOffset = in.readInt(); mLength = in.readInt(); } public static final Parcelable.Creator<ResultStorageDescriptor> CREATOR = new Creator<ResultStorageDescriptor>() { @Override public ResultStorageDescriptor createFromParcel(Parcel source) { return new ResultStorageDescriptor(source); } @Override public ResultStorageDescriptor[] newArray(int size) { return new ResultStorageDescriptor[size]; } }; } framework/java/android/bluetooth/le/TruncatedFilter.java 0 → 100644 +61 −0 Original line number Diff line number Diff line /* * 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.le; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; import java.util.List; /** * A special scan filter that lets the client decide how the scan record should be stored. * * @hide */ @SystemApi public final class TruncatedFilter { private final ScanFilter mFilter; private final List<ResultStorageDescriptor> mStorageDescriptors; /** * Constructor for {@link TruncatedFilter}. * * @param filter Scan filter of the truncated filter. * @param storageDescriptors Describes how the scan should be stored. */ public TruncatedFilter(ScanFilter filter, List<ResultStorageDescriptor> storageDescriptors) { mFilter = filter; mStorageDescriptors = storageDescriptors; } /** * Returns the scan filter. */ public ScanFilter getFilter() { return mFilter; } /** * Returns a list of descriptor for scan result storage. */ public List<ResultStorageDescriptor> getStorageDescriptors() { return mStorageDescriptors; } } Loading
framework/java/android/bluetooth/IBluetoothGatt.aidl +3 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.bluetooth.le.AdvertiseSettings; import android.bluetooth.le.AdvertiseData; import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanSettings; import android.bluetooth.le.ResultStorageDescriptor; import android.os.ParcelUuid; import android.bluetooth.IBluetoothGattCallback; Loading @@ -34,7 +35,8 @@ interface IBluetoothGatt { List<BluetoothDevice> getDevicesMatchingConnectionStates(in int[] states); void startScan(in int appIf, in boolean isServer, in ScanSettings settings, in List<ScanFilter> filters); in List<ScanFilter> filters, in List scanStorages); void stopScan(in int appIf, in boolean isServer); void flushPendingBatchResults(in int appIf, in boolean isServer); void startMultiAdvertising(in int appIf, Loading
framework/java/android/bluetooth/le/BluetoothLeScanner.java +41 −11 Original line number Diff line number Diff line Loading @@ -16,20 +16,19 @@ package android.bluetooth.le; import android.annotation.SystemApi; 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; import android.os.Handler; import android.os.Looper; import android.os.ParcelUuid; import android.os.RemoteException; import android.os.SystemClock; import android.util.Log; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; Loading Loading @@ -100,6 +99,11 @@ public final class BluetoothLeScanner { */ public void startScan(List<ScanFilter> filters, ScanSettings settings, final ScanCallback callback) { startScan(filters, settings, callback, null); } private void startScan(List<ScanFilter> filters, ScanSettings settings, final ScanCallback callback, List<List<ResultStorageDescriptor>> resultStorages) { checkAdapterState(); if (settings == null || callback == null) { throw new IllegalArgumentException("settings or callback is null"); Loading @@ -125,7 +129,7 @@ public final class BluetoothLeScanner { return; } BleScanCallbackWrapper wrapper = new BleScanCallbackWrapper(gatt, filters, settings, callback); settings, callback, resultStorages); try { UUID uuid = UUID.randomUUID(); gatt.registerClient(new ParcelUuid(uuid), wrapper); Loading Loading @@ -155,7 +159,8 @@ public final class BluetoothLeScanner { synchronized (mLeScanClients) { BleScanCallbackWrapper wrapper = mLeScanClients.remove(callback); if (wrapper == null) { if (DBG) Log.d(TAG, "could not find callback wrapper"); if (DBG) Log.d(TAG, "could not find callback wrapper"); return; } wrapper.stopLeScan(); Loading Loading @@ -184,6 +189,25 @@ public final class BluetoothLeScanner { } } /** * Start truncated scan. * * @hide */ @SystemApi public void startTruncatedScan(List<TruncatedFilter> truncatedFilters, ScanSettings settings, final ScanCallback callback) { int filterSize = truncatedFilters.size(); List<ScanFilter> scanFilters = new ArrayList<ScanFilter>(filterSize); List<List<ResultStorageDescriptor>> scanStorages = new ArrayList<List<ResultStorageDescriptor>>(filterSize); for (TruncatedFilter filter : truncatedFilters) { scanFilters.add(filter.getFilter()); scanStorages.add(filter.getStorageDescriptors()); } startScan(scanFilters, settings, callback, scanStorages); } /** * Bluetooth GATT interface callbacks */ Loading @@ -194,6 +218,7 @@ public final class BluetoothLeScanner { private final List<ScanFilter> mFilters; private ScanSettings mSettings; private IBluetoothGatt mBluetoothGatt; private List<List<ResultStorageDescriptor>> mResultStorages; // mLeHandle 0: not registered // -1: scan stopped Loading @@ -202,12 +227,13 @@ public final class BluetoothLeScanner { public BleScanCallbackWrapper(IBluetoothGatt bluetoothGatt, List<ScanFilter> filters, ScanSettings settings, ScanCallback scanCallback) { ScanCallback scanCallback, List<List<ResultStorageDescriptor>> resultStorages) { mBluetoothGatt = bluetoothGatt; mFilters = filters; mSettings = settings; mScanCallback = scanCallback; mClientIf = 0; mResultStorages = resultStorages; } public boolean scanStarted() { Loading Loading @@ -272,7 +298,8 @@ public final class BluetoothLeScanner { if (status == BluetoothGatt.GATT_SUCCESS) { mClientIf = clientIf; try { mBluetoothGatt.startScan(mClientIf, false, mSettings, mFilters); mBluetoothGatt.startScan(mClientIf, false, mSettings, mFilters, mResultStorages); } catch (RemoteException e) { Log.e(TAG, "fail to start le scan: " + e); mClientIf = -1; Loading Loading @@ -330,16 +357,19 @@ public final class BluetoothLeScanner { // Check null in case the scan has been stopped synchronized (this) { if (mClientIf <= 0) return; if (mClientIf <= 0) return; } Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { if (onFound) { mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_FIRST_MATCH, scanResult); mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_FIRST_MATCH, scanResult); } else { mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_MATCH_LOST, scanResult); mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_MATCH_LOST, scanResult); } } }); Loading
framework/java/android/bluetooth/le/ResultStorageDescriptor.aidl 0 → 100644 +23 −0 Original line number Diff line number Diff line /* * 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.le; /** * {@hide} */ parcelable ResultStorageDescriptor;
framework/java/android/bluetooth/le/ResultStorageDescriptor.java 0 → 100644 +93 −0 Original line number Diff line number Diff line /* * 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.le; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; /** * Describes the way to store scan result. * * @hide */ @SystemApi public final class ResultStorageDescriptor implements Parcelable { private int mType; private int mOffset; private int mLength; public int getType() { return mType; } public int getOffset() { return mOffset; } public int getLength() { return mLength; } /** * Constructor of {@link ResultStorageDescriptor} * * @param type Type of the data. * @param offset Offset from start of the advertise packet payload. * @param length Byte length of the data */ public ResultStorageDescriptor(int type, int offset, int length) { mType = type; mOffset = offset; mLength = length; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mType); dest.writeInt(mOffset); dest.writeInt(mLength); } private ResultStorageDescriptor(Parcel in) { ReadFromParcel(in); } private void ReadFromParcel(Parcel in) { mType = in.readInt(); mOffset = in.readInt(); mLength = in.readInt(); } public static final Parcelable.Creator<ResultStorageDescriptor> CREATOR = new Creator<ResultStorageDescriptor>() { @Override public ResultStorageDescriptor createFromParcel(Parcel source) { return new ResultStorageDescriptor(source); } @Override public ResultStorageDescriptor[] newArray(int size) { return new ResultStorageDescriptor[size]; } }; }
framework/java/android/bluetooth/le/TruncatedFilter.java 0 → 100644 +61 −0 Original line number Diff line number Diff line /* * 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.le; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; import java.util.List; /** * A special scan filter that lets the client decide how the scan record should be stored. * * @hide */ @SystemApi public final class TruncatedFilter { private final ScanFilter mFilter; private final List<ResultStorageDescriptor> mStorageDescriptors; /** * Constructor for {@link TruncatedFilter}. * * @param filter Scan filter of the truncated filter. * @param storageDescriptors Describes how the scan should be stored. */ public TruncatedFilter(ScanFilter filter, List<ResultStorageDescriptor> storageDescriptors) { mFilter = filter; mStorageDescriptors = storageDescriptors; } /** * Returns the scan filter. */ public ScanFilter getFilter() { return mFilter; } /** * Returns a list of descriptor for scan result storage. */ public List<ResultStorageDescriptor> getStorageDescriptors() { return mStorageDescriptors; } }