| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ash/crosapi/files_app_launcher.h" |
| |
| #include <utility> |
| |
| #include "ash/public/cpp/new_window_delegate.h" |
| #include "base/check.h" |
| #include "chrome/browser/apps/app_service/app_service_proxy_ash.h" |
| #include "chromeos/ash/components/file_manager/app_id.h" |
| |
| namespace crosapi { |
| |
| FilesAppLauncher::FilesAppLauncher(apps::AppServiceProxy* proxy) |
| : proxy_(proxy) {} |
| |
| FilesAppLauncher::~FilesAppLauncher() = default; |
| |
| void FilesAppLauncher::Launch(base::OnceClosure callback) { |
| DCHECK(callback_.is_null()); |
| DCHECK(!callback.is_null()); |
| |
| auto& instance_registry = proxy_->InstanceRegistry(); |
| if (instance_registry.ContainsAppId(file_manager::kFileManagerSwaAppId)) { |
| std::move(callback).Run(); |
| return; |
| } |
| |
| callback_ = std::move(callback); |
| |
| auto& app_registry = proxy_->AppRegistryCache(); |
| bool is_ready = false; |
| app_registry.ForOneApp(file_manager::kFileManagerSwaAppId, |
| [&is_ready](const apps::AppUpdate& update) { |
| is_ready = |
| update.Readiness() == apps::Readiness::kReady; |
| }); |
| if (is_ready) { |
| // Files.app is already ready, so launch it. |
| LaunchInternal(); |
| return; |
| } |
| |
| // Files.app is not yet initialized. Wait for its ready. |
| app_registry_cache_observer_.Observe(&app_registry); |
| } |
| |
| void FilesAppLauncher::LaunchInternal() { |
| // Start observing the launching. |
| instance_registry_observation_.Observe(&proxy_->InstanceRegistry()); |
| |
| // Launching traditional files.app and launching SWA files.app need quite |
| // different procedure. |
| // Use ash::NewWindowDelegate::OpenFileManager that handles the diff nicely. |
| ash::NewWindowDelegate::GetInstance()->OpenFileManager(); |
| } |
| |
| void FilesAppLauncher::OnAppUpdate(const apps::AppUpdate& update) { |
| if (update.AppId() != file_manager::kFileManagerSwaAppId) |
| return; |
| |
| if (update.Readiness() != apps::Readiness::kReady) |
| return; |
| |
| // So it's ready to launch files.app now. |
| // We no longer need to observe the update. |
| app_registry_cache_observer_.Reset(); |
| |
| LaunchInternal(); |
| } |
| |
| void FilesAppLauncher::OnAppRegistryCacheWillBeDestroyed( |
| apps::AppRegistryCache* cache) { |
| app_registry_cache_observer_.Reset(); |
| } |
| |
| void FilesAppLauncher::OnInstanceUpdate(const apps::InstanceUpdate& update) { |
| if (update.AppId() != file_manager::kFileManagerSwaAppId) |
| return; |
| |
| // So launching is progressed. Stop observing and run the callback |
| // to notify the caller of Launch(). |
| instance_registry_observation_.Reset(); |
| std::move(callback_).Run(); |
| } |
| |
| void FilesAppLauncher::OnInstanceRegistryWillBeDestroyed( |
| apps::InstanceRegistry* cache) { |
| instance_registry_observation_.Reset(); |
| } |
| |
| } // namespace crosapi |