Home | History | Annotate | Download | only in message_center
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/message_center/notification.h"
      6 
      7 #include "base/logging.h"
      8 #include "ui/message_center/notification_delegate.h"
      9 #include "ui/message_center/notification_types.h"
     10 
     11 namespace {
     12 unsigned g_next_serial_number_ = 0;
     13 }
     14 
     15 namespace message_center {
     16 
     17 NotificationItem::NotificationItem(const base::string16& title,
     18                                    const base::string16& message)
     19  : title(title),
     20    message(message) {
     21 }
     22 
     23 ButtonInfo::ButtonInfo(const base::string16& title)
     24  : title(title) {
     25 }
     26 
     27 RichNotificationData::RichNotificationData()
     28     : priority(DEFAULT_PRIORITY),
     29       never_timeout(false),
     30       timestamp(base::Time::Now()),
     31       progress(0),
     32       should_make_spoken_feedback_for_popup_updates(true),
     33       clickable(true) {}
     34 
     35 RichNotificationData::RichNotificationData(const RichNotificationData& other)
     36     : priority(other.priority),
     37       never_timeout(other.never_timeout),
     38       timestamp(other.timestamp),
     39       context_message(other.context_message),
     40       image(other.image),
     41       small_image(other.small_image),
     42       items(other.items),
     43       progress(other.progress),
     44       buttons(other.buttons),
     45       should_make_spoken_feedback_for_popup_updates(
     46           other.should_make_spoken_feedback_for_popup_updates),
     47       clickable(other.clickable) {}
     48 
     49 RichNotificationData::~RichNotificationData() {}
     50 
     51 Notification::Notification(NotificationType type,
     52                            const std::string& id,
     53                            const base::string16& title,
     54                            const base::string16& message,
     55                            const gfx::Image& icon,
     56                            const base::string16& display_source,
     57                            const NotifierId& notifier_id,
     58                            const RichNotificationData& optional_fields,
     59                            NotificationDelegate* delegate)
     60     : type_(type),
     61       id_(id),
     62       title_(title),
     63       message_(message),
     64       icon_(icon),
     65       display_source_(display_source),
     66       notifier_id_(notifier_id),
     67       serial_number_(g_next_serial_number_++),
     68       optional_fields_(optional_fields),
     69       shown_as_popup_(false),
     70       is_read_(false),
     71       delegate_(delegate) {}
     72 
     73 Notification::Notification(const Notification& other)
     74     : type_(other.type_),
     75       id_(other.id_),
     76       title_(other.title_),
     77       message_(other.message_),
     78       icon_(other.icon_),
     79       display_source_(other.display_source_),
     80       notifier_id_(other.notifier_id_),
     81       serial_number_(other.serial_number_),
     82       optional_fields_(other.optional_fields_),
     83       shown_as_popup_(other.shown_as_popup_),
     84       is_read_(other.is_read_),
     85       delegate_(other.delegate_) {}
     86 
     87 Notification& Notification::operator=(const Notification& other) {
     88   type_ = other.type_;
     89   id_ = other.id_;
     90   title_ = other.title_;
     91   message_ = other.message_;
     92   icon_ = other.icon_;
     93   display_source_ = other.display_source_;
     94   notifier_id_ = other.notifier_id_;
     95   serial_number_ = other.serial_number_;
     96   optional_fields_ = other.optional_fields_;
     97   shown_as_popup_ = other.shown_as_popup_;
     98   is_read_ = other.is_read_;
     99   delegate_ = other.delegate_;
    100 
    101   return *this;
    102 }
    103 
    104 Notification::~Notification() {}
    105 
    106 bool Notification::IsRead() const {
    107   return is_read_ || optional_fields_.priority == MIN_PRIORITY;
    108 }
    109 
    110 void Notification::CopyState(Notification* base) {
    111   shown_as_popup_ = base->shown_as_popup();
    112   is_read_ = base->is_read_;
    113   if (!delegate_.get())
    114     delegate_ = base->delegate();
    115   optional_fields_.never_timeout = base->never_timeout();
    116 }
    117 
    118 void Notification::SetButtonIcon(size_t index, const gfx::Image& icon) {
    119   if (index >= optional_fields_.buttons.size())
    120     return;
    121   optional_fields_.buttons[index].icon = icon;
    122 }
    123 
    124 void Notification::SetSystemPriority() {
    125   optional_fields_.priority = SYSTEM_PRIORITY;
    126   optional_fields_.never_timeout = true;
    127 }
    128 
    129 // static
    130 scoped_ptr<Notification> Notification::CreateSystemNotification(
    131     const std::string& notification_id,
    132     const base::string16& title,
    133     const base::string16& message,
    134     const gfx::Image& icon,
    135     const std::string& system_component_id,
    136     const base::Closure& click_callback) {
    137   scoped_ptr<Notification> notification(
    138       new Notification(
    139           NOTIFICATION_TYPE_SIMPLE,
    140           notification_id,
    141           title,
    142           message,
    143           icon,
    144           base::string16()  /* display_source */,
    145           NotifierId(NotifierId::SYSTEM_COMPONENT, system_component_id),
    146           RichNotificationData(),
    147           new HandleNotificationClickedDelegate(click_callback)));
    148   notification->SetSystemPriority();
    149   return notification.Pass();
    150 }
    151 
    152 }  // namespace message_center
    153