blob: 3ab5d0191ce32c991c948e28f50acddf6d65501a [file] [log] [blame]
// Copyright 2017 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.
#ifndef ASH_SYSTEM_BLUETOOTH_TRAY_BLUETOOTH_HELPER_H_
#define ASH_SYSTEM_BLUETOOTH_TRAY_BLUETOOTH_HELPER_H_
#include <string>
#include <vector>
#include "ash/ash_export.h"
#include "base/macros.h"
#include "base/timer/timer.h"
#include "device/bluetooth/bluetooth_common.h"
#include "services/device/public/mojom/bluetooth_system.mojom.h"
namespace ash {
using BluetoothAddress = std::array<uint8_t, 6>;
using BluetoothDeviceList = std::vector<device::mojom::BluetoothDeviceInfoPtr>;
// Maps UI concepts from the Bluetooth system tray (e.g. "Bluetooth is on") into
// device concepts ("Bluetooth adapter enabled"). Note that most Bluetooth
// device operations are asynchronous, hence the two step initialization.
//
// This is a temporary virtual class used during the migration to the new
// BluetoothSystem Mojo interface. Once the migration is over, we'll
// de-virtualize this class and remove its legacy implementation.
class ASH_EXPORT TrayBluetoothHelper {
public:
class Observer : public base::CheckedObserver {
public:
// Called when the state of Bluetooth in the system changes.
virtual void OnBluetoothSystemStateChanged() {}
// Called when a Bluetooth scan has started or stopped.
virtual void OnBluetoothScanStateChanged() {}
// Called when a device was added, removed, or changed.
virtual void OnBluetoothDeviceListChanged() {}
};
TrayBluetoothHelper();
virtual ~TrayBluetoothHelper();
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
// Initializes and gets the adapter asynchronously.
virtual void Initialize() = 0;
// Returns a list of available bluetooth devices.
const BluetoothDeviceList& GetAvailableBluetoothDevices() const;
// Requests bluetooth start discovering devices, which happens asynchronously.
virtual void StartBluetoothDiscovering() = 0;
// Requests bluetooth stop discovering devices.
virtual void StopBluetoothDiscovering() = 0;
// Connect to a specific bluetooth device.
virtual void ConnectToBluetoothDevice(const BluetoothAddress& address) = 0;
// Returns the state of Bluetooth in the system e.g. has hardware support,
// is enabled, etc.
virtual device::mojom::BluetoothSystem::State GetBluetoothState() = 0;
// Returns true if there is a Bluetooth radio present.
bool IsBluetoothStateAvailable();
// Changes bluetooth state to |enabled|. If the current state and |enabled|
// are same, it does nothing. If they're different, it toggles the state and
// records UMA.
virtual void SetBluetoothEnabled(bool enabled) = 0;
// Returns whether the delegate has initiated a bluetooth discovery session.
virtual bool HasBluetoothDiscoverySession() = 0;
protected:
using GetBluetoothDevicesCallback =
base::OnceCallback<void(BluetoothDeviceList)>;
// Using a "push" pattern where the underlying API notifies of device changes
// is undesireable because there are hundreds or sometimes thousands of
// changes per second. This could result in significantly slowing down the UI.
// To avoid this we use a pull pattern where we retrieve the device list every
// second and notify observers.
//
// Implementations of TrayBluetoothHelper should call this whenever the state
// changes.
void StartOrStopRefreshingDeviceList();
void NotifyBluetoothSystemStateChanged();
void NotifyBluetoothScanStateChanged();
virtual void GetBluetoothDevices(
GetBluetoothDevicesCallback callback) const = 0;
base::ObserverList<Observer> observers_;
private:
void UpdateDeviceCache();
void OnGetBluetoothDevices(BluetoothDeviceList devices);
void NotifyBluetoothDeviceListChanged();
// List of cached devices. Updated every second.
BluetoothDeviceList cached_devices_;
// Timer used to update |cached_devices_|.
base::RepeatingTimer timer_;
base::WeakPtrFactory<TrayBluetoothHelper> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(TrayBluetoothHelper);
};
} // namespace ash
#endif // ASH_SYSTEM_BLUETOOTH_TRAY_BLUETOOTH_HELPER_H_