chromium/ash/webui/eche_app_ui/eche_app_manager.h

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

#ifndef ASH_WEBUI_ECHE_APP_UI_ECHE_APP_MANAGER_H_
#define ASH_WEBUI_ECHE_APP_UI_ECHE_APP_MANAGER_H_

#include <stdint.h>

#include <memory>

#include "ash/public/cpp/ash_web_view.h"
#include "ash/webui/eche_app_ui/accessibility_provider.h"
#include "ash/webui/eche_app_ui/apps_launch_info_provider.h"
#include "ash/webui/eche_app_ui/eche_feature_status_provider.h"
#include "ash/webui/eche_app_ui/eche_notification_click_handler.h"
#include "ash/webui/eche_app_ui/eche_recent_app_click_handler.h"
#include "ash/webui/eche_app_ui/launch_app_helper.h"
#include "ash/webui/eche_app_ui/mojom/eche_app.mojom.h"
#include "base/memory/raw_ptr.h"
#include "chromeos/ash/services/secure_channel/public/cpp/client/presence_monitor_client_impl.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
#include "components/keyed_service/core/keyed_service.h"
#include "mojo/public/cpp/bindings/remote.h"

class PrefService;

namespace ash {

namespace device_sync {
class DeviceSyncClient;
}

namespace multidevice_setup {
class MultiDeviceSetupClient;
}

namespace phonehub {
class PhoneHubManager;
}

namespace secure_channel {
class ConnectionManager;
class SecureChannelClient;
}  // namespace secure_channel

namespace eche_app {

class AppsLaunchInfoProvider;
class EcheConnector;
class EcheMessageReceiver;
class EcheAlertGenerator;
class EchePresenceManager;
class EcheSignaler;
class EcheUidProvider;
class SystemInfo;
class SystemInfoProvider;
class AppsAccessManager;
class EcheStreamStatusChangeHandler;
class EcheTrayStreamStatusObserver;
class EcheConnectionScheduler;
class EcheStreamOrientationObserver;
class EcheConnectionStatusHandler;
class EcheKeyboardLayoutHandler;

// Implements the core logic of the EcheApp and exposes interfaces via its
// public API. Implemented as a KeyedService since it depends on other
// KeyedService instances.
class EcheAppManager : public KeyedService {
 public:
  EcheAppManager(PrefService* pref_service,
                 std::unique_ptr<SystemInfo> system_info,
                 phonehub::PhoneHubManager*,
                 device_sync::DeviceSyncClient*,
                 multidevice_setup::MultiDeviceSetupClient*,
                 secure_channel::SecureChannelClient*,
                 std::unique_ptr<secure_channel::PresenceMonitorClient>
                     presence_monitor_client,
                 std::unique_ptr<AccessibilityProviderProxy>,
                 LaunchAppHelper::LaunchEcheAppFunction,
                 LaunchAppHelper::LaunchNotificationFunction,
                 LaunchAppHelper::CloseNotificationFunction);
  ~EcheAppManager() override;

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

  void BindSignalingMessageExchangerInterface(
      mojo::PendingReceiver<mojom::SignalingMessageExchanger> receiver);

  void BindUidGeneratorInterface(
      mojo::PendingReceiver<mojom::UidGenerator> receiver);

  void BindSystemInfoProviderInterface(
      mojo::PendingReceiver<mojom::SystemInfoProvider> receiver);

  void BindAccessibilityProviderInterface(
      mojo::PendingReceiver<mojom::AccessibilityProvider> receiver);

  void BindNotificationGeneratorInterface(
      mojo::PendingReceiver<mojom::NotificationGenerator> receiver);

  void BindDisplayStreamHandlerInterface(
      mojo::PendingReceiver<mojom::DisplayStreamHandler> receiver);

  void BindStreamOrientationObserverInterface(
      mojo::PendingReceiver<mojom::StreamOrientationObserver> receiver);

  void BindConnectionStatusObserverInterface(
      mojo::PendingReceiver<mojom::ConnectionStatusObserver> receiver);

  void BindKeyboardLayoutHandlerInterface(
      mojo::PendingReceiver<mojom::KeyboardLayoutHandler> receiver);

  AppsAccessManager* GetAppsAccessManager();

  EcheConnectionStatusHandler* GetEcheConnectionStatusHandler();

  // This trigger Eche Web to release connection resource.
  void CloseStream();

  // This trigger Eche Web to go back the previous page.
  void StreamGoBack();

  // This is triggered when the app bubble appears in the UI.
  void BubbleShown(AshWebView* view);

  // KeyedService:
  void Shutdown() override;

 private:
  raw_ptr<phonehub::PhoneHubManager> phone_hub_manager_;
  std::unique_ptr<secure_channel::ConnectionManager> connection_manager_;
  std::unique_ptr<EcheConnectionStatusHandler> eche_connection_status_handler_;
  std::unique_ptr<EcheFeatureStatusProvider> feature_status_provider_;
  std::unique_ptr<LaunchAppHelper> launch_app_helper_;
  std::unique_ptr<AppsLaunchInfoProvider> apps_launch_info_provider_;
  std::unique_ptr<EcheStreamStatusChangeHandler> stream_status_change_handler_;
  std::unique_ptr<EcheNotificationClickHandler>
      eche_notification_click_handler_;
  std::unique_ptr<EcheConnectionScheduler> connection_scheduler_;
  std::unique_ptr<EcheConnector> eche_connector_;
  std::unique_ptr<EcheSignaler> signaler_;
  std::unique_ptr<EcheMessageReceiver> message_receiver_;
  std::unique_ptr<EchePresenceManager> eche_presence_manager_;
  std::unique_ptr<EcheUidProvider> uid_;
  std::unique_ptr<EcheRecentAppClickHandler> eche_recent_app_click_handler_;
  std::unique_ptr<EcheAlertGenerator> alert_generator_;
  mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig>
      remote_cros_network_config_;
  std::unique_ptr<SystemInfoProvider> system_info_provider_;
  std::unique_ptr<AccessibilityProvider> accessibility_provider_;
  std::unique_ptr<AppsAccessManager> apps_access_manager_;
  std::unique_ptr<EcheTrayStreamStatusObserver>
      eche_tray_stream_status_observer_;
  std::unique_ptr<EcheStreamOrientationObserver>
      eche_stream_orientation_observer_;
  std::unique_ptr<EcheKeyboardLayoutHandler> eche_keyboard_layout_handler_;
};

}  // namespace eche_app
}  // namespace ash

#endif  // ASH_WEBUI_ECHE_APP_UI_ECHE_APP_MANAGER_H_