| Index: chrome/browser/chromeos/file_system_provider/notification_manager.cc
|
| diff --git a/chrome/browser/chromeos/file_system_provider/notification_manager.cc b/chrome/browser/chromeos/file_system_provider/notification_manager.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..72655189ff5db6211f67d3d4a1c6d2a54730aad5
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/file_system_provider/notification_manager.cc
|
| @@ -0,0 +1,161 @@
|
| +// Copyright 2014 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/chromeos/file_system_provider/notification_manager.h"
|
| +
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/extensions/app_icon_loader_impl.h"
|
| +#include "grit/generated_resources.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
| +#include "ui/message_center/message_center.h"
|
| +#include "ui/message_center/notification.h"
|
| +#include "ui/message_center/notification_delegate.h"
|
| +#include "ui/message_center/notification_types.h"
|
| +#include "ui/message_center/notifier_settings.h"
|
| +
|
| +namespace chromeos {
|
| +namespace file_system_provider {
|
| +namespace {
|
| +
|
| +// Extension icon size for the notification.
|
| +const int kIconSize = 48;
|
| +
|
| +// Forwards notification events to the notification manager.
|
| +class ProviderNotificationDelegate
|
| + : public message_center::NotificationDelegate {
|
| + public:
|
| + // Passing a raw pointer is safe here, since the life of each notification is
|
| + // shorter than life of the |notification_manager|.
|
| + explicit ProviderNotificationDelegate(
|
| + NotificationManager* notification_manager)
|
| + : notification_manager_(notification_manager) {}
|
| +
|
| + virtual void ButtonClick(int button_index) OVERRIDE {
|
| + notification_manager_->OnButtonClick(button_index);
|
| + }
|
| +
|
| + virtual void Display() OVERRIDE {}
|
| +
|
| + virtual void Error() OVERRIDE { notification_manager_->OnError(); }
|
| +
|
| + virtual void Close(bool by_user) OVERRIDE {
|
| + notification_manager_->OnClose();
|
| + }
|
| +
|
| + virtual void Click() OVERRIDE {}
|
| +
|
| + private:
|
| + virtual ~ProviderNotificationDelegate() {}
|
| + NotificationManager* notification_manager_; // Not owned.
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ProviderNotificationDelegate);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +NotificationManager::NotificationManager(
|
| + Profile* profile,
|
| + const ProvidedFileSystemInfo& file_system_info)
|
| + : profile_(profile),
|
| + file_system_info_(file_system_info),
|
| + icon_loader_(
|
| + new extensions::AppIconLoaderImpl(profile, kIconSize, this)) {
|
| +}
|
| +
|
| +NotificationManager::~NotificationManager() {
|
| + if (callbacks_.size()) {
|
| + g_browser_process->message_center()->RemoveNotification(
|
| + file_system_info_.mount_path().value(), false /* by_user */);
|
| + }
|
| +}
|
| +
|
| +void NotificationManager::ShowUnresponsiveNotification(
|
| + int id,
|
| + const NotificationCallback& callback) {
|
| + callbacks_[id] = callback;
|
| +
|
| + if (callbacks_.size() == 1) {
|
| + g_browser_process->message_center()->AddNotification(CreateNotification());
|
| + } else {
|
| + g_browser_process->message_center()->UpdateNotification(
|
| + file_system_info_.mount_path().value(), CreateNotification());
|
| + }
|
| +}
|
| +
|
| +void NotificationManager::HideUnresponsiveNotification(int id) {
|
| + callbacks_.erase(id);
|
| +
|
| + if (callbacks_.size()) {
|
| + g_browser_process->message_center()->UpdateNotification(
|
| + file_system_info_.mount_path().value(), CreateNotification());
|
| + return;
|
| + }
|
| +
|
| + g_browser_process->message_center()->RemoveNotification(
|
| + file_system_info_.mount_path().value(), false /* by_user */);
|
| +}
|
| +
|
| +void NotificationManager::OnButtonClick(int button_index) {
|
| + OnNotificationResult(ABORT);
|
| +}
|
| +
|
| +void NotificationManager::OnError() {
|
| + OnNotificationResult(CONTINUE);
|
| +}
|
| +
|
| +void NotificationManager::OnClose() {
|
| + OnNotificationResult(CONTINUE);
|
| +}
|
| +
|
| +void NotificationManager::SetAppImage(const std::string& id,
|
| + const gfx::ImageSkia& image) {
|
| + extension_icon_.reset(new gfx::Image(image));
|
| + g_browser_process->message_center()->UpdateNotification(
|
| + file_system_info_.mount_path().value(), CreateNotification());
|
| +}
|
| +
|
| +scoped_ptr<message_center::Notification>
|
| +NotificationManager::CreateNotification() {
|
| + if (!extension_icon_.get())
|
| + icon_loader_->FetchImage(file_system_info_.extension_id());
|
| +
|
| + message_center::RichNotificationData rich_notification_data;
|
| + rich_notification_data.buttons.push_back(
|
| + message_center::ButtonInfo(l10n_util::GetStringUTF16(
|
| + IDS_FILE_SYSTEM_PROVIDER_UNRESPONSIVE_ABORT_BUTTON)));
|
| +
|
| + scoped_ptr<message_center::Notification> notification(
|
| + new message_center::Notification(
|
| + message_center::NOTIFICATION_TYPE_SIMPLE,
|
| + file_system_info_.mount_path().value(),
|
| + base::UTF8ToUTF16(file_system_info_.file_system_name()),
|
| + l10n_util::GetStringUTF16(
|
| + callbacks_.size() == 1
|
| + ? IDS_FILE_SYSTEM_PROVIDER_UNRESPONSIVE_WARNING
|
| + : IDS_FILE_SYSTEM_PROVIDER_MANY_UNRESPONSIVE_WARNING),
|
| + extension_icon_.get() ? *extension_icon_.get() : gfx::Image(),
|
| + base::string16(), // display_source
|
| + message_center::NotifierId(
|
| + message_center::NotifierId::SYSTEM_COMPONENT,
|
| + file_system_info_.mount_path().value()),
|
| + rich_notification_data,
|
| + new ProviderNotificationDelegate(this)));
|
| +
|
| + notification->SetSystemPriority();
|
| + return notification.Pass();
|
| +}
|
| +
|
| +void NotificationManager::OnNotificationResult(NotificationResult result) {
|
| + CallbackMap::iterator it = callbacks_.begin();
|
| + while (it != callbacks_.end()) {
|
| + CallbackMap::iterator current_it = it++;
|
| + NotificationCallback callback = current_it->second;
|
| + callbacks_.erase(current_it);
|
| + callback.Run(result);
|
| + }
|
| +}
|
| +
|
| +} // namespace file_system_provider
|
| +} // namespace chromeos
|
|
|