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

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: build fixes. 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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698