Chromium Code Reviews| 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 e9385438299f23f6110b048e441f2e5b65c4f43d..e370b6c16844fad32711035053d11324c3a4abc4 100644 |
| --- a/components/arc/bluetooth/arc_bluetooth_bridge.cc |
| +++ b/components/arc/bluetooth/arc_bluetooth_bridge.cc |
| @@ -81,6 +81,11 @@ constexpr uint16_t kAndroidMBluetoothVersionNumber = 95; |
| constexpr uint16_t kMaxAdvertisement = 5; |
| // Bluetooth SDP Service Class ID List Attribute identifier |
| constexpr uint16_t kServiceClassIDListAttributeID = 0x0001; |
| +// Timeout for Bluetooth Discovery (scan) |
| +constexpr base::TimeDelta kDiscoveryTimeout = base::TimeDelta::FromSeconds(120); |
|
Rahul Chaturvedi
2016/09/21 22:40:26
Mention in comment why 2 minutes.
puthik_chromium
2016/09/22 00:26:55
Done.
|
| +// From https://www.bluetooth.com/specifications/assigned-numbers/baseband |
| +// The Class of Device for generic computer. |
| +constexpr uint32_t kBluetoothComputerClass = 0x100; |
| using GattStatusCallback = |
| base::Callback<void(arc::mojom::BluetoothGattStatus)>; |
| @@ -310,12 +315,6 @@ void ArcBluetoothBridge::OnInstanceClosed() { |
| bluetooth_adapter_->RemoveObserver(this); |
| } |
| -void ArcBluetoothBridge::AdapterPoweredChanged(BluetoothAdapter* adapter, |
| - bool powered) { |
| - // TODO(smbarber): Invoke EnableAdapter or DisableAdapter via ARC bridge |
| - // service. |
| -} |
| - |
| void ArcBluetoothBridge::DeviceAdded(BluetoothAdapter* adapter, |
| BluetoothDevice* device) { |
| auto* bluetooth_instance = |
| @@ -808,9 +807,10 @@ void ArcBluetoothBridge::SetRemoteDeviceProperty( |
| if (!bluetooth_instance) |
| return; |
| - // TODO(smbarber): Implement SetRemoteDeviceProperty |
| + // Unsupported. Only used by Android hidden API, BluetoothDevice.SetAlias(). |
| + // And only Android Settings App / Android TV / NFC used that. |
| bluetooth_instance->OnRemoteDeviceProperties( |
| - mojom::BluetoothStatus::FAIL, std::move(remote_addr), |
| + mojom::BluetoothStatus::UNSUPPORTED, std::move(remote_addr), |
| mojo::Array<mojom::BluetoothPropertyPtr>::New(0)); |
| } |
| @@ -827,9 +827,13 @@ void ArcBluetoothBridge::GetRemoteServices( |
| void ArcBluetoothBridge::StartDiscovery() { |
| DCHECK(bluetooth_adapter_); |
| - // TODO(smbarber): Add timeout |
| + DCHECK(CalledOnValidThread()); |
| + |
| if (discovery_session_) { |
| - LOG(ERROR) << "Discovery session already running; leaving alone"; |
| + LOG(ERROR) << "Discovery session already running; Reset timeout."; |
| + discovery_off_timer_.Start(FROM_HERE, kDiscoveryTimeout, |
| + base::Bind(&ArcBluetoothBridge::CancelDiscovery, |
| + weak_factory_.GetWeakPtr())); |
| SendCachedDevicesFound(); |
| return; |
| } |
| @@ -874,6 +878,8 @@ void ArcBluetoothBridge::OnPoweredError( |
| void ArcBluetoothBridge::OnDiscoveryStarted( |
| std::unique_ptr<BluetoothDiscoverySession> session) { |
| + DCHECK(CalledOnValidThread()); |
| + |
| auto* bluetooth_instance = |
| arc_bridge_service()->bluetooth()->GetInstanceForMethod( |
| "OnDiscoveryStateChanged"); |
| @@ -882,6 +888,10 @@ void ArcBluetoothBridge::OnDiscoveryStarted( |
| discovery_session_ = std::move(session); |
| + discovery_off_timer_.Start(FROM_HERE, kDiscoveryTimeout, |
| + base::Bind(&ArcBluetoothBridge::CancelDiscovery, |
| + weak_factory_.GetWeakPtr())); |
| + |
| bluetooth_instance->OnDiscoveryStateChanged( |
| mojom::BluetoothDiscoveryState::STARTED); |
| @@ -896,6 +906,7 @@ void ArcBluetoothBridge::OnDiscoveryStopped() { |
| return; |
| discovery_session_.reset(); |
| + discovery_off_timer_.Stop(); |
| bluetooth_instance->OnDiscoveryStateChanged( |
| mojom::BluetoothDiscoveryState::STOPPED); |
| @@ -1761,18 +1772,20 @@ ArcBluetoothBridge::GetAdapterProperties( |
| } |
| if (type == mojom::BluetoothPropertyType::ALL || |
| type == mojom::BluetoothPropertyType::UUIDS) { |
| - // TODO(smbarber): Fill in once GetUUIDs is available for the adapter. |
| + mojom::BluetoothPropertyPtr btp = mojom::BluetoothProperty::New(); |
| + btp->set_uuids( |
| + mojo::Array<BluetoothUUID>::From(bluetooth_adapter_->GetUUIDs())); |
| + properties.push_back(std::move(btp)); |
| } |
| if (type == mojom::BluetoothPropertyType::ALL || |
| type == mojom::BluetoothPropertyType::CLASS_OF_DEVICE) { |
| - // TODO(smbarber): Populate with the actual adapter class |
| mojom::BluetoothPropertyPtr btp = mojom::BluetoothProperty::New(); |
| - btp->set_device_class(0); |
| + btp->set_device_class(kBluetoothComputerClass); |
| properties.push_back(std::move(btp)); |
| } |
| if (type == mojom::BluetoothPropertyType::ALL || |
| type == mojom::BluetoothPropertyType::TYPE_OF_DEVICE) { |
| - // TODO(smbarber): Populate with the actual adapter type |
| + // Assume that all ChromeOS devices are dual mode Bluetooth device. |
| mojom::BluetoothPropertyPtr btp = mojom::BluetoothProperty::New(); |
| btp->set_device_type(device::BLUETOOTH_TRANSPORT_DUAL); |
| properties.push_back(std::move(btp)); |