#include "ash/system/video_conference/effects/fake_video_conference_effects.h"
#include <string>
#include "ash/constants/ash_features.h"
#include "ash/resources/vector_icons/vector_icons.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/system/video_conference/effects/video_conference_tray_effects_manager_types.h"
#include "ash/system/video_conference/fake_video_conference_tray_controller.h"
#include "base/functional/bind.h"
#include "ui/views/controls/button/button.h"
namespace ash::fake_video_conference {
SimpleToggleEffect::SimpleToggleEffect(const std::u16string& label_text)
: SimpleToggleEffect(label_text,
std::nullopt,
std::nullopt) {}
SimpleToggleEffect::~SimpleToggleEffect() = default;
SimpleToggleEffect::SimpleToggleEffect(
const std::u16string& label_text,
std::optional<const gfx::VectorIcon*> icon,
std::optional<int> accessible_name_id) {
std::unique_ptr<VcHostedEffect> effect = std::make_unique<VcHostedEffect>(
VcEffectType::kToggle,
base::BindRepeating(&SimpleToggleEffect::GetEffectState,
base::Unretained(this),
VcEffectId::kTestEffect),
VcEffectId::kTestEffect);
std::unique_ptr<VcEffectState> state = std::make_unique<VcEffectState>(
icon.value_or(&ash::kPrivacyIndicatorsCameraIcon), label_text,
accessible_name_id.value_or(IDS_PRIVACY_INDICATORS_STATUS_CAMERA),
base::BindRepeating(&SimpleToggleEffect::OnEffectControlActivated,
weak_factory_.GetWeakPtr(),
VcEffectId::kTestEffect,
std::nullopt));
effect->AddState(std::move(state));
AddEffect(std::move(effect));
}
std::optional<int> SimpleToggleEffect::GetEffectState(VcEffectId effect_id) {
return 0;
}
void SimpleToggleEffect::OnEffectControlActivated(VcEffectId effect_id,
std::optional<int> state) {
++num_activations_for_testing_;
}
CatEarsEffect::CatEarsEffect()
: SimpleToggleEffect(
u"Cat Ears") {}
DogFurEffect::DogFurEffect()
: SimpleToggleEffect(
u"Dog Fur") {}
SpaceshipEffect::SpaceshipEffect()
: SimpleToggleEffect(
u"Spaceship") {}
OfficeBunnyEffect::OfficeBunnyEffect()
: SimpleToggleEffect(
u"Office Bunny") {}
CalmForestEffect::CalmForestEffect()
: SimpleToggleEffect(
u"Calm Forest") {}
StylishKitchenEffect::StylishKitchenEffect()
: SimpleToggleEffect(
u"Stylish Kitchen") {}
FakeLongTextLabelToggleEffect::FakeLongTextLabelToggleEffect()
: SimpleToggleEffect(
u"Fake Long Text Label Toggle Effect") {}
ShaggyFurEffect::ShaggyFurEffect() {
std::unique_ptr<VcHostedEffect> effect = std::make_unique<VcHostedEffect>(
VcEffectType::kSetValue,
base::BindRepeating(&ShaggyFurEffect::GetEffectState,
base::Unretained(this),
VcEffectId::kTestEffect),
VcEffectId::kTestEffect);
effect->set_label_text(u"Shaggy Fur");
AddStateToEffect(effect.get(),
static_cast<int>(FurShagginess::kBald),
u"Bald");
AddStateToEffect(effect.get(),
static_cast<int>(FurShagginess::kBuzzcut),
u"Buzzcut");
AddStateToEffect(effect.get(),
static_cast<int>(FurShagginess::kThick),
u"Thick");
AddEffect(std::move(effect));
for (int i = 0; i < static_cast<int>(FurShagginess::kMaxNumValues); ++i) {
num_activations_for_testing_.push_back(0);
}
}
ShaggyFurEffect::~ShaggyFurEffect() = default;
std::optional<int> ShaggyFurEffect::GetEffectState(VcEffectId effect_id) {
return static_cast<int>(FurShagginess::kBuzzcut);
}
void ShaggyFurEffect::OnEffectControlActivated(VcEffectId effect_id,
std::optional<int> state) {
DCHECK(state.has_value());
DCHECK(state.value() >= 0 &&
state.value() < static_cast<int>(FurShagginess::kMaxNumValues));
++num_activations_for_testing_[state.value()];
}
int ShaggyFurEffect::GetNumActivationsForTesting(int state_value) {
CHECK(state_value >= 0 &&
state_value < static_cast<int>(FurShagginess::kMaxNumValues));
return num_activations_for_testing_[state_value];
}
void ShaggyFurEffect::AddStateToEffect(VcHostedEffect* effect,
int state_value,
std::u16string label_text) {
DCHECK(effect);
effect->AddState(std::make_unique<VcEffectState>(
&ash::kPrivacyIndicatorsCameraIcon,
label_text,
IDS_PRIVACY_INDICATORS_STATUS_CAMERA,
base::BindRepeating(&ShaggyFurEffect::OnEffectControlActivated,
weak_factory_.GetWeakPtr(),
VcEffectId::kTestEffect,
state_value),
state_value));
}
SuperCutnessEffect::SuperCutnessEffect() {
std::unique_ptr<VcHostedEffect> effect = std::make_unique<VcHostedEffect>(
VcEffectType::kSetValue,
base::BindRepeating(&SuperCutnessEffect::GetEffectState,
base::Unretained(this),
VcEffectId::kTestEffect),
VcEffectId::kTestEffect);
effect->set_label_text(u"Super Cuteness");
AddStateToEffect(effect.get(),
static_cast<int>(HowCute::kUglyDog),
u"Ugly Dog");
AddStateToEffect(effect.get(),
static_cast<int>(HowCute::kTeddyBear),
u"Teddy Bear");
AddStateToEffect(effect.get(),
static_cast<int>(HowCute::kZara),
u"Zara");
AddEffect(std::move(effect));
for (int i = 0; i < static_cast<int>(HowCute::kMaxNumValues); ++i) {
num_activations_for_testing_.push_back(0);
}
}
SuperCutnessEffect::~SuperCutnessEffect() = default;
std::optional<int> SuperCutnessEffect::GetEffectState(VcEffectId effect_id) {
if (has_invalid_effect_state_for_testing_) {
return std::nullopt;
}
return static_cast<int>(HowCute::kTeddyBear);
}
void SuperCutnessEffect::OnEffectControlActivated(VcEffectId effect_id,
std::optional<int> state) {
DCHECK(state.has_value());
DCHECK(state.value() >= 0 &&
state.value() < static_cast<int>(HowCute::kMaxNumValues));
++num_activations_for_testing_[state.value()];
}
int SuperCutnessEffect::GetNumActivationsForTesting(int state) {
DCHECK(state >= 0 && state < static_cast<int>(HowCute::kMaxNumValues));
return num_activations_for_testing_[state];
}
void SuperCutnessEffect::AddStateToEffect(VcHostedEffect* effect,
int state_value,
std::u16string label_text) {
DCHECK(effect);
effect->AddState(std::make_unique<VcEffectState>(
&ash::kPrivacyIndicatorsCameraIcon,
label_text,
IDS_PRIVACY_INDICATORS_STATUS_CAMERA,
base::BindRepeating(&SuperCutnessEffect::OnEffectControlActivated,
weak_factory_.GetWeakPtr(),
VcEffectId::kTestEffect,
state_value),
state_value));
}
EffectRepository::EffectRepository(
ash::FakeVideoConferenceTrayController* controller)
: controller_(controller),
cat_ears_(std::make_unique<CatEarsEffect>()),
dog_fur_(std::make_unique<DogFurEffect>()),
spaceship_(std::make_unique<SpaceshipEffect>()),
office_bunny_(std::make_unique<OfficeBunnyEffect>()),
calm_forest_(std::make_unique<CalmForestEffect>()),
stylish_kitchen_(std::make_unique<StylishKitchenEffect>()),
long_text_label_effect_(
std::make_unique<FakeLongTextLabelToggleEffect>()),
shaggy_fur_(std::make_unique<ShaggyFurEffect>()),
super_cuteness_(std::make_unique<SuperCutnessEffect>()) {
DCHECK(controller_);
if (features::IsVcControlsUiFakeEffectsEnabled()) {
controller_->GetEffectsManager().RegisterDelegate(cat_ears_.get());
controller_->GetEffectsManager().RegisterDelegate(dog_fur_.get());
controller_->GetEffectsManager().RegisterDelegate(spaceship_.get());
controller_->GetEffectsManager().RegisterDelegate(office_bunny_.get());
controller_->GetEffectsManager().RegisterDelegate(calm_forest_.get());
controller_->GetEffectsManager().RegisterDelegate(stylish_kitchen_.get());
controller_->GetEffectsManager().RegisterDelegate(
long_text_label_effect_.get());
controller_->GetEffectsManager().RegisterDelegate(shaggy_fur_.get());
controller_->GetEffectsManager().RegisterDelegate(super_cuteness_.get());
}
}
EffectRepository::~EffectRepository() {
if (features::IsVcControlsUiFakeEffectsEnabled()) {
controller_->GetEffectsManager().UnregisterDelegate(cat_ears_.get());
cat_ears_.reset();
controller_->GetEffectsManager().UnregisterDelegate(dog_fur_.get());
dog_fur_.reset();
controller_->GetEffectsManager().UnregisterDelegate(spaceship_.get());
spaceship_.reset();
controller_->GetEffectsManager().UnregisterDelegate(office_bunny_.get());
office_bunny_.reset();
controller_->GetEffectsManager().UnregisterDelegate(calm_forest_.get());
calm_forest_.reset();
controller_->GetEffectsManager().UnregisterDelegate(stylish_kitchen_.get());
stylish_kitchen_.reset();
controller_->GetEffectsManager().UnregisterDelegate(
long_text_label_effect_.get());
long_text_label_effect_.reset();
controller_->GetEffectsManager().UnregisterDelegate(shaggy_fur_.get());
shaggy_fur_.reset();
controller_->GetEffectsManager().UnregisterDelegate(super_cuteness_.get());
super_cuteness_.reset();
}
}
}