• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 CHROME_BROWSER_NOTIFICATIONS_BALLOON_NOTIFICATION_UI_MANAGER_H_
6 #define CHROME_BROWSER_NOTIFICATIONS_BALLOON_NOTIFICATION_UI_MANAGER_H_
7 
8 #include <deque>
9 #include <string>
10 
11 #include "base/memory/linked_ptr.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/prefs/pref_member.h"
14 #include "chrome/browser/notifications/balloon.h"
15 #include "chrome/browser/notifications/balloon_collection.h"
16 #include "chrome/browser/notifications/fullscreen_notification_blocker.h"
17 #include "chrome/browser/notifications/notification_prefs_manager.h"
18 #include "chrome/browser/notifications/notification_system_observer.h"
19 #include "chrome/browser/notifications/notification_ui_manager.h"
20 #include "chrome/browser/notifications/screen_lock_notification_blocker.h"
21 
22 class Notification;
23 class PrefService;
24 class Profile;
25 class QueuedNotification;
26 
27 // The notification manager manages use of the desktop for notifications.
28 // It maintains a queue of pending notifications when space becomes constrained.
29 class BalloonNotificationUIManager
30     : public NotificationUIManager,
31       public NotificationPrefsManager,
32       public BalloonCollection::BalloonSpaceChangeListener,
33       public message_center::NotificationBlocker::Observer {
34  public:
35   explicit BalloonNotificationUIManager(PrefService* local_state);
36   virtual ~BalloonNotificationUIManager();
37 
38   // Initializes the UI manager with a balloon collection; this object
39   // takes ownership of the balloon collection.
40   void SetBalloonCollection(BalloonCollection* balloon_collection);
41 
42   // NotificationUIManager overrides:
43   virtual void Add(const Notification& notification,
44                    Profile* profile) OVERRIDE;
45   virtual bool Update(const Notification& notification,
46                       Profile* profile) OVERRIDE;
47   virtual const Notification* FindById(
48       const std::string& notification_id) const OVERRIDE;
49   virtual bool CancelById(const std::string& notification_id) OVERRIDE;
50   virtual std::set<std::string> GetAllIdsByProfileAndSourceOrigin(
51       Profile* profile,
52       const GURL& source) OVERRIDE;
53   virtual bool CancelAllBySourceOrigin(const GURL& source_origin) OVERRIDE;
54   virtual bool CancelAllByProfile(Profile* profile) OVERRIDE;
55   virtual void CancelAll() OVERRIDE;
56 
57   // NotificationPrefsManager overrides:
58   virtual BalloonCollection::PositionPreference
59       GetPositionPreference() const OVERRIDE;
60   virtual void SetPositionPreference(
61       BalloonCollection::PositionPreference preference) OVERRIDE;
62 
63   BalloonCollection* balloon_collection();
64   NotificationPrefsManager* prefs_manager();
65 
66   // Helper used to pull the static instance for testing.
67   // In tests, use this instead of g_browser_process->notification_ui_manager().
68   static BalloonNotificationUIManager* GetInstanceForTesting();
69 
70   void GetQueuedNotificationsForTesting(
71     std::vector<const Notification*>* notifications);
72 
73  private:
74   bool ShowNotification(const Notification& notification, Profile* profile);
75   bool UpdateNotification(const Notification& notification, Profile* profile);
76 
77   // Attempts to display notifications from the show_queue. Invoked if they
78   // previously returned 'false' from ShowNotifications, which may happen when
79   // there is no room to show another notification or notifications are blocked.
80   void CheckAndShowNotifications();
81 
82   void ShowNotifications();
83 
84   void OnDesktopNotificationPositionChanged();
85 
86   // BalloonCollectionObserver overrides:
87   virtual void OnBalloonSpaceChanged() OVERRIDE;
88 
89   // NotificationBlocker::Observer overrides:
90   virtual void OnBlockingStateChanged(
91       message_center::NotificationBlocker* blocker) OVERRIDE;
92 
93   // A queue of notifications which are waiting to be shown.
94   typedef std::deque<linked_ptr<QueuedNotification> > NotificationDeque;
95   NotificationDeque show_queue_;
96 
97   // An owned pointer to the collection of active balloons.
98   scoped_ptr<BalloonCollection> balloon_collection_;
99 
100   ScreenLockNotificationBlocker screen_lock_blocker_;
101   FullscreenNotificationBlocker fullscreen_blocker_;
102 
103   // Prefs listener for the position preference.
104   IntegerPrefMember position_pref_;
105 
106   NotificationSystemObserver system_observer_;
107 
108   DISALLOW_COPY_AND_ASSIGN(BalloonNotificationUIManager);
109 };
110 
111 #endif  // CHROME_BROWSER_NOTIFICATIONS_BALLOON_NOTIFICATION_UI_MANAGER_H_
112