| // 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 "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_ |