// Copyright 2018 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/unified/quiet_mode_feature_pod_controller.h"
#include "ash/constants/ash_features.h"
#include "ash/constants/quick_settings_catalogs.h"
#include "ash/public/cpp/ash_view_ids.h"
#include "ash/public/cpp/notifier_metadata.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/unified/feature_tile.h"
#include "ash/system/unified/quick_settings_metrics_util.h"
#include "ash/system/unified/unified_system_tray_controller.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/message_center/message_center.h"
using message_center::MessageCenter;
namespace ash {
QuietModeFeaturePodController::QuietModeFeaturePodController() {
MessageCenter::Get()->AddObserver(this);
}
QuietModeFeaturePodController::~QuietModeFeaturePodController() {
MessageCenter::Get()->RemoveObserver(this);
}
// static
bool QuietModeFeaturePodController::CalculateButtonVisibility() {
auto* session_controller = Shell::Get()->session_controller();
return session_controller->ShouldShowNotificationTray() &&
!session_controller->IsScreenLocked();
}
std::unique_ptr<FeatureTile> QuietModeFeaturePodController::CreateTile(
bool compact) {
auto tile = std::make_unique<FeatureTile>(
base::BindRepeating(&FeaturePodControllerBase::OnIconPressed,
weak_ptr_factory_.GetWeakPtr()),
/*is_togglable=*/true,
compact ? FeatureTile::TileType::kCompact
: FeatureTile::TileType::kPrimary);
tile_ = tile.get();
const bool target_visibility = CalculateButtonVisibility();
tile_->SetVisible(target_visibility);
if (target_visibility) {
TrackVisibilityUMA();
}
// TODO(b/263416361): Update vector icon to its newer version.
tile_->SetVectorIcon(kUnifiedMenuDoNotDisturbIcon);
tile_->SetLabel(
l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DO_NOT_DISTURB));
if (!compact) {
tile_->SetSubLabelVisibility(false);
}
tile_->SetTooltipText(l10n_util::GetStringFUTF16(
IDS_ASH_STATUS_TRAY_NOTIFICATIONS_TOGGLE_TOOLTIP,
GetQuietModeStateTooltip()));
OnQuietModeChanged(MessageCenter::Get()->IsQuietMode());
return tile;
}
QsFeatureCatalogName QuietModeFeaturePodController::GetCatalogName() {
return QsFeatureCatalogName::kQuietMode;
}
void QuietModeFeaturePodController::OnIconPressed() {
MessageCenter* message_center = MessageCenter::Get();
bool is_quiet_mode = message_center->IsQuietMode();
TrackToggleUMA(/*target_toggle_state=*/!is_quiet_mode);
message_center->SetQuietMode(!is_quiet_mode);
if (message_center->IsQuietMode()) {
base::RecordAction(base::UserMetricsAction("StatusArea_QuietMode_Enabled"));
} else {
base::RecordAction(
base::UserMetricsAction("StatusArea_QuietMode_Disabled"));
}
}
void QuietModeFeaturePodController::OnLabelPressed() {
// App badging lives in OS Settings, so this detailed view is not required.
FeaturePodControllerBase::OnLabelPressed();
}
void QuietModeFeaturePodController::OnQuietModeChanged(bool in_quiet_mode) {
tile_->SetToggled(in_quiet_mode);
tile_->SetTooltipText(l10n_util::GetStringFUTF16(
IDS_ASH_STATUS_TRAY_NOTIFICATIONS_TOGGLE_TOOLTIP,
GetQuietModeStateTooltip()));
}
void QuietModeFeaturePodController::OnNotifiersUpdated(
const std::vector<NotifierMetadata>& notifiers) {
// TODO(b/307974199) remove this method with the `NotifierSettingsController`
// clean up.
}
std::u16string QuietModeFeaturePodController::GetQuietModeStateTooltip() {
return l10n_util::GetStringUTF16(
MessageCenter::Get()->IsQuietMode()
? IDS_ASH_STATUS_TRAY_NOTIFICATIONS_DO_NOT_DISTURB_ON_STATE
: IDS_ASH_STATUS_TRAY_NOTIFICATIONS_DO_NOT_DISTURB_OFF_STATE);
}
void QuietModeFeaturePodController::RecordDisabledNotifierCount(
int disabled_count) {
if (!last_disabled_count_.has_value()) {
last_disabled_count_ = disabled_count;
UMA_HISTOGRAM_COUNTS_100("ChromeOS.SystemTray.BlockedNotifiersOnOpen",
disabled_count);
return;
}
if (*last_disabled_count_ == disabled_count) {
return;
}
last_disabled_count_ = disabled_count;
UMA_HISTOGRAM_COUNTS_100("ChromeOS.SystemTray.BlockedNotifiersAfterUpdate",
disabled_count);
}
} // namespace ash