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_MESSAGE_CENTER_H_
6#define UI_MESSAGE_CENTER_MESSAGE_CENTER_H_
7
8#include <string>
9
10#include "base/memory/scoped_ptr.h"
11#include "ui/message_center/message_center_export.h"
12#include "ui/message_center/message_center_types.h"
13#include "ui/message_center/notification_list.h"
14
15namespace base {
16class DictionaryValue;
17}
18
19// Interface to manage the NotificationList. The client (e.g. Chrome) calls
20// [Add|Remove|Update]Notification to create and update notifications in the
21// list. It also sends those changes to its observers when a notification
22// is shown, closed, or clicked on.
23//
24// MessageCenter is agnostic of profiles; it uses the string returned by
25// message_center::Notification::id() to uniquely identify a notification. It is
26// the caller's responsibility to formulate the id so that 2 different
27// notification should have different ids. For example, if the caller supports
28// multiple profiles, then caller should encode both profile characteristics and
29// notification front end's notification id into a new id and set it into the
30// notification instance before passing that in. Consequently the id passed to
31// observers will be this unique id, which can be used with MessageCenter
32// interface but probably not higher level interfaces.
33
34namespace message_center {
35
36namespace test {
37class MessagePopupCollectionTest;
38}
39
40class MessageCenterObserver;
41class NotificationBlocker;
42class NotifierSettingsProvider;
43
44class MESSAGE_CENTER_EXPORT MessageCenter {
45 public:
46  // Creates the global message center object.
47  static void Initialize();
48
49  // Returns the global message center object. Returns NULL if Initialize is not
50  // called.
51  static MessageCenter* Get();
52
53  // Destroys the global message_center object.
54  static void Shutdown();
55
56  // Management of the observer list.
57  virtual void AddObserver(MessageCenterObserver* observer) = 0;
58  virtual void RemoveObserver(MessageCenterObserver* observer) = 0;
59
60  // Queries of current notification list status.
61  virtual size_t NotificationCount() const = 0;
62  virtual size_t UnreadNotificationCount() const = 0;
63  virtual bool HasPopupNotifications() const = 0;
64  virtual bool IsQuietMode() const = 0;
65  virtual bool HasClickedListener(const std::string& id) = 0;
66
67  // Find the notification with the corresponding id. Returns NULL if not found.
68  // The returned instance is owned by the message center.
69  virtual message_center::Notification* FindVisibleNotificationById(
70      const std::string& id) = 0;
71
72  // Gets all notifications to be shown to the user in the message center.  Note
73  // that queued changes due to the message center being open are not reflected
74  // in this list.
75  virtual const NotificationList::Notifications& GetVisibleNotifications() = 0;
76
77  // Gets all notifications being shown as popups.  This should not be affected
78  // by the change queue since notifications are not held up while the state is
79  // VISIBILITY_TRANSIENT or VISIBILITY_SETTINGS.
80  virtual NotificationList::PopupNotifications GetPopupNotifications() = 0;
81
82  // Management of NotificationBlockers.
83  virtual void AddNotificationBlocker(NotificationBlocker* blocker) = 0;
84  virtual void RemoveNotificationBlocker(NotificationBlocker* blocker) = 0;
85
86  // Basic operations of notification: add/remove/update.
87
88  // Adds a new notification.
89  virtual void AddNotification(scoped_ptr<Notification> notification) = 0;
90
91  // Updates an existing notification with id = old_id and set its id to new_id.
92  virtual void UpdateNotification(
93      const std::string& old_id,
94      scoped_ptr<Notification> new_notification) = 0;
95
96  // Removes an existing notification.
97  virtual void RemoveNotification(const std::string& id, bool by_user) = 0;
98  virtual void RemoveAllNotifications(bool by_user) = 0;
99  virtual void RemoveAllVisibleNotifications(bool by_user) = 0;
100
101  // Sets the icon image. Icon appears at the top-left of the notification.
102  virtual void SetNotificationIcon(const std::string& notification_id,
103                                   const gfx::Image& image) = 0;
104
105  // Sets the large image for the notifications of type == TYPE_IMAGE. Specified
106  // image will appear below of the notification.
107  virtual void SetNotificationImage(const std::string& notification_id,
108                                    const gfx::Image& image) = 0;
109
110  // Sets the image for the icon of the specific action button.
111  virtual void SetNotificationButtonIcon(const std::string& notification_id,
112                                         int button_index,
113                                         const gfx::Image& image) = 0;
114
115  // Operations happening especially from GUIs: click, disable, and settings.
116  // Searches through the notifications and disables any that match the
117  // extension id given.
118  virtual void DisableNotificationsByNotifier(
119      const NotifierId& notifier_id) = 0;
120
121  // This should be called by UI classes when a notification is clicked to
122  // trigger the notification's delegate callback and also update the message
123  // center observers.
124  virtual void ClickOnNotification(const std::string& id) = 0;
125
126  // This should be called by UI classes when a notification button is clicked
127  // to trigger the notification's delegate callback and also update the message
128  // center observers.
129  virtual void ClickOnNotificationButton(const std::string& id,
130                                         int button_index) = 0;
131
132  // This should be called by UI classes after a visible notification popup
133  // closes, indicating that the notification has been shown to the user.
134  // |mark_notification_as_read|, if false, will unset the read bit on a
135  // notification, increasing the unread count of the center.
136  virtual void MarkSinglePopupAsShown(const std::string& id,
137                                      bool mark_notification_as_read) = 0;
138
139  // This should be called by UI classes when a notification is first displayed
140  // to the user, in order to decrement the unread_count for the tray, and to
141  // notify observers that the notification is visible.
142  virtual void DisplayedNotification(
143      const std::string& id,
144      const DisplaySource source) = 0;
145
146  // Setter/getter of notifier settings provider. This will be a weak reference.
147  // This should be set at the initialization process. The getter may return
148  // NULL for tests.
149  virtual void SetNotifierSettingsProvider(
150      NotifierSettingsProvider* provider) = 0;
151  virtual NotifierSettingsProvider* GetNotifierSettingsProvider() = 0;
152
153  // This can be called to change the quiet mode state (without a timeout).
154  virtual void SetQuietMode(bool in_quiet_mode) = 0;
155
156  // Temporarily enables quiet mode for |expires_in| time.
157  virtual void EnterQuietModeWithExpire(const base::TimeDelta& expires_in) = 0;
158
159  // Informs the notification list whether the message center is visible.
160  // This affects whether or not a message has been "read".
161  virtual void SetVisibility(Visibility visible) = 0;
162
163  // Allows querying the visibility of the center.
164  virtual bool IsMessageCenterVisible() const = 0;
165
166  // UI classes should call this when there is cause to leave popups visible for
167  // longer than the default (for example, when the mouse hovers over a popup).
168  virtual void PausePopupTimers() = 0;
169
170  // UI classes should call this when the popup timers should restart (for
171  // example, after the mouse leaves the popup.)
172  virtual void RestartPopupTimers() = 0;
173
174 protected:
175  friend class TrayViewControllerTest;
176  friend class test::MessagePopupCollectionTest;
177  virtual void DisableTimersForTest() = 0;
178
179  MessageCenter();
180  virtual ~MessageCenter();
181
182 private:
183  DISALLOW_COPY_AND_ASSIGN(MessageCenter);
184};
185
186}  // namespace message_center
187
188#endif  // UI_MESSAGE_CENTER_MESSAGE_CENTER_H_
189