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/gtest_prod_util.h" 13#include "ui/message_center/message_center_export.h" 14#include "ui/message_center/notification_blocker.h" 15#include "ui/message_center/notification_types.h" 16 17namespace base { 18class DictionaryValue; 19class TimeDelta; 20} 21 22namespace gfx { 23class Image; 24} 25 26namespace message_center { 27 28namespace test { 29class NotificationListTest; 30} 31 32class Notification; 33class NotificationDelegate; 34struct NotifierId; 35 36// Comparers used to auto-sort the lists of Notifications. 37struct MESSAGE_CENTER_EXPORT ComparePriorityTimestampSerial { 38 bool operator()(Notification* n1, Notification* n2); 39}; 40 41struct CompareTimestampSerial { 42 bool operator()(Notification* n1, Notification* n2); 43}; 44 45// A helper class to manage the list of notifications. 46class MESSAGE_CENTER_EXPORT NotificationList { 47 public: 48 // Auto-sorted set. Matches the order in which Notifications are shown in 49 // Notification Center. 50 typedef std::set<Notification*, ComparePriorityTimestampSerial> Notifications; 51 52 // Auto-sorted set used to return the Notifications to be shown as popup 53 // toasts. 54 typedef std::set<Notification*, CompareTimestampSerial> PopupNotifications; 55 56 explicit NotificationList(); 57 virtual ~NotificationList(); 58 59 // Affects whether or not a message has been "read". Collects the set of 60 // ids whose state have changed and set to |udpated_ids|. NULL if updated 61 // ids don't matter. 62 void SetMessageCenterVisible(bool visible, 63 std::set<std::string>* updated_ids); 64 65 void AddNotification(scoped_ptr<Notification> notification); 66 67 void UpdateNotificationMessage(const std::string& old_id, 68 scoped_ptr<Notification> new_notification); 69 70 void RemoveNotification(const std::string& id); 71 72 Notifications GetNotificationsByNotifierId(const NotifierId& notifier_id); 73 74 // Returns true if the notification exists and was updated. 75 bool SetNotificationIcon(const std::string& notification_id, 76 const gfx::Image& image); 77 78 // Returns true if the notification exists and was updated. 79 bool SetNotificationImage(const std::string& notification_id, 80 const gfx::Image& image); 81 82 // Returns true if the notification and button exist and were updated. 83 bool SetNotificationButtonIcon(const std::string& notification_id, 84 int button_index, 85 const gfx::Image& image); 86 87 // Returns true if |id| matches a notification in the list and that 88 // notification's type matches the given type. 89 bool HasNotificationOfType(const std::string& id, 90 const NotificationType type); 91 92 // Returns false if the first notification has been shown as a popup (which 93 // means that all notifications have been shown). 94 bool HasPopupNotifications(const NotificationBlockers& blockers); 95 96 // Returns the recent notifications of the priority higher then LOW, 97 // that have not been shown as a popup. kMaxVisiblePopupNotifications are 98 // used to limit the number of notifications for the DEFAULT priority. 99 // It also stores the list of notification ids which is blocked by |blockers| 100 // to |blocked_ids|. |blocked_ids| can be NULL if the caller doesn't care 101 // which notifications are blocked. 102 PopupNotifications GetPopupNotifications( 103 const NotificationBlockers& blockers, 104 std::list<std::string>* blocked_ids); 105 106 // Marks a specific popup item as shown. Set |mark_notification_as_read| to 107 // true in case marking the notification as read too. 108 void MarkSinglePopupAsShown(const std::string& id, 109 bool mark_notification_as_read); 110 111 // Marks a specific popup item as displayed. 112 void MarkSinglePopupAsDisplayed(const std::string& id); 113 114 NotificationDelegate* GetNotificationDelegate(const std::string& id); 115 116 bool quiet_mode() const { return quiet_mode_; } 117 118 // Sets the current quiet mode status to |quiet_mode|. 119 void SetQuietMode(bool quiet_mode); 120 121 // Sets the current quiet mode to true. The quiet mode will expire in the 122 // specified time-delta from now. 123 void EnterQuietModeWithExpire(const base::TimeDelta& expires_in); 124 125 // Returns the notification with the corresponding id. If not found, returns 126 // NULL. Notification instance is owned by this list. 127 Notification* GetNotificationById(const std::string& id); 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