chromium/chromeos/ash/services/hotspot_config/cros_hotspot_config.h

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMEOS_ASH_SERVICES_HOTSPOT_CONFIG_CROS_HOTSPOT_CONFIG_H_
#define CHROMEOS_ASH_SERVICES_HOTSPOT_CONFIG_CROS_HOTSPOT_CONFIG_H_

#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chromeos/ash/components/network/hotspot_capabilities_provider.h"
#include "chromeos/ash/components/network/hotspot_configuration_handler.h"
#include "chromeos/ash/components/network/hotspot_enabled_state_notifier.h"
#include "chromeos/ash/components/network/hotspot_state_handler.h"
#include "chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"

namespace ash {

class HotspotController;

namespace hotspot_config {

class CrosHotspotConfig : public mojom::CrosHotspotConfig,
                          public HotspotCapabilitiesProvider::Observer,
                          public HotspotConfigurationHandler::Observer,
                          public HotspotStateHandler::Observer {
 public:
  // Constructs an instance of CrosHotspotConfig with default network subsystem
  // dependencies appropriate for a production environment.
  CrosHotspotConfig();

  CrosHotspotConfig(const CrosHotspotConfig&) = delete;
  CrosHotspotConfig& operator=(const CrosHotspotConfig&) = delete;

  ~CrosHotspotConfig() override;

  // Binds a PendingReceiver to this instance. Clients wishing to use the
  // CrosHotspotConfig API should use this function as an entrypoint.
  void BindPendingReceiver(
      mojo::PendingReceiver<mojom::CrosHotspotConfig> pending_receiver);

  // mojom::CrosHotspotConfig
  void ObserveEnabledStateChanges(
      mojo::PendingRemote<mojom::HotspotEnabledStateObserver> observer)
      override;
  void AddObserver(
      mojo::PendingRemote<mojom::CrosHotspotConfigObserver> observer) override;
  void GetHotspotInfo(GetHotspotInfoCallback callback) override;
  void SetHotspotConfig(mojom::HotspotConfigPtr config,
                        SetHotspotConfigCallback callback) override;
  void EnableHotspot(EnableHotspotCallback callback) override;
  void DisableHotspot(DisableHotspotCallback callback) override;

 private:
  friend class CrosHotspotConfigTest;

  // Constructs an instance of CrosHotspotConfig with specific network subsystem
  // dependencies. This should only be used in test.
  CrosHotspotConfig(
      HotspotCapabilitiesProvider* hotspot_capabilities_provider,
      HotspotStateHandler* hotspot_state_handler,
      HotspotController* hotspot_controller,
      HotspotConfigurationHandler* hotspot_configuration_handler,
      HotspotEnabledStateNotifier* hotspot_enabled_state_notifier);
  // HotspotStateHandler::Observer:
  void OnHotspotStatusChanged() override;
  // HotspotCapabilitiesProvider::Observer:
  void OnHotspotCapabilitiesChanged() override;
  // HotspotConfigurationHandler::Observer:
  void OnHotspotConfigurationChanged() override;

  void NotifyObservers();

  raw_ptr<HotspotCapabilitiesProvider, LeakedDanglingUntriaged>
      hotspot_capabilities_provider_;
  raw_ptr<HotspotStateHandler, LeakedDanglingUntriaged> hotspot_state_handler_;
  raw_ptr<ash::HotspotController, LeakedDanglingUntriaged> hotspot_controller_;
  raw_ptr<HotspotConfigurationHandler, LeakedDanglingUntriaged>
      hotspot_configuration_handler_;
  raw_ptr<HotspotEnabledStateNotifier, LeakedDanglingUntriaged>
      hotspot_enabled_state_notifier_;

  mojo::RemoteSet<mojom::CrosHotspotConfigObserver> observers_;
  mojo::ReceiverSet<mojom::CrosHotspotConfig> receivers_;

  base::WeakPtrFactory<CrosHotspotConfig> weak_factory_{this};
};

}  // namespace hotspot_config
}  // namespace ash

#endif  // CHROMEOS_ASH_SERVICES_HOTSPOT_CONFIG_CROS_HOTSPOT_CONFIG_H_