OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/login/wallpaper_manager.h" | 5 #include "chrome/browser/chromeos/login/wallpaper_manager.h" |
6 | 6 |
7 #include "ash/desktop_background/desktop_background_controller.h" | 7 #include "ash/desktop_background/desktop_background_controller.h" |
8 #include "ash/desktop_background/desktop_background_resources.h" | |
9 #include "ash/shell.h" | 8 #include "ash/shell.h" |
9 #include "base/command_line.h" | |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/file_path.h" | |
12 #include "base/file_util.h" | |
13 #include "base/string_number_conversions.h" | |
14 #include "base/string_util.h" | |
11 #include "base/time.h" | 15 #include "base/time.h" |
12 #include "base/values.h" | 16 #include "base/values.h" |
13 #include "chrome/browser/browser_process.h" | 17 #include "chrome/browser/browser_process.h" |
14 #include "chrome/browser/chromeos/cros_settings.h" | 18 #include "chrome/browser/chromeos/cros_settings.h" |
15 #include "chrome/browser/chromeos/login/user.h" | 19 #include "chrome/browser/chromeos/login/user.h" |
16 #include "chrome/browser/chromeos/login/user_manager.h" | 20 #include "chrome/browser/chromeos/login/user_manager.h" |
17 #include "chrome/browser/chromeos/login/user_manager_impl.h" | 21 #include "chrome/browser/chromeos/login/user_manager_impl.h" |
22 #include "chrome/browser/chromeos/login/wizard_controller.h" | |
18 #include "chrome/browser/prefs/pref_service.h" | 23 #include "chrome/browser/prefs/pref_service.h" |
24 #include "chrome/browser/prefs/scoped_user_pref_update.h" | |
25 #include "chrome/common/chrome_notification_types.h" | |
26 #include "chrome/common/chrome_switches.h" | |
19 #include "chromeos/dbus/dbus_thread_manager.h" | 27 #include "chromeos/dbus/dbus_thread_manager.h" |
20 #include "chromeos/dbus/power_manager_client.h" | 28 #include "chromeos/dbus/power_manager_client.h" |
29 #include "content/public/browser/browser_thread.h" | |
30 #include "content/public/browser/notification_service.h" | |
31 #include "skia/ext/image_operations.h" | |
32 #include "third_party/zlib/zlib.h" | |
33 #include "ui/gfx/codec/png_codec.h" | |
34 #include "ui/gfx/skia_util.h" | |
35 | |
36 using content::BrowserThread; | |
21 | 37 |
22 namespace { | 38 namespace { |
39 | |
23 const int kWallpaperUpdateIntervalSec = 24 * 60 * 60; | 40 const int kWallpaperUpdateIntervalSec = 24 * 60 * 60; |
41 | |
42 const char kWallpaperTypeNodeName[] = "type"; | |
43 const char kWallpaperIndexNodeName[] = "index"; | |
44 const char kWallpaperDateNodeName[] = "date"; | |
45 | |
46 const int kThumbnailWidth = 128; | |
47 const int kThumbnailHeight = 80; | |
48 | |
49 // Default wallpaper index used in OOBE (first boot). | |
50 // Defined here because Chromium default index differs. | |
51 // Also see ash::WallpaperInfo kDefaultWallpapers in | |
52 // desktop_background_resources.cc | |
53 #if defined(GOOGLE_CHROME_BUILD) | |
54 const int kDefaultOOBEWallpaperIndex = 16; // IDR_AURA_WALLPAPERS_3_URBAN0 | |
55 #else | |
56 const int kDefaultOOBEWallpaperIndex = 0; // IDR_AURA_WALLPAPERS_ROMAINGUY_0 | |
57 #endif | |
58 | |
24 } // namespace | 59 } // namespace |
25 | 60 |
26 namespace chromeos { | 61 namespace chromeos { |
27 | 62 |
28 static WallpaperManager* g_wallpaper_manager = NULL; | 63 static WallpaperManager* g_wallpaper_manager = NULL; |
29 | 64 |
30 // WallpaperManager, public: --------------------------------------------------- | 65 // WallpaperManager, public: --------------------------------------------------- |
31 | 66 |
32 // static | 67 // static |
33 WallpaperManager* WallpaperManager::Get() { | 68 WallpaperManager* WallpaperManager::Get() { |
34 if (!g_wallpaper_manager) | 69 if (!g_wallpaper_manager) |
35 g_wallpaper_manager = new WallpaperManager(); | 70 g_wallpaper_manager = new WallpaperManager(); |
36 return g_wallpaper_manager; | 71 return g_wallpaper_manager; |
37 } | 72 } |
38 | 73 |
39 WallpaperManager::WallpaperManager() : last_selected_user_("") { | 74 WallpaperManager::WallpaperManager() |
75 : ALLOW_THIS_IN_INITIALIZER_LIST(wallpaper_loader_(new WallpaperLoader)), | |
76 current_user_wallpaper_type_(User::UNKNOWN), | |
77 ALLOW_THIS_IN_INITIALIZER_LIST(current_user_wallpaper_index_( | |
78 ash::GetInvalidWallpaperIndex())), | |
79 last_selected_user_(""), | |
80 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { | |
40 system::TimezoneSettings::GetInstance()->AddObserver(this); | 81 system::TimezoneSettings::GetInstance()->AddObserver(this); |
41 RestartTimer(); | 82 RestartTimer(); |
83 registrar_.Add(this, | |
84 chrome::NOTIFICATION_LOGIN_USER_CHANGED, | |
85 content::NotificationService::AllSources()); | |
42 } | 86 } |
43 | 87 |
44 void WallpaperManager::AddPowerManagerClientObserver() { | 88 void WallpaperManager::AddPowerManagerClientObserver() { |
45 if (!DBusThreadManager::Get()->GetPowerManagerClient()->HasObserver(this)) | 89 if (!DBusThreadManager::Get()->GetPowerManagerClient()->HasObserver(this)) |
46 DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this); | 90 DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this); |
47 } | 91 } |
48 | 92 |
93 void WallpaperManager::CacheIfCustomWallpaper(const std::string& email) { | |
94 User::WallpaperType type; | |
95 int index; | |
96 base::Time date; | |
97 GetUserWallpaperProperties(email, &type, &index, &date); | |
98 if (type == User::CUSTOMIZED) { | |
99 // Uses WeakPtr here to make the request cancelable. | |
100 LoadedCallback loaded_cb = base::Bind(&WallpaperManager::CacheCallback, | |
Ivan Korotkov
2012/07/27 23:02:02
Here and below: there is no point in storing a cal
bshe
2012/07/31 14:27:54
Done.
| |
101 weak_factory_.GetWeakPtr(), email); | |
102 LoadCustomWallpaperFromFile(email, loaded_cb); | |
103 } | |
104 } | |
105 | |
106 void WallpaperManager::EnsureLoggedInUserWallpaperLoaded() { | |
107 User::WallpaperType type; | |
108 int index; | |
109 base::Time last_modification_date; | |
110 GetLoggedInUserWallpaperProperties(&type, &index, &last_modification_date); | |
111 | |
112 if (type != current_user_wallpaper_type_ || | |
113 index != current_user_wallpaper_index_) { | |
114 UserSelected(UserManager::Get()->GetLoggedInUser().email()); | |
Ivan Korotkov
2012/07/27 23:02:02
Please don't make manual call of event handlers (l
bshe
2012/07/31 14:27:54
Done.
| |
115 } | |
116 } | |
117 | |
118 void WallpaperManager::FetchCustomWallpaper(const std::string& email) { | |
119 User::WallpaperType type; | |
120 int index; | |
121 base::Time date; | |
122 GetUserWallpaperProperties(email, &type, &index, &date); | |
123 ash::WallpaperLayout layout = static_cast<ash::WallpaperLayout>(index); | |
124 LoadedCallback loaded_cb = base::Bind(&WallpaperManager::FetchCallback, | |
125 base::Unretained(this), email, layout); | |
126 LoadCustomWallpaperFromFile(email, loaded_cb); | |
127 } | |
128 | |
129 bool WallpaperManager::GetCustomWallpaperFromCache(const std::string& email, | |
130 SkBitmap* wallpaper) { | |
131 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
132 CustomWallpaperMap::iterator it = custom_wallpaper_cache_.find(email); | |
Ivan Korotkov
2012/07/27 23:02:02
Here and below: const_iterator
bshe
2012/07/31 14:27:54
Done.
| |
133 if (it != custom_wallpaper_cache_.end()) { | |
134 *wallpaper = (*it).second; | |
135 return true; | |
136 } else { | |
Ivan Korotkov
2012/07/27 23:02:02
Chrome's style is "no else after return"
bshe
2012/07/31 14:27:54
Done.
| |
137 return false; | |
138 } | |
139 } | |
140 | |
141 SkBitmap WallpaperManager::GetCustomWallpaperThumbnail( | |
142 const std::string& email) { | |
143 CustomWallpaperMap::iterator it = | |
144 custom_wallpaper_thumbnail_cache_.find(email); | |
145 if (it != custom_wallpaper_cache_.end()) | |
146 return (*it).second; | |
147 else | |
148 return SkBitmap(); | |
149 } | |
150 | |
151 void WallpaperManager::GetLoggedInUserWallpaperProperties( | |
152 User::WallpaperType* type, | |
153 int* index, | |
154 base::Time* last_modification_date) { | |
155 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
156 | |
157 if (UserManager::Get()->IsLoggedInAsStub()) { | |
158 *type = current_user_wallpaper_type_ = User::DEFAULT; | |
159 *index = current_user_wallpaper_index_ = ash::GetInvalidWallpaperIndex(); | |
160 return; | |
161 } | |
162 | |
163 GetUserWallpaperProperties(UserManager::Get()->GetLoggedInUser().email(), | |
164 type, index, last_modification_date); | |
165 } | |
166 | |
167 void WallpaperManager::InitializeWallpaper() { | |
168 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
169 UserManager* user_manager = UserManager::Get(); | |
170 if (!user_manager->IsUserLoggedIn()) { | |
171 if (!CommandLine::ForCurrentProcess()->HasSwitch( | |
172 switches::kDisableNewOobe)) { | |
173 if (!WizardController::IsDeviceRegistered() && | |
174 !WizardController::IsZeroDelayEnabled()) { | |
175 // TODO(nkostylev): Add switch to disable wallpaper transition on OOBE. | |
176 // Should be used on test images so that they are not slowed down. | |
177 ash::Shell::GetInstance()->desktop_background_controller()-> | |
178 SetDefaultWallpaper(kDefaultOOBEWallpaperIndex); | |
179 } else { | |
180 bool show_users = true; | |
181 bool result = CrosSettings::Get()->GetBoolean( | |
182 kAccountsPrefShowUserNamesOnSignIn, &show_users); | |
183 DCHECK(result) << "Unable to fetch setting " | |
184 << kAccountsPrefShowUserNamesOnSignIn; | |
185 if (!show_users) { | |
186 ash::Shell::GetInstance()->desktop_background_controller()-> | |
187 SetDefaultWallpaper(ash::GetSolidColorIndex()); | |
188 } | |
189 } | |
190 } | |
191 return; | |
192 } | |
193 UserSelected(user_manager->GetLoggedInUser().email()); | |
Ivan Korotkov
2012/07/27 23:02:02
Same note about calling event handler.
bshe
2012/07/31 14:27:54
Done.
| |
194 } | |
195 | |
196 void WallpaperManager::Observe(int type, | |
197 const content::NotificationSource& source, | |
198 const content::NotificationDetails& details) { | |
199 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
200 if (type == chrome::NOTIFICATION_LOGIN_USER_CHANGED) { | |
201 // Cancel callback for previous cache requests. | |
202 weak_factory_.InvalidateWeakPtrs(); | |
203 custom_wallpaper_cache_.clear(); | |
204 } | |
205 } | |
206 | |
49 void WallpaperManager::RestartTimer() { | 207 void WallpaperManager::RestartTimer() { |
50 timer_.Stop(); | 208 timer_.Stop(); |
51 base::Time midnight = base::Time::Now().LocalMidnight(); | 209 base::Time midnight = base::Time::Now().LocalMidnight(); |
52 base::TimeDelta interval = base::Time::Now() - midnight; | 210 base::TimeDelta interval = base::Time::Now() - midnight; |
53 int64 remaining_seconds = kWallpaperUpdateIntervalSec - interval.InSeconds(); | 211 int64 remaining_seconds = kWallpaperUpdateIntervalSec - interval.InSeconds(); |
54 if (remaining_seconds <= 0) { | 212 if (remaining_seconds <= 0) { |
55 BatchUpdateWallpaper(); | 213 BatchUpdateWallpaper(); |
56 } else { | 214 } else { |
57 // Set up a one shot timer which will batch update wallpaper at midnight. | 215 // Set up a one shot timer which will batch update wallpaper at midnight. |
58 timer_.Start(FROM_HERE, | 216 timer_.Start(FROM_HERE, |
59 base::TimeDelta::FromSeconds(remaining_seconds), | 217 base::TimeDelta::FromSeconds(remaining_seconds), |
60 this, | 218 this, |
61 &WallpaperManager::BatchUpdateWallpaper); | 219 &WallpaperManager::BatchUpdateWallpaper); |
62 } | 220 } |
63 } | 221 } |
64 | 222 |
223 void WallpaperManager::SaveUserWallpaperProperties(const std::string& email, | |
224 User::WallpaperType type, | |
225 int index) { | |
226 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
227 | |
228 current_user_wallpaper_type_ = type; | |
229 current_user_wallpaper_index_ = index; | |
230 // Ephemeral users can not save data to local state. We just cache the index | |
231 // in memory for them. | |
232 if (UserManager::Get()->IsCurrentUserEphemeral()) { | |
233 return; | |
234 } | |
235 | |
236 PrefService* local_state = g_browser_process->local_state(); | |
237 DictionaryPrefUpdate wallpaper_update(local_state, | |
238 UserManager::kUserWallpapersProperties); | |
239 | |
240 base::DictionaryValue* wallpaper_properties = new base::DictionaryValue(); | |
241 wallpaper_properties->Set(kWallpaperTypeNodeName, | |
242 new base::FundamentalValue(type)); | |
243 wallpaper_properties->Set(kWallpaperIndexNodeName, | |
244 new base::FundamentalValue(index)); | |
245 wallpaper_properties->SetString(kWallpaperDateNodeName, | |
246 base::Int64ToString(base::Time::Now().LocalMidnight().ToInternalValue())); | |
247 wallpaper_update->SetWithoutPathExpansion(email, wallpaper_properties); | |
248 } | |
249 | |
250 void WallpaperManager::SetUserWallpaperFromFile( | |
251 const std::string& username, | |
252 const FilePath& path, | |
253 ash::WallpaperLayout layout, | |
254 base::WeakPtr<WallpaperDelegate> delegate) { | |
255 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
256 | |
257 // TODO(bshe): Refactor GetWallpaperPathForUser to this class. | |
258 std::string wallpaper_path = | |
259 static_cast<UserManagerImpl*>(UserManager::Get())-> | |
260 GetWallpaperPathForUser(username, false).value(); | |
261 // need to expose ephemeral user. | |
262 bool save_raw_file = true; | |
263 | |
264 // For wallpapers, save the image without resizing. | |
265 wallpaper_loader_->Start( | |
266 path.value(), save_raw_file, wallpaper_path, | |
267 base::Bind(&WallpaperManager::SetCallback, | |
268 base::Unretained(this), username, layout, User::CUSTOMIZED, | |
269 delegate)); | |
270 } | |
271 | |
272 void WallpaperManager::SetInitialUserWallpaper(const std::string& username) { | |
273 current_user_wallpaper_type_ = User::DEFAULT; | |
274 // TODO(bshe): Ideally, wallpaper should start to load as soon as user click | |
275 // "Add user". | |
276 if (username == kGuestUser) | |
277 current_user_wallpaper_index_ = ash::GetGuestWallpaperIndex(); | |
278 else | |
279 current_user_wallpaper_index_ = ash::GetDefaultWallpaperIndex(); | |
280 SaveUserWallpaperProperties(username, | |
281 current_user_wallpaper_type_, | |
282 current_user_wallpaper_index_); | |
283 | |
284 // Some browser tests do not have shell instance. And it is not necessary to | |
285 // create a wallpaper for these tests. Add HasInstance check to prevent tests | |
286 // crash and speed up the tests by avoid loading wallpaper. | |
287 if (ash::Shell::HasInstance()) { | |
288 ash::Shell::GetInstance()->desktop_background_controller()-> | |
289 SetDefaultWallpaper(current_user_wallpaper_index_); | |
290 } | |
291 } | |
292 | |
65 void WallpaperManager::SetLastSelectedUser( | 293 void WallpaperManager::SetLastSelectedUser( |
66 const std::string& last_selected_user) { | 294 const std::string& last_selected_user) { |
67 last_selected_user_ = last_selected_user; | 295 last_selected_user_ = last_selected_user; |
68 } | 296 } |
69 | 297 |
70 void WallpaperManager::UserDeselected() { | 298 void WallpaperManager::UserDeselected() { |
71 if (!UserManager::Get()->IsUserLoggedIn()) { | 299 if (!UserManager::Get()->IsUserLoggedIn()) { |
72 // This will set default login wallpaper (#fefefe). | 300 // This will set default login wallpaper (#fefefe). |
73 ash::Shell::GetInstance()->desktop_background_controller()-> | 301 ash::Shell::GetInstance()->desktop_background_controller()-> |
74 SetDefaultWallpaper(ash::GetSolidColorIndex()); | 302 SetDefaultWallpaper(ash::GetSolidColorIndex()); |
75 } | 303 } |
76 } | 304 } |
77 | 305 |
306 void WallpaperManager::UserSelected(const std::string& email) { | |
307 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
308 if (UserManager::Get()->IsKnownUser(email)) { | |
309 User::WallpaperType type; | |
310 int index; | |
311 base::Time date; | |
312 GetUserWallpaperProperties(email, &type, &index, &date); | |
313 if (type == User::DAILY && date != base::Time::Now().LocalMidnight()) { | |
314 index = ash::GetNextWallpaperIndex(index); | |
315 SaveUserWallpaperProperties(email, User::DAILY, index); | |
316 } else if (type == User::CUSTOMIZED) { | |
317 SkBitmap custom_wallpaper; | |
318 if (GetCustomWallpaperFromCache(email, &custom_wallpaper)) { | |
319 // In customized mode, we use index pref to save the user selected | |
320 // wallpaper layout. See function SaveWallpaperToLocalState(). | |
321 ash::WallpaperLayout layout = static_cast<ash::WallpaperLayout>(index); | |
322 ash::Shell::GetInstance()->desktop_background_controller()-> | |
323 SetCustomWallpaper(custom_wallpaper, layout); | |
324 } else { | |
325 FetchCustomWallpaper(email); | |
326 } | |
327 return; | |
328 } | |
329 ash::Shell::GetInstance()->desktop_background_controller()-> | |
330 SetDefaultWallpaper(index); | |
331 SetLastSelectedUser(email); | |
332 } | |
333 } | |
334 | |
78 // WallpaperManager, private: -------------------------------------------------- | 335 // WallpaperManager, private: -------------------------------------------------- |
79 | 336 |
80 WallpaperManager::~WallpaperManager() { | 337 WallpaperManager::~WallpaperManager() { |
81 DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this); | 338 DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this); |
82 system::TimezoneSettings::GetInstance()->RemoveObserver(this); | 339 system::TimezoneSettings::GetInstance()->RemoveObserver(this); |
83 } | 340 } |
84 | 341 |
85 void WallpaperManager::BatchUpdateWallpaper() { | 342 void WallpaperManager::BatchUpdateWallpaper() { |
86 PrefService* local_state = g_browser_process->local_state(); | 343 PrefService* local_state = g_browser_process->local_state(); |
87 UserManager* user_manager = UserManager::Get(); | 344 UserManager* user_manager = UserManager::Get(); |
88 bool show_users = true; | 345 bool show_users = true; |
89 CrosSettings::Get()->GetBoolean( | 346 CrosSettings::Get()->GetBoolean( |
90 kAccountsPrefShowUserNamesOnSignIn, &show_users); | 347 kAccountsPrefShowUserNamesOnSignIn, &show_users); |
91 if (local_state) { | 348 if (local_state) { |
92 User::WallpaperType type; | 349 User::WallpaperType type; |
93 int index = 0; | 350 int index = 0; |
94 base::Time last_modification_date; | 351 base::Time last_modification_date; |
95 const UserList& users = user_manager->GetUsers(); | 352 const UserList& users = user_manager->GetUsers(); |
96 for (UserList::const_iterator it = users.begin(); | 353 for (UserList::const_iterator it = users.begin(); |
97 it != users.end(); ++it) { | 354 it != users.end(); ++it) { |
98 std::string email = (*it)->email(); | 355 std::string email = (*it)->email(); |
99 // TODO(bshe): Move GetUserWallpaperProperties() to this class. | 356 GetUserWallpaperProperties(email, &type, &index, &last_modification_date); |
100 static_cast<UserManagerImpl*>(user_manager)-> | |
101 GetUserWallpaperProperties(email, &type, &index, | |
102 &last_modification_date); | |
103 base::Time current_date = base::Time::Now().LocalMidnight(); | 357 base::Time current_date = base::Time::Now().LocalMidnight(); |
104 if (type == User::DAILY && current_date != last_modification_date) { | 358 if (type == User::DAILY && current_date != last_modification_date) { |
105 index = ash::GetNextWallpaperIndex(index); | 359 index = ash::GetNextWallpaperIndex(index); |
106 // TODO(bshe): Move SaveUserWallpaperProperties() to this class. | 360 SaveUserWallpaperProperties(email, type, index); |
107 static_cast<UserManagerImpl*>(user_manager)-> | |
108 SaveUserWallpaperProperties(email, type, index); | |
109 } | 361 } |
110 // Force a wallpaper update for logged in / last selected user. | 362 // Force a wallpaper update for logged in / last selected user. |
111 // TODO(bshe): Notify lock screen, wallpaper picker UI to update wallpaper | 363 // TODO(bshe): Notify lock screen, wallpaper picker UI to update wallpaper |
112 // as well. | 364 // as well. |
113 if (user_manager->IsUserLoggedIn() && | 365 if (user_manager->IsUserLoggedIn() && |
114 email == user_manager->GetLoggedInUser().email()) { | 366 email == user_manager->GetLoggedInUser().email()) { |
115 user_manager->UserSelected(email); | 367 UserSelected(email); |
116 } else if (show_users && | 368 } else if (show_users && |
117 email == last_selected_user_) { | 369 email == last_selected_user_) { |
118 user_manager->UserSelected(email); | 370 UserSelected(email); |
119 } | 371 } |
120 } | 372 } |
121 } | 373 } |
122 RestartTimer(); | 374 RestartTimer(); |
123 } | 375 } |
124 | 376 |
377 void WallpaperManager::CacheCallback(const std::string& email, | |
378 const SkBitmap& wallpaper) { | |
379 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
380 | |
381 if (custom_wallpaper_cache_.find(email) != custom_wallpaper_cache_.end()) { | |
382 LOG(ERROR) << "Try to cache a wallpaper for the same user twice."; | |
Ivan Korotkov
2012/07/27 23:02:02
No need in braces
Ivan Korotkov
2012/07/27 23:02:02
"Attemped to cache wallpaper for the same user twi
Ivan Korotkov
2012/07/27 23:02:02
If this can happen only due to incorrect programmi
bshe
2012/07/31 14:27:54
Done. Using a DCHECK instead.
On 2012/07/27 23:02
| |
383 } | |
384 | |
385 BrowserThread::PostTask( | |
386 BrowserThread::FILE, | |
387 FROM_HERE, | |
388 base::Bind(&WallpaperManager::CacheThumbnail, | |
389 base::Unretained(this), email, wallpaper)); | |
390 | |
391 custom_wallpaper_cache_.insert(std::make_pair(email, wallpaper)); | |
392 } | |
393 | |
394 void WallpaperManager::CacheThumbnail(const std::string& email, | |
395 const SkBitmap& wallpaper) { | |
396 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | |
397 SkBitmap thumbnail = | |
398 skia::ImageOperations::Resize(wallpaper, | |
399 skia::ImageOperations::RESIZE_LANCZOS3, | |
400 kThumbnailWidth, kThumbnailHeight); | |
401 CustomWallpaperMap::iterator it = | |
Ivan Korotkov
2012/07/27 23:02:02
Just custom_wallpaper_thumbnail_cache_[email] = th
bshe
2012/07/31 14:27:54
Done.
| |
402 custom_wallpaper_thumbnail_cache_.find(email); | |
403 if (it != custom_wallpaper_thumbnail_cache_.end()) | |
404 it->second = thumbnail; | |
405 else | |
406 custom_wallpaper_thumbnail_cache_.insert(std::make_pair(email, thumbnail)); | |
407 } | |
408 | |
409 void WallpaperManager::FetchCallback(const std::string& email, | |
410 ash::WallpaperLayout layout, | |
411 const SkBitmap& wallpaper) { | |
412 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
413 | |
414 BrowserThread::PostTask( | |
415 BrowserThread::FILE, | |
416 FROM_HERE, | |
417 base::Bind(&WallpaperManager::CacheThumbnail, | |
418 base::Unretained(this), email, wallpaper)); | |
419 | |
420 ash::Shell::GetInstance()->desktop_background_controller()-> | |
421 SetCustomWallpaper(wallpaper, layout); | |
422 } | |
423 | |
424 void WallpaperManager::GetUserWallpaperProperties(const std::string& email, | |
425 User::WallpaperType* type, | |
426 int* index, | |
427 base::Time* last_modification_date) { | |
428 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
429 | |
430 // Default to the values cached in memory. | |
431 *type = current_user_wallpaper_type_; | |
432 *index = current_user_wallpaper_index_; | |
433 | |
434 // Override with values found in local store, if any. | |
435 if (!email.empty()) { | |
436 const DictionaryValue* user_wallpapers = g_browser_process->local_state()-> | |
437 GetDictionary(UserManager::kUserWallpapersProperties); | |
438 base::DictionaryValue* wallpaper_properties; | |
439 if (user_wallpapers->GetDictionaryWithoutPathExpansion( | |
440 email, | |
441 &wallpaper_properties)) { | |
442 *type = User::UNKNOWN; | |
443 *index = ash::GetInvalidWallpaperIndex(); | |
444 wallpaper_properties->GetInteger(kWallpaperTypeNodeName, | |
445 reinterpret_cast<int*>(type)); | |
446 wallpaper_properties->GetInteger(kWallpaperIndexNodeName, index); | |
447 std::string date_string; | |
448 int64 val; | |
449 if (!(wallpaper_properties->GetString(kWallpaperDateNodeName, | |
450 &date_string) && | |
451 base::StringToInt64(date_string, &val))) | |
452 val = 0; | |
453 *last_modification_date = base::Time::FromInternalValue(val); | |
454 } | |
455 } | |
456 } | |
457 | |
458 void WallpaperManager::GenerateUserWallpaperThumbnail( | |
459 const std::string& email, | |
460 User::WallpaperType type, | |
461 base::WeakPtr<WallpaperDelegate> delegate, | |
462 const SkBitmap& wallpaper) { | |
463 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | |
464 SkBitmap thumbnail = | |
465 skia::ImageOperations::Resize(wallpaper, | |
466 skia::ImageOperations::RESIZE_LANCZOS3, | |
467 kThumbnailWidth, kThumbnailHeight); | |
468 | |
469 CustomWallpaperMap::iterator it = | |
Ivan Korotkov
2012/07/27 23:02:02
ditto
bshe
2012/07/31 14:27:54
Done.
| |
470 custom_wallpaper_thumbnail_cache_.find(email); | |
471 if (it != custom_wallpaper_thumbnail_cache_.end()) | |
472 it->second = thumbnail; | |
473 else | |
474 custom_wallpaper_thumbnail_cache_.insert(std::make_pair(email, thumbnail)); | |
475 | |
476 // Notify thumbnail is ready. | |
477 BrowserThread::PostTask( | |
478 BrowserThread::UI, | |
479 FROM_HERE, | |
480 base::Bind(&WallpaperManager::OnThumbnailUpdated, | |
481 base::Unretained(this), delegate)); | |
482 } | |
483 | |
484 void WallpaperManager::LoadCustomWallpaperFromFile(const std::string& email, | |
485 const LoadedCallback& loaded_cb) { | |
486 // TODO(bshe): Refactor GetWallpaperPathForUser to this class. | |
Ivan Korotkov
2012/07/27 23:02:02
Time to do it maybe? :)
Or put it into UserManager
bshe
2012/07/31 14:27:54
Done.
| |
487 std::string wallpaper_path = | |
488 static_cast<UserManagerImpl*>(UserManager::Get())-> | |
489 GetWallpaperPathForUser(email, false).value(); | |
490 // Load user wallpaper asynchronously. | |
491 wallpaper_loader_->Start(wallpaper_path, false, std::string(), | |
492 base::Bind(loaded_cb)); | |
Ivan Korotkov
2012/07/27 23:02:02
Should be no need in empty Bind
bshe
2012/07/31 14:27:54
Done.
| |
493 } | |
494 | |
495 void WallpaperManager::OnThumbnailUpdated( | |
496 base::WeakPtr<WallpaperDelegate> delegate) { | |
497 if (delegate) | |
498 delegate->SetCustomWallpaperThumbnail(); | |
499 } | |
500 | |
501 void WallpaperManager::SetCallback(const std::string& username, | |
502 ash::WallpaperLayout layout, | |
503 User::WallpaperType type, | |
504 base::WeakPtr<WallpaperDelegate> delegate, | |
505 const SkBitmap& wallpaper) { | |
506 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
507 | |
508 BrowserThread::PostTask( | |
509 BrowserThread::FILE, | |
510 FROM_HERE, | |
511 base::Bind(&WallpaperManager::GenerateUserWallpaperThumbnail, | |
512 base::Unretained(this), username, type, delegate, wallpaper)); | |
513 | |
514 ash::Shell::GetInstance()->desktop_background_controller()-> | |
515 SetCustomWallpaper(wallpaper, layout); | |
516 | |
517 BrowserThread::PostTask( | |
518 BrowserThread::UI, | |
519 FROM_HERE, | |
520 base::Bind(&WallpaperManager::SaveUserWallpaperProperties, | |
521 base::Unretained(this), | |
522 username, type, layout)); | |
523 } | |
524 | |
125 void WallpaperManager::SystemResumed() { | 525 void WallpaperManager::SystemResumed() { |
126 BatchUpdateWallpaper(); | 526 BatchUpdateWallpaper(); |
127 } | 527 } |
128 | 528 |
129 void WallpaperManager::TimezoneChanged(const icu::TimeZone& timezone) { | 529 void WallpaperManager::TimezoneChanged(const icu::TimeZone& timezone) { |
130 RestartTimer(); | 530 RestartTimer(); |
131 } | 531 } |
132 | 532 |
133 } // chromeos | 533 } // chromeos |
OLD | NEW |