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