blob: c142ee9f6cefc2ccaf97c6b812f289cef65a03f0 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/permissions/permission_request_notification_android.h"
#include "base/strings/strcat.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "chrome/browser/notifications/notification_display_service_impl.h"
#include "chrome/browser/notifications/notification_handler.h"
#include "chrome/browser/permissions/permission_features.h"
#include "chrome/browser/permissions/permission_request.h"
#include "chrome/browser/permissions/permission_request_notification_handler.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_features.h"
#include "chrome/grit/generated_resources.h"
#include "components/vector_icons/vector_icons.h"
#include "content/public/browser/web_contents.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/message_center/public/cpp/message_center_constants.h"
#include "ui/message_center/public/cpp/notification.h"
#include "ui/native_theme/native_theme.h"
namespace {
const gfx::Image GetNotificationsSmallImage() {
// TODO(andypaicu): when the "notifications blocked" icon is submitted, use
// that icon instead of this one.
return gfx::Image(CreateVectorIcon(
vector_icons::kNotificationsIcon, message_center::kNotificationIconSize,
ui::NativeTheme::GetInstanceForWeb()->GetSystemColor(
ui::NativeTheme::kColorId_DefaultIconColor)));
}
constexpr char kNotificationIdPrefix[] = "notification_permission_request_";
} // namespace
PermissionRequestNotificationAndroid::~PermissionRequestNotificationAndroid() {
permission_request_notification_handler_->RemoveNotificationDelegate(
notification_->id());
notification_display_service_->Close(
NotificationHandler::Type::PERMISSION_REQUEST, notification_->id());
}
// static
std::unique_ptr<PermissionRequestNotificationAndroid>
PermissionRequestNotificationAndroid::Create(
content::WebContents* web_contents,
PermissionPrompt::Delegate* delegate) {
return base::WrapUnique(
new PermissionRequestNotificationAndroid(web_contents, delegate));
}
// static
bool PermissionRequestNotificationAndroid::ShouldShowAsNotification(
ContentSettingsType type) {
QuietNotificationsPromptConfig::UIFlavor ui_flavor =
QuietNotificationsPromptConfig::UIFlavorToUse();
return (ui_flavor ==
QuietNotificationsPromptConfig::UIFlavor::QUIET_NOTIFICATION ||
ui_flavor == QuietNotificationsPromptConfig::UIFlavor::
HEADS_UP_NOITIFCATION) &&
type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS;
}
// static
std::string PermissionRequestNotificationAndroid::NotificationIdForOrigin(
const std::string& origin) {
return kNotificationIdPrefix + origin;
}
void PermissionRequestNotificationAndroid::Close() {
delegate_->Closing();
}
void PermissionRequestNotificationAndroid::Click(int button_index) {
switch (button_index) {
// "Show for site" button.
case 0:
delegate_->Accept();
break;
default:
delegate_->Closing();
}
}
PermissionRequestNotificationAndroid::PermissionRequestNotificationAndroid(
content::WebContents* web_contents,
PermissionPrompt::Delegate* delegate)
: delegate_(delegate),
notification_display_service_(
NotificationDisplayServiceImpl::GetForProfile(
Profile::FromBrowserContext(web_contents->GetBrowserContext()))),
permission_request_notification_handler_(
static_cast<PermissionRequestNotificationHandler*>(
notification_display_service_->GetNotificationHandler(
NotificationHandler::Type::PERMISSION_REQUEST))) {
DCHECK(delegate_);
DCHECK(notification_display_service_);
DCHECK(permission_request_notification_handler_);
message_center::RichNotificationData data;
// TODO(andypaicu): Refactor this to make it content settings type agnostic.
data.buttons.push_back(message_center::ButtonInfo(l10n_util::GetStringUTF16(
IDS_NOTIFICATIONS_QUIET_PERMISSION_BUBBLE_ALLOW_BUTTON)));
data.small_image = GetNotificationsSmallImage();
CHECK(!delegate_->Requests().empty());
const PermissionRequest* permission_request = delegate_->Requests()[0];
notification_ = std::make_unique<message_center::Notification>(
message_center::NOTIFICATION_TYPE_SIMPLE,
NotificationIdForOrigin(permission_request->GetOrigin().spec()),
permission_request->GetQuietTitleText(),
permission_request->GetQuietMessageText(), data.small_image,
base::UTF8ToUTF16(permission_request->GetOrigin().host()),
permission_request->GetOrigin(),
message_center::NotifierId(permission_request->GetOrigin()), data,
nullptr);
permission_request_notification_handler_->AddNotificationDelegate(
notification_->id(), this);
notification_display_service_->Display(
NotificationHandler::Type::PERMISSION_REQUEST, *notification_,
nullptr /* metadata */);
}