/*
NewBleDeviceAdapterImpl
Copyright (c) 2015 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.heartrate.ble.adapter;
import android.annotation.TargetApi;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanFilter;
import android.bluetooth.le.ScanResult;
import android.bluetooth.le.ScanSettings;
import android.content.Context;
import android.os.Build;
import android.os.ParcelUuid;
import org.deviceconnect.android.deviceplugin.heartrate.ble.BleDeviceAdapter;
import org.deviceconnect.android.deviceplugin.heartrate.ble.BleUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
/**
*
* @author NTT DOCOMO, INC.
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class NewBleDeviceAdapterImpl extends BleDeviceAdapter {
private final Context mContext;
private BluetoothAdapter mBluetoothAdapter;
private BluetoothLeScanner mBleScanner;
private BleDeviceScanCallback mCallback;
private final UUID[] mServiceUuids = {
UUID.fromString(BleUtils.SERVICE_HEART_RATE_SERVICE)
};
public NewBleDeviceAdapterImpl(final Context context) {
mContext = context;
BluetoothManager manager = BleUtils.getManager(context);
mBluetoothAdapter = manager.getAdapter();
mBleScanner = mBluetoothAdapter.getBluetoothLeScanner();
}
@Override
public void startScan(final BleDeviceScanCallback callback) {
mCallback = callback;
List<ScanFilter> filters = new ArrayList<ScanFilter>();
if (mServiceUuids != null && mServiceUuids.length > 0) {
for (UUID uuid : mServiceUuids) {
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(
new ParcelUuid(uuid)).build();
filters.add(filter);
}
}
ScanSettings settings = new ScanSettings.Builder().build();
mBleScanner = mBluetoothAdapter.getBluetoothLeScanner();
if (mBleScanner != null) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
mBleScanner.startScan(filters, settings, mScanCallback);
} else {
// Unless required permissions were acquired, scan does not start.
if (BleUtils.isBLEPermission(mContext)) {
mBleScanner.startScan(filters, settings, mScanCallback);
}
}
}
}
@Override
public void stopScan(final BleDeviceScanCallback callback) {
mBleScanner = mBluetoothAdapter.getBluetoothLeScanner();
if (mBleScanner != null) {
mBleScanner.stopScan(mScanCallback);
}
}
@Override
public BluetoothDevice getDevice(final String address) {
return mBluetoothAdapter.getRemoteDevice(address);
}
@Override
public Set<BluetoothDevice> getBondedDevices() {
return mBluetoothAdapter.getBondedDevices();
}
@Override
public boolean isEnabled() {
return mBluetoothAdapter.isEnabled();
}
@Override
public boolean checkBluetoothAddress(final String address) {
return BluetoothAdapter.checkBluetoothAddress(address);
}
private final ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(final int callbackType, final ScanResult result) {
if (mCallback != null) {
mCallback.onLeScan(result.getDevice(), result.getRssi());
}
}
@Override
public void onBatchScanResults(final List<ScanResult> results) {
}
@Override
public void onScanFailed(final int errorCode) {
mCallback.onFail();
}
};
}