#ifndef ASH_SYSTEM_CAMERA_CAMERA_EFFECTS_CONTROLLER_H_
#define ASH_SYSTEM_CAMERA_CAMERA_EFFECTS_CONTROLLER_H_
#include <utility>
#include "ash/ash_export.h"
#include "ash/public/cpp/session/session_controller.h"
#include "ash/public/cpp/session/session_observer.h"
#include "ash/system/video_conference/effects/video_conference_tray_effects_delegate.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "media/capture/video/chromeos/camera_hal_dispatcher_impl.h"
#include "media/capture/video/chromeos/mojom/effects_pipeline.mojom.h"
class PrefRegistrySimple;
class PrefService;
class PrefChangeRegistrar;
namespace gfx {
struct VectorIcon;
}
namespace ash {
enum class VcEffectId;
class ASH_EXPORT CameraEffectsController : public media::CameraEffectObserver,
public SessionObserver,
public VcEffectsDelegate {
public:
enum BackgroundBlurPrefValue {
kOff = -1,
kLowest = 0,
kLight = 1,
kMedium = 2,
kHeavy = 3,
kMaximum = 4,
};
enum class BackgroundBlurState {
kOff = 0,
kLowest = 1,
kLight = 2,
kMedium = 3,
kHeavy = 4,
kMaximum = 5,
kMaxValue = kMaximum
};
CameraEffectsController();
CameraEffectsController(const CameraEffectsController&) = delete;
CameraEffectsController& operator=(const CameraEffectsController&) = delete;
~CameraEffectsController() override;
bool IsEffectControlAvailable(
cros::mojom::CameraEffect effect = cros::mojom::CameraEffect::kNone);
cros::mojom::EffectsConfigPtr GetCameraEffects();
static void RegisterProfilePrefs(PrefRegistrySimple* registry);
void OnActiveUserPrefServiceChanged(PrefService* pref_service) override;
absl::optional<int> GetEffectState(VcEffectId effect_id) override;
void OnEffectControlActivated(VcEffectId effect_id,
absl::optional<int> state) override;
void RecordMetricsForSetValueEffect(VcEffectId effect_id,
int state_value) const override;
void OnCameraEffectChanged(
const cros::mojom::EffectsConfigPtr& new_effects) final;
void bypass_set_camera_effects_for_testing(bool in_testing_mode) {
in_testing_mode_ = in_testing_mode;
}
private:
cros::mojom::SegmentationModel GetSegmentationModelType();
void SetCameraEffects(cros::mojom::EffectsConfigPtr config);
cros::mojom::EffectsConfigPtr GetEffectsConfigFromPref();
void SetEffectsConfigToPref(cros::mojom::EffectsConfigPtr config);
void InitializeEffectControls();
void AddBackgroundBlurStateToEffect(VcHostedEffect* effect,
const gfx::VectorIcon& icon,
int state_value,
int string_id);
bool in_testing_mode_ = false;
std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
const scoped_refptr<base::SequencedTaskRunner> main_task_runner_;
cros::mojom::EffectsConfigPtr current_effects_;
base::ScopedObservation<SessionController, SessionObserver>
session_observation_{this};
base::WeakPtrFactory<CameraEffectsController> weak_factory_{this};
};
}
#endif