Home | History | Annotate | Download | only in message_center
      1 // Copyright (c) 2012 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 #ifndef UI_MESSAGE_CENTER_NOTIFICATION_LIST_H_
      6 #define UI_MESSAGE_CENTER_NOTIFICATION_LIST_H_
      7 
      8 #include <list>
      9 #include <set>
     10 #include <string>
     11 
     12 #include "base/strings/string16.h"
     13 #include "base/time/time.h"
     14 #include "base/timer/timer.h"
     15 #include "ui/gfx/image/image.h"
     16 #include "ui/gfx/native_widget_types.h"
     17 #include "ui/message_center/message_center_export.h"
     18 #include "ui/message_center/notification.h"
     19 #include "ui/message_center/notification_blocker.h"
     20 #include "ui/message_center/notification_types.h"
     21 
     22 namespace base {
     23 class DictionaryValue;
     24 }
     25 
     26 namespace message_center {
     27 
     28 class NotificationDelegate;
     29 
     30 namespace test {
     31 class NotificationListTest;
     32 }
     33 
     34 // Comparers used to auto-sort the lists of Notifications.
     35 struct MESSAGE_CENTER_EXPORT ComparePriorityTimestampSerial {
     36   bool operator()(Notification* n1, Notification* n2);
     37 };
     38 
     39 struct CompareTimestampSerial {
     40   bool operator()(Notification* n1, Notification* n2);
     41 };
     42 
     43 // A helper class to manage the list of notifications.
     44 class MESSAGE_CENTER_EXPORT NotificationList {
     45  public:
     46   // Auto-sorted set. Matches the order in which Notifications are shown in
     47   // Notification Center.
     48   typedef std::set<Notification*, ComparePriorityTimestampSerial> Notifications;
     49 
     50   // Auto-sorted set used to return the Notifications to be shown as popup
     51   // toasts.
     52   typedef std::set<Notification*, CompareTimestampSerial> PopupNotifications;
     53 
     54   explicit NotificationList();
     55   virtual ~NotificationList();
     56 
     57   // Affects whether or not a message has been "read". Collects the set of
     58   // ids whose state have changed and set to |udpated_ids|. NULL if updated
     59   // ids don't matter.
     60   void SetMessageCenterVisible(bool visible,
     61                                std::set<std::string>* updated_ids);
     62 
     63   void AddNotification(scoped_ptr<Notification> notification);
     64 
     65   void UpdateNotificationMessage(const std::string& old_id,
     66                                  scoped_ptr<Notification> new_notification);
     67 
     68   void RemoveNotification(const std::string& id);
     69 
     70   Notifications GetNotificationsByNotifierId(const NotifierId& notifier_id);
     71 
     72   // Returns true if the notification exists and was updated.
     73   bool SetNotificationIcon(const std::string& notification_id,
     74                            const gfx::Image& image);
     75 
     76   // Returns true if the notification exists and was updated.
     77   bool SetNotificationImage(const std::string& notification_id,
     78                             const gfx::Image& image);
     79 
     80   // Returns true if the notification and button exist and were updated.
     81   bool SetNotificationButtonIcon(const std::string& notification_id,
     82                                  int button_index,
     83                                  const gfx::Image& image);
     84 
     85   // Returns true if |id| matches a notification in the list.
     86   bool HasNotification(const std::string& id);
     87 
     88   // Returns true if |id| matches a notification in the list and that
     89   // notification's type matches the given type.
     90   bool HasNotificationOfType(const std::string& id,
     91                              const NotificationType type);
     92 
     93   // Returns false if the first notification has been shown as a popup (which
     94   // means that all notifications have been shown).
     95   bool HasPopupNotifications(const NotificationBlockers& blockers);
     96 
     97   // Returns the recent notifications of the priority higher then LOW,
     98   // that have not been shown as a popup. kMaxVisiblePopupNotifications are
     99   // used to limit the number of notifications for the DEFAULT priority.
    100   // It also stores the list of notification ids which is blocked by |blockers|
    101   // to |blocked_ids|. |blocked_ids| can be NULL if the caller doesn't care
    102   // which notifications are blocked.
    103   PopupNotifications GetPopupNotifications(
    104       const NotificationBlockers& blockers,
    105       std::list<std::string>* blocked_ids);
    106 
    107   // Marks a specific popup item as shown. Set |mark_notification_as_read| to
    108   // true in case marking the notification as read too.
    109   void MarkSinglePopupAsShown(const std::string& id,
    110                               bool mark_notification_as_read);
    111 
    112   // Marks a specific popup item as displayed.
    113   void MarkSinglePopupAsDisplayed(const std::string& id);
    114 
    115   // Marks the specified notification as expanded in the notification center.
    116   void MarkNotificationAsExpanded(const std::string& id);
    117 
    118   NotificationDelegate* GetNotificationDelegate(const std::string& id);
    119 
    120   bool quiet_mode() const { return quiet_mode_; }
    121 
    122   // Sets the current quiet mode status to |quiet_mode|.
    123   void SetQuietMode(bool quiet_mode);
    124 
    125   // Sets the current quiet mode to true. The quiet mode will expire in the
    126   // specified time-delta from now.
    127   void EnterQuietModeWithExpire(const base::TimeDelta& expires_in);
    128 
    129   // Returns all visible notifications, in a (priority-timestamp) order.
    130   // Suitable for rendering notifications in a MessageCenter.
    131   Notifications GetVisibleNotifications(
    132       const NotificationBlockers& blockers) const;
    133   size_t NotificationCount(const NotificationBlockers& blockers) const;
    134   size_t UnreadCount(const NotificationBlockers& blockers) const;
    135 
    136   bool is_message_center_visible() const { return message_center_visible_; }
    137 
    138  private:
    139   friend class NotificationListTest;
    140   FRIEND_TEST_ALL_PREFIXES(NotificationListTest,
    141                            TestPushingShownNotification);
    142 
    143   // Iterates through the list and returns the first notification matching |id|.
    144   Notifications::iterator GetNotification(const std::string& id);
    145 
    146   void EraseNotification(Notifications::iterator iter);
    147 
    148   void PushNotification(scoped_ptr<Notification> notification);
    149 
    150   Notifications notifications_;
    151   bool message_center_visible_;
    152   bool quiet_mode_;
    153 
    154   DISALLOW_COPY_AND_ASSIGN(NotificationList);
    155 };
    156 
    157 }  // namespace message_center
    158 
    159 #endif // UI_MESSAGE_CENTER_NOTIFICATION_LIST_H_
    160