// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_NOTIFICATIONS_BALLOON_COLLECTION_IMPL_H_
#define CHROME_BROWSER_CHROMEOS_NOTIFICATIONS_BALLOON_COLLECTION_IMPL_H_
#pragma once
#include <string>
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/chromeos/notifications/balloon_view_host.h"
#include "chrome/browser/notifications/balloon_collection.h"
#include "chrome/browser/notifications/balloon_collection_base.h"
#include "content/common/notification_registrar.h"
#include "ui/gfx/point.h"
#include "ui/gfx/rect.h"
namespace gfx {
class Size;
} // namespace gfx
namespace chromeos {
class BalloonViewImpl;
// A balloon collection represents a set of notification balloons being
// shown in the chromeos notification panel. Unlike other platforms,
// chromeos shows the all notifications in the notification panel, and
// this class does not manage the location of balloons.
class BalloonCollectionImpl : public BalloonCollection,
public NotificationObserver {
public:
// An interface to display balloons on the screen.
// This is used for unit tests to inject a mock ui implementation.
class NotificationUI {
public:
NotificationUI() {}
virtual ~NotificationUI() {}
// Add, remove, resize and show the balloon.
virtual void Add(Balloon* balloon) = 0;
virtual bool Update(Balloon* balloon) = 0;
virtual void Remove(Balloon* balloon) = 0;
virtual void Show(Balloon* balloon) = 0;
// Resize notification from webkit.
virtual void ResizeNotification(Balloon* balloon,
const gfx::Size& size) = 0;
// Sets the active view.
virtual void SetActiveView(BalloonViewImpl* view) = 0;
private:
DISALLOW_COPY_AND_ASSIGN(NotificationUI);
};
BalloonCollectionImpl();
virtual ~BalloonCollectionImpl();
// BalloonCollectionInterface overrides
virtual void Add(const Notification& notification,
Profile* profile);
virtual bool RemoveById(const std::string& id);
virtual bool RemoveBySourceOrigin(const GURL& origin);
virtual void RemoveAll();
virtual bool HasSpace() const;
virtual void ResizeBalloon(Balloon* balloon, const gfx::Size& size);
virtual void SetPositionPreference(PositionPreference position) {}
virtual void DisplayChanged() {}
virtual void OnBalloonClosed(Balloon* source);
virtual const Balloons& GetActiveBalloons() { return base_.balloons(); }
// NotificationObserver overrides:
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
// Adds a callback for WebUI message. Returns true if the callback
// is succssfully registered, or false otherwise. It fails to add if
// there is no notification that matches NotificationDelegate::id(),
// or a callback for given message already exists. The callback
// object is owned and deleted by callee.
bool AddWebUIMessageCallback(const Notification& notification,
const std::string& message,
MessageCallback* callback);
// Adds new system notification.
// |sticky| is used to indicate that the notification
// is sticky and cannot be dismissed by a user. |controls| turns on/off
// info label and option/dismiss buttons.
void AddSystemNotification(const Notification& notification,
Profile* profile, bool sticky, bool controls);
// Updates the notification's content. It uses
// NotificationDelegate::id() to check the equality of notifications.
// Returns true if the notification has been updated. False if
// no corresponding notification is found. This will not change the
// visibility of the notification.
bool UpdateNotification(const Notification& notification);
// Updates and shows the notification. It will open the notification panel
// if it's closed or minimized, and scroll the viewport so that
// the updated notification is visible.
bool UpdateAndShowNotification(const Notification& notification);
// Injects notification ui. Used to inject a mock implementation in tests.
void set_notification_ui(NotificationUI* ui) {
notification_ui_.reset(ui);
}
NotificationUI* notification_ui() {
return notification_ui_.get();
}
protected:
// Creates a new balloon. Overridable by unit tests. The caller is
// responsible for freeing the pointer returned.
virtual Balloon* MakeBalloon(const Notification& notification,
Profile* profile);
// Base implementation for the collection of active balloons.
BalloonCollectionBase base_;
private:
friend class NotificationPanelTester;
// Shutdown the notification ui.
void Shutdown();
Balloon* FindBalloon(const Notification& notification) {
return base_.FindBalloon(notification);
}
scoped_ptr<NotificationUI> notification_ui_;
NotificationRegistrar registrar_;
DISALLOW_COPY_AND_ASSIGN(BalloonCollectionImpl);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_NOTIFICATIONS_BALLOON_COLLECTION_IMPL_H_