// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ash/bluetooth_devices_observer.h" #include "base/bind.h" #include "device/bluetooth/bluetooth_adapter_factory.h" namespace ash { BluetoothDevicesObserver::BluetoothDevicesObserver( const AdapterOrDeviceChangedCallback& device_changed_callback) : adapter_or_device_changed_callback_(device_changed_callback) { if (device::BluetoothAdapterFactory::IsBluetoothSupported()) { device::BluetoothAdapterFactory::Get()->GetAdapter( base::BindOnce(&BluetoothDevicesObserver::InitializeOnAdapterReady, weak_factory_.GetWeakPtr())); } else { adapter_or_device_changed_callback_.Run(/*device=*/nullptr); } } BluetoothDevicesObserver::~BluetoothDevicesObserver() { if (bluetooth_adapter_) bluetooth_adapter_->RemoveObserver(this); } void BluetoothDevicesObserver::AdapterPresentChanged( device::BluetoothAdapter* adapter, bool present) { adapter_or_device_changed_callback_.Run(/*device=*/nullptr); } void BluetoothDevicesObserver::AdapterPoweredChanged( device::BluetoothAdapter* adapter, bool powered) { adapter_or_device_changed_callback_.Run(/*device=*/nullptr); } void BluetoothDevicesObserver::DeviceChanged(device::BluetoothAdapter* adapter, device::BluetoothDevice* device) { adapter_or_device_changed_callback_.Run(device); } void BluetoothDevicesObserver::InitializeOnAdapterReady( scoped_refptr adapter) { bluetooth_adapter_ = std::move(adapter); bluetooth_adapter_->AddObserver(this); } bool BluetoothDevicesObserver::IsConnectedBluetoothDevice( const ui::InputDevice& input_device) const { if (!bluetooth_adapter_ || !bluetooth_adapter_->IsPresent() || !bluetooth_adapter_->IsInitialized() || !bluetooth_adapter_->IsPowered()) { return false; } // Since there is no map from an InputDevice to a BluetoothDevice. We just // comparing their vendor id and product id to guess a match. for (auto* device : bluetooth_adapter_->GetDevices()) { if (!device->IsConnected()) continue; if (device->GetVendorID() == input_device.vendor_id && device->GetProductID() == input_device.product_id) { return true; } } return false; } } // namespace ash