chromium/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h

// Copyright 2013 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_COMPONENTS_AUDIO_AUDIO_DEVICES_PREF_HANDLER_IMPL_H_
#define CHROMEOS_ASH_COMPONENTS_AUDIO_AUDIO_DEVICES_PREF_HANDLER_IMPL_H_

#include <memory>
#include <string>

#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/values.h"
#include "chromeos/ash/components/audio/audio_devices_pref_handler.h"
#include "components/prefs/pref_change_registrar.h"

class PrefRegistrySimple;
class PrefService;

namespace ash {

// Class which implements AudioDevicesPrefHandler interface and register audio
// preferences as well.
class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_AUDIO)
    AudioDevicesPrefHandlerImpl : public AudioDevicesPrefHandler {
 public:
  // |local_state| is the device-wide preference service.
  explicit AudioDevicesPrefHandlerImpl(PrefService* local_state);

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

  // Overridden from AudioDevicesPrefHandler.
  double GetOutputVolumeValue(const AudioDevice* device) override;
  double GetInputGainValue(const AudioDevice* device) override;
  void SetVolumeGainValue(const AudioDevice& device, double value) override;

  bool GetMuteValue(const AudioDevice& device) override;
  void SetMuteValue(const AudioDevice& device, bool mute_on) override;

  void SetDeviceActive(const AudioDevice& device,
                       bool active,
                       bool activate_by_user) override;
  bool GetDeviceActive(const AudioDevice& device,
                       bool* active,
                       bool* activate_by_user) override;

  void SetUserPriorityHigherThan(const AudioDevice& target,
                                 const AudioDevice* base) override;
  int GetUserPriority(const AudioDevice& device) override;

  const std::optional<uint64_t> GetPreferredDeviceFromPreferenceSet(
      bool is_input,
      const AudioDeviceList& devices) override;

  void UpdateDevicePreferenceSet(const AudioDeviceList& devices,
                                 const AudioDevice& preferred_device) override;

  const base::Value::List& GetMostRecentActivatedDeviceIdList(
      bool is_input) override;

  void UpdateMostRecentActivatedDeviceIdList(
      const AudioDevice& device) override;

  void DropLeastRecentlySeenDevices(
      const std::vector<AudioDevice>& connected_devices,
      size_t keep_devices) override;

  bool GetNoiseCancellationState() override;
  void SetNoiseCancellationState(bool noise_cancellation_state) override;

  bool GetStyleTransferState() const override;
  void SetStyleTransferState(bool style_transfer_state) override;

  bool GetAudioOutputAllowedValue() const override;

  void AddAudioPrefObserver(AudioPrefObserver* observer) override;
  void RemoveAudioPrefObserver(AudioPrefObserver* observer) override;

  bool GetForceRespectUiGainsState() override;
  void SetForceRespectUiGainsState(bool force_respect_ui_gains) override;

  bool GetHfpMicSrState() override;
  void SetHfpMicSrState(bool hfp_mic_sr_state) override;

  // Registers volume and mute preferences.
  static void RegisterPrefs(PrefRegistrySimple* registry);

 protected:
  ~AudioDevicesPrefHandlerImpl() override;

 private:
  // Initializes the observers for the policy prefs.
  void InitializePrefObservers();

  // Load and save methods for the mute preferences for all devices.
  void LoadDevicesMutePref();
  void SaveDevicesMutePref();

  // Load and save methods for the gain preferences for all devices.
  void LoadDevicesGainPref();
  void SaveDevicesGainPref();

  // Load and save methods for the volume preferences for all devices.
  void LoadDevicesVolumePref();
  void SaveDevicesVolumePref();

  // Load and save methods for the active state for all devices.
  void LoadDevicesStatePref();
  void SaveDevicesStatePref();

  // Load and save methods for the user priority for all input devices.
  void LoadInputDevicesUserPriorityPref();
  void SaveInputDevicesUserPriorityPref();

  // Load and save methods for the user priority for all output devices.
  void LoadOutputDevicesUserPriorityPref();
  void SaveOutputDevicesUserPriorityPref();

  // Load and save methods for the preference set for all input devices.
  void LoadInputDevicePreferenceSetPref();
  void SaveInputDevicePreferenceSetPref();

  // Load and save methods for the preference set for all output devices.
  void LoadOutputDevicePreferenceSetPref();
  void SaveOutputDevicePreferenceSetPref();

  // Load and save methods for the most recently activated input device id list.
  void LoadMostRecentActivatedInputDeviceIdsPref();
  void SaveMostRecentActivatedInputDeviceIdsPref();

  // Load and save methods for the most recently activated output device id
  // list.
  void LoadMostRecentActivatedOutputDeviceIdsPref();
  void SaveMostRecentActivatedOutputDeviceIdsPref();

  double GetOutputVolumePrefValue(const AudioDevice& device);
  double GetInputGainPrefValue(const AudioDevice& device);
  double GetDeviceDefaultOutputVolume(const AudioDevice& device);

  void SetOutputVolumePrefValue(const AudioDevice& device, double value);
  void SetInputGainPrefValue(const AudioDevice& device, double value);

  // Migrates devices state pref for an audio device. Device settings are
  // saved under device stable device ID - this method migrates device state
  // for a device that is saved under key derived from v1 stable device ID to
  // |device_key|. Note that |device_key| should be the key derived from
  // |device|'s v2 stable device ID.
  bool MigrateDevicesStatePref(const std::string& device_key,
                               const AudioDevice& device);

  // Methods to migrate the mute and volume settings for an audio device.
  // Migration is done in the folowing way:
  //   1. If there is a setting for the device under |device_key|, do nothing.
  //      (Note that |device_key| is expected to be the key derived from
  //       |device's| v2 stable device ID).
  //   2. If there is a setting for the device under the key derived from
  //      |device|'s v1 stable device ID, move the value to |device_key|.
  //   3. If a previous global pref value exists, move it to the per device
  //      setting (under |device_key|).
  //   4. If a previous global setting is not set, use default values of
  //      mute = off and volume = 75%.
  void MigrateDeviceMuteSettings(const std::string& device_key,
                                 const AudioDevice& device);
  void MigrateDeviceVolumeGainSettings(const std::string& device_key,
                                       const AudioDevice& device);

  // Notifies the AudioPrefObserver for audio policy pref changes.
  void NotifyAudioPolicyChange();

  base::Value::Dict device_mute_settings_;
  base::Value::Dict device_volume_settings_;
  base::Value::Dict device_gain_settings_;
  base::Value::Dict device_state_settings_;
  base::Value::Dict input_device_user_priority_settings_;
  base::Value::Dict output_device_user_priority_settings_;
  base::Value::Dict input_device_preference_set_settings_;
  base::Value::Dict output_device_preference_set_settings_;
  base::Value::List most_recent_activated_input_device_ids_;
  base::Value::List most_recent_activated_output_device_ids_;

  raw_ptr<PrefService> local_state_;  // not owned

  PrefChangeRegistrar pref_change_registrar_;
  base::ObserverList<AudioPrefObserver>::Unchecked observers_;
};

}  // namespace ash

#endif  // CHROMEOS_ASH_COMPONENTS_AUDIO_AUDIO_DEVICES_PREF_HANDLER_IMPL_H_