picker: Add CrOS Search engine to `PickerClientImpl`

At the moment, `PickerClientImpl::StartCrosSearch` does not return any
search results as there are no providers added to the search engine.

Bug: b:316936687
Change-Id: Ie0d212cbdbf06350740cfc1934e4f34874de0fa9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5251929
Reviewed-by: Darren Shen <shend@chromium.org>
Commit-Queue: Michael Cui <mlcui@google.com>
Cr-Commit-Position: refs/heads/main@{#1257225}
diff --git a/chrome/browser/ui/ash/picker/picker_client_impl.cc b/chrome/browser/ui/ash/picker/picker_client_impl.cc
index 4b6e626..b09899c 100644
--- a/chrome/browser/ui/ash/picker/picker_client_impl.cc
+++ b/chrome/browser/ui/ash/picker/picker_client_impl.cc
@@ -14,6 +14,8 @@
 #include "base/check.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "chrome/browser/ash/app_list/search/chrome_search_result.h"
+#include "chrome/browser/ash/app_list/search/search_engine.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/ash/ash_web_view_impl.h"
 #include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
@@ -41,6 +43,21 @@
   std::move(callback).Run(std::string());
 }
 
+void OnCrosSearchResultsUpdated(
+    PickerClientImpl::CrosSearchResultsCallback callback,
+    ash::AppListSearchResultType result_type,
+    std::vector<std::unique_ptr<ChromeSearchResult>> results) {
+  std::vector<ash::PickerSearchResult> picker_results;
+
+  picker_results.reserve(results.size());
+  for (std::unique_ptr<ChromeSearchResult>& result : results) {
+    // TODO: b/316936687 - Handle results for each provider.
+    picker_results.push_back(ash::PickerSearchResult::Text(result->title()));
+  }
+
+  callback.Run(result_type, std::move(picker_results));
+}
+
 }  // namespace
 
 PickerClientImpl::PickerClientImpl(ash::PickerController* controller)
@@ -118,9 +135,10 @@
 
 void PickerClientImpl::StartCrosSearch(const std::u16string& query,
                                        CrosSearchResultsCallback callback) {
-  // TODO: b/316936687 - Call CrOS Search here.
-  callback.Run(ash::AppListSearchResultType::kOmnibox,
-               {ash::PickerSearchResult::Text(query)});
+  CHECK(search_engine_);
+  search_engine_->StartSearch(
+      query, app_list::SearchOptions(),
+      base::BindRepeating(&OnCrosSearchResultsUpdated, std::move(callback)));
 }
 
 void PickerClientImpl::ActiveUserChanged(user_manager::User* active_user) {
@@ -141,5 +159,11 @@
 }
 
 void PickerClientImpl::SetProfile(Profile* profile) {
+  if (profile_ == profile) {
+    return;
+  }
+
   profile_ = profile;
+
+  search_engine_ = std::make_unique<app_list::SearchEngine>(profile_);
 }
diff --git a/chrome/browser/ui/ash/picker/picker_client_impl.h b/chrome/browser/ui/ash/picker/picker_client_impl.h
index ba47d2b5..ccac318 100644
--- a/chrome/browser/ui/ash/picker/picker_client_impl.h
+++ b/chrome/browser/ui/ash/picker/picker_client_impl.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_UI_ASH_PICKER_PICKER_CLIENT_IMPL_H_
 #define CHROME_BROWSER_UI_ASH_PICKER_PICKER_CLIENT_IMPL_H_
 
+#include <memory>
 #include <string>
 
 #include "ash/public/cpp/picker/picker_client.h"
@@ -13,6 +14,10 @@
 
 class Profile;
 
+namespace app_list {
+class SearchEngine;
+}
+
 namespace ash {
 class PickerController;
 }
@@ -51,6 +56,8 @@
   raw_ptr<ash::PickerController> controller_ = nullptr;
   raw_ptr<Profile> profile_ = nullptr;
 
+  std::unique_ptr<app_list::SearchEngine> search_engine_;
+
   base::WeakPtrFactory<PickerClientImpl> weak_factory_{this};
 };