Commit f66b2bfe authored by bshe@chromium.org's avatar bshe@chromium.org

Reland " Preload default wallpaper."


Original CL http://codereview.chromium.org/10827154/ was failed on linux_chromeos. This CL fixed the test.

Preload default wallpaper.


BUG=139929
TBR=nkostylev, sky

Review URL: https://chromiumcodereview.appspot.com/10827247

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@150885 0039d316-1c4b-4281-b951-d872f2087c98
parent 62a379a9
...@@ -151,6 +151,18 @@ void DesktopBackgroundController::OnRootWindowAdded( ...@@ -151,6 +151,18 @@ void DesktopBackgroundController::OnRootWindowAdded(
InstallComponent(root_window); InstallComponent(root_window);
} }
void DesktopBackgroundController::CacheDefaultWallpaper(int index) {
DCHECK(index >= 0);
WallpaperResolution resolution = GetAppropriateResolution();
scoped_refptr<WallpaperOperation> wallpaper_op =
new WallpaperOperation(index, resolution);
base::WorkerPool::PostTask(
FROM_HERE,
base::Bind(&WallpaperOperation::Run, wallpaper_op),
true);
}
void DesktopBackgroundController::SetDefaultWallpaper(int index, void DesktopBackgroundController::SetDefaultWallpaper(int index,
bool force_reload) { bool force_reload) {
// We should not change background when index is invalid. For instance, at // We should not change background when index is invalid. For instance, at
...@@ -169,15 +181,7 @@ void DesktopBackgroundController::SetDefaultWallpaper(int index, ...@@ -169,15 +181,7 @@ void DesktopBackgroundController::SetDefaultWallpaper(int index,
CancelPendingWallpaperOperation(); CancelPendingWallpaperOperation();
WallpaperResolution resolution = SMALL; WallpaperResolution resolution = GetAppropriateResolution();
Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
for (Shell::RootWindowList::iterator iter = root_windows.begin();
iter != root_windows.end(); ++iter) {
gfx::Size root_window_size = (*iter)->GetHostSize();
if (root_window_size.width() > kSmallWallpaperMaximalWidth ||
root_window_size.height() > kSmallWallpaperMaximalHeight)
resolution = LARGE;
}
wallpaper_op_ = new WallpaperOperation(index, resolution); wallpaper_op_ = new WallpaperOperation(index, resolution);
base::WorkerPool::PostTaskAndReply( base::WorkerPool::PostTaskAndReply(
...@@ -355,4 +359,17 @@ int DesktopBackgroundController::GetBackgroundContainerId(bool locked) { ...@@ -355,4 +359,17 @@ int DesktopBackgroundController::GetBackgroundContainerId(bool locked) {
internal::kShellWindowId_DesktopBackgroundContainer; internal::kShellWindowId_DesktopBackgroundContainer;
} }
WallpaperResolution DesktopBackgroundController::GetAppropriateResolution() {
WallpaperResolution resolution = SMALL;
Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
for (Shell::RootWindowList::iterator iter = root_windows.begin();
iter != root_windows.end(); ++iter) {
gfx::Size root_window_size = (*iter)->GetHostSize();
if (root_window_size.width() > kSmallWallpaperMaximalWidth ||
root_window_size.height() > kSmallWallpaperMaximalHeight)
resolution = LARGE;
}
return resolution;
}
} // namespace ash } // namespace ash
...@@ -76,6 +76,11 @@ class ASH_EXPORT DesktopBackgroundController : public aura::WindowObserver { ...@@ -76,6 +76,11 @@ class ASH_EXPORT DesktopBackgroundController : public aura::WindowObserver {
// Initialize root window's background. // Initialize root window's background.
void OnRootWindowAdded(aura::RootWindow* root_window); void OnRootWindowAdded(aura::RootWindow* root_window);
// Loads default wallpaper at |index| asynchronously but does not set the
// loaded image to current wallpaper. Resource bundle will cache the loaded
// image.
void CacheDefaultWallpaper(int index);
// Loads default wallpaper at |index| asynchronously and sets to current // Loads default wallpaper at |index| asynchronously and sets to current
// wallpaper after loaded. When |force_reload| is true, reload wallpaper // wallpaper after loaded. When |force_reload| is true, reload wallpaper
// for all root windows even if |index| is the same as current wallpaper. It // for all root windows even if |index| is the same as current wallpaper. It
...@@ -145,6 +150,9 @@ class ASH_EXPORT DesktopBackgroundController : public aura::WindowObserver { ...@@ -145,6 +150,9 @@ class ASH_EXPORT DesktopBackgroundController : public aura::WindowObserver {
// Returns id for background container for unlocked and locked states. // Returns id for background container for unlocked and locked states.
int GetBackgroundContainerId(bool locked); int GetBackgroundContainerId(bool locked);
// Returns the appropriate wallpaper resolution for all root windows.
WallpaperResolution GetAppropriateResolution();
// Can change at runtime. // Can change at runtime.
bool locked_; bool locked_;
......
...@@ -731,8 +731,6 @@ void UserManagerImpl::EnsureUsersLoaded() { ...@@ -731,8 +731,6 @@ void UserManagerImpl::EnsureUsersLoaded() {
User* user = CreateUser(email, /* is_ephemeral= */ false); User* user = CreateUser(email, /* is_ephemeral= */ false);
users_.push_back(user); users_.push_back(user);
WallpaperManager::Get()->CacheIfCustomWallpaper(email);
if (prefs_images) { if (prefs_images) {
// Get account image path. // Get account image path.
// TODO(avayvod): Reading image path as a string is here for // TODO(avayvod): Reading image path as a string is here for
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "base/time.h" #include "base/time.h"
#include "base/values.h" #include "base/values.h"
#include "chrome/browser/browser_process.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/user_manager.h"
#include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/chromeos/settings/cros_settings.h"
...@@ -47,6 +48,8 @@ const char kWallpaperDateNodeName[] = "date"; ...@@ -47,6 +48,8 @@ const char kWallpaperDateNodeName[] = "date";
const int kThumbnailWidth = 128; const int kThumbnailWidth = 128;
const int kThumbnailHeight = 80; const int kThumbnailHeight = 80;
const int kCacheWallpaperDelayMs = 500;
// Default wallpaper index used in OOBE (first boot). // Default wallpaper index used in OOBE (first boot).
// Defined here because Chromium default index differs. // Defined here because Chromium default index differs.
// Also see ash::WallpaperInfo kDefaultWallpapers in // Also see ash::WallpaperInfo kDefaultWallpapers in
...@@ -83,11 +86,18 @@ WallpaperManager::WallpaperManager() ...@@ -83,11 +86,18 @@ WallpaperManager::WallpaperManager()
current_user_wallpaper_type_(User::UNKNOWN), current_user_wallpaper_type_(User::UNKNOWN),
ALLOW_THIS_IN_INITIALIZER_LIST(current_user_wallpaper_index_( ALLOW_THIS_IN_INITIALIZER_LIST(current_user_wallpaper_index_(
ash::GetInvalidWallpaperIndex())), ash::GetInvalidWallpaperIndex())),
should_cache_wallpaper_(false),
ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
RestartTimer(); RestartTimer();
registrar_.Add(this, registrar_.Add(this,
chrome::NOTIFICATION_LOGIN_USER_CHANGED, chrome::NOTIFICATION_LOGIN_USER_CHANGED,
content::NotificationService::AllSources()); 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 // static
...@@ -102,21 +112,6 @@ void WallpaperManager::AddObservers() { ...@@ -102,21 +112,6 @@ void WallpaperManager::AddObservers() {
system::TimezoneSettings::GetInstance()->AddObserver(this); 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() { void WallpaperManager::EnsureLoggedInUserWallpaperLoaded() {
User::WallpaperType type; User::WallpaperType type;
int index; int index;
...@@ -245,10 +240,39 @@ void WallpaperManager::Observe(int type, ...@@ -245,10 +240,39 @@ void WallpaperManager::Observe(int type,
const content::NotificationSource& source, const content::NotificationSource& source,
const content::NotificationDetails& details) { const content::NotificationDetails& details) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (type == chrome::NOTIFICATION_LOGIN_USER_CHANGED) { switch (type) {
// Cancel callback for previous cache requests. case chrome::NOTIFICATION_LOGIN_USER_CHANGED: {
weak_factory_.InvalidateWeakPtrs(); // Cancel callback for previous cache requests.
custom_wallpaper_cache_.clear(); 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;
} }
} }
...@@ -445,6 +469,39 @@ void WallpaperManager::BatchUpdateWallpaper() { ...@@ -445,6 +469,39 @@ void WallpaperManager::BatchUpdateWallpaper() {
RestartTimer(); RestartTimer();
} }
void WallpaperManager::CacheAllUsersWallpapers() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
UserList users = UserManager::Get()->GetUsers();
if (!users.empty()) {
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, void WallpaperManager::CacheWallpaper(const std::string& email,
const UserImage& wallpaper) { const UserImage& wallpaper) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
...@@ -480,6 +537,7 @@ void WallpaperManager::FetchWallpaper(const std::string& email, ...@@ -480,6 +537,7 @@ void WallpaperManager::FetchWallpaper(const std::string& email,
base::Bind(&WallpaperManager::CacheThumbnail, base::Bind(&WallpaperManager::CacheThumbnail,
base::Unretained(this), email, wallpaper.image())); base::Unretained(this), email, wallpaper.image()));
custom_wallpaper_cache_.insert(std::make_pair(email, wallpaper.image()));
ash::Shell::GetInstance()->desktop_background_controller()-> ash::Shell::GetInstance()->desktop_background_controller()->
SetCustomWallpaper(wallpaper.image(), layout); SetCustomWallpaper(wallpaper.image(), layout);
} }
......
...@@ -45,9 +45,6 @@ class WallpaperManager: public system::TimezoneSettings::Observer, ...@@ -45,9 +45,6 @@ class WallpaperManager: public system::TimezoneSettings::Observer,
// added after PowerManagerClient initialized. // added after PowerManagerClient initialized.
void AddObservers(); void AddObservers();
// Caches |email|'s wallpaper to memory if it is custom wallpaper.
void CacheIfCustomWallpaper(const std::string& email);
// Loads wallpaper asynchronously if the current wallpaper is not the // Loads wallpaper asynchronously if the current wallpaper is not the
// wallpaper of logged in user. // wallpaper of logged in user.
void EnsureLoggedInUserWallpaperLoaded(); void EnsureLoggedInUserWallpaperLoaded();
...@@ -134,6 +131,21 @@ class WallpaperManager: public system::TimezoneSettings::Observer, ...@@ -134,6 +131,21 @@ class WallpaperManager: public system::TimezoneSettings::Observer,
// at 0am if chromeos device is on. // at 0am if chromeos device is on.
void BatchUpdateWallpaper(); void BatchUpdateWallpaper();
// Cache all logged in users' wallpapers to memory at login screen. It should
// not compete with first wallpaper loading when boot up/initialize login
// WebUI page.
// There are two ways the first wallpaper might be loaded:
// 1. Loaded on boot. Login WebUI waits for it.
// 2. When flag --disable-boot-animation is passed. Login WebUI is loaded
// right away and in 500ms after. Wallpaper started to load.
// For case 2, should_cache_wallpaper_ is used to indicate if we need to
// cache wallpapers on wallpaper animation finished. The cache operation
// should be only executed once.
void CacheAllUsersWallpapers();
// Caches |email|'s wallpaper to memory.
void CacheUserWallpaper(const std::string& email);
// Caches the decoded wallpaper to memory. // Caches the decoded wallpaper to memory.
void CacheWallpaper(const std::string& email, const UserImage& wallpaper); void CacheWallpaper(const std::string& email, const UserImage& wallpaper);
...@@ -200,6 +212,8 @@ class WallpaperManager: public system::TimezoneSettings::Observer, ...@@ -200,6 +212,8 @@ class WallpaperManager: public system::TimezoneSettings::Observer,
// The last selected user on user pod row. // The last selected user on user pod row.
std::string last_selected_user_; std::string last_selected_user_;
bool should_cache_wallpaper_;
base::WeakPtrFactory<WallpaperManager> weak_factory_; base::WeakPtrFactory<WallpaperManager> weak_factory_;
content::NotificationRegistrar registrar_; content::NotificationRegistrar registrar_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment