| Index: chrome/browser/notifications/balloon_notification_ui_manager.cc
|
| ===================================================================
|
| --- chrome/browser/notifications/balloon_notification_ui_manager.cc (revision 263121)
|
| +++ chrome/browser/notifications/balloon_notification_ui_manager.cc (working copy)
|
| @@ -1,307 +0,0 @@
|
| -// Copyright (c) 2012 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.
|
| -
|
| -#include "chrome/browser/notifications/balloon_notification_ui_manager.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/prefs/pref_service.h"
|
| -#include "base/stl_util.h"
|
| -#include "chrome/browser/browser_process.h"
|
| -#include "chrome/browser/chrome_notification_types.h"
|
| -#include "chrome/browser/fullscreen.h"
|
| -#include "chrome/browser/idle.h"
|
| -#include "chrome/browser/notifications/balloon_collection.h"
|
| -#include "chrome/browser/notifications/notification.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -
|
| -// A class which represents a notification waiting to be shown.
|
| -class QueuedNotification {
|
| - public:
|
| - QueuedNotification(const Notification& notification, Profile* profile)
|
| - : notification_(notification),
|
| - profile_(profile) {
|
| - }
|
| -
|
| - const Notification& notification() const { return notification_; }
|
| - Profile* profile() const { return profile_; }
|
| -
|
| - void Replace(const Notification& new_notification) {
|
| - notification_ = new_notification;
|
| - }
|
| -
|
| - private:
|
| - // The notification to be shown.
|
| - Notification notification_;
|
| -
|
| - // Non owned pointer to the user's profile.
|
| - Profile* profile_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(QueuedNotification);
|
| -};
|
| -
|
| -BalloonNotificationUIManager::BalloonNotificationUIManager(
|
| - PrefService* local_state)
|
| - : NotificationPrefsManager(local_state),
|
| - // Passes NULL to blockers since |message_center| is not used from balloon
|
| - // notifications.
|
| - screen_lock_blocker_(NULL),
|
| - fullscreen_blocker_(NULL),
|
| - system_observer_(this) {
|
| - position_pref_.Init(
|
| - prefs::kDesktopNotificationPosition,
|
| - local_state,
|
| - base::Bind(
|
| - &BalloonNotificationUIManager::OnDesktopNotificationPositionChanged,
|
| - base::Unretained(this)));
|
| -}
|
| -
|
| -BalloonNotificationUIManager::~BalloonNotificationUIManager() {
|
| -}
|
| -
|
| -void BalloonNotificationUIManager::SetBalloonCollection(
|
| - BalloonCollection* balloon_collection) {
|
| - DCHECK(!balloon_collection_.get() ||
|
| - balloon_collection_->GetActiveBalloons().size() == 0);
|
| - DCHECK(balloon_collection);
|
| - balloon_collection_.reset(balloon_collection);
|
| - balloon_collection_->SetPositionPreference(
|
| - static_cast<BalloonCollection::PositionPreference>(
|
| - position_pref_.GetValue()));
|
| - balloon_collection_->set_space_change_listener(this);
|
| -}
|
| -
|
| -void BalloonNotificationUIManager::Add(const Notification& notification,
|
| - Profile* profile) {
|
| - if (Update(notification, profile)) {
|
| - return;
|
| - }
|
| -
|
| - VLOG(1) << "Added notification. URL: "
|
| - << notification.content_url().spec();
|
| - show_queue_.push_back(linked_ptr<QueuedNotification>(
|
| - new QueuedNotification(notification, profile)));
|
| - CheckAndShowNotifications();
|
| -}
|
| -
|
| -bool BalloonNotificationUIManager::Update(const Notification& notification,
|
| - Profile* profile) {
|
| - const GURL& origin = notification.origin_url();
|
| - const base::string16& replace_id = notification.replace_id();
|
| -
|
| - if (replace_id.empty())
|
| - return false;
|
| -
|
| - // First check the queue of pending notifications for replacement.
|
| - // Then check the list of notifications already being shown.
|
| - for (NotificationDeque::const_iterator iter = show_queue_.begin();
|
| - iter != show_queue_.end(); ++iter) {
|
| - if (profile == (*iter)->profile() &&
|
| - origin == (*iter)->notification().origin_url() &&
|
| - replace_id == (*iter)->notification().replace_id()) {
|
| - (*iter)->Replace(notification);
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - return UpdateNotification(notification, profile);
|
| -}
|
| -
|
| -const Notification* BalloonNotificationUIManager::FindById(
|
| - const std::string& id) const {
|
| - for (NotificationDeque::const_iterator iter = show_queue_.begin();
|
| - iter != show_queue_.end(); ++iter) {
|
| - if ((*iter)->notification().notification_id() == id) {
|
| - return &((*iter)->notification());
|
| - }
|
| - }
|
| - return balloon_collection_->FindById(id);
|
| -}
|
| -
|
| -bool BalloonNotificationUIManager::CancelById(const std::string& id) {
|
| - // See if this ID hasn't been shown yet.
|
| - for (NotificationDeque::iterator iter = show_queue_.begin();
|
| - iter != show_queue_.end(); ++iter) {
|
| - if ((*iter)->notification().notification_id() == id) {
|
| - show_queue_.erase(iter);
|
| - return true;
|
| - }
|
| - }
|
| - // If it has been shown, remove it from the balloon collections.
|
| - return balloon_collection_->RemoveById(id);
|
| -}
|
| -
|
| -std::set<std::string>
|
| -BalloonNotificationUIManager::GetAllIdsByProfileAndSourceOrigin(
|
| - Profile* profile,
|
| - const GURL& source) {
|
| - std::set<std::string> notification_ids;
|
| - for (NotificationDeque::iterator iter = show_queue_.begin();
|
| - iter != show_queue_.end(); iter++) {
|
| - if ((*iter)->notification().origin_url() == source &&
|
| - profile->IsSameProfile((*iter)->profile())) {
|
| - notification_ids.insert((*iter)->notification().notification_id());
|
| - }
|
| - }
|
| -
|
| - const BalloonCollection::Balloons& balloons =
|
| - balloon_collection_->GetActiveBalloons();
|
| - for (BalloonCollection::Balloons::const_iterator iter = balloons.begin();
|
| - iter != balloons.end(); ++iter) {
|
| - if (profile->IsSameProfile((*iter)->profile()) &&
|
| - source == (*iter)->notification().origin_url()) {
|
| - notification_ids.insert((*iter)->notification().notification_id());
|
| - }
|
| - }
|
| - return notification_ids;
|
| -}
|
| -
|
| -bool BalloonNotificationUIManager::CancelAllBySourceOrigin(const GURL& source) {
|
| - // Same pattern as CancelById, but more complicated than the above
|
| - // because there may be multiple notifications from the same source.
|
| - bool removed = false;
|
| - for (NotificationDeque::iterator loopiter = show_queue_.begin();
|
| - loopiter != show_queue_.end(); ) {
|
| - if ((*loopiter)->notification().origin_url() != source) {
|
| - ++loopiter;
|
| - continue;
|
| - }
|
| -
|
| - loopiter = show_queue_.erase(loopiter);
|
| - removed = true;
|
| - }
|
| - return balloon_collection_->RemoveBySourceOrigin(source) || removed;
|
| -}
|
| -
|
| -bool BalloonNotificationUIManager::CancelAllByProfile(Profile* profile) {
|
| - // Same pattern as CancelAllBySourceOrigin.
|
| - bool removed = false;
|
| - for (NotificationDeque::iterator loopiter = show_queue_.begin();
|
| - loopiter != show_queue_.end(); ) {
|
| - if ((*loopiter)->profile() != profile) {
|
| - ++loopiter;
|
| - continue;
|
| - }
|
| -
|
| - loopiter = show_queue_.erase(loopiter);
|
| - removed = true;
|
| - }
|
| - return balloon_collection_->RemoveByProfile(profile) || removed;
|
| -}
|
| -
|
| -void BalloonNotificationUIManager::CancelAll() {
|
| - balloon_collection_->RemoveAll();
|
| -}
|
| -
|
| -BalloonCollection* BalloonNotificationUIManager::balloon_collection() {
|
| - return balloon_collection_.get();
|
| -}
|
| -
|
| -NotificationPrefsManager* BalloonNotificationUIManager::prefs_manager() {
|
| - return this;
|
| -}
|
| -
|
| -bool BalloonNotificationUIManager::ShowNotification(
|
| - const Notification& notification,
|
| - Profile* profile) {
|
| - if (!balloon_collection_->HasSpace())
|
| - return false;
|
| - balloon_collection_->Add(notification, profile);
|
| - return true;
|
| -}
|
| -
|
| -void BalloonNotificationUIManager::OnBalloonSpaceChanged() {
|
| - CheckAndShowNotifications();
|
| -}
|
| -
|
| -void BalloonNotificationUIManager::OnBlockingStateChanged(
|
| - message_center::NotificationBlocker* blocker) {
|
| - CheckAndShowNotifications();
|
| -}
|
| -
|
| -bool BalloonNotificationUIManager::UpdateNotification(
|
| - const Notification& notification,
|
| - Profile* profile) {
|
| - const GURL& origin = notification.origin_url();
|
| - const base::string16& replace_id = notification.replace_id();
|
| -
|
| - DCHECK(!replace_id.empty());
|
| -
|
| - const BalloonCollection::Balloons& balloons =
|
| - balloon_collection_->GetActiveBalloons();
|
| - for (BalloonCollection::Balloons::const_iterator iter = balloons.begin();
|
| - iter != balloons.end(); ++iter) {
|
| - if (profile == (*iter)->profile() &&
|
| - origin == (*iter)->notification().origin_url() &&
|
| - replace_id == (*iter)->notification().replace_id()) {
|
| - (*iter)->Update(notification);
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -BalloonCollection::PositionPreference
|
| -BalloonNotificationUIManager::GetPositionPreference() const {
|
| - return static_cast<BalloonCollection::PositionPreference>(
|
| - position_pref_.GetValue());
|
| -}
|
| -
|
| -void BalloonNotificationUIManager::SetPositionPreference(
|
| - BalloonCollection::PositionPreference preference) {
|
| - position_pref_.SetValue(static_cast<int>(preference));
|
| - balloon_collection_->SetPositionPreference(preference);
|
| -}
|
| -
|
| -void BalloonNotificationUIManager::CheckAndShowNotifications() {
|
| - screen_lock_blocker_.CheckState();
|
| - fullscreen_blocker_.CheckState();
|
| - if (screen_lock_blocker_.is_locked() ||
|
| - fullscreen_blocker_.is_fullscreen_mode()) {
|
| - return;
|
| - }
|
| - ShowNotifications();
|
| -}
|
| -
|
| -void BalloonNotificationUIManager::OnDesktopNotificationPositionChanged() {
|
| - balloon_collection_->SetPositionPreference(
|
| - static_cast<BalloonCollection::PositionPreference>(
|
| - position_pref_.GetValue()));
|
| -}
|
| -
|
| -void BalloonNotificationUIManager::ShowNotifications() {
|
| - while (!show_queue_.empty()) {
|
| - linked_ptr<QueuedNotification> queued_notification(show_queue_.front());
|
| - show_queue_.pop_front();
|
| - if (!ShowNotification(queued_notification->notification(),
|
| - queued_notification->profile())) {
|
| - show_queue_.push_front(queued_notification);
|
| - return;
|
| - }
|
| - }
|
| -}
|
| -
|
| -// static
|
| -BalloonNotificationUIManager*
|
| - BalloonNotificationUIManager::GetInstanceForTesting() {
|
| - if (NotificationUIManager::DelegatesToMessageCenter()) {
|
| - LOG(ERROR) << "Attempt to run a test that requires "
|
| - << "BalloonNotificationUIManager while delegating to a "
|
| - << "native MessageCenter. Test will fail. Ask dimich@";
|
| - return NULL;
|
| - }
|
| - return static_cast<BalloonNotificationUIManager*>(
|
| - g_browser_process->notification_ui_manager());
|
| -}
|
| -
|
| -void BalloonNotificationUIManager::GetQueuedNotificationsForTesting(
|
| - std::vector<const Notification*>* notifications) {
|
| - for (NotificationDeque::const_iterator iter = show_queue_.begin();
|
| - iter != show_queue_.end(); ++iter) {
|
| - notifications->push_back(&(*iter)->notification());
|
| - }
|
| -}
|
|
|