// Copyright 2021 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/projector/projector_ui_controller.h"
#include "ash/accessibility/caption_bubble_context_ash.h"
#include "ash/annotator/annotator_controller.h"
#include "ash/constants/ash_features.h"
#include "ash/constants/notifier_catalogs.h"
#include "ash/projector/projector_controller_impl.h"
#include "ash/projector/projector_metrics.h"
#include "ash/public/cpp/notification_utils.h"
#include "ash/public/cpp/system/toast_data.h"
#include "ash/public/cpp/window_properties.h"
#include "ash/resources/vector_icons/vector_icons.h"
#include "ash/shell.h"
#include "ash/system/toast/toast_manager_impl.h"
#include "base/functional/callback_helpers.h"
#include "components/live_caption/views/caption_bubble.h"
#include "components/live_caption/views/caption_bubble_model.h"
#include "ui/aura/window.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/vector_icon_types.h"
#include "ui/message_center/message_center.h"
#include "ui/message_center/public/cpp/notification.h"
#include "ui/message_center/public/cpp/notification_delegate.h"
#include "ui/message_center/public/cpp/notifier_id.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
#include "url/gurl.h"
namespace ash {
namespace {
// A unique id to identify system notifications coming from this file.
constexpr char kProjectorNotifierId[] = "ash.projector_ui_controller";
// A unique id for system notifications reporting a generic failure.
constexpr char kProjectorErrorNotificationId[] = "projector_error_notification";
// A unique id for system notifications reporting a save failure.
constexpr char kProjectorSaveErrorNotificationId[] =
"projector_save_error_notification";
// Shows a Projector-related notification to the user with the given parameters.
void ShowNotification(
const std::string& notification_id,
int title_id,
int message_id,
message_center::SystemNotificationWarningLevel warning_level =
message_center::SystemNotificationWarningLevel::NORMAL,
const message_center::RichNotificationData& optional_fields = {},
scoped_refptr<message_center::NotificationDelegate> delegate = nullptr,
const gfx::VectorIcon& notification_icon = kPaletteTrayIconProjectorIcon) {
std::unique_ptr<message_center::Notification> notification =
CreateSystemNotificationPtr(
message_center::NOTIFICATION_TYPE_SIMPLE, notification_id,
l10n_util::GetStringUTF16(title_id),
l10n_util::GetStringUTF16(message_id),
l10n_util::GetStringUTF16(IDS_ASH_PROJECTOR_DISPLAY_SOURCE), GURL(),
message_center::NotifierId(
message_center::NotifierType::SYSTEM_COMPONENT,
kProjectorNotifierId, NotificationCatalogName::kProjector),
optional_fields, delegate, notification_icon, warning_level);
// Remove the previous notification before showing the new one if there are
// any.
auto* message_center = message_center::MessageCenter::Get();
message_center->RemoveNotification(notification_id,
/*by_user=*/false);
message_center->AddNotification(std::move(notification));
}
} // namespace
// static
void ProjectorUiController::ShowFailureNotification(int message_id,
int title_id) {
RecordCreationFlowError(message_id);
ShowNotification(
kProjectorErrorNotificationId, title_id, message_id,
message_center::SystemNotificationWarningLevel::CRITICAL_WARNING);
}
// static
void ProjectorUiController::ShowSaveFailureNotification() {
RecordCreationFlowError(IDS_ASH_PROJECTOR_SAVE_FAILURE_TEXT);
ShowNotification(
kProjectorSaveErrorNotificationId, IDS_ASH_PROJECTOR_SAVE_FAILURE_TITLE,
IDS_ASH_PROJECTOR_SAVE_FAILURE_TEXT,
message_center::SystemNotificationWarningLevel::CRITICAL_WARNING);
}
ProjectorUiController::ProjectorUiController() = default;
ProjectorUiController::~ProjectorUiController() = default;
} // namespace ash