blob: 929dcc925f201cf094bde0ba15e0ceccf96f6184 [file] [log] [blame]
// 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.
#ifndef CHROME_BROWSER_SCREEN_AI_SCREEN_AI_SERVICE_ROUTER_H_
#define CHROME_BROWSER_SCREEN_AI_SCREEN_AI_SERVICE_ROUTER_H_
#include <optional>
#include <set>
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/screen_ai/screen_ai_install_state.h"
#include "components/keyed_service/core/keyed_service.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/screen_ai/public/mojom/screen_ai_factory.mojom.h"
#include "services/screen_ai/public/mojom/screen_ai_service.mojom.h"
namespace {
class ComponentFiles;
}
namespace screen_ai {
using ServiceStateCallback = base::OnceCallback<void(bool)>;
class ScreenAIServiceRouter : public KeyedService,
ScreenAIInstallState::Observer {
public:
enum class Service {
kMainContentExtraction,
kOCR,
};
ScreenAIServiceRouter(const ScreenAIServiceRouter&) = delete;
ScreenAIServiceRouter& operator=(const ScreenAIServiceRouter&) = delete;
~ScreenAIServiceRouter() override;
void BindScreenAIAnnotator(
mojo::PendingReceiver<mojom::ScreenAIAnnotator> receiver);
void BindMainContentExtractor(
mojo::PendingReceiver<mojom::Screen2xMainContentExtractor> receiver);
// Schedules library download and initializaes the service if needed, and
// calls `callback` with initialization result when service is ready or
// failed to initialize.
void GetServiceStateAsync(Service service, ServiceStateCallback callback);
// ScreenAIInstallState::Observer:
void StateChanged(ScreenAIInstallState::State state) override;
// Returns true if the connection for `service` is bound.
bool IsConnectionBoundForTesting(Service service);
// Returns true if sandboxed process is running.
bool IsProcessRunningForTesting();
void ShutDownIfNoClientsForTesting() {
if (screen_ai_service_factory_.is_bound()) {
screen_ai_service_factory_->ShutDownIfNoClients();
}
}
private:
friend class ScreenAIServiceRouterFactory;
ScreenAIServiceRouter();
// Initialzies the `service` if it's not already done.
void InitializeServiceIfNeeded(Service service);
void InitializeOCR(base::TimeTicks request_start_time,
mojo::PendingReceiver<mojom::OCRService> receiver,
std::unique_ptr<ComponentFiles> model_files);
void InitializeMainContentExtraction(
base::TimeTicks request_start_time,
mojo::PendingReceiver<mojom::MainContentExtractionService> receiver,
std::unique_ptr<ComponentFiles> model_files);
// Launches the service if it's not already launched.
void LaunchIfNotRunning();
// True if service is already initialized, false if it is disabled, and
// nullopt if not known.
std::optional<bool> GetServiceState(Service service);
// Callback from Screen AI service with library load result.
void SetLibraryLoadState(Service service,
base::TimeTicks request_start_time,
bool successful);
// Calls back all pendnding service state requests.
void CallPendingStatusRequests(Service service, bool successful);
// Called when ScreenAI service factory is disconnected.
void OnScreenAIServiceDisconnected();
// Returns the list of services that have a pending status request.
std::set<Service> GetAllPendingStatusServices();
// Pending requests to receive service state for each service type.
std::map<Service, std::vector<ServiceStateCallback>> pending_state_requests_;
// Observes changes in Screen AI component download state.
base::ScopedObservation<ScreenAIInstallState, ScreenAIInstallState::Observer>
component_ready_observer_{this};
mojo::Remote<mojom::ScreenAIServiceFactory> screen_ai_service_factory_;
mojo::Remote<mojom::OCRService> ocr_service_;
mojo::Remote<mojom::MainContentExtractionService>
main_content_extraction_service_;
base::WeakPtrFactory<ScreenAIServiceRouter> weak_ptr_factory_{this};
};
} // namespace screen_ai
#endif // CHROME_BROWSER_SCREEN_AI_SCREEN_AI_SERVICE_ROUTER_H_