// 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),
      weak_factory_(this) {
  if (device::BluetoothAdapterFactory::IsBluetoothSupported()) {
    device::BluetoothAdapterFactory::GetAdapter(
        base::Bind(&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<device::BluetoothAdapter> 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
