|  | // 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 |