blob: b195d6371a842ff4ba2d554ee6a3f19aa4713845 [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_MIXER_H_
#define CHROME_BROWSER_UI_APP_LIST_SEARCH_MIXER_H_
#include "base/basictypes.h"
#include "base/memory/scoped_vector.h"
#include "chrome/browser/ui/app_list/search/history_types.h"
#include "ui/app_list/app_list_model.h"
namespace app_list {
class SearchProvider;
// Mixer collects results from providers, sorts them and publishes them to the
// SearchResults UI model. The targeted results have 6 slots to hold the
// result. These slots could be viewed as having three groups: main group
// (local apps and contacts), omnibox group and web store group. The
// main group takes no more than 4 slots. The web store takes no more than 2
// slots. The omnibox group takes all the remaining slots.
class Mixer {
public:
// The enum represents mixer groups. Note this must matches the order
// of group creation in Init().
enum GroupId {
MAIN_GROUP = 0,
OMNIBOX_GROUP = 1,
WEBSTORE_GROUP = 2,
PEOPLE_GROUP = 3,
};
explicit Mixer(AppListModel::SearchResults* ui_results);
~Mixer();
// Creates mixer groups.
void Init();
// Associates a provider with a mixer group.
void AddProviderToGroup(GroupId group, SearchProvider* provider);
// Collects the results, sorts and publishes them.
void MixAndPublish(const KnownResults& known_results);
private:
class Group;
typedef ScopedVector<Group> Groups;
void FetchResults(const KnownResults& known_results);
AppListModel::SearchResults* ui_results_; // Not owned.
Groups groups_;
DISALLOW_COPY_AND_ASSIGN(Mixer);
};
} // namespace app_list
#endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_MIXER_H_