Chromium Code Reviews| 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..1fdefaf702c44ec6c4f2059c60bb8f4883a9a897 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,8 @@ class WallpaperManager::PendingWallpaper : |
| WallpaperManager::~WallpaperManager() { |
| show_user_name_on_signin_subscription_.reset(); |
| device_wallpaper_image_subscription_.reset(); |
| + if (color_calculator_) |
| + color_calculator_->RemoveObserver(this); |
| user_manager::UserManager::Get()->RemoveSessionStateObserver(this); |
| weak_factory_.InvalidateWeakPtrs(); |
| } |
| @@ -427,6 +430,27 @@ 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_.reset(); |
|
xdai1
2017/06/15 18:27:51
Remove WallpaperManager as an observer before rese
Wenzhao (Colin) Zang
2017/06/15 19:04:14
Done. Then RemoveObserver() should also be added i
|
| + 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 +935,17 @@ void WallpaperManager::OnWindowDestroying(aura::Window* window) { |
| user_manager::UserManager::Get()->GetActiveUser()->username_hash()); |
| } |
| +void WallpaperManager::OnColorCalculationComplete() { |
| + SkColor color = color_calculator_->prominent_color(); |
| + color_calculator_.reset(); |
| + if (prominent_color_ == color) |
| + return; |
| + prominent_color_ = color; |
| + |
| + for (auto& observer : observers_) |
| + observer.OnWallpaperColorsChanged(); |
| +} |
| + |
| // WallpaperManager, private: -------------------------------------------------- |
| WallpaperManager::WallpaperManager() |