1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_NOTIFICATIONS_MESSAGE_CENTER_SETTINGS_CONTROLLER_H_ 6 #define CHROME_BROWSER_NOTIFICATIONS_MESSAGE_CENTER_SETTINGS_CONTROLLER_H_ 7 8 #include <map> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_vector.h" 14 #include "base/memory/weak_ptr.h" 15 #include "base/observer_list.h" 16 #include "chrome/browser/extensions/app_icon_loader.h" 17 #include "components/content_settings/core/common/content_settings.h" 18 #include "components/favicon_base/favicon_types.h" 19 #include "content/public/browser/notification_details.h" 20 #include "content/public/browser/notification_observer.h" 21 #include "content/public/browser/notification_registrar.h" 22 #include "content/public/browser/notification_source.h" 23 #include "ui/message_center/notifier_settings.h" 24 25 #if defined(OS_CHROMEOS) 26 #include "components/user_manager/user_manager.h" 27 #endif 28 29 class Profile; 30 class ProfileInfoCache; 31 32 namespace base { 33 class CancelableTaskTracker; 34 } 35 36 namespace favicon_base { 37 struct FaviconImageResult; 38 } 39 40 namespace message_center { 41 class ProfileNotifierGroup; 42 } 43 44 // The class to bridge between the settings UI of notifiers and the preference 45 // storage. 46 class MessageCenterSettingsController 47 : public message_center::NotifierSettingsProvider, 48 public content::NotificationObserver, 49 #if defined(OS_CHROMEOS) 50 public user_manager::UserManager::UserSessionStateObserver, 51 #endif 52 public extensions::AppIconLoader::Delegate { 53 public: 54 explicit MessageCenterSettingsController( 55 ProfileInfoCache* profile_info_cache); 56 virtual ~MessageCenterSettingsController(); 57 58 // Overridden from message_center::NotifierSettingsProvider. 59 virtual void AddObserver( 60 message_center::NotifierSettingsObserver* observer) OVERRIDE; 61 virtual void RemoveObserver( 62 message_center::NotifierSettingsObserver* observer) OVERRIDE; 63 virtual size_t GetNotifierGroupCount() const OVERRIDE; 64 virtual const message_center::NotifierGroup& GetNotifierGroupAt( 65 size_t index) const OVERRIDE; 66 virtual bool IsNotifierGroupActiveAt(size_t index) const OVERRIDE; 67 virtual void SwitchToNotifierGroup(size_t index) OVERRIDE; 68 virtual const message_center::NotifierGroup& GetActiveNotifierGroup() const 69 OVERRIDE; 70 virtual void GetNotifierList( 71 std::vector<message_center::Notifier*>* notifiers) OVERRIDE; 72 virtual void SetNotifierEnabled(const message_center::Notifier& notifier, 73 bool enabled) OVERRIDE; 74 virtual void OnNotifierSettingsClosing() OVERRIDE; 75 virtual bool NotifierHasAdvancedSettings( 76 const message_center::NotifierId& notifier_id) const OVERRIDE; 77 virtual void OnNotifierAdvancedSettingsRequested( 78 const message_center::NotifierId& notifier_id, 79 const std::string* notification_id) OVERRIDE; 80 81 #if defined(OS_CHROMEOS) 82 // Overridden from user_manager::UserManager::UserSessionStateObserver. 83 virtual void ActiveUserChanged( 84 const user_manager::User* active_user) OVERRIDE; 85 #endif 86 87 // Overridden from extensions::AppIconLoader::Delegate. 88 virtual void SetAppImage(const std::string& id, 89 const gfx::ImageSkia& image) OVERRIDE; 90 91 private: 92 // Overridden from content::NotificationObserver. 93 virtual void Observe(int type, 94 const content::NotificationSource& source, 95 const content::NotificationDetails& details) OVERRIDE; 96 97 void OnFaviconLoaded(const GURL& url, 98 const favicon_base::FaviconImageResult& favicon_result); 99 100 #if defined(OS_CHROMEOS) 101 // Sets up the notifier group for the guest session. This needs to be 102 // separated from RebuildNotifierGroup() and called asynchronously to avoid 103 // the infinite loop of creating profile. See more the comment of 104 // RebuildNotifierGroups(). 105 void CreateNotifierGroupForGuestLogin(); 106 #endif 107 108 void RebuildNotifierGroups(); 109 110 // The views displaying notifier settings. 111 ObserverList<message_center::NotifierSettingsObserver> observers_; 112 113 // The task tracker for loading favicons. 114 scoped_ptr<base::CancelableTaskTracker> favicon_tracker_; 115 116 scoped_ptr<extensions::AppIconLoader> app_icon_loader_; 117 118 std::map<base::string16, ContentSettingsPattern> patterns_; 119 120 // The list of all configurable notifier groups. This is each profile that is 121 // loaded (and in the ProfileInfoCache - so no incognito profiles go here). 122 ScopedVector<message_center::ProfileNotifierGroup> notifier_groups_; 123 size_t current_notifier_group_; 124 125 content::NotificationRegistrar registrar_; 126 127 ProfileInfoCache* profile_info_cache_; 128 129 base::WeakPtrFactory<MessageCenterSettingsController> weak_factory_; 130 131 DISALLOW_COPY_AND_ASSIGN(MessageCenterSettingsController); 132 }; 133 134 #endif // CHROME_BROWSER_NOTIFICATIONS_MESSAGE_CENTER_SETTINGS_CONTROLLER_H_ 135