| // 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/printing_metrics_ash.h" |
| |
| #include "base/functional/bind.h" |
| #include "base/notreached.h" |
| #include "chrome/browser/ash/crosapi/print_job_info_idl_conversions.h" |
| #include "chrome/browser/ash/printing/history/print_job_history_service.h" |
| #include "chrome/browser/ash/printing/history/print_job_history_service_factory.h" |
| #include "chrome/browser/ash/printing/history/print_job_info.pb.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| |
| namespace crosapi { |
| |
| PrintingMetricsForProfileAsh::PrintingMetricsForProfileAsh( |
| Profile* profile, |
| mojo::PendingRemote<crosapi::mojom::PrintJobObserverForProfile> observer) |
| : profile_(profile), observer_(std::move(observer)) { |
| auto* history_service = |
| ash::PrintJobHistoryServiceFactory::GetForBrowserContext(profile_); |
| // The print job history service is not available on the lock screen. |
| if (history_service) { |
| print_job_history_service_observation_.Observe(history_service); |
| } |
| } |
| |
| PrintingMetricsForProfileAsh::~PrintingMetricsForProfileAsh() = default; |
| |
| void PrintingMetricsForProfileAsh::GetPrintJobs(GetPrintJobsCallback callback) { |
| ash::PrintJobHistoryServiceFactory::GetForBrowserContext(profile_) |
| ->GetPrintJobs( |
| base::BindOnce(&PrintingMetricsForProfileAsh::OnPrintJobsRetrieved, |
| weak_factory_.GetWeakPtr(), std::move(callback))); |
| } |
| |
| void PrintingMetricsForProfileAsh::OnPrintJobFinished( |
| const ash::printing::proto::PrintJobInfo& print_job_info) { |
| auto dict_value = |
| extensions::PrintJobInfoProtoToIdl(print_job_info).ToValue(); |
| observer_->OnPrintJobFinished(base::Value(std::move(dict_value))); |
| } |
| |
| void PrintingMetricsForProfileAsh::OnShutdown() { |
| // ash::PrintJobHistoryService might go out of scope earlier than the ash |
| // service since we don't declare any factory dependencies here. Therefore |
| // it's safer to reset the observer at this point. |
| print_job_history_service_observation_.Reset(); |
| } |
| |
| void PrintingMetricsForProfileAsh::OnPrintJobsRetrieved( |
| GetPrintJobsCallback callback, |
| bool success, |
| std::vector<ash::printing::proto::PrintJobInfo> print_job_infos) { |
| if (!success) { |
| std::move(callback).Run(/*print_jobs=*/{}); |
| return; |
| } |
| |
| std::vector<base::Value> print_job_info_values; |
| for (const auto& print_job_info : print_job_infos) { |
| auto dict_value = |
| extensions::PrintJobInfoProtoToIdl(print_job_info).ToValue(); |
| print_job_info_values.emplace_back(std::move(dict_value)); |
| } |
| |
| std::move(callback).Run(std::move(print_job_info_values)); |
| } |
| |
| PrintingMetricsAsh::PrintingMetricsAsh() = default; |
| PrintingMetricsAsh::~PrintingMetricsAsh() = default; |
| |
| void PrintingMetricsAsh::RegisterForMainProfile( |
| mojo::PendingReceiver<crosapi::mojom::PrintingMetricsForProfile> receiver, |
| mojo::PendingRemote<crosapi::mojom::PrintJobObserverForProfile> observer) { |
| RegisterForProfile(ProfileManager::GetPrimaryUserProfile(), |
| std::move(receiver), std::move(observer)); |
| } |
| |
| void PrintingMetricsAsh::RegisterForProfile( |
| Profile* profile, |
| mojo::PendingReceiver<crosapi::mojom::PrintingMetricsForProfile> receiver, |
| mojo::PendingRemote<crosapi::mojom::PrintJobObserverForProfile> observer) { |
| DCHECK(profile); |
| auto service = std::make_unique<PrintingMetricsForProfileAsh>( |
| profile, std::move(observer)); |
| receivers_.Add(std::move(service), std::move(receiver)); |
| } |
| |
| void PrintingMetricsAsh::BindReceiver( |
| mojo::PendingReceiver<crosapi::mojom::PrintingMetrics> receiver) { |
| crosapi_receivers_.Add(this, std::move(receiver)); |
| } |
| |
| } // namespace crosapi |