1 // Copyright 2018 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ash/bluetooth_devices_observer.h"
8 #include "device/bluetooth/bluetooth_adapter_factory.h"
12 BluetoothDevicesObserver::BluetoothDevicesObserver(
13 const AdapterOrDeviceChangedCallback& device_changed_callback)
14 : adapter_or_device_changed_callback_(device_changed_callback) {
15 if (device::BluetoothAdapterFactory::IsBluetoothSupported()) {
16 device::BluetoothAdapterFactory::Get()->GetAdapter(
17 base::BindOnce(&BluetoothDevicesObserver::InitializeOnAdapterReady,
18 weak_factory_.GetWeakPtr()));
20 adapter_or_device_changed_callback_.Run(/*device=*/nullptr);
24 BluetoothDevicesObserver::~BluetoothDevicesObserver() {
25 if (bluetooth_adapter_)
26 bluetooth_adapter_->RemoveObserver(this);
29 void BluetoothDevicesObserver::AdapterPresentChanged(
30 device::BluetoothAdapter* adapter,
32 adapter_or_device_changed_callback_.Run(/*device=*/nullptr);
35 void BluetoothDevicesObserver::AdapterPoweredChanged(
36 device::BluetoothAdapter* adapter,
38 adapter_or_device_changed_callback_.Run(/*device=*/nullptr);
41 void BluetoothDevicesObserver::DeviceChanged(device::BluetoothAdapter* adapter,
42 device::BluetoothDevice* device) {
43 adapter_or_device_changed_callback_.Run(device);
46 void BluetoothDevicesObserver::InitializeOnAdapterReady(
47 scoped_refptr<device::BluetoothAdapter> adapter) {
48 bluetooth_adapter_ = std::move(adapter);
49 bluetooth_adapter_->AddObserver(this);
52 bool BluetoothDevicesObserver::IsConnectedBluetoothDevice(
53 const ui::InputDevice& input_device) const {
54 if (!bluetooth_adapter_ || !bluetooth_adapter_->IsPresent() ||
55 !bluetooth_adapter_->IsInitialized() ||
56 !bluetooth_adapter_->IsPowered()) {
60 // Since there is no map from an InputDevice to a BluetoothDevice. We just
61 // comparing their vendor id and product id to guess a match.
62 for (auto* device : bluetooth_adapter_->GetDevices()) {
63 if (!device->IsConnected())
66 if (device->GetVendorID() == input_device.vendor_id &&
67 device->GetProductID() == input_device.product_id) {