people_provider.h revision 1e9bf3e0803691d0a228da41fc608347b6db4340
136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Copyright 2013 The Chromium Authors. All rights reserved.
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Use of this source code is governed by a BSD-style license that can be
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// found in the LICENSE file.
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PEOPLE_PROVIDER_H_
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PEOPLE_PROVIDER_H_
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "base/basictypes.h"
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "base/callback_forward.h"
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "base/memory/scoped_ptr.h"
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "chrome/browser/ui/app_list/search/common/webservice_search_provider.h"
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "google_apis/gaia/oauth2_token_service.h"
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "url/gurl.h"
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass AppListControllerDelegate;
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace base {
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DictionaryValue;
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace app_list {
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace test {
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass PeopleProviderTest;
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass ChromeSearchResult;
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass JSONResponseFetcher;
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// PeopleProvider fetches search results from the web store server.
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// A "Search in web store" result will be returned if the server does not
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// return any results.
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass PeopleProvider : public WebserviceSearchProvider,
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                       public OAuth2TokenService::Consumer {
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines public:
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit PeopleProvider(Profile* profile);
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual ~PeopleProvider();
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // SearchProvider overrides:
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void Start(const base::string16& query) OVERRIDE;
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void Stop() OVERRIDE;
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // OAuth2TokenService::Consumer overrides:
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void OnGetTokenSuccess(
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      const OAuth2TokenService::Request* request,
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      const std::string& access_token,
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      const base::Time& expiration_time) OVERRIDE;
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void OnGetTokenFailure(
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      const OAuth2TokenService::Request* request,
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      const GoogleServiceAuthError& error) OVERRIDE;
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines private:
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  friend class app_list::test::PeopleProviderTest;
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Start a request for getting the access token for people search.
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void RequestAccessToken();
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Invalidate our existing token so a new one can be fetched.
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void InvalidateToken();
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Get the full people search query URL. This URL includes the OAuth refresh
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // token for authenticating the current user.
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  GURL GetQueryUrl(const std::string& query);
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Start the search request with |query_|.
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void StartQuery();
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Callback for people search results being fetched.
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void OnPeopleSearchFetched(scoped_ptr<base::DictionaryValue> json);
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void ProcessPeopleSearchResults(const base::DictionaryValue* json);
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  scoped_ptr<ChromeSearchResult> CreateResult(
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      const base::DictionaryValue& dict);
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Setup the various variables that we override for testing.
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void SetupForTest(const base::Closure& people_search_fetched_callback,
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                    const GURL& people_search_url);
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  scoped_ptr<JSONResponseFetcher> people_search_;
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  base::Closure people_search_fetched_callback_;
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string access_token_;
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  scoped_ptr<OAuth2TokenService::Request> access_token_request_;
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  OAuth2TokenService::ScopeSet oauth2_scope_;
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The current query.
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string query_;
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  GURL people_search_url_;
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool skip_request_token_for_test_;
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DISALLOW_COPY_AND_ASSIGN(PeopleProvider);
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}  // namespace app_list
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PEOPLE_PROVIDER_H_
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines