Add API to ScreenAI service OCR to set light mode.

The light model is used to restrict the number of scripts to one, which
is Latin, to limit resource usage. APIs are added to set the mode for
each client and get the last running mode for scheduling optimizattion.

AX-Relnotes: n/a
Bug: 412553116
Change-Id: I097577d1562041dfe800348a3e345023c6deaa11
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6651902
Reviewed-by: Mark Schillaci <[email protected]>
Reviewed-by: Kinuko Yasuda <[email protected]>
Commit-Queue: Ramin Halavati <[email protected]>
Reviewed-by: CJ Huang <[email protected]>
Reviewed-by: Kyungjun Lee <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1481536}
diff --git a/services/screen_ai/screen_ai_service_impl.cc b/services/screen_ai/screen_ai_service_impl.cc
index fbc4f76d..d437c57 100644
--- a/services/screen_ai/screen_ai_service_impl.cc
+++ b/services/screen_ai/screen_ai_service_impl.cc
@@ -440,6 +440,14 @@
   base::UmaHistogramEnumeration("Accessibility.ScreenAI.OCR.ClientType",
                                 client_type);
 
+  bool light_client = base::Contains(light_ocr_clients_,
+                                     screen_ai_annotators_.current_receiver());
+  if (light_client != last_ocr_light_) {
+    library_->SetOCRLightMode(light_client);
+    last_ocr_light_ = light_client;
+    ocr_mode_switch_count_++;
+  }
+
   base::TimeTicks start_time = base::TimeTicks::Now();
   base::SequenceBound<HangTimer> hang_timer(background_task_runner_,
                                             /*is_ocr=*/true);
@@ -537,6 +545,19 @@
   std::move(callback).Run(max_ocr_dimension_);
 }
 
+void ScreenAIService::SetOCRLightMode(bool enabled) {
+  const auto client = screen_ai_annotators_.current_receiver();
+  if (enabled) {
+    light_ocr_clients_.insert(client);
+  } else {
+    light_ocr_clients_.erase(client);
+  }
+}
+
+void ScreenAIService::IsOCRBusy(IsOCRBusyCallback callback) {
+  std::move(callback).Run(screen_ai_annotators_.size() > 1);
+}
+
 void ScreenAIService::PerformOcrAndReturnAnnotation(
     const SkBitmap& image,
     PerformOcrAndReturnAnnotationCallback callback) {
@@ -710,6 +731,13 @@
   if (ocr_last_used_ < kIdlenessThreshold &&
       mce_last_used_ < kIdlenessThreshold) {
     screen_ai_shutdown_handler_->ShuttingDownOnIdle();
+
+    // If OCR was used, record the number of times it's mode was switched.
+    if (ocr_last_used_ != base::TimeTicks()) {
+      base::UmaHistogramCounts100("Accessibility.ScreenAI.OCR.ModeSwitch",
+                                  ocr_mode_switch_count_);
+    }
+
     base::Process::TerminateCurrentProcessImmediately(0);
   }
 }