| Index: chrome/browser/chromeos/login/wallpaper_manager.cc
|
| diff --git a/chrome/browser/chromeos/login/wallpaper_manager.cc b/chrome/browser/chromeos/login/wallpaper_manager.cc
|
| index b0e59a88a19350c7b4fb479062761fb4b76eed06..6e051c62843045f9b840bfe130a17a96dcb63aa5 100644
|
| --- a/chrome/browser/chromeos/login/wallpaper_manager.cc
|
| +++ b/chrome/browser/chromeos/login/wallpaper_manager.cc
|
| @@ -17,6 +17,7 @@
|
| #include "base/time.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/chromeos/login/user.h"
|
| #include "chrome/browser/chromeos/login/user_manager.h"
|
| #include "chrome/browser/chromeos/login/wizard_controller.h"
|
| #include "chrome/browser/chromeos/settings/cros_settings.h"
|
| @@ -47,6 +48,8 @@ const char kWallpaperDateNodeName[] = "date";
|
| const int kThumbnailWidth = 128;
|
| const int kThumbnailHeight = 80;
|
|
|
| +const int kCacheWallpaperDelayMs = 500;
|
| +
|
| // Default wallpaper index used in OOBE (first boot).
|
| // Defined here because Chromium default index differs.
|
| // Also see ash::WallpaperInfo kDefaultWallpapers in
|
| @@ -83,11 +86,18 @@ WallpaperManager::WallpaperManager()
|
| current_user_wallpaper_type_(User::UNKNOWN),
|
| ALLOW_THIS_IN_INITIALIZER_LIST(current_user_wallpaper_index_(
|
| ash::GetInvalidWallpaperIndex())),
|
| + should_cache_wallpaper_(false),
|
| ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
|
| RestartTimer();
|
| registrar_.Add(this,
|
| chrome::NOTIFICATION_LOGIN_USER_CHANGED,
|
| content::NotificationService::AllSources());
|
| + registrar_.Add(this,
|
| + chrome::NOTIFICATION_LOGIN_WEBUI_VISIBLE,
|
| + content::NotificationService::AllSources());
|
| + registrar_.Add(this,
|
| + chrome::NOTIFICATION_WALLPAPER_ANIMATION_FINISHED,
|
| + content::NotificationService::AllSources());
|
| }
|
|
|
| // static
|
| @@ -102,21 +112,6 @@ void WallpaperManager::AddObservers() {
|
| system::TimezoneSettings::GetInstance()->AddObserver(this);
|
| }
|
|
|
| -void WallpaperManager::CacheIfCustomWallpaper(const std::string& email) {
|
| - User::WallpaperType type;
|
| - int index;
|
| - base::Time date;
|
| - GetUserWallpaperProperties(email, &type, &index, &date);
|
| - if (type == User::CUSTOMIZED) {
|
| - std::string wallpaper_path = GetWallpaperPathForUser(email, false).value();
|
| -
|
| - // Uses WeakPtr here to make the request cancelable.
|
| - wallpaper_loader_->Start(wallpaper_path, 0,
|
| - base::Bind(&WallpaperManager::CacheWallpaper,
|
| - weak_factory_.GetWeakPtr(), email));
|
| - }
|
| -}
|
| -
|
| void WallpaperManager::EnsureLoggedInUserWallpaperLoaded() {
|
| User::WallpaperType type;
|
| int index;
|
| @@ -245,10 +240,39 @@ void WallpaperManager::Observe(int type,
|
| const content::NotificationSource& source,
|
| const content::NotificationDetails& details) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - if (type == chrome::NOTIFICATION_LOGIN_USER_CHANGED) {
|
| - // Cancel callback for previous cache requests.
|
| - weak_factory_.InvalidateWeakPtrs();
|
| - custom_wallpaper_cache_.clear();
|
| + switch (type) {
|
| + case chrome::NOTIFICATION_LOGIN_USER_CHANGED: {
|
| + // Cancel callback for previous cache requests.
|
| + weak_factory_.InvalidateWeakPtrs();
|
| + custom_wallpaper_cache_.clear();
|
| + break;
|
| + }
|
| + case chrome::NOTIFICATION_LOGIN_WEBUI_VISIBLE: {
|
| + if (!CommandLine::ForCurrentProcess()->
|
| + HasSwitch(switches::kDisableBootAnimation)) {
|
| + BrowserThread::PostDelayedTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&WallpaperManager::CacheAllUsersWallpapers,
|
| + weak_factory_.GetWeakPtr()),
|
| + base::TimeDelta::FromMilliseconds(kCacheWallpaperDelayMs));
|
| + } else {
|
| + should_cache_wallpaper_ = true;
|
| + }
|
| + break;
|
| + }
|
| + case chrome::NOTIFICATION_WALLPAPER_ANIMATION_FINISHED: {
|
| + if (should_cache_wallpaper_) {
|
| + BrowserThread::PostDelayedTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&WallpaperManager::CacheAllUsersWallpapers,
|
| + weak_factory_.GetWeakPtr()),
|
| + base::TimeDelta::FromMilliseconds(kCacheWallpaperDelayMs));
|
| + should_cache_wallpaper_ = false;
|
| + }
|
| + break;
|
| + }
|
| + default:
|
| + NOTREACHED() << "Unexpected notification " << type;
|
| }
|
| }
|
|
|
| @@ -448,6 +472,37 @@ void WallpaperManager::BatchUpdateWallpaper() {
|
| RestartTimer();
|
| }
|
|
|
| +void WallpaperManager::CacheAllUsersWallpapers() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + UserList users = UserManager::Get()->GetUsers();
|
| +
|
| + UserList::const_iterator it = users.begin();
|
| + // Skip the wallpaper of first user in the list. It should have been cached.
|
| + it++;
|
| + for (; it != users.end(); ++it) {
|
| + std::string user_email = (*it)->email();
|
| + CacheUserWallpaper(user_email);
|
| + }
|
| +}
|
| +
|
| +void WallpaperManager::CacheUserWallpaper(const std::string& email) {
|
| + User::WallpaperType type;
|
| + int index;
|
| + base::Time date;
|
| + GetUserWallpaperProperties(email, &type, &index, &date);
|
| + if (type == User::CUSTOMIZED) {
|
| + std::string wallpaper_path = GetWallpaperPathForUser(email, false).value();
|
| +
|
| + // Uses WeakPtr here to make the request cancelable.
|
| + wallpaper_loader_->Start(wallpaper_path, 0,
|
| + base::Bind(&WallpaperManager::CacheWallpaper,
|
| + weak_factory_.GetWeakPtr(), email));
|
| + } else {
|
| + ash::Shell::GetInstance()->desktop_background_controller()->
|
| + CacheDefaultWallpaper(index);
|
| + }
|
| +}
|
| +
|
| void WallpaperManager::CacheWallpaper(const std::string& email,
|
| const UserImage& wallpaper) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| @@ -483,6 +538,7 @@ void WallpaperManager::FetchWallpaper(const std::string& email,
|
| base::Bind(&WallpaperManager::CacheThumbnail,
|
| base::Unretained(this), email, wallpaper.image()));
|
|
|
| + custom_wallpaper_cache_.insert(std::make_pair(email, wallpaper.image()));
|
| ash::Shell::GetInstance()->desktop_background_controller()->
|
| SetCustomWallpaper(wallpaper.image(), layout);
|
| }
|
|
|