OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2012 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 #include "chrome/browser/chromeos/screensaver/screensaver_controller.h" |
| 6 |
| 7 #include "ash/screensaver/screensaver_view.h" |
| 8 #include "ash/shell.h" |
| 9 #include "ash/wm/user_activity_detector.h" |
| 10 #include "base/bind.h" |
| 11 #include "base/callback.h" |
| 12 #include "base/logging.h" |
| 13 #include "chrome/browser/extensions/extension_service.h" |
| 14 #include "chrome/browser/extensions/extension_system.h" |
| 15 #include "chrome/browser/profiles/profile_manager.h" |
| 16 #include "chrome/common/chrome_notification_types.h" |
| 17 #include "chrome/common/extensions/extension.h" |
| 18 #include "chromeos/dbus/dbus_thread_manager.h" |
| 19 #include "chromeos/dbus/power_manager_client.h" |
| 20 #include "content/public/browser/notification_service.h" |
| 21 |
| 22 namespace { |
| 23 |
| 24 const int kScreensaverTimeoutMinutes = 2; |
| 25 |
| 26 ExtensionService* GetDefaultExtensionService() { |
| 27 Profile* default_profile = ProfileManager::GetDefaultProfile(); |
| 28 DCHECK(default_profile); |
| 29 ExtensionService* service = |
| 30 extensions::ExtensionSystem::Get(default_profile)->extension_service(); |
| 31 DCHECK(service); |
| 32 |
| 33 return service; |
| 34 } |
| 35 |
| 36 // Find the screensaver extension for the given service, excluding |
| 37 // the one with exclude_id. |
| 38 std::string FindScreensaverExtension(ExtensionService* service, |
| 39 const std::string& exclude_id) { |
| 40 const ExtensionSet* extensions = service->extensions(); |
| 41 if (!extensions) |
| 42 return std::string(); |
| 43 |
| 44 for (ExtensionSet::const_iterator it = extensions->begin(); |
| 45 it != extensions->end(); |
| 46 ++it) { |
| 47 const extensions::Extension* extension = *it; |
| 48 if (extension && |
| 49 extension->id() != exclude_id && |
| 50 extension->HasAPIPermission(extensions::APIPermission::kScreensaver)) { |
| 51 return extension->id(); |
| 52 } |
| 53 } |
| 54 |
| 55 return std::string(); |
| 56 } |
| 57 |
| 58 void UninstallPreviousScreensavers(const extensions::Extension* current) { |
| 59 Profile* default_profile = ProfileManager::GetDefaultProfile(); |
| 60 DCHECK(default_profile); |
| 61 ExtensionService* service = |
| 62 extensions::ExtensionSystem::Get(default_profile)->extension_service(); |
| 63 DCHECK(service); |
| 64 |
| 65 std::string screensaver_id; |
| 66 while ((screensaver_id = FindScreensaverExtension(service, current->id())) |
| 67 != "") { |
| 68 string16 error; |
| 69 if (!service->UninstallExtension(screensaver_id, false, &error)) |
| 70 LOG(ERROR) |
| 71 << "Couldn't uninstall previous screensaver extension with id: " |
| 72 << screensaver_id << " \nError: " << error; |
| 73 } |
| 74 } |
| 75 |
| 76 } // namespace |
| 77 |
| 78 namespace chromeos { |
| 79 |
| 80 ScreensaverController::ScreensaverController() |
| 81 : threshold_(base::TimeDelta::FromMinutes(kScreensaverTimeoutMinutes)), |
| 82 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
| 83 // Register for extension changes. |
| 84 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, |
| 85 content::NotificationService::AllSources()); |
| 86 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, |
| 87 content::NotificationService::AllSources()); |
| 88 |
| 89 std::string screensaver_extension_id = |
| 90 FindScreensaverExtension(GetDefaultExtensionService(), std::string()); |
| 91 if (!screensaver_extension_id.empty()) |
| 92 SetupScreensaver(screensaver_extension_id); |
| 93 } |
| 94 |
| 95 ScreensaverController::~ScreensaverController() { |
| 96 TeardownScreensaver(); |
| 97 } |
| 98 |
| 99 void ScreensaverController::Observe( |
| 100 int type, |
| 101 const content::NotificationSource& source, |
| 102 const content::NotificationDetails& details) { |
| 103 switch (type) { |
| 104 case chrome::NOTIFICATION_EXTENSION_INSTALLED: { |
| 105 const extensions::Extension* extension = |
| 106 content::Details<const extensions::Extension>(details).ptr(); |
| 107 // Uninstall any previously installed screensaver extensions if a new |
| 108 // screensaver extension is installed. |
| 109 if (extension->HasAPIPermission(extensions::APIPermission::kScreensaver)) |
| 110 UninstallPreviousScreensavers(extension); |
| 111 break; |
| 112 } |
| 113 case chrome::NOTIFICATION_EXTENSION_LOADED: { |
| 114 const extensions::Extension* extension = |
| 115 content::Details<const extensions::Extension>(details).ptr(); |
| 116 if (extension->HasAPIPermission(extensions::APIPermission::kScreensaver)) |
| 117 SetupScreensaver(extension->id()); |
| 118 break; |
| 119 } |
| 120 case chrome::NOTIFICATION_EXTENSION_UNLOADED: { |
| 121 const extensions::Extension* extension = |
| 122 content::Details<extensions::UnloadedExtensionInfo>( |
| 123 details)->extension; |
| 124 if (extension->id() == screensaver_extension_id_) |
| 125 TeardownScreensaver(); |
| 126 break; |
| 127 } |
| 128 } |
| 129 } |
| 130 |
| 131 void ScreensaverController::IdleNotify(int64 threshold) { |
| 132 ExtensionService* service = GetDefaultExtensionService(); |
| 133 const extensions::Extension* screensaver_extension = |
| 134 service->GetExtensionById(screensaver_extension_id_, |
| 135 ExtensionService::INCLUDE_ENABLED); |
| 136 ash::ShowScreensaver(screensaver_extension->GetFullLaunchURL()); |
| 137 |
| 138 if (!ash::Shell::GetInstance()->user_activity_detector()->HasObserver(this)) |
| 139 ash::Shell::GetInstance()->user_activity_detector()->AddObserver(this); |
| 140 } |
| 141 |
| 142 void ScreensaverController::OnUserActivity() { |
| 143 // We don't want to handle further user notifications; we'll either login |
| 144 // the user and close out or or at least close the screensaver. |
| 145 if (ash::Shell::GetInstance()->user_activity_detector()->HasObserver(this)) |
| 146 ash::Shell::GetInstance()->user_activity_detector()->RemoveObserver(this); |
| 147 ash::CloseScreensaver(); |
| 148 |
| 149 RequestNextIdleNotification(); |
| 150 } |
| 151 |
| 152 void ScreensaverController::SetupScreensaver( |
| 153 const std::string& screensaver_extension_id) { |
| 154 screensaver_extension_id_ = screensaver_extension_id; |
| 155 |
| 156 PowerManagerClient* power_manager = |
| 157 DBusThreadManager::Get()->GetPowerManagerClient(); |
| 158 if (!power_manager->HasObserver(this)) |
| 159 power_manager->AddObserver(this); |
| 160 |
| 161 RequestNextIdleNotification(); |
| 162 } |
| 163 |
| 164 void ScreensaverController::TeardownScreensaver() { |
| 165 PowerManagerClient* power_manager = |
| 166 DBusThreadManager::Get()->GetPowerManagerClient(); |
| 167 if (power_manager && power_manager->HasObserver(this)) |
| 168 power_manager->RemoveObserver(this); |
| 169 |
| 170 if (ash::Shell::GetInstance() && |
| 171 ash::Shell::GetInstance()->user_activity_detector()->HasObserver(this)) { |
| 172 ash::Shell::GetInstance()->user_activity_detector()->RemoveObserver(this); |
| 173 } |
| 174 |
| 175 ash::CloseScreensaver(); |
| 176 screensaver_extension_id_ = ""; |
| 177 } |
| 178 |
| 179 void ScreensaverController::RequestNextIdleNotification() { |
| 180 DBusThreadManager::Get()->GetPowerManagerClient()-> |
| 181 RequestIdleNotification(threshold_.InMilliseconds()); |
| 182 } |
| 183 |
| 184 } // namespace chromeos |
OLD | NEW |