blob: 7754ded677fea5713016f04b1eb5abe8aa3ebff5 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_QUICK_INSERT_SEARCH_QUICK_INSERT_SEARCH_CONTROLLER_H_
#define ASH_QUICK_INSERT_SEARCH_QUICK_INSERT_SEARCH_CONTROLLER_H_
#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include <vector>
#include "ash/ash_export.h"
#include "ash/quick_insert/quick_insert_category.h"
#include "ash/quick_insert/search/quick_insert_search_aggregator.h"
#include "ash/quick_insert/search/quick_insert_search_request.h"
#include "ash/quick_insert/views/quick_insert_view_delegate.h"
#include "base/containers/span.h"
#include "base/memory/raw_ref.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/types/expected.h"
#include "chromeos/ash/components/emoji/emoji_search.h"
#include "chromeos/ash/components/emoji/gif_tenor_api_fetcher.h"
#include "chromeos/ash/components/emoji/tenor_types.mojom.h"
#include "components/prefs/pref_change_registrar.h"
class PrefService;
namespace ash {
class QuickInsertClient;
class ASH_EXPORT QuickInsertSearchController {
public:
using SearchGifsCallback =
base::OnceCallback<void(std::vector<QuickInsertGifResult> results)>;
explicit QuickInsertSearchController(base::TimeDelta burn_in_period);
QuickInsertSearchController(const QuickInsertSearchController&) = delete;
QuickInsertSearchController& operator=(const QuickInsertSearchController&) =
delete;
~QuickInsertSearchController();
// Adds emoji keywords for enabled languages in `prefs` and whenever the
// enabled languages change. This does not unload any keywords loaded
// previously. `prefs` can be null, which stops this class from listening to
// changes to prefs.
void LoadEmojiLanguagesFromPrefs(PrefService* prefs);
// `client` must remain valid until `StopSearch` is called or until this
// object is destroyed.
void StartSearch(QuickInsertClient* client,
std::u16string_view query,
std::optional<QuickInsertCategory> category,
base::span<const QuickInsertCategory> available_categories,
bool caps_lock_state_to_search,
bool search_case_transforms,
QuickInsertViewDelegate::SearchResultsCallback callback);
void StopSearch();
void StartEmojiSearch(
PrefService* prefs,
std::u16string_view query,
QuickInsertViewDelegate::EmojiSearchResultsCallback callback);
// Gets the emoji name for the given emoji / emoticon / symbol.
// Used for getting emoji tooltips for zero state emoji.
// TODO: b/358492493 - Refactor this out of `QuickInsertSearchController`, as
// this is unrelated to search.
std::string GetEmojiName(std::string_view emoji);
private:
void LoadEmojiLanguages(PrefService* pref);
void OnGifSearchResponse(
SearchGifsCallback callback,
std::u16string gif_search_query,
base::expected<tenor::mojom::PaginatedGifResponsesPtr,
GifTenorApiFetcher::Error> response);
PrefChangeRegistrar pref_change_registrar_;
base::TimeDelta burn_in_period_;
emoji::EmojiSearch emoji_search_;
// The search request calls the aggregator, so the search request should be
// destructed first.
std::unique_ptr<QuickInsertSearchAggregator> aggregator_;
std::unique_ptr<QuickInsertSearchRequest> search_request_;
base::WeakPtrFactory<QuickInsertSearchController> weak_ptr_factory_{this};
};
} // namespace ash
#endif // ASH_QUICK_INSERT_SEARCH_QUICK_INSERT_SEARCH_CONTROLLER_H_