| Index: chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc
|
| diff --git a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc
|
| index f4bbeb0ba300984c7aa8a19a81ef1a4877c3837b..8621f3677fe6f02e5de8a42746d601f3f7e9dcc0 100644
|
| --- a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc
|
| +++ b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc
|
| @@ -204,6 +204,7 @@ void SetKnownUserWallpaperFilesId(
|
| // A helper to set the wallpaper image for Classic Ash and Mash.
|
| void SetWallpaper(const gfx::ImageSkia& image,
|
| wallpaper::WallpaperLayout layout) {
|
| + WallpaperManager::Get()->CalculateProminentColor(image);
|
| if (ash_util::IsRunningInMash()) {
|
| // In mash, connect to the WallpaperController interface via mojo.
|
| service_manager::Connector* connector =
|
| @@ -395,6 +396,10 @@ class WallpaperManager::PendingWallpaper :
|
| WallpaperManager::~WallpaperManager() {
|
| show_user_name_on_signin_subscription_.reset();
|
| device_wallpaper_image_subscription_.reset();
|
| + if (color_calculator_) {
|
| + color_calculator_->RemoveObserver(this);
|
| + color_calculator_.reset();
|
| + }
|
| user_manager::UserManager::Get()->RemoveSessionStateObserver(this);
|
| weak_factory_.InvalidateWeakPtrs();
|
| }
|
| @@ -418,6 +423,11 @@ void WallpaperManager::Shutdown() {
|
| wallpaper_manager = nullptr;
|
| }
|
|
|
| +// static
|
| +bool WallpaperManager::HasInstance() {
|
| + return wallpaper_manager != nullptr;
|
| +}
|
| +
|
| bool WallpaperManager::IsPendingWallpaper(uint32_t image_id) {
|
| for (size_t i = 0; i < loading_.size(); ++i) {
|
| if (loading_[i]->GetImageId() == image_id) {
|
| @@ -427,6 +437,28 @@ bool WallpaperManager::IsPendingWallpaper(uint32_t image_id) {
|
| return false;
|
| }
|
|
|
| +void WallpaperManager::CalculateProminentColor(const gfx::ImageSkia& image) {
|
| + // Cancel in-flight color calculations, if any.
|
| + if (color_calculator_) {
|
| + color_calculator_->RemoveObserver(this);
|
| + color_calculator_.reset();
|
| + }
|
| +
|
| + color_calculator_ = base::MakeUnique<wallpaper::WallpaperColorCalculator>(
|
| + image, color_utils::LumaRange::DARK, color_utils::SaturationRange::MUTED,
|
| + task_runner_);
|
| + color_calculator_->AddObserver(this);
|
| + if (!color_calculator_->StartCalculation()) {
|
| + color_calculator_->RemoveObserver(this);
|
| + color_calculator_.reset();
|
| + if (!prominent_color_.has_value())
|
| + return;
|
| + prominent_color_.reset();
|
| + for (auto& observer : observers_)
|
| + observer.OnWallpaperColorsChanged();
|
| + }
|
| +}
|
| +
|
| WallpaperManager::WallpaperResolution
|
| WallpaperManager::GetAppropriateResolution() {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| @@ -911,6 +943,18 @@ void WallpaperManager::OnWindowDestroying(aura::Window* window) {
|
| user_manager::UserManager::Get()->GetActiveUser()->username_hash());
|
| }
|
|
|
| +void WallpaperManager::OnColorCalculationComplete() {
|
| + SkColor color = color_calculator_->prominent_color();
|
| + color_calculator_->RemoveObserver(this);
|
| + color_calculator_.reset();
|
| + if (prominent_color_ == color)
|
| + return;
|
| + prominent_color_ = color;
|
| +
|
| + for (auto& observer : observers_)
|
| + observer.OnWallpaperColorsChanged();
|
| +}
|
| +
|
| // WallpaperManager, private: --------------------------------------------------
|
|
|
| WallpaperManager::WallpaperManager()
|
|
|