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_PEOPLE_PEOPLE_PROVIDER_H_
6#define CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PEOPLE_PROVIDER_H_
7
8#include "base/basictypes.h"
9#include "base/callback_forward.h"
10#include "base/memory/scoped_ptr.h"
11#include "chrome/browser/ui/app_list/search/common/webservice_search_provider.h"
12#include "google_apis/gaia/oauth2_token_service.h"
13#include "url/gurl.h"
14
15class AppListControllerDelegate;
16
17namespace base {
18class DictionaryValue;
19}
20
21namespace app_list {
22
23namespace test {
24class PeopleProviderTest;
25}
26
27class ChromeSearchResult;
28class JSONResponseFetcher;
29
30// PeopleProvider fetches search results from the web store server.
31// A "Search in web store" result will be returned if the server does not
32// return any results.
33class PeopleProvider : public WebserviceSearchProvider,
34                       public OAuth2TokenService::Consumer {
35 public:
36  explicit PeopleProvider(Profile* profile);
37  virtual ~PeopleProvider();
38
39  // SearchProvider overrides:
40  virtual void Start(const base::string16& query) OVERRIDE;
41  virtual void Stop() OVERRIDE;
42
43  // OAuth2TokenService::Consumer overrides:
44  virtual void OnGetTokenSuccess(
45      const OAuth2TokenService::Request* request,
46      const std::string& access_token,
47      const base::Time& expiration_time) OVERRIDE;
48  virtual void OnGetTokenFailure(
49      const OAuth2TokenService::Request* request,
50      const GoogleServiceAuthError& error) OVERRIDE;
51
52 private:
53  friend class app_list::test::PeopleProviderTest;
54
55  // Start a request for getting the access token for people search.
56  void RequestAccessToken();
57  // Invalidate our existing token so a new one can be fetched.
58  void InvalidateToken();
59
60  // Get the full people search query URL. This URL includes the OAuth refresh
61  // token for authenticating the current user.
62  GURL GetQueryUrl(const std::string& query);
63
64  // Start the search request with |query_|.
65  void StartQuery();
66
67  // Callback for people search results being fetched.
68  void OnPeopleSearchFetched(scoped_ptr<base::DictionaryValue> json);
69  void ProcessPeopleSearchResults(const base::DictionaryValue* json);
70  scoped_ptr<ChromeSearchResult> CreateResult(
71      const base::DictionaryValue& dict);
72
73  // Setup the various variables that we override for testing.
74  void SetupForTest(const base::Closure& people_search_fetched_callback,
75                    const GURL& people_search_url);
76
77  scoped_ptr<JSONResponseFetcher> people_search_;
78  base::Closure people_search_fetched_callback_;
79
80  std::string access_token_;
81  scoped_ptr<OAuth2TokenService::Request> access_token_request_;
82  OAuth2TokenService::ScopeSet oauth2_scope_;
83
84  // The current query.
85  std::string query_;
86  GURL people_search_url_;
87
88  bool skip_request_token_for_test_;
89
90  DISALLOW_COPY_AND_ASSIGN(PeopleProvider);
91};
92
93}  // namespace app_list
94
95#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PEOPLE_PROVIDER_H_
96