Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5360)

Unified Diff: chrome/browser/chromeos/file_system_provider/notification_manager.cc

Issue 350683002: [fsp] Add notifications in case of slow operations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed clang. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698