blob: a0651dff952fa9e9ceee7ad68a8b2d63d2873b3d [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_CONTROLLER_H_
#define CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_CONTROLLER_H_
#include <stddef.h>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/callback.h"
#include "base/containers/flat_map.h"
#include "base/logging.h"
#include "base/observer_list_types.h"
#include "chrome/browser/ui/app_list/search/mixer.h"
#include "chrome/browser/ui/app_list/search/ranking/launch_data.h"
#include "chrome/browser/ui/app_list/search/ranking/types.h"
class ChromeSearchResult;
namespace ash {
enum class AppListSearchResultType;
}
namespace app_list {
class SearchProvider;
enum class RankingItemType;
// Common types used throughout result ranking.
using Results = std::vector<std::unique_ptr<ChromeSearchResult>>;
using ResultsMap = base::flat_map<ProviderType, Results>;
// Controller that collects query from given SearchBoxModel, dispatches it
// to all search providers, then invokes the mixer to mix and to publish the
// results to the given SearchResults UI model.
//
// TODO(crbug.com/1199206): The SearchController is being reimplemented with
// a different ranking system. Once this reimplementation is finished, this pure
// virtual class can be removed and replaced with SearchControllerImplNew.
class SearchController {
public:
using ResultsChangedCallback =
base::RepeatingCallback<void(ash::AppListSearchResultType)>;
class Observer : public base::CheckedObserver {
public:
// Called whenever results are added to the launcher, as a result of
// zero-state or from a user query. This will be called multiple times per
// query because launcher results arrive incrementally.
//
// Observers should not store the ChromeSearchResult* pointers or post them
// to another sequence because they may be invalidated.
virtual void OnResultsAdded(
const std::u16string& query,
const std::vector<const ChromeSearchResult*>& results) {}
// Called whenever old results are cleared. This occurs whenever a new
// search is started.
virtual void OnResultsCleared() {}
};
virtual ~SearchController() {}
virtual void InitializeRankers() {}
virtual void StartSearch(const std::u16string& query) = 0;
virtual void StartZeroState(base::OnceClosure on_done,
base::TimeDelta timeout) = 0;
// TODO(crbug.com/1199206): We should rename this to AppListClosing for
// consistency with AppListShown.
virtual void ViewClosing() = 0;
virtual void OpenResult(ChromeSearchResult* result, int event_flags) = 0;
virtual void InvokeResultAction(ChromeSearchResult* result,
ash::SearchResultActionType action) = 0;
// Adds a new mixer group. See Mixer::AddGroup.
virtual size_t AddGroup(size_t max_results) = 0;
// Takes ownership of |provider| and associates it with given mixer group.
virtual void AddProvider(size_t group_id,
std::unique_ptr<SearchProvider> provider) = 0;
// Update the controller with the given results. Used only if the categorical
// search feature flag is enabled.
virtual void SetResults(const SearchProvider* provider, Results results) = 0;
virtual ChromeSearchResult* FindSearchResult(
const std::string& result_id) = 0;
virtual ChromeSearchResult* GetResultByTitleForTest(
const std::string& title) = 0;
// Sends training signal to each |providers_|
virtual void Train(LaunchData&& launch_data) = 0;
// Invoked when the app list is shown.
virtual void AppListShown() = 0;
// Gets the length of the most recent query.
// TODO(crbug.com/1199206): This should be replaced with calls to
// get_query().size().
virtual int GetLastQueryLength() const = 0;
// TODO(crbug.com/1199206): This is unused and can be deleted.
// Called when items in the results list have been on screen for some amount
// of time, or the user clicked a search result.
virtual void OnSearchResultsImpressionMade(
const std::u16string& trimmed_query,
const ash::SearchResultIdWithPositionIndices& results,
int launched_index) = 0;
virtual void AddObserver(Observer* observer) = 0;
virtual void RemoveObserver(Observer* observer) = 0;
virtual std::u16string get_query() = 0;
virtual base::Time session_start() = 0;
virtual void set_results_changed_callback_for_test(
ResultsChangedCallback callback) = 0;
virtual void disable_ranking_for_test() = 0;
};
} // namespace app_list
#endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_CONTROLLER_H_