blob: 043dedde3097496bf502bf054c511427cac22528 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/full_restore/arc_window_handler.h"
#include "chrome/browser/chromeos/full_restore/arc_ghost_window_shell_surface.h"
#include "chrome/browser/chromeos/full_restore/arc_window_utils.h"
#include "components/exo/shell_surface_util.h"
#include "components/exo/wm_helper.h"
#include "components/full_restore/app_restore_data.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/views/background.h"
namespace chromeos {
namespace full_restore {
ArcWindowHandler::WindowSessionResolver::WindowSessionResolver(
ShellSurfaceMap* session_id_map)
: session_id_map_(session_id_map) {}
void ArcWindowHandler::WindowSessionResolver::PopulateProperties(
const Params& params,
ui::PropertyHandler& out_properties_container) {
if (params.window_session_id <= 0)
return;
auto it = session_id_map_->find(params.window_session_id);
if (it != session_id_map_->end()) {
if (it->second->HasOverlay())
it->second->RemoveOverlay();
SetShellClientControlledShellSurface(&out_properties_container,
it->second.release());
session_id_map_->erase(it);
}
}
ArcWindowHandler::ArcWindowHandler() {
exo::WMHelper::GetInstance()->RegisterAppPropertyResolver(
std::make_unique<WindowSessionResolver>(&session_id_to_shell_surface_));
}
ArcWindowHandler::~ArcWindowHandler() = default;
void ArcWindowHandler::LaunchArcGhostWindow(
const std::string& app_id,
int32_t session_id,
::full_restore::AppRestoreData* restore_data) {
DCHECK(restore_data);
DCHECK(restore_data->current_bounds.has_value());
DCHECK(restore_data->display_id.has_value());
auto container = std::make_unique<views::View>();
container->SetBackground(views::CreateSolidBackground(SK_ColorWHITE));
session_id_to_shell_surface_.emplace(
session_id,
InitArcGhostWindow(
this, app_id, session_id, restore_data->display_id.value(),
restore_data->current_bounds.value(), std::move(container),
base::BindRepeating(&ArcWindowHandler::CloseWindow,
weak_ptr_factory_.GetWeakPtr(), session_id)));
}
void ArcWindowHandler::CloseWindow(int session_id) {
auto it = session_id_to_shell_surface_.find(session_id);
if (it == session_id_to_shell_surface_.end())
return;
for (auto& observer : observer_list_)
observer.OnWindowCloseRequested(session_id);
session_id_to_shell_surface_.erase(it);
}
void ArcWindowHandler::AddObserver(Observer* observer) {
observer_list_.AddObserver(observer);
}
void ArcWindowHandler::RemoveObserver(Observer* observer) {
observer_list_.RemoveObserver(observer);
}
bool ArcWindowHandler::HasObserver(Observer* observer) {
return observer_list_.HasObserver(observer);
}
void ArcWindowHandler::OnAppInstanceConnected() {
// TODO(sstan): Send existed ghost window info to ARC once ghost window
// has been introduced.
for (auto& observer : observer_list_)
observer.OnAppInstanceConnected();
}
} // namespace full_restore
} // namespace chromeos