Commit 99f03c76 authored by Doug Turner's avatar Doug Turner Committed by Commit Bot

WebBluetooth - Implementing Android scanning support

Bug: 897312
Change-Id: Ibbfc4ee379f7c044358bc62359b43da493ce4c90
Reviewed-on: https://chromium-review.googlesource.com/c/1435591Reviewed-by: default avatarOvidio de Jesús Ruiz-Henríquez <odejesush@chromium.org>
Commit-Queue: Doug Turner <dougt@chromium.org>
Cr-Commit-Position: refs/heads/master@{#626849}
parent 0abc618e
...@@ -585,9 +585,8 @@ void WebBluetoothServiceImpl::RemoteServerGetPrimaryServices( ...@@ -585,9 +585,8 @@ void WebBluetoothServiceImpl::RemoteServerGetPrimaryServices(
return; return;
} }
if (services_uuid && if (services_uuid && !allowed_devices().IsAllowedToAccessService(
!allowed_devices().IsAllowedToAccessService(device_id, device_id, services_uuid.value())) {
services_uuid.value())) {
std::move(callback).Run( std::move(callback).Run(
blink::mojom::WebBluetoothResult::NOT_ALLOWED_TO_ACCESS_SERVICE, blink::mojom::WebBluetoothResult::NOT_ALLOWED_TO_ACCESS_SERVICE,
base::nullopt /* service */); base::nullopt /* service */);
......
...@@ -289,9 +289,10 @@ final class ChromeBluetoothAdapter extends BroadcastReceiver { ...@@ -289,9 +289,10 @@ final class ChromeBluetoothAdapter extends BroadcastReceiver {
// Object can be destroyed, but Android keeps calling onScanResult. // Object can be destroyed, but Android keeps calling onScanResult.
if (mNativeBluetoothAdapterAndroid != 0) { if (mNativeBluetoothAdapterAndroid != 0) {
nativeCreateOrUpdateDeviceOnScan(mNativeBluetoothAdapterAndroid, nativeCreateOrUpdateDeviceOnScan(mNativeBluetoothAdapterAndroid,
result.getDevice().getAddress(), result.getDevice(), result.getRssi(), result.getDevice().getAddress(), result.getDevice(),
uuid_strings, result.getScanRecord_getTxPowerLevel(), serviceDataKeys, result.getScanRecord_getDeviceName(), result.getRssi(), uuid_strings,
serviceDataValues, manufacturerDataKeys, manufacturerDataValues); result.getScanRecord_getTxPowerLevel(), serviceDataKeys, serviceDataValues,
manufacturerDataKeys, manufacturerDataValues);
} }
} }
...@@ -349,8 +350,8 @@ final class ChromeBluetoothAdapter extends BroadcastReceiver { ...@@ -349,8 +350,8 @@ final class ChromeBluetoothAdapter extends BroadcastReceiver {
// Binds to BluetoothAdapterAndroid::CreateOrUpdateDeviceOnScan. // Binds to BluetoothAdapterAndroid::CreateOrUpdateDeviceOnScan.
private native void nativeCreateOrUpdateDeviceOnScan(long nativeBluetoothAdapterAndroid, private native void nativeCreateOrUpdateDeviceOnScan(long nativeBluetoothAdapterAndroid,
String address, Wrappers.BluetoothDeviceWrapper deviceWrapper, int rssi, String address, Wrappers.BluetoothDeviceWrapper deviceWrapper, String localName,
String[] advertisedUuids, int txPower, String[] serviceDataKeys, int rssi, String[] advertisedUuids, int txPower, String[] serviceDataKeys,
Object[] serviceDataValues, int[] manufacturerDataKeys, Object[] serviceDataValues, int[] manufacturerDataKeys,
Object[] manufacturerDataValues); Object[] manufacturerDataValues);
......
...@@ -310,6 +310,10 @@ class Wrappers { ...@@ -310,6 +310,10 @@ class Wrappers {
public int getScanRecord_getTxPowerLevel() { public int getScanRecord_getTxPowerLevel() {
return mScanResult.getScanRecord().getTxPowerLevel(); return mScanResult.getScanRecord().getTxPowerLevel();
} }
public String getScanRecord_getDeviceName() {
return mScanResult.getScanRecord().getDeviceName();
}
} }
/** /**
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_adapter.h"
#include <memory> #include <memory>
#include <string>
#include <utility> #include <utility>
#include "base/bind.h" #include "base/bind.h"
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "device/bluetooth/bluetooth_adapter_android.h" #include "device/bluetooth/bluetooth_adapter_android.h"
#include <memory> #include <memory>
#include <string>
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_array.h" #include "base/android/jni_array.h"
...@@ -167,6 +168,7 @@ void BluetoothAdapterAndroid::CreateOrUpdateDeviceOnScan( ...@@ -167,6 +168,7 @@ void BluetoothAdapterAndroid::CreateOrUpdateDeviceOnScan(
const JavaParamRef<jstring>& address, const JavaParamRef<jstring>& address,
const JavaParamRef<jobject>& const JavaParamRef<jobject>&
bluetooth_device_wrapper, // Java Type: bluetoothDeviceWrapper bluetooth_device_wrapper, // Java Type: bluetoothDeviceWrapper
const JavaParamRef<jstring>& local_name,
int32_t rssi, int32_t rssi,
const JavaParamRef<jobjectArray>& advertised_uuids, // Java Type: String[] const JavaParamRef<jobjectArray>& advertised_uuids, // Java Type: String[]
int32_t tx_power, int32_t tx_power,
...@@ -175,7 +177,7 @@ void BluetoothAdapterAndroid::CreateOrUpdateDeviceOnScan( ...@@ -175,7 +177,7 @@ void BluetoothAdapterAndroid::CreateOrUpdateDeviceOnScan(
const JavaParamRef<jintArray>& manufacturer_data_keys, // Java Type: int[] const JavaParamRef<jintArray>& manufacturer_data_keys, // Java Type: int[]
const JavaParamRef<jobjectArray>& const JavaParamRef<jobjectArray>&
manufacturer_data_values // Java Type: byte[] manufacturer_data_values // Java Type: byte[]
) { ) {
std::string device_address = ConvertJavaStringToUTF8(env, address); std::string device_address = ConvertJavaStringToUTF8(env, address);
auto iter = devices_.find(device_address); auto iter = devices_.find(device_address);
...@@ -235,13 +237,30 @@ void BluetoothAdapterAndroid::CreateOrUpdateDeviceOnScan( ...@@ -235,13 +237,30 @@ void BluetoothAdapterAndroid::CreateOrUpdateDeviceOnScan(
device_android->UpdateAdvertisementData( device_android->UpdateAdvertisementData(
BluetoothDevice::ClampPower(rssi), base::nullopt /* flags */, BluetoothDevice::ClampPower(rssi), base::nullopt /* flags */,
std::move(advertised_bluetooth_uuids), advertised_bluetooth_uuids,
// Android uses INT32_MIN to indicate no Advertised Tx Power. // Android uses INT32_MIN to indicate no Advertised Tx Power.
// https://developer.android.com/reference/android/bluetooth/le/ScanRecord.html#getTxPowerLevel() // https://developer.android.com/reference/android/bluetooth/le/ScanRecord.html#getTxPowerLevel()
tx_power == INT32_MIN ? base::nullopt tx_power == INT32_MIN ? base::nullopt
: base::make_optional(clamped_tx_power), : base::make_optional(clamped_tx_power),
service_data_map, manufacturer_data_map); service_data_map, manufacturer_data_map);
for (auto& observer : observers_) {
base::Optional<std::string> device_name_opt = device_android->GetName();
base::Optional<std::string> advertisement_name_opt;
if (local_name)
advertisement_name_opt = ConvertJavaStringToUTF8(env, local_name);
observer.DeviceAdvertisementReceived(
device_android->GetAddress(), device_name_opt, advertisement_name_opt,
BluetoothDevice::ClampPower(rssi),
// Android uses INT32_MIN to indicate no Advertised Tx Power.
// https://developer.android.com/reference/android/bluetooth/le/ScanRecord.html#getTxPowerLevel()
tx_power == INT32_MIN ? base::nullopt
: base::make_optional(clamped_tx_power),
base::nullopt, /* TODO(crbug.com/588083) Implement appearance */
advertised_bluetooth_uuids, service_data_map, manufacturer_data_map);
}
if (is_new_device) { if (is_new_device) {
devices_[device_address] = std::move(device_android_owner); devices_[device_address] = std::move(device_android_owner);
for (auto& observer : observers_) for (auto& observer : observers_)
......
...@@ -92,6 +92,7 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothAdapterAndroid final ...@@ -92,6 +92,7 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothAdapterAndroid final
const base::android::JavaParamRef<jstring>& address, const base::android::JavaParamRef<jstring>& address,
const base::android::JavaParamRef<jobject>& const base::android::JavaParamRef<jobject>&
bluetooth_device_wrapper, // Java Type: bluetoothDeviceWrapper bluetooth_device_wrapper, // Java Type: bluetoothDeviceWrapper
const base::android::JavaParamRef<jstring>& local_name,
int32_t rssi, int32_t rssi,
const base::android::JavaParamRef<jobjectArray>& const base::android::JavaParamRef<jobjectArray>&
advertised_uuids, // Java Type: String[] advertised_uuids, // Java Type: String[]
...@@ -104,7 +105,7 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothAdapterAndroid final ...@@ -104,7 +105,7 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothAdapterAndroid final
manufacturer_data_keys, // Java Type: int[] manufacturer_data_keys, // Java Type: int[]
const base::android::JavaParamRef<jobjectArray>& const base::android::JavaParamRef<jobjectArray>&
manufacturer_data_values // Java Type: byte[] manufacturer_data_values // Java Type: byte[]
); );
protected: protected:
BluetoothAdapterAndroid(); BluetoothAdapterAndroid();
......
...@@ -588,7 +588,7 @@ TEST_F(BluetoothTest, MAYBE_AdvertisementData_Discovery) { ...@@ -588,7 +588,7 @@ TEST_F(BluetoothTest, MAYBE_AdvertisementData_Discovery) {
EXPECT_EQ(ToInt8(TestTxPower::LOWEST), device->GetInquiryTxPower().value()); EXPECT_EQ(ToInt8(TestTxPower::LOWEST), device->GetInquiryTxPower().value());
} }
#if defined(OS_MACOSX) #if defined(OS_ANDROID) || defined(OS_MACOSX)
// TODO(dougt) As I turn on new platforms for WebBluetooth Scanning, // TODO(dougt) As I turn on new platforms for WebBluetooth Scanning,
// I will relax this #ifdef // I will relax this #ifdef
TEST_F(BluetoothTest, DeviceAdvertisementReceived) { TEST_F(BluetoothTest, DeviceAdvertisementReceived) {
......
...@@ -152,8 +152,8 @@ class Fakes { ...@@ -152,8 +152,8 @@ class Fakes {
mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES,
new FakeScanResult(new FakeBluetoothDevice(this, "01:00:00:90:1E:BE", new FakeScanResult(new FakeBluetoothDevice(this, "01:00:00:90:1E:BE",
"FakeBluetoothDevice"), "FakeBluetoothDevice"),
TestRSSI.LOWEST, uuids, TestTxPower.LOWEST, serviceData, "FakeBluetoothDevice", TestRSSI.LOWEST, uuids,
manufacturerData)); TestTxPower.LOWEST, serviceData, manufacturerData));
break; break;
} }
case 2: { case 2: {
...@@ -173,8 +173,8 @@ class Fakes { ...@@ -173,8 +173,8 @@ class Fakes {
mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES,
new FakeScanResult(new FakeBluetoothDevice(this, "01:00:00:90:1E:BE", new FakeScanResult(new FakeBluetoothDevice(this, "01:00:00:90:1E:BE",
"FakeBluetoothDevice"), "FakeBluetoothDevice"),
TestRSSI.LOWER, uuids, TestTxPower.LOWER, serviceData, "Local Device Name", TestRSSI.LOWER, uuids, TestTxPower.LOWER,
manufacturerData)); serviceData, manufacturerData));
break; break;
} }
case 3: { case 3: {
...@@ -182,7 +182,8 @@ class Fakes { ...@@ -182,7 +182,8 @@ class Fakes {
mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES,
new FakeScanResult( new FakeScanResult(
new FakeBluetoothDevice(this, "01:00:00:90:1E:BE", ""), new FakeBluetoothDevice(this, "01:00:00:90:1E:BE", ""),
TestRSSI.LOW, uuids, NO_TX_POWER, null, null)); "Local Device Name", TestRSSI.LOW, uuids, NO_TX_POWER, null,
null));
break; break;
} }
...@@ -191,7 +192,8 @@ class Fakes { ...@@ -191,7 +192,8 @@ class Fakes {
mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES,
new FakeScanResult( new FakeScanResult(
new FakeBluetoothDevice(this, "02:00:00:8B:74:63", ""), new FakeBluetoothDevice(this, "02:00:00:8B:74:63", ""),
TestRSSI.MEDIUM, uuids, NO_TX_POWER, null, null)); "Local Device Name", TestRSSI.MEDIUM, uuids, NO_TX_POWER, null,
null));
break; break;
} }
...@@ -200,7 +202,8 @@ class Fakes { ...@@ -200,7 +202,8 @@ class Fakes {
mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES,
new FakeScanResult( new FakeScanResult(
new FakeBluetoothDevice(this, "01:00:00:90:1E:BE", null), new FakeBluetoothDevice(this, "01:00:00:90:1E:BE", null),
TestRSSI.HIGH, uuids, NO_TX_POWER, null, null)); "Local Device Name", TestRSSI.HIGH, uuids, NO_TX_POWER, null,
null));
break; break;
} }
case 6: { case 6: {
...@@ -208,7 +211,8 @@ class Fakes { ...@@ -208,7 +211,8 @@ class Fakes {
mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES,
new FakeScanResult( new FakeScanResult(
new FakeBluetoothDevice(this, "02:00:00:8B:74:63", null), new FakeBluetoothDevice(this, "02:00:00:8B:74:63", null),
TestRSSI.LOWEST, uuids, NO_TX_POWER, null, null)); "Local Device Name", TestRSSI.LOWEST, uuids, NO_TX_POWER, null,
null));
break; break;
} }
case 7: { case 7: {
...@@ -222,7 +226,8 @@ class Fakes { ...@@ -222,7 +226,8 @@ class Fakes {
mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, mFakeScanner.mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES,
new FakeScanResult(new FakeBluetoothDevice( new FakeScanResult(new FakeBluetoothDevice(
this, "01:00:00:90:1E:BE", "U2F FakeDevice"), this, "01:00:00:90:1E:BE", "U2F FakeDevice"),
TestRSSI.LOWEST, uuids, NO_TX_POWER, serviceData, null)); "Local Device Name", TestRSSI.LOWEST, uuids, NO_TX_POWER,
serviceData, null));
break; break;
} }
} }
...@@ -362,17 +367,19 @@ class Fakes { ...@@ -362,17 +367,19 @@ class Fakes {
*/ */
static class FakeScanResult extends Wrappers.ScanResultWrapper { static class FakeScanResult extends Wrappers.ScanResultWrapper {
private final FakeBluetoothDevice mDevice; private final FakeBluetoothDevice mDevice;
private final String mLocalName;
private final int mRssi; private final int mRssi;
private final int mTxPower; private final int mTxPower;
private final ArrayList<ParcelUuid> mUuids; private final ArrayList<ParcelUuid> mUuids;
private final Map<ParcelUuid, byte[]> mServiceData; private final Map<ParcelUuid, byte[]> mServiceData;
private final SparseArray<byte[]> mManufacturerData; private final SparseArray<byte[]> mManufacturerData;
FakeScanResult(FakeBluetoothDevice device, int rssi, ArrayList<ParcelUuid> uuids, FakeScanResult(FakeBluetoothDevice device, String localName, int rssi,
int txPower, Map<ParcelUuid, byte[]> serviceData, ArrayList<ParcelUuid> uuids, int txPower, Map<ParcelUuid, byte[]> serviceData,
SparseArray<byte[]> manufacturerData) { SparseArray<byte[]> manufacturerData) {
super(null); super(null);
mDevice = device; mDevice = device;
mLocalName = localName;
mRssi = rssi; mRssi = rssi;
mUuids = uuids; mUuids = uuids;
mTxPower = txPower; mTxPower = txPower;
...@@ -409,6 +416,11 @@ class Fakes { ...@@ -409,6 +416,11 @@ class Fakes {
public SparseArray<byte[]> getScanRecord_getManufacturerSpecificData() { public SparseArray<byte[]> getScanRecord_getManufacturerSpecificData() {
return mManufacturerData; return mManufacturerData;
} }
@Override
public String getScanRecord_getDeviceName() {
return mLocalName;
}
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment