Home | History | Annotate | Download | only in search
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_MIXER_H_
      6 #define CHROME_BROWSER_UI_APP_LIST_SEARCH_MIXER_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/gtest_prod_util.h"
     10 #include "base/memory/scoped_vector.h"
     11 #include "chrome/browser/ui/app_list/search/history_types.h"
     12 #include "ui/app_list/app_list_model.h"
     13 
     14 namespace app_list {
     15 
     16 namespace test {
     17 FORWARD_DECLARE_TEST(MixerTest, Publish);
     18 }
     19 
     20 class ChromeSearchResult;
     21 class SearchProvider;
     22 
     23 // Mixer collects results from providers, sorts them and publishes them to the
     24 // SearchResults UI model. The targeted results have 6 slots to hold the
     25 // result. These slots could be viewed as having three groups: main group
     26 // (local apps and contacts), omnibox group and web store group. The
     27 // main group takes no more than 4 slots. The web store takes no more than 2
     28 // slots. The omnibox group takes all the remaining slots.
     29 class Mixer {
     30  public:
     31   // The enum represents mixer groups. Note this must matches the order
     32   // of group creation in Init().
     33   enum GroupId {
     34     MAIN_GROUP = 0,
     35     OMNIBOX_GROUP = 1,
     36     WEBSTORE_GROUP = 2,
     37     PEOPLE_GROUP = 3,
     38   };
     39 
     40   explicit Mixer(AppListModel::SearchResults* ui_results);
     41   ~Mixer();
     42 
     43   // Creates mixer groups.
     44   void Init();
     45 
     46   // Associates a provider with a mixer group.
     47   void AddProviderToGroup(GroupId group, SearchProvider* provider);
     48 
     49   // Collects the results, sorts and publishes them.
     50   void MixAndPublish(const KnownResults& known_results);
     51 
     52  private:
     53   FRIEND_TEST_ALL_PREFIXES(test::MixerTest, Publish);
     54 
     55   // Used for sorting and mixing results.
     56   struct SortData {
     57     SortData();
     58     SortData(ChromeSearchResult* result, double score);
     59 
     60     bool operator<(const SortData& other) const;
     61 
     62     ChromeSearchResult* result;  // Not owned.
     63     double score;
     64   };
     65   typedef std::vector<Mixer::SortData> SortedResults;
     66 
     67   class Group;
     68   typedef ScopedVector<Group> Groups;
     69 
     70   // Publishes the given |new_results| to |ui_results|, deleting any existing
     71   // results that are not in |new_results|. Results that already exist in
     72   // |ui_results| are reused to avoid flickering caused by icon reload.
     73   static void Publish(const SortedResults& results,
     74                       AppListModel::SearchResults* ui_results);
     75 
     76   // Removes duplicates from |results|.
     77   static void RemoveDuplicates(SortedResults* results);
     78 
     79   void FetchResults(const KnownResults& known_results);
     80 
     81   AppListModel::SearchResults* ui_results_;  // Not owned.
     82   Groups groups_;
     83 
     84   DISALLOW_COPY_AND_ASSIGN(Mixer);
     85 };
     86 
     87 }  // namespace app_list
     88 
     89 #endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_MIXER_H_
     90