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

Unified Diff: chrome/browser/notifications/message_center_settings_controller.cc

Issue 20066003: Update notification settings to allow for multiprofile situations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix message_center_unittests Created 7 years, 4 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/notifications/message_center_settings_controller.cc
diff --git a/chrome/browser/notifications/message_center_settings_controller.cc b/chrome/browser/notifications/message_center_settings_controller.cc
index 5e9a588a930596ca0f8ba3a5823d82337ac1c0d9..3c42070a53bf92ee98f2f4c2036dbc48863a46e8 100644
--- a/chrome/browser/notifications/message_center_settings_controller.cc
+++ b/chrome/browser/notifications/message_center_settings_controller.cc
@@ -9,6 +9,7 @@
#include "base/command_line.h"
#include "base/i18n/string_compare.h"
#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/app_icon_loader_impl.h"
#include "chrome/browser/extensions/extension_service.h"
@@ -19,6 +20,8 @@
#include "chrome/browser/notifications/desktop_notification_service_factory.h"
#include "chrome/browser/notifications/sync_notifier/chrome_notifier_service.h"
#include "chrome/browser/notifications/sync_notifier/chrome_notifier_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_info_cache.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/common/cancelable_task_tracker.h"
#include "chrome/common/extensions/extension_constants.h"
@@ -32,16 +35,39 @@
#include "ui/gfx/image/image.h"
#include "ui/message_center/message_center_style.h"
-#if defined(USE_ASH)
-#include "ash/shell.h"
-#include "ash/system/web_notification/web_notification_tray.h"
-#endif
-
using message_center::Notifier;
using message_center::NotifierId;
-namespace {
+namespace message_center {
+class ProfileNotifierGroup : public message_center::NotifierGroup {
+ public:
+ ProfileNotifierGroup(const gfx::Image& icon,
+ const string16& display_name,
+ const string16& login_info,
+ size_t index,
+ const base::FilePath& profile_path);
+ virtual ~ProfileNotifierGroup() {}
+
+ Profile* profile() { return profile_; }
jianli 2013/08/05 20:48:03 nit: add const modifier
dewittj 2013/08/05 22:42:28 Done.
+
+ private:
+ Profile* profile_;
+};
+
+ProfileNotifierGroup::ProfileNotifierGroup(const gfx::Image& icon,
+ const string16& display_name,
+ const string16& login_info,
+ size_t index,
+ const base::FilePath& profile_path)
+ : message_center::NotifierGroup(icon, display_name, login_info, index),
+ profile_(NULL) {
+ // Try to get the profile
+ profile_ =
+ g_browser_process->profile_manager()->GetProfileByPath(profile_path);
+}
+} // namespace message_center
+namespace {
class NotifierComparator {
public:
explicit NotifierComparator(icu::Collator* collator) : collator_(collator) {}
@@ -61,13 +87,26 @@ bool SimpleCompareNotifiers(Notifier* n1, Notifier* n2) {
} // namespace
-MessageCenterSettingsController::MessageCenterSettingsController()
- : profile_(NULL) {
- // We set the profile associated with the settings at the beginning and fail
- // silently if this profile is destroyed later. This is a temporary fix for
- // http://crbug.com/263193
- registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
- content::NotificationService::AllSources());
+MessageCenterSettingsController::MessageCenterSettingsController(
+ ProfileInfoCache* profile_info_cache)
+ : current_notifier_group_(0), profile_info_cache_(profile_info_cache) {
+ DCHECK(profile_info_cache_);
+ // The following events all represent changes that may need to be reflected in
+ // the profile selector context menu, so listen for them all. We'll just
+ // rebuild the list when we get any of them.
+ registrar_.Add(this,
+ chrome::NOTIFICATION_PROFILE_CREATED,
+ content::NotificationService::AllBrowserContextsAndSources());
+ registrar_.Add(this,
+ chrome::NOTIFICATION_PROFILE_ADDED,
+ content::NotificationService::AllBrowserContextsAndSources());
+ registrar_.Add(this,
+ chrome::NOTIFICATION_PROFILE_DESTROYED,
+ content::NotificationService::AllBrowserContextsAndSources());
+ registrar_.Add(this,
+ chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
+ content::NotificationService::AllBrowserContextsAndSources());
+ RebuildNotifierGroups();
}
MessageCenterSettingsController::~MessageCenterSettingsController() {
@@ -83,15 +122,47 @@ void MessageCenterSettingsController::RemoveObserver(
observers_.RemoveObserver(observer);
}
+size_t MessageCenterSettingsController::GetNotifierGroupCount() {
+ return notifier_groups_.size();
+}
+
+const message_center::NotifierGroup&
+MessageCenterSettingsController::GetNotifierGroupAt(size_t index) {
+ DCHECK_LT(index, notifier_groups_.size());
+ return *(notifier_groups_[index]);
+}
+
+const message_center::NotifierGroup&
+MessageCenterSettingsController::GetActiveNotifierGroup() {
+ DCHECK_LT(current_notifier_group_, notifier_groups_.size());
+ return *(notifier_groups_[current_notifier_group_]);
+}
+
+void MessageCenterSettingsController::SwitchToNotifierGroup(size_t index) {
+ DCHECK_LT(index, notifier_groups_.size());
+ if (current_notifier_group_ == index)
+ return;
+
+ current_notifier_group_ = index;
+ FOR_EACH_OBSERVER(message_center::NotifierSettingsObserver,
+ observers_,
+ NotifierGroupChanged());
+}
+
void MessageCenterSettingsController::GetNotifierList(
std::vector<Notifier*>* notifiers) {
DCHECK(notifiers);
// TODO(mukai): Fix this for multi-profile.
// Temporarily use the last used profile to prevent chrome from crashing when
// the default profile is not loaded.
- profile_ = ProfileManager::GetLastUsedProfileAllowedByPolicy();
+ message_center::ProfileNotifierGroup* group =
+ notifier_groups_[current_notifier_group_];
+ Profile* profile = group->profile();
+ if (!profile)
+ return;
+
DesktopNotificationService* notification_service =
- DesktopNotificationServiceFactory::GetForProfile(profile_);
+ DesktopNotificationServiceFactory::GetForProfile(profile);
UErrorCode error;
scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(error));
@@ -99,7 +170,7 @@ void MessageCenterSettingsController::GetNotifierList(
if (!U_FAILURE(error))
comparator.reset(new NotifierComparator(collator.get()));
- ExtensionService* extension_service = profile_->GetExtensionService();
+ ExtensionService* extension_service = profile->GetExtensionService();
const ExtensionSet* extension_set = extension_service->extensions();
// The extension icon size has to be 32x32 at least to load bigger icons if
// the icon doesn't exist for the specified size, and in that case it falls
@@ -107,9 +178,10 @@ void MessageCenterSettingsController::GetNotifierList(
// dialog. See chrome/browser/extensions/extension_icon_image.cc and
// crbug.com/222931
app_icon_loader_.reset(new extensions::AppIconLoaderImpl(
- profile_, extension_misc::EXTENSION_ICON_SMALL, this));
+ profile, extension_misc::EXTENSION_ICON_SMALL, this));
for (ExtensionSet::const_iterator iter = extension_set->begin();
- iter != extension_set->end(); ++iter) {
+ iter != extension_set->end();
+ ++iter) {
const extensions::Extension* extension = iter->get();
if (!extension->HasAPIPermission(
extensions::APIPermission::kNotification)) {
@@ -128,7 +200,7 @@ void MessageCenterSettingsController::GetNotifierList(
CommandLine::ForCurrentProcess())) {
notifier::ChromeNotifierService* sync_notifier_service =
notifier::ChromeNotifierServiceFactory::GetInstance()->GetForProfile(
- profile_, Profile::EXPLICIT_ACCESS);
+ profile, Profile::EXPLICIT_ACCESS);
sync_notifier_service->GetSyncedNotificationServices(notifiers);
if (comparator)
@@ -141,8 +213,8 @@ void MessageCenterSettingsController::GetNotifierList(
ContentSettingsForOneType settings;
notification_service->GetNotificationsSettings(&settings);
- FaviconService* favicon_service = FaviconServiceFactory::GetForProfile(
- profile_, Profile::EXPLICIT_ACCESS);
+ FaviconService* favicon_service =
+ FaviconServiceFactory::GetForProfile(profile, Profile::EXPLICIT_ACCESS);
favicon_tracker_.reset(new CancelableTaskTracker());
patterns_.clear();
for (ContentSettingsForOneType::const_iterator iter = settings.begin();
@@ -163,7 +235,9 @@ void MessageCenterSettingsController::GetNotifierList(
notification_service->IsNotifierEnabled(notifier_id)));
patterns_[name] = iter->primary_pattern;
FaviconService::FaviconForURLParams favicon_params(
- profile_, url, chrome::FAVICON | chrome::TOUCH_ICON,
+ profile,
+ url,
+ chrome::FAVICON | chrome::TOUCH_ICON,
message_center::kSettingsIconSize);
// Note that favicon service obtains the favicon from history. This means
// that it will fail to obtain the image if there are no history data for
@@ -201,12 +275,11 @@ void MessageCenterSettingsController::GetNotifierList(
void MessageCenterSettingsController::SetNotifierEnabled(
const Notifier& notifier,
bool enabled) {
- // TODO(mukai): Fix this for multi-profile.
- // If the profile has been destroyed, fail silently.
- if (!profile_)
- return;
+ Profile* profile = notifier_groups_[current_notifier_group_]->profile();
+ DCHECK(profile);
+
DesktopNotificationService* notification_service =
- DesktopNotificationServiceFactory::GetForProfile(profile_);
+ DesktopNotificationServiceFactory::GetForProfile(profile);
if (notifier.notifier_id.type == NotifierId::WEB_PAGE) {
// WEB_PAGE notifier cannot handle in DesktopNotificationService
@@ -243,7 +316,7 @@ void MessageCenterSettingsController::SetNotifierEnabled(
if (notifier.notifier_id.type == NotifierId::SYNCED_NOTIFICATION_SERVICE) {
notifier::ChromeNotifierService* notifier_service =
notifier::ChromeNotifierServiceFactory::GetInstance()->GetForProfile(
- profile_, Profile::EXPLICIT_ACCESS);
+ profile, Profile::EXPLICIT_ACCESS);
notifier_service->OnSyncedNotificationServiceEnabled(
notifier.notifier_id.id, enabled);
}
@@ -256,17 +329,6 @@ void MessageCenterSettingsController::OnNotifierSettingsClosing() {
patterns_.clear();
}
-void MessageCenterSettingsController::Observe(
- int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- if (type == chrome::NOTIFICATION_PROFILE_DESTROYED &&
- content::Source<Profile>(source).ptr() == profile_) {
- // Our profile just got destroyed, so we delete our pointer to it.
- profile_ = NULL;
- }
-}
-
void MessageCenterSettingsController::OnFaviconLoaded(
const GURL& url,
const chrome::FaviconImageResult& favicon_result) {
@@ -283,3 +345,33 @@ void MessageCenterSettingsController::SetAppImage(const std::string& id,
UpdateIconImage(NotifierId(NotifierId::APPLICATION, id),
gfx::Image(image)));
}
+
+void MessageCenterSettingsController::Observe(
+ int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ RebuildNotifierGroups();
+ FOR_EACH_OBSERVER(message_center::NotifierSettingsObserver,
+ observers_,
+ NotifierGroupChanged());
+}
+
+void MessageCenterSettingsController::RebuildNotifierGroups() {
+ notifier_groups_.clear();
+ current_notifier_group_ = 0;
+
+ const size_t count = profile_info_cache_->GetNumberOfProfiles();
+ bool picked_active = false;
jianli 2013/08/05 20:48:03 nit: not used
dewittj 2013/08/05 22:42:28 Done.
+ for (size_t i = 0; i < count; ++i) {
+ message_center::ProfileNotifierGroup* group =
+ new message_center::ProfileNotifierGroup(
+ profile_info_cache_->GetAvatarIconOfProfileAtIndex(i),
+ profile_info_cache_->GetNameOfProfileAtIndex(i),
+ profile_info_cache_->GetUserNameOfProfileAtIndex(i),
+ i,
+ profile_info_cache_->GetPathOfProfileAtIndex(i));
+ if (group->profile() != NULL) {
+ notifier_groups_.push_back(group);
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698