#include "ash/wm/overview/overview_wallpaper_controller.h"
#include "ash/root_window_controller.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shell.h"
#include "ash/wallpaper/wallpaper_constants.h"
#include "ash/wallpaper/wallpaper_widget_controller.h"
#include "ash/wm/overview/overview_utils.h"
#include "ash/wm/tablet_mode/tablet_mode_controller.h"
namespace ash {
namespace {
bool g_disable_wallpaper_change_for_tests = false;
constexpr base::TimeDelta kBlurSlideDuration = base::Milliseconds(250);
bool IsWallpaperChangeAllowed() {
return !g_disable_wallpaper_change_for_tests;
}
WallpaperWidgetController* GetWallpaperWidgetController(aura::Window* root) {
return RootWindowController::ForWindow(root)->wallpaper_widget_controller();
}
float GetBlur(bool should_blur) {
return should_blur ? wallpaper_constants::kOverviewBlur
: wallpaper_constants::kClear;
}
}
OverviewWallpaperController::OverviewWallpaperController() {
Shell::Get()->tablet_mode_controller()->AddObserver(this);
}
OverviewWallpaperController::~OverviewWallpaperController() = default;
void OverviewWallpaperController::SetDisableChangeWallpaperForTest(
bool disable) {
g_disable_wallpaper_change_for_tests = disable;
}
void OverviewWallpaperController::Blur(bool animate) {
UpdateWallpaper(true, animate);
}
void OverviewWallpaperController::Unblur() {
UpdateWallpaper(false, true);
}
void OverviewWallpaperController::OnTabletModeStarted() {
UpdateWallpaper(wallpaper_blurred_, absl::nullopt);
}
void OverviewWallpaperController::OnTabletModeEnded() {
UpdateWallpaper(wallpaper_blurred_, absl::nullopt);
}
void OverviewWallpaperController::OnTabletControllerDestroyed() {
Shell::Get()->tablet_mode_controller()->RemoveObserver(this);
}
void OverviewWallpaperController::UpdateWallpaper(
bool should_blur,
absl::optional<bool> animate) {
if (!IsWallpaperChangeAllowed())
return;
if (Shell::Get()->session_controller()->IsUserSessionBlocked())
return;
float blur = GetBlur(should_blur);
for (aura::Window* root : Shell::Get()->GetAllRootWindows()) {
auto* wallpaper_widget_controller = GetWallpaperWidgetController(root);
if (blur == wallpaper_widget_controller->GetWallpaperBlur())
continue;
if (!animate.has_value()) {
wallpaper_widget_controller->SetWallpaperBlur(blur);
continue;
}
const bool should_animate = ShouldAnimateWallpaper(root);
if (should_blur && should_animate != animate.value())
continue;
wallpaper_widget_controller->SetWallpaperBlur(
blur, should_animate ? kBlurSlideDuration : base::TimeDelta());
}
wallpaper_blurred_ = should_blur;
}
}