chromium/chrome/browser/ui/ash/system/system_tray_client_impl.h

// Copyright 2016 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_UI_ASH_SYSTEM_SYSTEM_TRAY_CLIENT_IMPL_H_
#define CHROME_BROWSER_UI_ASH_SYSTEM_SYSTEM_TRAY_CLIENT_IMPL_H_

#include <optional>
#include <string_view>

#include "ash/public/cpp/system_tray_client.h"
#include "ash/public/cpp/update_types.h"
#include "base/memory/raw_ptr.h"
#include "chrome/browser/ash/system/system_clock_observer.h"
#include "chrome/browser/upgrade_detector/upgrade_observer.h"
#include "components/access_code_cast/common/access_code_cast_metrics.h"
#include "components/policy/core/common/cloud/cloud_policy_store.h"

namespace ash {
struct DeviceEnterpriseInfo;
struct LocaleInfo;
class SystemTray;
enum class LoginStatus;
enum class NotificationStyle;
}  // namespace ash

class Profile;

// Handles method calls delegated back to chrome from ash. Also notifies ash of
// relevant state changes in chrome.
class SystemTrayClientImpl : public ash::SystemTrayClient,
                             public ash::system::SystemClockObserver,
                             public policy::CloudPolicyStore::Observer,
                             public UpgradeObserver {
 public:
  SystemTrayClientImpl();

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

  ~SystemTrayClientImpl() override;

  static SystemTrayClientImpl* Get();

  // Specifies if notification is recommended or required by administrator and
  // triggers the notification to be shown with the given body and title.
  // Only applies to OS updates.
  virtual void SetRelaunchNotificationState(
      const ash::RelaunchNotificationState& relaunch_notification_state);

  // Resets update state to hide notification.
  void ResetUpdateState();

  // Wrappers around ash::mojom::SystemTray interface:
  void SetPrimaryTrayEnabled(bool enabled);
  void SetPrimaryTrayVisible(bool visible);
  void SetPerformanceTracingIconVisible(bool visible);
  void SetLocaleList(std::vector<ash::LocaleInfo> locale_list,
                     const std::string& current_locale_iso_code);
  void SetShowEolNotice(bool show, bool eol_passed_recently);

  // ash::SystemTrayClient:
  void ShowSettings(int64_t display_id) override;
  void ShowAccountSettings() override;
  void ShowBluetoothSettings() override;
  void ShowBluetoothSettings(const std::string& device_id) override;
  void ShowBluetoothPairingDialog(
      std::optional<std::string_view> device_address) override;
  void ShowDateSettings() override;
  void ShowSetTimeDialog() override;
  void ShowDisplaySettings() override;
  void ShowDarkModeSettings() override;
  void ShowStorageSettings() override;
  void ShowPowerSettings() override;
  void ShowPrivacyAndSecuritySettings() override;
  void ShowPrivacyHubSettings() override;
  void ShowSpeakOnMuteDetectionSettings() override;
  void ShowSmartPrivacySettings() override;
  void ShowChromeSlow() override;
  void ShowIMESettings() override;
  void ShowConnectedDevicesSettings() override;
  void ShowTetherNetworkSettings() override;
  void ShowWifiSyncSettings() override;
  void ShowAboutChromeOS() override;
  void ShowAboutChromeOSDetails() override;
  void ShowAccessibilityHelp() override;
  void ShowAccessibilitySettings() override;
  void ShowColorCorrectionSettings() override;
  void ShowGestureEducationHelp() override;
  void ShowPaletteHelp() override;
  void ShowPaletteSettings() override;
  void ShowEnterpriseInfo() override;
  void ShowNetworkConfigure(const std::string& network_id) override;
  void ShowNetworkCreate(const std::string& type) override;
  void ShowSettingsCellularSetup(bool show_psim_flow) override;
  void ShowMobileDataSubpage() override;
  void ShowSettingsSimUnlock() override;
  void ShowApnSubpage(const std::string& network_id) override;
  void ShowThirdPartyVpnCreate(const std::string& extension_id) override;
  void ShowArcVpnCreate(const std::string& app_id) override;
  void ShowNetworkSettings(const std::string& network_id) override;
  void ShowHotspotSubpage() override;
  void ShowMultiDeviceSetup() override;
  void ShowFirmwareUpdate() override;
  void SetLocaleAndExit(const std::string& locale_iso_code) override;
  void ShowAccessCodeCastingDialog(
      AccessCodeCastDialogOpenLocation open_location) override;
  void ShowCalendarEvent(const std::optional<GURL>& event_url,
                         const base::Time& date,
                         bool& opened_pwa,
                         GURL& finalized_event_url) override;
  void ShowVideoConference(const GURL& video_conference_url) override;
  void ShowChannelInfoAdditionalDetails() override;
  void ShowChannelInfoGiveFeedback() override;
  void ShowAudioSettings() override;
  void ShowEolInfoPage() override;
  void RecordEolNoticeShown() override;
  bool IsUserFeedbackEnabled() override;
  void ShowGraphicsTabletSettings() override;
  void ShowMouseSettings() override;
  void ShowTouchpadSettings() override;
  void ShowRemapKeysSubpage(int device_id) override;
  void ShowYouTubeMusicPremiumPage() override;
  void ShowKeyboardSettings() override;
  void ShowPointingStickSettings() override;
  void ShowNearbyShareSettings() override;

 protected:
  // Used by mocks in tests.
  explicit SystemTrayClientImpl(SystemTrayClientImpl* mock_instance);

 private:
  // Observes profile changed and profile's policy changed.
  class EnterpriseAccountObserver;

  // Helper function shared by ShowNetworkSettings() and ShowNetworkConfigure().
  void ShowNetworkSettingsHelper(const std::string& network_id,
                                 bool show_configure);

  // Requests that ash show the update available icon.
  void HandleUpdateAvailable();

  // ash::system::SystemClockObserver:
  void OnSystemClockChanged(ash::system::SystemClock* clock) override;

  // UpgradeObserver implementation.
  void OnUpdateDeferred(bool use_notification) override;
  void OnUpdateOverCellularAvailable() override;
  void OnUpdateOverCellularOneTimePermissionGranted() override;
  void OnUpgradeRecommended() override;

  // policy::CloudPolicyStore::Observer
  void OnStoreLoaded(policy::CloudPolicyStore* store) override;
  void OnStoreError(policy::CloudPolicyStore* store) override;

  void UpdateDeviceEnterpriseInfo();
  void UpdateEnterpriseAccountDomainInfo(Profile* profile);

  // The system tray model in ash.
  const raw_ptr<ash::SystemTray> system_tray_;

  // Information on whether the update is recommended or required.
  ash::RelaunchNotificationState relaunch_notification_state_;

  std::unique_ptr<ash::DeviceEnterpriseInfo> last_device_enterprise_info_;
  std::string last_enterprise_account_domain_manager_;

  std::unique_ptr<EnterpriseAccountObserver> enterprise_account_observer_;

  // Whether the eol incentive is due to a recently pasesed end of life date.
  bool eol_incentive_recently_passed_ = false;
};

#endif  // CHROME_BROWSER_UI_ASH_SYSTEM_SYSTEM_TRAY_CLIENT_IMPL_H_