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

Side by Side Diff: chrome/browser/chromeos/screensaver/screensaver_controller.cc

Issue 12093058: Screensaver implementation for ChromeOS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed tests. Created 7 years, 10 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 return std::string();
55 }
56
57 void UninstallPreviousScreensavers(const extensions::Extension* current) {
58 Profile* default_profile = ProfileManager::GetDefaultProfile();
59 DCHECK(default_profile);
60 ExtensionService* service =
61 extensions::ExtensionSystem::Get(default_profile)->extension_service();
62 DCHECK(service);
63
64 std::string screensaver_id;
65 while (!(screensaver_id =
66 FindScreensaverExtension(service, current->id())).empty()) {
67 string16 error;
68 if (!service->UninstallExtension(screensaver_id, false, &error))
69 LOG(ERROR) <<
70 "Couldn't uninstall previous screensaver extension with id: " <<
71 screensaver_id << " \nError: " << error;
72 }
73 }
74
75 } // namespace
76
77 namespace chromeos {
78
79 ScreensaverController::ScreensaverController()
80 : threshold_(base::TimeDelta::FromMinutes(kScreensaverTimeoutMinutes)),
81 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
82 // Register for extension changes.
83 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
84 content::NotificationService::AllSources());
85 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
86 content::NotificationService::AllSources());
87
88 std::string screensaver_extension_id =
89 FindScreensaverExtension(GetDefaultExtensionService(), std::string());
90 if (!screensaver_extension_id.empty())
91 SetupScreensaver(screensaver_extension_id);
92 }
93
94 ScreensaverController::~ScreensaverController() {
95 TeardownScreensaver();
96 }
97
98 void ScreensaverController::Observe(
99 int type,
100 const content::NotificationSource& source,
101 const content::NotificationDetails& details) {
102 switch (type) {
103 case chrome::NOTIFICATION_EXTENSION_INSTALLED: {
104 const extensions::Extension* extension =
105 content::Details<const extensions::Extension>(details).ptr();
106 // Uninstall any previously installed screensaver extensions if a new
107 // screensaver extension is installed.
108 if (!extension->HasAPIPermission(extensions::APIPermission::kScreensaver))
Matt Perry 2013/01/31 22:43:51 negate this
rkc 2013/01/31 22:53:56 Done.
109 UninstallPreviousScreensavers(extension);
110 break;
111 }
112 case chrome::NOTIFICATION_EXTENSION_LOADED: {
113 const extensions::Extension* extension =
114 content::Details<const extensions::Extension>(details).ptr();
115 if (!extension->HasAPIPermission(extensions::APIPermission::kScreensaver))
116 return;
117
118 SetupScreensaver(extension->id());
119 break;
120 }
121 case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
122 const extensions::Extension* extension =
123 content::Details<extensions::UnloadedExtensionInfo>(
124 details)->extension;
125 if (extension->id() == screensaver_extension_id_)
126 TeardownScreensaver();
127 break;
128 }
129 }
130 }
131
132 void ScreensaverController::IdleNotify(int64 threshold) {
133 ExtensionService* service = GetDefaultExtensionService();
134 const extensions::Extension* screensaver_extension =
135 service->GetExtensionById(screensaver_extension_id_,
136 ExtensionService::INCLUDE_ENABLED);
137 ash::ShowScreensaver(screensaver_extension->GetFullLaunchURL());
138
139 if (!ash::Shell::GetInstance()->user_activity_detector()->HasObserver(this))
140 ash::Shell::GetInstance()->user_activity_detector()->AddObserver(this);
141 }
142
143 void ScreensaverController::OnUserActivity() {
144 // We don't want to handle further user notifications; we'll either login
145 // the user and close out or or at least close the screensaver.
146 if (ash::Shell::GetInstance()->user_activity_detector()->HasObserver(this))
147 ash::Shell::GetInstance()->user_activity_detector()->RemoveObserver(this);
148 ash::CloseScreensaver();
149
150 RequestNextIdleNotification();
151 }
152
153 void ScreensaverController::SetupScreensaver(
154 const std::string& screensaver_extension_id) {
155 screensaver_extension_id_ = screensaver_extension_id;
156
157 PowerManagerClient* power_manager =
158 DBusThreadManager::Get()->GetPowerManagerClient();
159 if (!power_manager->HasObserver(this))
160 power_manager->AddObserver(this);
161
162 RequestNextIdleNotification();
163 }
164
165 void ScreensaverController::TeardownScreensaver() {
166 PowerManagerClient* power_manager =
167 DBusThreadManager::Get()->GetPowerManagerClient();
168 if (power_manager && power_manager->HasObserver(this))
169 power_manager->RemoveObserver(this);
170
171 if (ash::Shell::GetInstance() &&
172 ash::Shell::GetInstance()->user_activity_detector()->HasObserver(this))
173 ash::Shell::GetInstance()->user_activity_detector()->RemoveObserver(this);
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698