#include "chrome/browser/services/gcm/gcm_profile_service.h"
-#include <map>
+#include <vector>
#include "base/logging.h"
#include "base/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
+#include "components/gcm_driver/gcm_driver.h"
#include "components/pref_registry/pref_registry_syncable.h"
#if defined(OS_ANDROID)
// in. It ensures that account tracker is taking
class GCMProfileService::IdentityObserver : public IdentityProvider::Observer {
public:
- IdentityObserver(Profile* profile, GCMDriverDesktop* driver);
- virtual ~IdentityObserver();
+ IdentityObserver(Profile* profile, GCMDriver* driver);
+ ~IdentityObserver() override;
// IdentityProvider::Observer:
- virtual void OnActiveAccountLogin() OVERRIDE;
- virtual void OnActiveAccountLogout() OVERRIDE;
+ void OnActiveAccountLogin() override;
+ void OnActiveAccountLogout() override;
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:
+ void StartAccountTracker();
+
Profile* profile_;
- GCMDriverDesktop* driver_;
+ GCMDriver* driver_;
scoped_ptr<IdentityProvider> identity_provider_;
scoped_ptr<GCMAccountTracker> gcm_account_tracker_;
};
GCMProfileService::IdentityObserver::IdentityObserver(Profile* profile,
- GCMDriverDesktop* driver)
+ GCMDriver* driver)
: profile_(profile), driver_(driver), weak_ptr_factory_(this) {
identity_provider_.reset(new ProfileIdentityProvider(
SigninManagerFactory::GetForProfile(profile),
identity_provider_->AddObserver(this);
OnActiveAccountLogin();
+ StartAccountTracker();
}
GCMProfileService::IdentityObserver::~IdentityObserver() {
const std::string account_id = identity_provider_->GetActiveAccountId();
if (account_id == account_id_)
return;
- account_id_ = account_id;
+ 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() {
account_id_.clear();
- // Check is necessary to not crash browser_tests.
- if (gcm_account_tracker_)
- gcm_account_tracker_->Stop();
// When sign-in enforcement is not dropped, OnSignedOut will also clear all
// the GCM data and a new GCM ID will be retrieved after the user signs in
// again. Otherwise, the user sign-out will not affect the existing GCM
return driver_->IsStarted() ? account_id_ : std::string();
}
-void GCMProfileService::IdentityObserver::AccountsUpdated(
- const std::map<std::string, std::string>& account_tokens) {
- driver_->SetAccountsForCheckin(account_tokens);
+void GCMProfileService::IdentityObserver::StartAccountTracker() {
+ if (gcm_account_tracker_)
+ return;
+
+ 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(), driver_));
+
+ gcm_account_tracker_->Start();
}
+
#endif // !defined(OS_ANDROID)
// static
driver_->AddConnectionObserver(chromeos_connection_observer_.get());
#endif
- identity_observer_.reset(new IdentityObserver(
- profile, static_cast<gcm::GCMDriverDesktop*>(driver_.get())));
+ identity_observer_.reset(new IdentityObserver(profile, driver_.get()));
}
#endif // defined(OS_ANDROID)
GCMProfileService::~GCMProfileService() {
}
-void GCMProfileService::AddAppHandler(const std::string& app_id,
- GCMAppHandler* handler) {
- if (driver_)
- driver_->AddAppHandler(app_id, handler);
-}
-
-void GCMProfileService::RemoveAppHandler(const std::string& app_id) {
- if (driver_)
- driver_->RemoveAppHandler(app_id);
-}
-
-void GCMProfileService::Register(const std::string& app_id,
- const std::vector<std::string>& sender_ids,
- const GCMDriver::RegisterCallback& callback) {
- if (driver_)
- driver_->Register(app_id, sender_ids, callback);
-}
-
void GCMProfileService::Shutdown() {
#if !defined(OS_ANDROID)
identity_observer_.reset();
void GCMProfileService::SetDriverForTesting(GCMDriver* driver) {
driver_.reset(driver);
+#if !defined(OS_ANDROID)
+ if (identity_observer_)
+ identity_observer_.reset(new IdentityObserver(profile_, driver));
+#endif // !defined(OS_ANDROID)
}
} // namespace gcm