Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Unified Diff: chrome/browser/services/gcm/gcm_profile_service.cc

Issue 378643002: [GCM] Check-in with signed in accounts associates device to user (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Update to the code to prevent test crashes. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/services/gcm/gcm_profile_service.cc
diff --git a/chrome/browser/services/gcm/gcm_profile_service.cc b/chrome/browser/services/gcm/gcm_profile_service.cc
index 3e549a75d447f53b07669601e2cbc5037c61dbd1..4b90897c225bdbe7a0c968f8dbc0ab25815af527 100644
--- a/chrome/browser/services/gcm/gcm_profile_service.cc
+++ b/chrome/browser/services/gcm/gcm_profile_service.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/services/gcm/gcm_profile_service.h"
+#include <map>
+
#include "base/logging.h"
#include "base/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
@@ -13,7 +15,10 @@
#if defined(OS_ANDROID)
#include "components/gcm_driver/gcm_driver_android.h"
#else
+#include "base/bind.h"
#include "base/files/file_path.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/services/gcm/gcm_account_tracker.h"
#include "chrome/browser/services/gcm/gcm_desktop_utils.h"
#include "chrome/browser/signin/profile_identity_provider.h"
#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
@@ -21,7 +26,9 @@
#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
#include "chrome/common/chrome_constants.h"
#include "components/gcm_driver/gcm_client_factory.h"
+#include "components/gcm_driver/gcm_driver_desktop.h"
#include "components/signin/core/browser/signin_manager.h"
+#include "google_apis/gaia/account_tracker.h"
#include "google_apis/gaia/identity_provider.h"
#include "net/url_request/url_request_context_getter.h"
#endif
@@ -29,9 +36,11 @@
namespace gcm {
#if !defined(OS_ANDROID)
+// Identity observer only has actual work to do when the user is actually signed
+// in. It ensures that account tracker is taking
class GCMProfileService::IdentityObserver : public IdentityProvider::Observer {
public:
- IdentityObserver(Profile* profile, GCMDriver* driver);
+ IdentityObserver(Profile* profile, GCMDriverDesktop* driver);
virtual ~IdentityObserver();
// IdentityProvider::Observer:
@@ -40,20 +49,29 @@ class GCMProfileService::IdentityObserver : public IdentityProvider::Observer {
std::string SignedInUserName() const;
+ // Called to inform IdentityObserver that a list of accounts was updated.
+ // |account_tokens| maps email addresses to OAuth2 access tokens.
+ void AccountsUpdated(
+ const std::map<std::string, std::string>& account_tokens);
+
private:
- GCMDriver* driver_;
+ Profile* profile_;
+ GCMDriverDesktop* driver_;
scoped_ptr<IdentityProvider> identity_provider_;
+ scoped_ptr<GCMAccountTracker> gcm_account_tracker_;
// The account ID that this service is responsible for. Empty when the service
// is not running.
std::string account_id_;
+ base::WeakPtrFactory<GCMProfileService::IdentityObserver> weak_ptr_factory_;
+
DISALLOW_COPY_AND_ASSIGN(IdentityObserver);
};
GCMProfileService::IdentityObserver::IdentityObserver(Profile* profile,
- GCMDriver* driver)
- : driver_(driver) {
+ GCMDriverDesktop* driver)
+ : profile_(profile), driver_(driver), weak_ptr_factory_(this) {
identity_provider_.reset(new ProfileIdentityProvider(
SigninManagerFactory::GetForProfile(profile),
ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
@@ -64,6 +82,8 @@ GCMProfileService::IdentityObserver::IdentityObserver(Profile* profile,
}
GCMProfileService::IdentityObserver::~IdentityObserver() {
+ if (gcm_account_tracker_)
+ gcm_account_tracker_->Shutdown();
identity_provider_->RemoveObserver(this);
}
@@ -75,15 +95,38 @@ void GCMProfileService::IdentityObserver::OnActiveAccountLogin() {
account_id_ = account_id;
driver_->OnSignedIn();
+
+ if (!gcm_account_tracker_) {
+ scoped_ptr<gaia::AccountTracker> gaia_account_tracker(
+ new gaia::AccountTracker(identity_provider_.get(),
+ profile_->GetRequestContext()));
+
+ gcm_account_tracker_.reset(new GCMAccountTracker(
+ gaia_account_tracker.Pass(),
+ base::Bind(&GCMProfileService::IdentityObserver::AccountsUpdated,
+ weak_ptr_factory_.GetWeakPtr())));
+ }
+
+ gcm_account_tracker_->Start();
}
void GCMProfileService::IdentityObserver::OnActiveAccountLogout() {
+ // Check is necessary to not crash browser_tests.
+ if (gcm_account_tracker_)
+ gcm_account_tracker_->Stop();
+ // TODO(fgorski): If we purge here, what should happen when we get
+ // OnActiveAccountLogin() right after that?
driver_->Purge();
}
std::string GCMProfileService::IdentityObserver::SignedInUserName() const {
return driver_->IsStarted() ? account_id_ : std::string();
}
+
+void GCMProfileService::IdentityObserver::AccountsUpdated(
+ const std::map<std::string, std::string>& account_tokens) {
+ driver_->SetAccountsForCheckin(account_tokens);
+}
#endif // !defined(OS_ANDROID)
// static
@@ -122,7 +165,8 @@ GCMProfileService::GCMProfileService(
profile_->GetPath().Append(chrome::kGCMStoreDirname),
profile_->GetRequestContext());
- identity_observer_.reset(new IdentityObserver(profile, driver_.get()));
+ identity_observer_.reset(new IdentityObserver(
+ profile, static_cast<gcm::GCMDriverDesktop*>(driver_.get())));
}
#endif // defined(OS_ANDROID)
« no previous file with comments | « chrome/browser/services/gcm/gcm_account_tracker_unittest.cc ('k') | components/gcm_driver/fake_gcm_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698