chromium/chrome/browser/ash/scalable_iph/scalable_iph_delegate_impl.h

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

#ifndef CHROME_BROWSER_ASH_SCALABLE_IPH_SCALABLE_IPH_DELEGATE_IMPL_H_
#define CHROME_BROWSER_ASH_SCALABLE_IPH_SCALABLE_IPH_DELEGATE_IMPL_H_

#include <memory>

#include "ash/public/cpp/app_list/app_list_controller.h"
#include "ash/public/cpp/app_list/app_list_controller_observer.h"
#include "ash/public/cpp/session/session_observer.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shell.h"
#include "ash/shell_observer.h"
#include "base/scoped_observation.h"
#include "chrome/browser/ash/printing/synced_printers_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chromeos/ash/components/phonehub/feature_status_provider.h"
#include "chromeos/ash/components/scalable_iph/iph_session.h"
#include "chromeos/ash/components/scalable_iph/logger.h"
#include "chromeos/ash/components/scalable_iph/scalable_iph_delegate.h"
#include "chromeos/dbus/power/power_manager_client.h"
#include "chromeos/services/network_config/public/cpp/cros_network_config_observer.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/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"

namespace ash {

class ScalableIphDelegateImpl
    : public scalable_iph::ScalableIphDelegate,
      public chromeos::network_config::CrosNetworkConfigObserver,
      public ShellObserver,
      public SessionObserver,
      public chromeos::PowerManagerClient::Observer,
      public AppListControllerObserver,
      public SyncedPrintersManager::Observer,
      public phonehub::FeatureStatusProvider::Observer {
 public:
  explicit ScalableIphDelegateImpl(Profile* profile,
                                   scalable_iph::Logger* logger);
  ~ScalableIphDelegateImpl() override;

  // scalable_iph::ScalableIphDelegate:
  bool ShowBubble(
      const BubbleParams& params,
      std::unique_ptr<scalable_iph::IphSession> iph_session) override;
  bool ShowNotification(
      const NotificationParams& params,
      std::unique_ptr<scalable_iph::IphSession> iph_session) override;
  void AddObserver(
      scalable_iph::ScalableIphDelegate::Observer* observer) override;
  void RemoveObserver(
      scalable_iph::ScalableIphDelegate::Observer* observer) override;
  bool IsOnline() override;
  int ClientAgeInDays() override;
  void PerformActionForScalableIph(
      scalable_iph::ActionType action_type) override;

  // chromeos::network_config::CrosNetworkConfigObserver:
  void OnActiveNetworksChanged(
      std::vector<chromeos::network_config::mojom::NetworkStatePropertiesPtr>
          networks) override;

  // ShellObserver:
  void OnShellDestroying() override;

  // SessionObserver:
  void OnSessionStateChanged(session_manager::SessionState state) override;

  // chromeos::PowerManagerClient::Observer:
  void SuspendDone(base::TimeDelta sleep_duration) override;

  // AppListControllerObserver:
  void OnAppListVisibilityChanged(bool shown, int64_t display_id) override;

  // SyncedPrintersManager::Observer
  void OnSavedPrintersChanged() override;

  // phonehub::FeatureStatusProvider::Observer
  void OnFeatureStatusChanged() override;

  void SetFakeFeatureStatusProviderForTesting(
      phonehub::FeatureStatusProvider* feature_status_provider);

 private:
  bool IsEligibleAction(scalable_iph::ActionType action_type);
  void SetHasOnlineNetwork(bool has_online_network);
  void QueryOnlineNetworkState();
  void OnNetworkStateList(
      std::vector<chromeos::network_config::mojom::NetworkStatePropertiesPtr>
          networks);
  void NotifySessionStateChanged(
      ::scalable_iph::ScalableIphDelegate::SessionState session_state);
  void NotifySuspendDoneWithoutLockScreen();
  void MaybeNotifyHasSavedPrinters();
  void MaybeNotifyPhoneHubOnboardingEligibility();
  void OnNudgeButtonClicked(const std::string& bubble_id,
                            scalable_iph::ScalableIphDelegate::Action action);
  void OnNudgeDismissed(const std::string& bubble_id);

  scalable_iph::Logger* GetLogger() { return logger_; }

  raw_ptr<Profile> profile_;

  // Owned by `ScalableIph`
  raw_ptr<scalable_iph::Logger> logger_;

  raw_ptr<SyncedPrintersManager> synced_printers_manager_;
  raw_ptr<phonehub::FeatureStatusProvider> feature_status_provider_;
  bool has_online_network_ = false;
  bool has_saved_printers_ = false;
  bool phonehub_onboarding_eligible_ = false;

  std::unique_ptr<scalable_iph::IphSession> bubble_iph_session_;
  std::string bubble_id_;

  mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig>
      remote_cros_network_config_;
  mojo::Receiver<chromeos::network_config::mojom::CrosNetworkConfigObserver>
      receiver_cros_network_config_observer_{this};

  base::ObserverList<scalable_iph::ScalableIphDelegate::Observer> observers_;
  base::ScopedObservation<Shell, ShellObserver> shell_observer_{this};
  base::ScopedObservation<SessionControllerImpl, SessionObserver>
      session_observer_{this};
  base::ScopedObservation<chromeos::PowerManagerClient,
                          chromeos::PowerManagerClient::Observer>
      power_manager_client_observer_{this};
  base::ScopedObservation<AppListController, AppListControllerObserver>
      app_list_controller_observer_{this};
  base::ScopedObservation<SyncedPrintersManager,
                          SyncedPrintersManager::Observer>
      synced_printers_manager_observer_{this};
  base::ScopedObservation<phonehub::FeatureStatusProvider,
                          phonehub::FeatureStatusProvider::Observer>
      feature_status_provider_observer_{this};

  base::WeakPtrFactory<ScalableIphDelegateImpl> weak_ptr_factory_{this};
};
}  // namespace ash

#endif  // CHROME_BROWSER_ASH_SCALABLE_IPH_SCALABLE_IPH_DELEGATE_IMPL_H_