// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/public/cpp/overview_test_api.h"
#include "ash/shell.h"
#include "ash/wm/overview/overview_animation_state_waiter.h"
#include "ash/wm/overview/overview_controller.h"
#include "ash/wm/overview/overview_grid.h"
#include "ash/wm/overview/overview_item.h"
#include "ash/wm/overview/overview_session.h"
#include "ui/views/widget/widget.h"
namespace ash {
OverviewTestApi::OverviewTestApi() = default;
OverviewTestApi::~OverviewTestApi() = default;
void OverviewTestApi::SetOverviewMode(
bool start,
OverviewTestApi::DoneCallback done_callback) {
auto* overview_controller = Shell::Get()->overview_controller();
const bool in_overview_session = overview_controller->InOverviewSession();
if (start && in_overview_session &&
!overview_controller->IsInStartAnimation()) {
std::move(done_callback).Run(true);
return;
}
if (!start && !in_overview_session &&
!overview_controller->IsCompletingShutdownAnimations()) {
std::move(done_callback).Run(true);
return;
}
auto* waiter = new OverviewAnimationStateWaiter(
start ? OverviewAnimationState::kEnterAnimationComplete
: OverviewAnimationState::kExitAnimationComplete,
std::move(done_callback));
const bool animation_started =
start ? overview_controller->StartOverview(OverviewStartAction::kTests)
: overview_controller->EndOverview(OverviewEndAction::kTests);
if (!animation_started)
waiter->Cancel();
}
void OverviewTestApi::WaitForOverviewState(
OverviewAnimationState expected_state,
DoneCallback callback) {
auto* overview_controller = Shell::Get()->overview_controller();
const bool overview_finished_showing =
overview_controller->InOverviewSession() &&
!overview_controller->IsInStartAnimation();
const bool overview_finished_hiding =
!overview_controller->InOverviewSession() &&
!overview_controller->IsCompletingShutdownAnimations();
if ((expected_state == OverviewAnimationState::kEnterAnimationComplete &&
overview_finished_showing) ||
(expected_state == OverviewAnimationState::kExitAnimationComplete &&
overview_finished_hiding)) {
std::move(callback).Run(/*animation_succeeded=*/true);
return;
}
new OverviewAnimationStateWaiter(expected_state, std::move(callback));
}
std::optional<OverviewInfo> OverviewTestApi::GetOverviewInfo() const {
auto* overview_controller = OverviewController::Get();
if (!overview_controller->InOverviewSession())
return std::nullopt;
OverviewInfo info;
for (const auto& grid :
overview_controller->overview_session()->grid_list()) {
for (const auto& overview_item : grid->item_list()) {
aura::Window* const app_window = overview_item->GetWindow();
info[app_window] = {
app_window,
overview_item->item_widget()->GetWindowBoundsInScreen(),
overview_item->IsDragItem(),
};
}
}
return info;
}
} // namespace ash