chromium/ash/public/cpp/system_notification_builder.cc

// 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/public/cpp/system_notification_builder.h"

#include <memory>
#include <string>
#include <utility>

#include "ash/public/cpp/notification_utils.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/vector_icon_types.h"
#include "ui/message_center/public/cpp/notification.h"
#include "ui/message_center/public/cpp/notification_delegate.h"

namespace ash {

SystemNotificationBuilder::SystemNotificationBuilder() = default;
SystemNotificationBuilder::SystemNotificationBuilder(
    SystemNotificationBuilder&&) = default;
SystemNotificationBuilder& SystemNotificationBuilder::operator=(
    SystemNotificationBuilder&&) = default;
SystemNotificationBuilder::~SystemNotificationBuilder() = default;

SystemNotificationBuilder& SystemNotificationBuilder::SetType(
    message_center::NotificationType type) {
  type_ = type;
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetId(
    const std::string& id) {
  id_ = id;
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetTitle(
    const std::u16string& title) {
  title_ = title;
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetTitleId(
    const int title_id) {
  SetTitle(l10n_util::GetStringUTF16(title_id));
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetTitleWithArgs(
    const int title_id,
    const std::vector<std::u16string>& args) {
  SetTitle(l10n_util::GetStringFUTF16(title_id, args, /*offsets=*/nullptr));
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetMessage(
    const std::u16string& message) {
  message_ = message;
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetMessageId(
    const int message_id) {
  SetMessage(l10n_util::GetStringUTF16(message_id));
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetMessageWithArgs(
    const int message_id,
    const std::vector<std::u16string>& args) {
  SetMessage(l10n_util::GetStringFUTF16(message_id, args, /*offsets=*/nullptr));
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetDisplaySource(
    const std::u16string& display_source) {
  display_source_ = display_source;
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetOriginUrl(
    const GURL& origin_url) {
  origin_url_ = origin_url;
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetNotifierId(
    const message_center::NotifierId& notifier_id) {
  notifier_id_ = notifier_id;
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetCatalogName(
    const NotificationCatalogName catalog_name) {
  catalog_name_ = catalog_name;
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetDelegate(
    scoped_refptr<message_center::NotificationDelegate> delegate) {
  delegate_ = std::move(delegate);
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetSmallImage(
    const gfx::VectorIcon& small_image) {
  small_image_ = &small_image;
  return *this;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetOptionalFields(
    const message_center::RichNotificationData& optional_fields) {
  optional_fields_ = optional_fields;
  return *this;
}

const message_center::RichNotificationData&
SystemNotificationBuilder::GetOptionalFields() {
  return optional_fields_;
}

SystemNotificationBuilder& SystemNotificationBuilder::SetWarningLevel(
    message_center::SystemNotificationWarningLevel warning_level) {
  warning_level_ = warning_level;
  return *this;
}

message_center::Notification SystemNotificationBuilder::Build(
    bool keep_timestamp) {
  DCHECK(!id_.empty());
  const message_center::NotifierId notifier_id = GetNotifierId();
  DCHECK(notifier_id.type == message_center::NotifierType::SYSTEM_COMPONENT);
  if (!keep_timestamp) {
    optional_fields_.timestamp = base::Time::Now();
  }
  return CreateSystemNotification(type_, id_, title_, message_, display_source_,
                                  origin_url_, notifier_id, optional_fields_,
                                  delegate_, *small_image_, warning_level_);
}

std::unique_ptr<message_center::Notification>
SystemNotificationBuilder::BuildPtr(bool keep_timestamp) {
  return std::make_unique<message_center::Notification>(Build(keep_timestamp));
}

message_center::NotifierId SystemNotificationBuilder::GetNotifierId() const {
  // value_or doesn't work here as it eagerly constructs the potential
  // replacement value and the default `catalog_name_` is set to invalid
  // resulting in a failed DCHECK. This could be solved with the monadic
  // operations for optional but they won't be added until C++23.
  if (notifier_id_.has_value())
    return notifier_id_.value();

  return message_center::NotifierId(
      message_center::NotifierType::SYSTEM_COMPONENT, id_, catalog_name_);
}

}  // namespace ash