| Index: components/arc/bluetooth/arc_bluetooth_bridge.cc
|
| diff --git a/components/arc/bluetooth/arc_bluetooth_bridge.cc b/components/arc/bluetooth/arc_bluetooth_bridge.cc
|
| index ed9b0a0f8097e68b76e49a065136445438517b00..c0da8d5818afa54e812519f36b29703e6d55f0da 100644
|
| --- a/components/arc/bluetooth/arc_bluetooth_bridge.cc
|
| +++ b/components/arc/bluetooth/arc_bluetooth_bridge.cc
|
| @@ -2007,24 +2007,30 @@ ArcBluetoothBridge::GetAdapterProperties(
|
| return properties;
|
| }
|
|
|
| -// Android support 5 types of Advertising Data.
|
| -// However Chrome didn't expose AdvertiseFlag and ManufacturerData.
|
| -// So we will only expose local_name, service_uuids and service_data.
|
| -// Note that we need to use UUID 16 bits in service_data section
|
| -// because Android does not support UUID 128 bits there.
|
| -// TODO(crbug.com/618442) Make Chrome expose missing data.
|
| +// Android support 6 types of Advertising Data which are Advertising Data Flags,
|
| +// Local Name, Service UUIDs, Tx Power Level, Service Data, and Manufacturer
|
| +// Data. Note that we need to use 16-bit UUID in Service Data section because
|
| +// Android does not support 128-bit UUID there.
|
| mojo::Array<mojom::BluetoothAdvertisingDataPtr>
|
| ArcBluetoothBridge::GetAdvertisingData(const BluetoothDevice* device) const {
|
| mojo::Array<mojom::BluetoothAdvertisingDataPtr> advertising_data;
|
|
|
| - // LocalName
|
| + // Advertising Data Flags
|
| + if (device->GetAdvertisingDataFlags().has_value()) {
|
| + mojom::BluetoothAdvertisingDataPtr flags =
|
| + mojom::BluetoothAdvertisingData::New();
|
| + flags->set_flags(device->GetAdvertisingDataFlags().value());
|
| + advertising_data.push_back(std::move(flags));
|
| + }
|
| +
|
| + // Local Name
|
| mojom::BluetoothAdvertisingDataPtr local_name =
|
| mojom::BluetoothAdvertisingData::New();
|
| local_name->set_local_name(device->GetName() ? device->GetName().value()
|
| : nullptr);
|
| advertising_data.push_back(std::move(local_name));
|
|
|
| - // ServiceUuid
|
| + // Service UUIDs
|
| const BluetoothDevice::UUIDSet& uuid_set = device->GetUUIDs();
|
| if (uuid_set.size() > 0) {
|
| mojom::BluetoothAdvertisingDataPtr service_uuids =
|
| @@ -2034,7 +2040,16 @@ ArcBluetoothBridge::GetAdvertisingData(const BluetoothDevice* device) const {
|
| advertising_data.push_back(std::move(service_uuids));
|
| }
|
|
|
| - // Service data
|
| + // Tx Power Level
|
| + if (device->GetInquiryTxPower().has_value()) {
|
| + mojom::BluetoothAdvertisingDataPtr tx_power_level_element =
|
| + mojom::BluetoothAdvertisingData::New();
|
| + tx_power_level_element->set_tx_power_level(
|
| + device->GetInquiryTxPower().value());
|
| + advertising_data.push_back(std::move(tx_power_level_element));
|
| + }
|
| +
|
| + // Service Data
|
| for (const BluetoothUUID& uuid : device->GetServiceDataUUIDs()) {
|
| mojom::BluetoothAdvertisingDataPtr service_data_element =
|
| mojom::BluetoothAdvertisingData::New();
|
| @@ -2054,6 +2069,23 @@ ArcBluetoothBridge::GetAdvertisingData(const BluetoothDevice* device) const {
|
| advertising_data.push_back(std::move(service_data_element));
|
| }
|
|
|
| + // Manufacturer Data
|
| + if (!device->GetManufacturerData().empty()) {
|
| + std::vector<uint8_t> manufacturer_data;
|
| + for (const auto& pair : device->GetManufacturerData()) {
|
| + uint16_t id = pair.first;
|
| + // Use little endian here.
|
| + manufacturer_data.push_back(id & 0xff);
|
| + manufacturer_data.push_back(id >> 8);
|
| + manufacturer_data.insert(manufacturer_data.end(), pair.second.begin(),
|
| + pair.second.end());
|
| + }
|
| + mojom::BluetoothAdvertisingDataPtr manufacturer_data_element =
|
| + mojom::BluetoothAdvertisingData::New();
|
| + manufacturer_data_element->set_manufacturer_data(manufacturer_data);
|
| + advertising_data.push_back(std::move(manufacturer_data_element));
|
| + }
|
| +
|
| return advertising_data;
|
| }
|
|
|
|
|