1 // Copyright 2015 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_LAUNCHER_SEARCH_LAUNCHER_SEARCH_PROVIDER_H_
6 #define CHROME_BROWSER_UI_APP_LIST_SEARCH_LAUNCHER_SEARCH_LAUNCHER_SEARCH_PROVIDER_H_
7 
8 #include <map>
9 #include <memory>
10 #include <vector>
11 
12 #include "base/macros.h"
13 #include "base/strings/string16.h"
14 #include "base/time/time.h"
15 #include "base/timer/timer.h"
16 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/browser/ui/app_list/search/launcher_search/launcher_search_result.h"
18 #include "chrome/browser/ui/app_list/search/search_provider.h"
19 #include "chromeos/components/string_matching/tokenized_string.h"
20 #include "extensions/common/extension_id.h"
21 
22 namespace app_list {
23 
24 // LauncherSearchProvider dispatches queries to extensions and fetches the
25 // results from them via chrome.launcherSearchProvider API.
26 class LauncherSearchProvider : public SearchProvider {
27  public:
28   explicit LauncherSearchProvider(Profile* profile);
29   ~LauncherSearchProvider() override;
30 
31   void Start(const base::string16& query) override;
32   void SetSearchResults(
33       const extensions::ExtensionId& extension_id,
34       std::vector<std::unique_ptr<LauncherSearchResult>> extension_results);
35   ash::AppListSearchResultType ResultType() override;
36 
37  private:
38   // Delays query for |kLauncherSearchProviderQueryDelayInMs|. This dispatches
39   // the latest query after no more calls to Start() for the delay duration.
40   void DelayQuery(const base::Closure& closure);
41 
42   // Dispatches |query| to LauncherSearchProvider service.
43   void StartInternal(const base::string16& query);
44 
45   // The search results of each extension.
46   std::map<extensions::ExtensionId,
47            std::vector<std::unique_ptr<LauncherSearchResult>>>
48       extension_results_;
49 
50   // A timer to delay query.
51   base::OneShotTimer query_timer_;
52 
53   // The timestamp of the last query.
54   base::Time last_query_time_;
55 
56   base::TimeTicks query_start_time_;
57 
58   base::Optional<chromeos::string_matching::TokenizedString>
59       last_tokenized_query_;
60 
61   // The reference to profile to get LauncherSearchProvider service.
62   Profile* profile_;
63 
64   base::WeakPtrFactory<LauncherSearchProvider> weak_ptr_factory_{this};
65 
66   DISALLOW_COPY_AND_ASSIGN(LauncherSearchProvider);
67 };
68 
69 }  // namespace app_list
70 
71 #endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_LAUNCHER_SEARCH_LAUNCHER_SEARCH_PROVIDER_H_
72