From 3477747346b42e4fd3445891a360cc8dafe6eebd Mon Sep 17 00:00:00 2001 From: "leandrogracia@chromium.org" Date: Fri, 28 Oct 2011 13:34:01 +0000 Subject: Implement notifications for the DisplayBalloon method on Linux and Mac. BUG=74970 TEST=install background app on window, see desktop notification. Review URL: http://codereview.chromium.org/8375027 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@107722 0039d316-1c4b-4281-b951-d872f2087c98 --- .../status_icons/desktop_notification_balloon.cc | 82 ++++++++++++++++++++++ .../status_icons/desktop_notification_balloon.h | 37 ++++++++++ 2 files changed, 119 insertions(+) create mode 100644 chrome/browser/status_icons/desktop_notification_balloon.cc create mode 100644 chrome/browser/status_icons/desktop_notification_balloon.h (limited to 'chrome/browser/status_icons') diff --git a/chrome/browser/status_icons/desktop_notification_balloon.cc b/chrome/browser/status_icons/desktop_notification_balloon.cc new file mode 100644 index 0000000..4f1777a --- /dev/null +++ b/chrome/browser/status_icons/desktop_notification_balloon.cc @@ -0,0 +1,82 @@ +// 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. + +#include "chrome/browser/status_icons/desktop_notification_balloon.h" + +#include "base/bind.h" +#include "base/string_number_conversions.h" +#include "base/threading/thread_restrictions.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/notifications/desktop_notification_service.h" +#include "chrome/browser/notifications/notification.h" +#include "chrome/browser/notifications/notification_delegate.h" +#include "chrome/browser/notifications/notification_ui_manager.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/webui/web_ui_util.h" +#include "third_party/skia/include/core/SkBitmap.h" + +namespace { + +void CloseBalloon(const std::string& id) { + g_browser_process->notification_ui_manager()->CancelById(id); +} + +// Prefix added to the notification ids. +const char kNotificationPrefix[] = "desktop_notification_balloon."; + +// Timeout for automatically dismissing the notification balloon. +const size_t kTimeoutMilliseconds = 6000; + +class DummyNotificationDelegate : public NotificationDelegate { + public: + explicit DummyNotificationDelegate(const std::string& id) + : id_(kNotificationPrefix + id) {} + virtual ~DummyNotificationDelegate() {} + + virtual void Display() OVERRIDE { + MessageLoop::current()->PostDelayedTask(FROM_HERE, + base::Bind(&CloseBalloon, id()), kTimeoutMilliseconds); + } + virtual void Error() OVERRIDE {} + virtual void Close(bool by_user) OVERRIDE {} + virtual void Click() OVERRIDE {} + virtual std::string id() const OVERRIDE { return id_; } + + private: + std::string id_; +}; + +} // anonymous namespace + +int DesktopNotificationBalloon::id_count_ = 1; + +DesktopNotificationBalloon::DesktopNotificationBalloon() { +} + +DesktopNotificationBalloon::~DesktopNotificationBalloon() { + if (notification_.get()) + CloseBalloon(notification_->notification_id()); +} + +void DesktopNotificationBalloon::DisplayBalloon(const SkBitmap& icon, + const string16& title, + const string16& contents) { + GURL icon_url; + if (!icon.empty()) + icon_url = GURL(web_ui_util::GetImageDataUrl(icon)); + + GURL content_url(DesktopNotificationService::CreateDataUrl( + icon_url, title, contents, WebKit::WebTextDirectionDefault)); + + notification_.reset(new Notification( + GURL(), content_url, string16(), string16(), + new DummyNotificationDelegate(base::IntToString(id_count_++)))); + + // Allowing IO access is required here to cover the corner case where + // there is no last used profile and the default one is loaded. + // IO access won't be required for normal uses. + base::ThreadRestrictions::ScopedAllowIO allow_io; + g_browser_process->notification_ui_manager()->Add( + *notification_.get(), ProfileManager::GetLastUsedProfile()); +} diff --git a/chrome/browser/status_icons/desktop_notification_balloon.h b/chrome/browser/status_icons/desktop_notification_balloon.h new file mode 100644 index 0000000..2a44f2b --- /dev/null +++ b/chrome/browser/status_icons/desktop_notification_balloon.h @@ -0,0 +1,37 @@ +// 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_STATUS_ICONS_DESKTOP_NOTIFICATION_BALLOON_H_ +#define CHROME_BROWSER_STATUS_ICONS_DESKTOP_NOTIFICATION_BALLOON_H_ +#pragma once + +#include "base/compiler_specific.h" +#include "base/memory/scoped_ptr.h" +#include "base/string16.h" + +class Notification; +class SkBitmap; + +// Provides the notification balloon functionality by using desktop +// notifications to platforms that don't have a specific native API. +class DesktopNotificationBalloon { + public: + DesktopNotificationBalloon(); + virtual ~DesktopNotificationBalloon(); + + void DisplayBalloon(const SkBitmap& icon, + const string16& title, + const string16& contents); + + private: + // Notification balloon. + scoped_ptr notification_; + + // Counter to provide unique ids to notifications. + static int id_count_; + + DISALLOW_COPY_AND_ASSIGN(DesktopNotificationBalloon); +}; + +#endif // CHROME_BROWSER_STATUS_ICONS_DESKTOP_NOTIFICATION_BALLOON_H_ -- cgit v1.1