// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/system/camera/autozoom_feature_pod_controller.h"
#include "ash/constants/quick_settings_catalogs.h"
#include "ash/resources/vector_icons/vector_icons.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/system/camera/autozoom_controller_impl.h"
#include "ash/system/unified/feature_tile.h"
#include "ash/system/unified/quick_settings_metrics_util.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/views/accessibility/view_accessibility.h"
namespace ash {
namespace {
bool IsButtonVisible() {
return Shell::Get()->autozoom_controller()->IsAutozoomControlEnabled() &&
Shell::Get()->session_controller()->ShouldEnableSettings();
}
} // namespace
AutozoomFeaturePodController::AutozoomFeaturePodController() {
Shell::Get()->autozoom_controller()->AddObserver(this);
}
AutozoomFeaturePodController::~AutozoomFeaturePodController() {
Shell::Get()->autozoom_controller()->RemoveObserver(this);
}
std::unique_ptr<FeatureTile> AutozoomFeaturePodController::CreateTile(
bool compact) {
DCHECK(!tile_);
auto tile = std::make_unique<FeatureTile>(
base::BindRepeating(&AutozoomFeaturePodController::OnIconPressed,
weak_factory_.GetWeakPtr()));
tile_ = tile.get();
tile_->SetVectorIcon(kUnifiedMenuAutozoomIcon);
tile_->SetLabel(
l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_AUTOZOOM_BUTTON_LABEL));
auto description = l10n_util::GetStringUTF16(
IDS_ASH_STATUS_TRAY_AUTOZOOM_TOGGLE_ACCESSIBILITY_DESCRIPTION);
tile_->GetViewAccessibility().SetDescription(description);
// `UpdateButton` will update visibility.
tile_->SetVisible(false);
UpdateButton(Shell::Get()->autozoom_controller()->GetState());
return tile;
}
QsFeatureCatalogName AutozoomFeaturePodController::GetCatalogName() {
return QsFeatureCatalogName::kAutozoom;
}
void AutozoomFeaturePodController::OnIconPressed() {
TrackToggleUMA(
/*target_toggle_state=*/Shell::Get()->autozoom_controller()->GetState() !=
cros::mojom::CameraAutoFramingState::ON_SINGLE);
Shell::Get()->autozoom_controller()->Toggle();
}
void AutozoomFeaturePodController::UpdateTileVisibility() {
if (!tile_) {
return;
}
const bool visible = IsButtonVisible();
if (!tile_->GetVisible() && visible) {
TrackVisibilityUMA();
}
tile_->SetVisible(visible);
}
void AutozoomFeaturePodController::OnAutozoomStateChanged(
cros::mojom::CameraAutoFramingState state) {
UpdateButton(state);
}
void AutozoomFeaturePodController::OnAutozoomControlEnabledChanged(
bool enabled) {
UpdateTileVisibility();
}
void AutozoomFeaturePodController::UpdateButton(
cros::mojom::CameraAutoFramingState state) {
if (!tile_) {
return;
}
tile_->SetToggled(state != cros::mojom::CameraAutoFramingState::OFF);
UpdateTileVisibility();
std::u16string tooltip_state;
std::u16string button_label;
switch (state) {
case cros::mojom::CameraAutoFramingState::OFF:
button_label =
l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_AUTOZOOM_OFF_STATE);
tooltip_state = l10n_util::GetStringUTF16(
IDS_ASH_STATUS_TRAY_AUTOZOOM_OFF_STATE_TOOLTIP);
break;
case cros::mojom::CameraAutoFramingState::ON_SINGLE:
case cros::mojom::CameraAutoFramingState::ON_MULTI:
button_label =
l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_AUTOZOOM_ON_STATE);
tooltip_state = l10n_util::GetStringUTF16(
IDS_ASH_STATUS_TRAY_AUTOZOOM_ON_STATE_TOOLTIP);
break;
}
tile_->SetSubLabel(button_label);
tile_->SetTooltipText(l10n_util::GetStringFUTF16(
IDS_ASH_STATUS_TRAY_AUTOZOOM_TOGGLE_TOOLTIP, tooltip_state));
}
} // namespace ash