message_center.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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 "base/observer_list.h"
12#include "ui/gfx/native_widget_types.h"
13#include "ui/message_center/message_center_export.h"
14#include "ui/message_center/notification_list.h"
15#include "ui/message_center/notification_types.h"
16
17class TrayViewControllerTest;
18
19namespace base {
20class DictionaryValue;
21}
22
23// Interface to manage the NotificationList. The client (e.g. Chrome) calls
24// [Add|Remove|Update]Notification to create and update notifications in the
25// list. It also sends those changes to its observers when a notification
26// is shown, closed, or clicked on.
27// It can also implement Delegate to ask platform-dependent features like
28// disabling extensions or opening settings.
29
30namespace message_center {
31
32class MessageCenterObserver;
33class NotificationList;
34class NotifierSettingsDelegate;
35class NotifierSettingsProvider;
36
37class MESSAGE_CENTER_EXPORT MessageCenter {
38 public:
39  // Creates the global message center object.
40  static void Initialize();
41
42  // Returns the global message center object. Initialize must be called first.
43  static MessageCenter* Get();
44
45  // Destroys the global message_center object.
46  static void Shutdown();
47
48  class MESSAGE_CENTER_EXPORT Delegate {
49   public:
50    virtual ~Delegate();
51
52    // Request to disable the extension associated with |notification_id|.
53    virtual void DisableExtension(const std::string& notification_id) = 0;
54
55    // Request to disable notifications from the source of |notification_id|.
56    virtual void DisableNotificationsFromSource(
57        const std::string& notification_id) = 0;
58
59    // Request to show the notification settings (|notification_id| is used
60    // to identify the requesting browser context).
61    virtual void ShowSettings(const std::string& notification_id) = 0;
62  };
63
64  // Called to set the delegate.  Generally called only once, except in tests.
65  // Changing the delegate does not affect notifications in its
66  // NotificationList.
67  virtual void SetDelegate(Delegate* delegate) = 0;
68
69  // Management of the observer list.
70  virtual void AddObserver(MessageCenterObserver* observer) = 0;
71  virtual void RemoveObserver(MessageCenterObserver* observer) = 0;
72
73  // Queries of current notification list status.
74  virtual size_t NotificationCount() const = 0;
75  virtual size_t UnreadNotificationCount() const = 0;
76  virtual bool HasPopupNotifications() const = 0;
77  virtual bool HasNotification(const std::string& id) = 0;
78  virtual bool IsQuietMode() const = 0;
79  virtual bool HasClickedListener(const std::string& id) = 0;
80
81  // Getters of the current notifications.
82  virtual const NotificationList::Notifications& GetNotifications() = 0;
83  // Gets all notifications being shown as popups.
84  virtual NotificationList::PopupNotifications GetPopupNotifications() = 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
100  // Sets the icon image. Icon appears at the top-left of the notification.
101  virtual void SetNotificationIcon(const std::string& notification_id,
102                                   const gfx::Image& image) = 0;
103
104  // Sets the large image for the notifications of type == TYPE_IMAGE. Specified
105  // image will appear below of the notification.
106  virtual void SetNotificationImage(const std::string& notification_id,
107                                    const gfx::Image& image) = 0;
108
109  // Sets the image for the icon of the specific action button.
110  virtual void SetNotificationButtonIcon(const std::string& notification_id,
111                                         int button_index,
112                                         const gfx::Image& image) = 0;
113
114  // Operations happening especially from GUIs: click, expand, disable,
115  // and settings.
116  // Searches through the notifications and disables any that match the
117  // extension id given.
118  virtual void DisableNotificationsByExtension(const std::string& id) = 0;
119
120  // Disables all notifications that match the given url by querying the
121  // delegate and also by matching display_source.
122  // TODO(dewittj): Is display_source matching necessary?
123  virtual void DisableNotificationsByUrl(const std::string& url) = 0;
124
125  // TODO(mukai): settings can be in another class?
126  // Shows the settings for a web notification (profile is identified by the
127  // given notification id).
128  virtual void ShowNotificationSettings(const std::string& id) = 0;
129
130  // Reformat a notification to show its entire text content.
131  virtual void ExpandNotification(const std::string& id) = 0;
132
133  // This should be called by UI classes when a notification is clicked to
134  // trigger the notification's delegate callback and also update the message
135  // center observers.
136  virtual void ClickOnNotification(const std::string& id) = 0;
137
138  // This should be called by UI classes when a notification button is clicked
139  // to trigger the notification's delegate callback and also update the message
140  // center observers.
141  virtual void ClickOnNotificationButton(const std::string& id,
142                                         int button_index) = 0;
143
144  // This should be called by UI classes after a visible notification popup
145  // closes, indicating that the notification has been shown to the user.
146  // |mark_notification_as_read|, if false, will unset the read bit on a
147  // notification, increasing the unread count of the center.
148  virtual void MarkSinglePopupAsShown(const std::string& id,
149                                      bool mark_notification_as_read) = 0;
150
151  // This should be called by UI classes when a notification is first displayed
152  // to the user, in order to decrement the unread_count for the tray, and to
153  // notify observers that the notification is visible.
154  virtual void DisplayedNotification(const std::string& id) = 0;
155
156  // Setter/getter of notifier settings provider. This will be a weak reference.
157  // This should be set at the initialization process. The getter may return
158  // NULL for tests.
159  virtual void SetNotifierSettingsProvider(
160      NotifierSettingsProvider* provider) = 0;
161  virtual NotifierSettingsProvider* GetNotifierSettingsProvider() = 0;
162
163  // This can be called to change the quiet mode state (without a timeout).
164  virtual void SetQuietMode(bool in_quiet_mode) = 0;
165
166  // Temporarily enables quiet mode for |expires_in| time.
167  virtual void EnterQuietModeWithExpire(const base::TimeDelta& expires_in) = 0;
168
169  // Informs the notification list whether the message center is visible.
170  // This affects whether or not a message has been "read".
171  virtual void SetMessageCenterVisible(bool visible) = 0;
172
173  // Allows querying the visibility of the center.
174  virtual bool IsMessageCenterVisible() = 0;
175
176  // UI classes should call this when there is cause to leave popups visible for
177  // longer than the default (for example, when the mouse hovers over a popup).
178  virtual void PausePopupTimers() = 0;
179
180  // UI classes should call this when the popup timers should restart (for
181  // example, after the mouse leaves the popup.)
182  virtual void RestartPopupTimers() = 0;
183
184 protected:
185  friend class ::TrayViewControllerTest;
186  virtual void DisableTimersForTest() = 0;
187
188  MessageCenter();
189  virtual ~MessageCenter();
190
191 private:
192  DISALLOW_COPY_AND_ASSIGN(MessageCenter);
193};
194
195}  // namespace message_center
196
197#endif  // UI_MESSAGE_CENTER_MESSAGE_CENTER_H_
198