Index: ash/common/wallpaper/wallpaper_controller.cc |
diff --git a/ash/common/wallpaper/wallpaper_controller.cc b/ash/common/wallpaper/wallpaper_controller.cc |
index 8b9b4048aa690914092ed4f4f740dc6261273283..42e70a74423a8e63d2deda24241c925656ca9b3f 100644 |
--- a/ash/common/wallpaper/wallpaper_controller.cc |
+++ b/ash/common/wallpaper/wallpaper_controller.cc |
@@ -4,6 +4,10 @@ |
#include "ash/common/wallpaper/wallpaper_controller.h" |
+#include <string> |
+#include <utility> |
+ |
+#include "ash/common/ash_switches.h" |
#include "ash/common/wallpaper/wallpaper_controller_observer.h" |
#include "ash/common/wallpaper/wallpaper_delegate.h" |
#include "ash/common/wallpaper/wallpaper_view.h" |
@@ -13,14 +17,18 @@ |
#include "ash/public/cpp/shell_window_ids.h" |
#include "ash/root_window_controller.h" |
#include "base/bind.h" |
+#include "base/command_line.h" |
#include "base/logging.h" |
#include "base/task_runner.h" |
+#include "components/wallpaper/wallpaper_color_calculator.h" |
#include "components/wallpaper/wallpaper_resizer.h" |
#include "ui/display/manager/managed_display_info.h" |
#include "ui/display/screen.h" |
+#include "ui/gfx/color_analysis.h" |
#include "ui/views/widget/widget.h" |
namespace ash { |
+ |
namespace { |
// How long to wait reloading the wallpaper after the display size has changed. |
@@ -28,10 +36,41 @@ const int kWallpaperReloadDelayMs = 100; |
} // namespace |
+// static |
+bool WallpaperController::GetProminentColorProfile( |
+ color_utils::LumaRange* luma, |
+ color_utils::SaturationRange* saturation) { |
+ if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kAshShelfColor)) { |
+ return false; |
+ } |
+ |
+ *luma = color_utils::LumaRange::NORMAL; |
+ *saturation = color_utils::SaturationRange::VIBRANT; |
+ |
+ const std::string switch_value = |
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
+ switches::kAshShelfColor); |
+ if (switch_value.find("light") != std::string::npos) |
+ *luma = color_utils::LumaRange::LIGHT; |
+ else if (switch_value.find("normal") != std::string::npos) |
+ *luma = color_utils::LumaRange::NORMAL; |
+ else if (switch_value.find("dark") != std::string::npos) |
+ *luma = color_utils::LumaRange::DARK; |
+ |
+ if (switch_value.find("vibrant") != std::string::npos) |
+ *saturation = color_utils::SaturationRange::VIBRANT; |
+ else if (switch_value.find("muted") != std::string::npos) |
+ *saturation = color_utils::SaturationRange::MUTED; |
+ |
+ return true; |
+} |
+ |
WallpaperController::WallpaperController( |
const scoped_refptr<base::TaskRunner>& task_runner) |
: locked_(false), |
wallpaper_mode_(WALLPAPER_NONE), |
+ prominent_color_(SK_ColorTRANSPARENT), |
wallpaper_reload_delay_(kWallpaperReloadDelayMs), |
task_runner_(task_runner) { |
WmShell::Get()->AddDisplayObserver(this); |
@@ -39,6 +78,10 @@ WallpaperController::WallpaperController( |
} |
WallpaperController::~WallpaperController() { |
+ if (current_wallpaper_) |
+ current_wallpaper_->RemoveObserver(this); |
+ if (color_calculator_) |
+ color_calculator_->RemoveObserver(this); |
WmShell::Get()->RemoveDisplayObserver(this); |
WmShell::Get()->RemoveShellObserver(this); |
} |
@@ -82,6 +125,7 @@ void WallpaperController::SetWallpaperImage(const gfx::ImageSkia& image, |
current_wallpaper_.reset(new wallpaper::WallpaperResizer( |
image, GetMaxDisplaySizeInNative(), layout, task_runner_)); |
+ current_wallpaper_->AddObserver(this); |
current_wallpaper_->StartResize(); |
for (auto& observer : observers_) |
@@ -91,6 +135,7 @@ void WallpaperController::SetWallpaperImage(const gfx::ImageSkia& image, |
} |
void WallpaperController::CreateEmptyWallpaper() { |
+ SetProminentColor(SK_ColorTRANSPARENT); |
current_wallpaper_.reset(); |
wallpaper_mode_ = WALLPAPER_IMAGE; |
InstallDesktopControllerForAllWindows(); |
@@ -205,6 +250,16 @@ void WallpaperController::SetWallpaper(const SkBitmap& wallpaper, |
SetWallpaperImage(gfx::ImageSkia::CreateFrom1xBitmap(wallpaper), layout); |
} |
+void WallpaperController::OnWallpaperResized() { |
+ CalculateWallpaperColors(); |
+} |
+ |
+void WallpaperController::OnColorCalculationComplete() { |
+ const SkColor color = color_calculator_->prominent_color(); |
+ color_calculator_.reset(); |
+ SetProminentColor(color); |
+} |
+ |
void WallpaperController::InstallDesktopController(WmWindow* root_window) { |
WallpaperWidgetController* component = nullptr; |
int container_id = GetWallpaperContainerId(locked_); |
@@ -273,4 +328,29 @@ void WallpaperController::UpdateWallpaper(bool clear_cache) { |
WmShell::Get()->wallpaper_delegate()->UpdateWallpaper(clear_cache); |
} |
+void WallpaperController::SetProminentColor(SkColor color) { |
+ if (prominent_color_ == color) |
+ return; |
+ |
+ prominent_color_ = color; |
+ for (auto& observer : observers_) |
+ observer.OnWallpaperColorsChanged(); |
+} |
+ |
+void WallpaperController::CalculateWallpaperColors() { |
+ color_utils::LumaRange luma; |
+ color_utils::SaturationRange saturation; |
+ if (!GetProminentColorProfile(&luma, &saturation)) |
+ return; |
+ |
+ if (color_calculator_) |
+ color_calculator_->RemoveObserver(this); |
+ |
+ color_calculator_ = base::MakeUnique<wallpaper::WallpaperColorCalculator>( |
+ GetWallpaper(), luma, saturation, task_runner_); |
+ color_calculator_->AddObserver(this); |
+ if (!color_calculator_->StartCalculation()) |
+ SetProminentColor(SK_ColorTRANSPARENT); |
+} |
+ |
} // namespace ash |