1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/enterprise/reporting/extension_request/extension_request_notification.h"
#include <array>
#include <memory>
#include "chrome/browser/notifications/notification_display_service.h"
#include "chrome/browser/notifications/notification_display_service_factory.h"
#include "chrome/browser/notifications/notification_handler.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/browser/ui/browser_navigator_params.h"
#include "chrome/grit/generated_resources.h"
#include "components/vector_icons/vector_icons.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/color/color_id.h"
#include "ui/message_center/public/cpp/message_center_constants.h"
#include "ui/message_center/public/cpp/notification.h"
#include "ui/message_center/public/cpp/notification_delegate.h"
#include "ui/native_theme/native_theme.h"
namespace enterprise_reporting {
namespace {
constexpr char kApprovedNotificationId[] = "extension_approved_notificaiton";
constexpr char kRejectedNotificationId[] = "extension_rejected_notificaiton";
constexpr char kInstalledNotificationId[] = "extension_installed_notificaiton";
constexpr char kExtensionRequestNotifierId[] =
"chrome_browser_cloud_management_extension_request";
constexpr char kChromeWebstoreUrl[] =
"https://chrome.google.com/webstore/detail/";
// The elements order of array below must match the order in enum
// ExtensionRequestNotification::NotifyType.
constexpr auto kNotificationIds = std::to_array<const char*>({
kApprovedNotificationId,
kRejectedNotificationId,
kInstalledNotificationId,
});
constexpr auto kNotificationTitles = std::to_array<int>(
{IDS_ENTERPRISE_EXTENSION_REQUEST_APPROVED_TITLE,
IDS_ENTERPRISE_EXTENSION_REQUEST_REJECTED_TITLE,
IDS_ENTERPRISE_EXTENSION_REQUEST_FORCE_INSTALLED_TITLE});
constexpr auto kNotificationBodies =
std::to_array<int>({IDS_ENTERPRISE_EXTENSION_REQUEST_CLICK_TO_INSTALL,
IDS_ENTERPRISE_EXTENSION_REQUEST_CLICK_TO_VIEW,
IDS_ENTERPRISE_EXTENSION_REQUEST_CLICK_TO_VIEW});
} // namespace
ExtensionRequestNotification::ExtensionRequestNotification(
Profile* profile,
const NotifyType notify_type,
const ExtensionIds& extension_ids)
: profile_(profile),
notify_type_(notify_type),
extension_ids_(extension_ids) {}
ExtensionRequestNotification::~ExtensionRequestNotification() = default;
void ExtensionRequestNotification::Show(NotificationCloseCallback callback) {
CHECK(!extension_ids_.empty());
callback_ = std::move(callback);
const std::u16string title = l10n_util::GetPluralStringFUTF16(
kNotificationTitles[notify_type_], extension_ids_.size());
const std::u16string body = l10n_util::GetPluralStringFUTF16(
kNotificationBodies[notify_type_], extension_ids_.size());
GURL original_url("https://chrome.google.com/webstore");
auto icon = ui::ImageModel::FromVectorIcon(vector_icons::kBusinessIcon,
ui::kColorIcon,
message_center::kSmallImageSize);
notification_ = std::make_unique<message_center::Notification>(
message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationIds[notify_type_],
title, body, icon, /*source=*/std::u16string(), original_url,
message_center::NotifierId(message_center::NotifierType::APPLICATION,
kExtensionRequestNotifierId),
message_center::RichNotificationData(),
base::MakeRefCounted<message_center::ThunkNotificationDelegate>(
weak_factory_.GetWeakPtr()));
notification_->set_never_timeout(true);
NotificationDisplayServiceFactory::GetForProfile(profile_)->Display(
NotificationHandler::Type::TRANSIENT, *notification_, nullptr);
}
void ExtensionRequestNotification::CloseNotification() {
NotificationDisplayServiceFactory::GetForProfile(profile_)->Close(
NotificationHandler::Type::TRANSIENT, kNotificationIds[notify_type_]);
notification_.reset();
}
void ExtensionRequestNotification::Click(
const std::optional<int>& button_index,
const std::optional<std::u16string>& reply) {
for (const std::string& extension_id : extension_ids_) {
NavigateParams params(profile_, GURL(kChromeWebstoreUrl + extension_id),
ui::PAGE_TRANSITION_LINK);
params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
params.window_action = NavigateParams::SHOW_WINDOW;
Navigate(¶ms);
}
if (callback_)
std::move(callback_).Run(true);
CloseNotification();
}
void ExtensionRequestNotification::Close(bool by_user) {
if (callback_) {
std::move(callback_).Run(by_user);
}
}
} // namespace enterprise_reporting
|