#ifndef SERVICES_SCREEN_AI_SCREEN_AI_SERVICE_IMPL_H_
#define SERVICES_SCREEN_AI_SCREEN_AI_SERVICE_IMPL_H_
#include <string>
#include "base/containers/flat_map.h"
#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/functional/callback.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "build/build_config.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.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"
#include "services/screen_ai/screen_ai_library_wrapper.h"
namespace ui {
class AXTree;
}
namespace screen_ai {
class ModelDataHolder;
class ScreenAIService : public mojom::ScreenAIServiceFactory,
public mojom::OCRService,
public mojom::MainContentExtractionService,
public mojom::ScreenAIAnnotator,
public mojom::Screen2xMainContentExtractor {
public:
explicit ScreenAIService(
mojo::PendingReceiver<mojom::ScreenAIServiceFactory> receiver);
ScreenAIService(const ScreenAIService&) = delete;
ScreenAIService& operator=(const ScreenAIService&) = delete;
~ScreenAIService() override;
static ui::AXNodeID ComputeMainNodeForTesting(
const ui::AXTree* tree,
const std::vector<ui::AXNodeID>& content_node_ids);
private:
std::unique_ptr<ScreenAILibraryWrapper> library_;
void LoadLibrary(const base::FilePath& library_path);
#if BUILDFLAG(IS_CHROMEOS)
void PerformOcrAndReturnAXTreeUpdate(
const SkBitmap& image,
PerformOcrAndReturnAXTreeUpdateCallback callback) override;
#endif
void PerformOcrAndReturnAnnotation(
const SkBitmap& image,
PerformOcrAndReturnAnnotationCallback callback) override;
void SetClientType(mojom::OcrClientType client) override;
void GetMaxImageDimension(GetMaxImageDimensionCallback callback) override;
void SetOCRLightMode(bool enabled) override;
void IsOCRBusy(IsOCRBusyCallback callback) override;
void ExtractMainContent(const ui::AXTreeUpdate& snapshot,
ExtractMainContentCallback callback) override;
void ExtractMainNode(const ui::AXTreeUpdate& snapshot,
ExtractMainNodeCallback callback) override;
void IdentifyMainNode(const ui::AXTreeUpdate& snapshot,
IdentifyMainNodeCallback callback) override;
void SetClientType(mojom::MceClientType client) override;
void InitializeOCR(
const base::FilePath& library_path,
base::flat_map<base::FilePath, base::File> model_files,
mojo::PendingReceiver<mojom::OCRService> ocr_service_receiver,
InitializeOCRCallback callback) override;
void InitializeMainContentExtraction(
const base::FilePath& library_path,
base::flat_map<base::FilePath, base::File> model_files,
mojo::PendingReceiver<mojom::MainContentExtractionService>
main_content_extractor_service_receiver,
InitializeMainContentExtractionCallback callback) override;
void BindShutdownHandler(
mojo::PendingRemote<mojom::ScreenAIServiceShutdownHandler>
shutdown_handler) override;
void BindAnnotator(
mojo::PendingReceiver<mojom::ScreenAIAnnotator> annotator) override;
void BindMainContentExtractor(
mojo::PendingReceiver<mojom::Screen2xMainContentExtractor>
main_content_extractor) override;
bool ExtractMainContentInternalAndRecordMetrics(
const ui::AXTreeUpdate& snapshot,
ui::AXTree& tree,
std::optional<std::vector<int32_t>>& content_node_ids);
std::optional<chrome_screen_ai::VisualAnnotation> PerformOcrAndRecordMetrics(
const SkBitmap& image);
void OcrReceiverDisconnected();
void MceReceiverDisconnected();
void StartShutDownOnIdleTimer();
void ShutDownOnIdle();
uint32_t max_ocr_dimension_ = 0;
base::TimeTicks ocr_last_used_;
base::TimeTicks mce_last_used_;
std::unique_ptr<base::RepeatingTimer> idle_checking_timer_;
mojo::Receiver<mojom::ScreenAIServiceFactory> factory_receiver_;
mojo::Receiver<mojom::OCRService> ocr_receiver_;
mojo::Receiver<mojom::MainContentExtractionService>
main_content_extraction_receiver_;
std::unique_ptr<ModelDataHolder> model_data_holder_;
std::map<mojo::ReceiverId, mojom::OcrClientType> ocr_client_types_;
std::set<mojo::ReceiverId> light_ocr_clients_;
bool last_ocr_light_ = false;
uint32_t ocr_mode_switch_count_ = 0;
std::map<mojo::ReceiverId, mojom::MceClientType> mce_client_types_;
mojo::Remote<mojom::ScreenAIServiceShutdownHandler>
screen_ai_shutdown_handler_;
mojo::ReceiverSet<mojom::ScreenAIAnnotator> screen_ai_annotators_;
mojo::ReceiverSet<mojom::Screen2xMainContentExtractor>
screen2x_main_content_extractors_;
scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
base::WeakPtrFactory<ScreenAIService> weak_ptr_factory_{this};
};
}
#endif