1 // Copyright (c) 2013 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_IMPL_H_
6 #define UI_MESSAGE_CENTER_MESSAGE_CENTER_IMPL_H_
7 
8 #include <stddef.h>
9 
10 #include <memory>
11 #include <string>
12 #include <vector>
13 
14 #include "base/callback.h"
15 #include "base/macros.h"
16 #include "base/memory/weak_ptr.h"
17 #include "base/threading/thread_checker.h"
18 #include "base/time/time.h"
19 #include "base/timer/timer.h"
20 #include "ui/message_center/message_center.h"
21 #include "ui/message_center/message_center_observer.h"
22 #include "ui/message_center/message_center_stats_collector.h"
23 #include "ui/message_center/message_center_types.h"
24 #include "ui/message_center/notification_blocker.h"
25 #include "ui/message_center/popup_timers_controller.h"
26 #include "ui/message_center/public/cpp/notifier_id.h"
27 
28 namespace message_center {
29 
30 class LockScreenController;
31 
32 // The default implementation of MessageCenter.
33 class MessageCenterImpl : public MessageCenter,
34                           public NotificationBlocker::Observer {
35  public:
36   explicit MessageCenterImpl(
37       std::unique_ptr<LockScreenController> lock_screen_controller);
38   ~MessageCenterImpl() override;
39 
40   // MessageCenter overrides:
41   void AddObserver(MessageCenterObserver* observer) override;
42   void RemoveObserver(MessageCenterObserver* observer) override;
43   void AddNotificationBlocker(NotificationBlocker* blocker) override;
44   void RemoveNotificationBlocker(NotificationBlocker* blocker) override;
45   void SetVisibility(Visibility visible) override;
46   bool IsMessageCenterVisible() const override;
47   void SetHasMessageCenterView(bool has_message_center_view) override;
48   bool HasMessageCenterView() const override;
49   size_t NotificationCount() const override;
50   bool HasPopupNotifications() const override;
51   bool IsQuietMode() const override;
52   bool IsSpokenFeedbackEnabled() const override;
53   Notification* FindVisibleNotificationById(const std::string& id) override;
54   NotificationList::Notifications FindNotificationsByAppId(
55       const std::string& app_id) override;
56   NotificationList::Notifications GetNotifications() override;
57   const NotificationList::Notifications& GetVisibleNotifications() override;
58   NotificationList::PopupNotifications GetPopupNotifications() override;
59   void AddNotification(std::unique_ptr<Notification> notification) override;
60   void UpdateNotification(
61       const std::string& old_id,
62       std::unique_ptr<Notification> new_notification) override;
63   void RemoveNotification(const std::string& id, bool by_user) override;
64   void RemoveNotificationsForNotifierId(const NotifierId& notifier_id) override;
65   void RemoveAllNotifications(bool by_user, RemoveType type) override;
66   void SetNotificationIcon(const std::string& notification_id,
67                            const gfx::Image& image) override;
68   void SetNotificationImage(const std::string& notification_id,
69                             const gfx::Image& image) override;
70   void ClickOnNotification(const std::string& id) override;
71   void ClickOnNotificationButton(const std::string& id,
72                                  int button_index) override;
73   void ClickOnNotificationButtonWithReply(const std::string& id,
74                                           int button_index,
75                                           const base::string16& reply) override;
76   void ClickOnSettingsButton(const std::string& id) override;
77   void DisableNotification(const std::string& id) override;
78   void MarkSinglePopupAsShown(const std::string& id,
79                               bool mark_notification_as_read) override;
80   void DisplayedNotification(const std::string& id,
81                              const DisplaySource source) override;
82   void SetQuietMode(bool in_quiet_mode) override;
83   void SetSpokenFeedbackEnabled(bool enabled) override;
84   void EnterQuietModeWithExpire(const base::TimeDelta& expires_in) override;
85   void RestartPopupTimers() override;
86   void PausePopupTimers() override;
87   const base::string16& GetSystemNotificationAppName() const override;
88   void SetSystemNotificationAppName(const base::string16& name) override;
89 
90   // NotificationBlocker::Observer overrides:
91   void OnBlockingStateChanged(NotificationBlocker* blocker) override;
92 
lock_screen_controller()93   LockScreenController* lock_screen_controller() {
94     return lock_screen_controller_.get();
95   }
lock_screen_controller()96   const LockScreenController* lock_screen_controller() const {
97     return lock_screen_controller_.get();
98   }
99 
100  protected:
101   void DisableTimersForTest() override;
102 
103  private:
104   THREAD_CHECKER(thread_checker_);
105 
106   void ClickOnNotificationUnlocked(const std::string& id,
107                                    const base::Optional<int>& button_index,
108                                    const base::Optional<base::string16>& reply);
109 
110   const std::unique_ptr<LockScreenController> lock_screen_controller_;
111 
112   std::unique_ptr<NotificationList> notification_list_;
113   NotificationList::Notifications visible_notifications_;
114   base::ObserverList<MessageCenterObserver> observer_list_;
115   std::unique_ptr<PopupTimersController> popup_timers_controller_;
116   std::unique_ptr<base::OneShotTimer> quiet_mode_timer_;
117   std::vector<NotificationBlocker*> blockers_;
118 
119   bool visible_ = false;
120   bool has_message_center_view_ = true;
121   bool spoken_feedback_enabled_ = false;
122 
123   base::string16 system_notification_app_name_;
124 
125   MessageCenterStatsCollector stats_collector_;
126 
127   DISALLOW_COPY_AND_ASSIGN(MessageCenterImpl);
128 };
129 
130 }  // namespace message_center
131 
132 #endif  // UI_MESSAGE_CENTER_MESSAGE_CENTER_H_
133