| // Copyright 2023 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_UI_ASH_PICKER_PICKER_CLIENT_IMPL_H_ |
| #define CHROME_BROWSER_UI_ASH_PICKER_PICKER_CLIENT_IMPL_H_ |
| |
| #include <cstdint> |
| #include <memory> |
| #include <optional> |
| #include <string> |
| #include <vector> |
| |
| #include "ash/public/cpp/app_list/app_list_types.h" |
| #include "ash/public/cpp/picker/picker_category.h" |
| #include "ash/public/cpp/picker/picker_client.h" |
| #include "ash/public/cpp/picker/picker_web_paste_target.h" |
| #include "base/memory/weak_ptr.h" |
| #include "chrome/browser/ash/app_list/app_list_controller_delegate.h" |
| #include "chrome/browser/ash/app_list/search/ranking/ranker_manager.h" |
| #include "chrome/browser/ash/input_method/editor_announcer.h" |
| #include "chrome/browser/ash/login/session/user_session_manager.h" |
| #include "chrome/browser/ui/ash/picker/picker_link_suggester.h" |
| #include "ui/base/page_transition_types.h" |
| #include "ui/base/window_open_disposition.h" |
| #include "url/gurl.h" |
| |
| class PrefService; |
| class Profile; |
| class ChromeSearchResult; |
| class PickerFileSuggester; |
| class PickerThumbnailLoader; |
| |
| namespace app_list { |
| class SearchEngine; |
| class SearchProvider; |
| struct CategoryMetadata; |
| } |
| |
| namespace ash { |
| class PickerController; |
| } |
| |
| namespace aura { |
| class Window; |
| } |
| |
| namespace user_manager { |
| class User; |
| } |
| |
| // Implements the PickerClient used by Ash. |
| class PickerClientImpl |
| : public ash::PickerClient, |
| public user_manager::UserManager::UserSessionStateObserver { |
| public: |
| // Sets this instance as the client of `controller`. |
| // Automatically unsets the client when this instance is destroyed. |
| // `manager` needs to outlive this class. |
| explicit PickerClientImpl(ash::PickerController* controller, |
| user_manager::UserManager* user_manager); |
| PickerClientImpl(const PickerClientImpl&) = delete; |
| PickerClientImpl& operator=(const PickerClientImpl&) = delete; |
| ~PickerClientImpl() override; |
| |
| // ash::PickerClient: |
| void StartCrosSearch(const std::u16string& query, |
| std::optional<ash::PickerCategory> category, |
| CrosSearchResultsCallback callback) override; |
| void StopCrosQuery() override; |
| bool IsEligibleForEditor() override; |
| ShowEditorCallback CacheEditorContext() override; |
| void GetSuggestedEditorResults( |
| SuggestedEditorResultsCallback callback) override; |
| void GetRecentLocalFileResults(size_t max_files, |
| RecentFilesCallback callback) override; |
| void GetRecentDriveFileResults(size_t max_files, |
| RecentFilesCallback callback) override; |
| void GetSuggestedLinkResults(size_t max_results, |
| SuggestedLinksCallback callback) override; |
| bool IsFeatureAllowedForDogfood() override; |
| void FetchFileThumbnail(const base::FilePath& path, |
| const gfx::Size& size, |
| FetchFileThumbnailCallback callback) override; |
| PrefService* GetPrefs() override; |
| std::optional<ash::PickerWebPasteTarget> GetWebPasteTarget() override; |
| void Announce(std::u16string_view message) override; |
| |
| // user_manager::UserManager::UserSessionStateObserver: |
| void ActiveUserChanged(user_manager::User* active_user) override; |
| |
| void set_ranker_manager_for_test( |
| std::unique_ptr<app_list::RankerManager> ranker_manager) { |
| ranker_manager_ = std::move(ranker_manager); |
| } |
| |
| PickerLinkSuggester* get_link_suggester_for_test() { |
| return link_suggester_.get(); |
| } |
| |
| private: |
| // Implements `AppListControllerDelegate` with empty methods. Used only for |
| // constructing search engine providers. |
| class PickerAppListControllerDelegate : public AppListControllerDelegate { |
| public: |
| PickerAppListControllerDelegate(); |
| ~PickerAppListControllerDelegate() override; |
| |
| // AppListControllerDelegate overrides: |
| void DismissView() override; |
| aura::Window* GetAppListWindow() override; |
| int64_t GetAppListDisplayId() override; |
| bool IsAppPinned(const std::string& app_id) override; |
| bool IsAppOpen(const std::string& app_id) const override; |
| void PinApp(const std::string& app_id) override; |
| void UnpinApp(const std::string& app_id) override; |
| Pinnable GetPinnable(const std::string& app_id) override; |
| void CreateNewWindow(bool incognito, |
| bool should_trigger_session_restore) override; |
| void OpenURL(Profile* profile, |
| const GURL& url, |
| ui::PageTransition transition, |
| WindowOpenDisposition disposition) override; |
| }; |
| |
| void OnCrosSearchResultsUpdated( |
| CrosSearchResultsCallback callback, |
| ash::AppListSearchResultType result_type, |
| std::vector<std::unique_ptr<ChromeSearchResult>> results); |
| void SetProfileByUser(const user_manager::User* user); |
| void SetProfile(Profile* profile); |
| |
| std::unique_ptr<app_list::SearchProvider> |
| CreateOmniboxProvider(bool bookmarks, bool history, bool open_tabs); |
| std::unique_ptr<app_list::SearchProvider> CreateSearchProviderForCategory( |
| ash::PickerCategory category); |
| |
| void ShowEditor(std::optional<std::string> preset_query_id, |
| std::optional<std::string> freeform_text); |
| |
| ash::input_method::EditorLiveRegionAnnouncer announcer_; |
| |
| raw_ptr<ash::PickerController> controller_ = nullptr; |
| raw_ptr<Profile> profile_ = nullptr; |
| |
| std::unique_ptr<app_list::SearchEngine> search_engine_; |
| PickerAppListControllerDelegate app_list_controller_delegate_; |
| |
| // A dedicated cros search engine for filtered searches. |
| std::unique_ptr<app_list::SearchEngine> filtered_search_engine_; |
| std::optional<ash::PickerCategory> current_filter_category_; |
| |
| std::unique_ptr<app_list::RankerManager> ranker_manager_; |
| std::vector<app_list::CategoryMetadata> ranker_categories_; |
| |
| std::unique_ptr<PickerFileSuggester> file_suggester_; |
| std::unique_ptr<PickerLinkSuggester> link_suggester_; |
| std::unique_ptr<PickerThumbnailLoader> thumbnail_loader_; |
| |
| base::ScopedObservation<user_manager::UserManager, |
| user_manager::UserManager::UserSessionStateObserver> |
| user_session_state_observation_{this}; |
| |
| base::WeakPtrFactory<PickerClientImpl> weak_factory_{this}; |
| }; |
| |
| #endif // CHROME_BROWSER_UI_ASH_PICKER_PICKER_CLIENT_IMPL_H_ |