Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(228)

Unified Diff: chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc

Issue 2931063004: Extract colors from wallpaper and dynamically update login screen overlay (Closed)
Patch Set: Will clean up this CL when crbug.com/733709 is fixed Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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()

Powered by Google App Engine
This is Rietveld 408576698