172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_CHROMEOS_NOTIFICATIONS_BALLOON_COLLECTION_IMPL_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CHROMEOS_NOTIFICATIONS_BALLOON_COLLECTION_IMPL_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/notifications/balloon_view_host.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/notifications/balloon_collection.h"
15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/notifications/balloon_collection_base.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_registrar.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/point.h"
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace gfx {
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Size;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace gfx
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BalloonViewImpl;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A balloon collection represents a set of notification balloons being
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// shown in the chromeos notification panel. Unlike other platforms,
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// chromeos shows the all notifications in the notification panel, and
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this class does not manage the location of balloons.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BalloonCollectionImpl : public BalloonCollection,
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              public NotificationObserver {
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // An interface to display balloons on the screen.
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is used for unit tests to inject a mock ui implementation.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class NotificationUI {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationUI() {}
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~NotificationUI() {}
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Add, remove, resize and show the balloon.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void Add(Balloon* balloon) = 0;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual bool Update(Balloon* balloon) = 0;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void Remove(Balloon* balloon) = 0;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void Show(Balloon* balloon) = 0;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Resize notification from webkit.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void ResizeNotification(Balloon* balloon,
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const gfx::Size& size) = 0;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Sets the active view.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void SetActiveView(BalloonViewImpl* view) = 0;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DISALLOW_COPY_AND_ASSIGN(NotificationUI);
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BalloonCollectionImpl();
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~BalloonCollectionImpl();
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BalloonCollectionInterface overrides
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Add(const Notification& notification,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   Profile* profile);
64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool RemoveById(const std::string& id);
65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool RemoveBySourceOrigin(const GURL& origin);
66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void RemoveAll();
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool HasSpace() const;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ResizeBalloon(Balloon* balloon, const gfx::Size& size);
693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void SetPositionPreference(PositionPreference position) {}
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DisplayChanged() {}
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnBalloonClosed(Balloon* source);
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual const Balloons& GetActiveBalloons() { return base_.balloons(); }
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver overrides:
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Adds a callback for WebUI message. Returns true if the callback
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // is succssfully registered, or false otherwise. It fails to add if
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // there is no notification that matches NotificationDelegate::id(),
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // or a callback for given message already exists. The callback
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // object is owned and deleted by callee.
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool AddWebUIMessageCallback(const Notification& notification,
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                               const std::string& message,
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                               MessageCallback* callback);
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds new system notification.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |sticky| is used to indicate that the notification
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is sticky and cannot be dismissed by a user. |controls| turns on/off
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // info label and option/dismiss buttons.
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddSystemNotification(const Notification& notification,
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             Profile* profile, bool sticky, bool controls);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Updates the notification's content. It uses
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationDelegate::id() to check the equality of notifications.
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the notification has been updated. False if
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // no corresponding notification is found. This will not change the
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // visibility of the notification.
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool UpdateNotification(const Notification& notification);
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Updates and shows the notification. It will open the notification panel
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // if it's closed or minimized, and scroll the viewport so that
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the updated notification is visible.
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool UpdateAndShowNotification(const Notification& notification);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Injects notification ui. Used to inject a mock implementation in tests.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_notification_ui(NotificationUI* ui) {
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    notification_ui_.reset(ui);
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationUI* notification_ui() {
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return notification_ui_.get();
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a new balloon. Overridable by unit tests.  The caller is
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // responsible for freeing the pointer returned.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual Balloon* MakeBalloon(const Notification& notification,
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               Profile* profile);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Base implementation for the collection of active balloons.
123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BalloonCollectionBase base_;
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class NotificationPanelTester;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Shutdown the notification ui.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Shutdown();
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Balloon* FindBalloon(const Notification& notification) {
132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return base_.FindBalloon(notification);
133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<NotificationUI> notification_ui_;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BalloonCollectionImpl);
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_NOTIFICATIONS_BALLOON_COLLECTION_IMPL_H_
145