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

Unified Diff: chrome/browser/extensions/api/file_system/request_file_system_notification.cc

Issue 1032313002: Add a notification about auto-granted access to file systems. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 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/extensions/api/file_system/request_file_system_notification.cc
diff --git a/chrome/browser/extensions/api/file_system/request_file_system_notification.cc b/chrome/browser/extensions/api/file_system/request_file_system_notification.cc
new file mode 100644
index 0000000000000000000000000000000000000000..432a3de824e3f5ba3982a65cdcc0e9eeb19e2948
--- /dev/null
+++ b/chrome/browser/extensions/api/file_system/request_file_system_notification.cc
@@ -0,0 +1,118 @@
+// Copyright 2015 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/extensions/api/file_system/request_file_system_notification.h"
+
+#include "base/memory/ref_counted.h"
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/file_manager/volume_manager.h"
+#include "chrome/browser/extensions/app_icon_loader_impl.h"
+#include "chrome/grit/generated_resources.h"
+#include "extensions/common/extension.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"
+
+using file_manager::VolumeInfo;
+using message_center::Notification;
+
+namespace {
+
+// Extension icon size for the notification.
+// TODO(mtomasz): Take into account DPI.
+const int kIconSize = 48;
+
+scoped_ptr<Notification> CreateAutoGrantedNotification(
+ const extensions::Extension& extension,
+ const VolumeInfo& volume_info,
+ bool writable,
+ message_center::NotificationDelegate* delegate) {
+ DCHECK(delegate);
+
+ const std::string notification_id =
+ extension.id() + "-" + volume_info.volume_id;
+ message_center::RichNotificationData data;
+ data.clickable = false;
+
+ // TODO(mtomasz): Share this code with RequestFileSystemDialogView.
+ const base::string16 display_name = base::UTF8ToUTF16(
+ !volume_info.volume_label.empty() ? volume_info.volume_label
+ : volume_info.volume_id);
+ const base::string16 message = l10n_util::GetStringFUTF16(
+ writable
+ ? IDS_FILE_SYSTEM_REQUEST_FILE_SYSTEM_NOTIFICATION_WRITABLE_MESSAGE
+ : IDS_FILE_SYSTEM_REQUEST_FILE_SYSTEM_NOTIFICATION_MESSAGE,
+ display_name);
+
+ scoped_ptr<Notification> notification(new Notification(
+ message_center::NOTIFICATION_TYPE_SIMPLE, notification_id,
+ base::UTF8ToUTF16(extension.name()), message,
+ gfx::Image(), // Updated asynchronously later.
+ base::string16(), // display_source
+ message_center::NotifierId(message_center::NotifierId::SYSTEM_COMPONENT,
+ notification_id),
+ data, delegate));
+
+ return notification.Pass();
+}
+
+} // namespace
+
+// static
+void RequestFileSystemNotification::ShowAutoGrantedNotification(
+ Profile* profile,
+ const extensions::Extension& extension,
+ const VolumeInfo& volume_info,
+ bool writable) {
+ DCHECK(profile);
+ scoped_refptr<RequestFileSystemNotification>
+ request_file_system_notification = make_scoped_refptr(
+ new RequestFileSystemNotification(profile, extension));
+ scoped_ptr<message_center::Notification> notification(
+ CreateAutoGrantedNotification(
+ extension, volume_info, writable,
+ request_file_system_notification.get() /* delegate */));
+ request_file_system_notification->Show(notification.Pass());
+}
+
+void RequestFileSystemNotification::SetAppImage(const std::string& id,
+ const gfx::ImageSkia& image) {
+ extension_icon_.reset(new gfx::Image(image));
+
+ // If there is a pending notification, then show it now.
+ if (pending_notification_.get()) {
+ pending_notification_->set_icon(*extension_icon_.get());
+ g_browser_process->message_center()->AddNotification(
+ pending_notification_.Pass());
+ }
+}
+
+RequestFileSystemNotification::RequestFileSystemNotification(
+ Profile* profile,
+ const extensions::Extension& extension)
+ : icon_loader_(
+ new extensions::AppIconLoaderImpl(profile, kIconSize, this)) {
+ icon_loader_->FetchImage(extension.id());
+}
+
+RequestFileSystemNotification::~RequestFileSystemNotification() {
+}
+
+void RequestFileSystemNotification::Show(
+ scoped_ptr<Notification> notification) {
+ pending_notification_.reset(notification.release());
+ // If the extension icon is not known yet, then defer showing the notification
+ // until it is (from SetAppImage).
+ if (!extension_icon_.get())
+ return;
+
+ pending_notification_->set_icon(*extension_icon_.get());
+ g_browser_process->message_center()->AddNotification(
+ pending_notification_.Pass());
+}

Powered by Google App Engine
This is Rietveld 408576698