11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef COMPONENTS_SIGNIN_CORE_BROWSER_ACCOUNT_TRACKER_SERVICE_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define COMPONENTS_SIGNIN_CORE_BROWSER_ACCOUNT_TRACKER_SERVICE_H_ 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <map> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string> 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector> 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/keyed_service/core/keyed_service.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "google_apis/gaia/oauth2_token_service.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AccountInfoFetcher; 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass OAuth2TokenService; 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PrefService; 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace base { 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DictionaryValue; 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// AccountTrackerService is a KeyedService that retrieves and caches GAIA 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// information about Google Accounts. 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AccountTrackerService : public KeyedService, 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public OAuth2TokenService::Observer { 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Name of the preference property that persists the account information 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // tracked by this service. 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const char kAccountInfoPref[]; 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Information about a specific account. 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct AccountInfo { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string account_id; // The account ID used by OAuth2TokenService. 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string gaia; 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string email; 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(rogerta): eventually this structure will include other information 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // about the account, like full name, profile picture URL, etc. 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Clients of AccountTrackerService can implement this interface and register 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // with AddObserver() to learn about account information changes. 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class Observer { 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~Observer() {} 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnAccountUpdated(const AccountInfo& info) = 0; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnAccountRemoved(const AccountInfo& info) = 0; 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Possible values for the kAccountIdMigrationState preference. 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum AccountIdMigrationState { 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MIGRATION_NOT_STARTED, 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MIGRATION_IN_PROGRESS, 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MIGRATION_DONE 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AccountTrackerService(); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~AccountTrackerService(); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // KeyedService implementation. 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Shutdown() OVERRIDE; 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void AddObserver(Observer* observer); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RemoveObserver(Observer* observer); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Initialize(OAuth2TokenService* token_service, 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefService* pref_service, 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::URLRequestContextGetter* request_context_getter); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns the list of known accounts and for which gaia IDs 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // have been fetched. 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<AccountInfo> GetAccounts() const; 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AccountInfo GetAccountInfo(const std::string& account_id); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AccountInfo FindAccountInfoByGaiaId(const std::string& gaia_id); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AccountInfo FindAccountInfoByEmail(const std::string& email); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Indicates if all user information has been fetched. If the result is false, 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // there are still unfininshed fetchers. 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool IsAllUserInfoFetched() const; 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AccountIdMigrationState GetMigrationState(); 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static AccountIdMigrationState GetMigrationState(PrefService* pref_service); 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci friend class AccountInfoFetcher; 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // These methods are called by fetchers. 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnUserInfoFetchSuccess(AccountInfoFetcher* fetcher, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::DictionaryValue* user_info); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnUserInfoFetchFailure(AccountInfoFetcher* fetcher); 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // OAuth2TokenService::Observer implementation. 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE; 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnRefreshTokenRevoked(const std::string& account_id) OVERRIDE; 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct AccountState { 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AccountInfo info; 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void NotifyAccountUpdated(const AccountState& state); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void NotifyAccountRemoved(const AccountState& state); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void StartTrackingAccount(const std::string& account_id); 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void StopTrackingAccount(const std::string& account_id); 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Virtual so that tests can override the network fetching behaviour. 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void StartFetchingUserInfo(const std::string& account_id); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DeleteFetcher(AccountInfoFetcher* fetcher); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Load the current state of the account info from the preferences file. 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void LoadFromPrefs(); 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SaveToPrefs(const AccountState& account); 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RemoveFromPrefs(const AccountState& account); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void LoadFromTokenService(); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OAuth2TokenService* token_service_; // Not owned. 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefService* pref_service_; // Not owned. 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<net::URLRequestContextGetter> request_context_getter_; 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::map<std::string, AccountInfoFetcher*> user_info_requests_; 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::map<std::string, AccountState> accounts_; 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ObserverList<Observer> observer_list_; 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool shutdown_called_; 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(AccountTrackerService); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // COMPONENTS_SIGNIN_CORE_BROWSER_ACCOUNT_TRACKER_SERVICE_H_ 130