#include "ash/drag_drop/tab_drag_drop_windows_hider.h"
#include "base/memory/raw_ptr.h"
#include <vector>
#include "ash/app_list/app_list_controller_impl.h"
#include "ash/public/cpp/style/color_provider.h"
#include "ash/public/cpp/window_backdrop.h"
#include "ash/public/cpp/window_properties.h"
#include "ash/root_window_controller.h"
#include "ash/shell.h"
#include "ash/wallpaper/views/wallpaper_widget_controller.h"
#include "ash/wm/mru_window_tracker.h"
#include "ash/wm/overview/overview_controller.h"
#include "ui/aura/window.h"
#include "ui/compositor/scoped_layer_animation_settings.h"
#include "ui/wm/core/scoped_animation_disabler.h"
namespace ash {
TabDragDropWindowsHider::TabDragDropWindowsHider(aura::Window* source_window)
: source_window_(source_window) {
DCHECK(source_window_);
root_window_ = source_window_->GetRootWindow();
WindowBackdrop::Get(source_window_)->DisableBackdrop();
DCHECK(!Shell::Get()->overview_controller()->InOverviewSession());
std::vector<raw_ptr<aura::Window, VectorExperimental>> windows =
Shell::Get()->mru_window_tracker()->BuildMruWindowList(kActiveDesk);
for (aura::Window* window : windows) {
if (window == source_window_ || window->GetRootWindow() != root_window_) {
continue;
}
window_visibility_map_.emplace(window, window->IsVisible());
if (window->IsVisible()) {
wm::ScopedAnimationDisabler disabler(window);
window->Hide();
}
window->AddObserver(this);
}
Shell::Get()->app_list_controller()->OnWindowDragStarted();
RootWindowController::ForWindow(root_window_)
->wallpaper_widget_controller()
->SetWallpaperBlur(ColorProvider::kBackgroundBlurSigma);
root_window_->AddObserver(this);
}
TabDragDropWindowsHider::~TabDragDropWindowsHider() {
if (source_window_) {
WindowBackdrop::Get(source_window_)->RestoreBackdrop();
}
for (auto iter = window_visibility_map_.begin();
iter != window_visibility_map_.end(); ++iter) {
iter->first->RemoveObserver(this);
if (iter->second) {
wm::ScopedAnimationDisabler disabler(iter->first);
iter->first->Show();
}
}
DCHECK(!Shell::Get()->overview_controller()->InOverviewSession());
Shell::Get()->app_list_controller()->OnWindowDragEnded(
false);
if (root_window_) {
RootWindowController::ForWindow(root_window_)
->wallpaper_widget_controller()
->SetWallpaperBlur(wallpaper_constants::kClear);
root_window_->RemoveObserver(this);
}
}
void TabDragDropWindowsHider::OnWindowDestroying(aura::Window* window) {
if (window == source_window_) {
source_window_ = nullptr;
return;
}
if (window == root_window_) {
root_window_ = nullptr;
return;
}
window->RemoveObserver(this);
window_visibility_map_.erase(window);
}
void TabDragDropWindowsHider::OnWindowVisibilityChanged(aura::Window* window,
bool visible) {
if (window_visibility_map_.count(window) == 0) {
return;
}
if (visible) {
window->Hide();
window_visibility_map_[window] = visible;
}
}
int TabDragDropWindowsHider::GetWindowVisibilityMapSizeForTesting() const {
return window_visibility_map_.size();
}
}