gcm_profile_service.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/services/gcm/gcm_profile_service.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <map>
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/logging.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/prefs/pref_service.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/profiles/profile.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/common/pref_names.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_ANDROID)
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/gcm_driver/gcm_driver_android.h"
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#else
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS)
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/services/gcm/chromeos_gcm_connection_observer.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/files/file_path.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/weak_ptr.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/services/gcm/gcm_account_tracker.h"
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/services/gcm/gcm_desktop_utils.h"
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/signin/profile_identity_provider.h"
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/gcm_client_factory.h"
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/gcm_driver/gcm_driver_desktop.h"
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "google_apis/gaia/account_tracker.h"
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "google_apis/gaia/identity_provider.h"
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace gcm {
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if !defined(OS_ANDROID)
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Identity observer only has actual work to do when the user is actually signed
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// in. It ensures that account tracker is taking
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class GCMProfileService::IdentityObserver : public IdentityProvider::Observer {
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  IdentityObserver(Profile* profile, GCMDriverDesktop* driver);
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~IdentityObserver();
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // IdentityProvider::Observer:
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnActiveAccountLogin() OVERRIDE;
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnActiveAccountLogout() OVERRIDE;
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string SignedInUserName() const;
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Called to inform IdentityObserver that a list of accounts was updated.
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |account_tokens| maps email addresses to OAuth2 access tokens.
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void AccountsUpdated(
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const std::map<std::string, std::string>& account_tokens);
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Profile* profile_;
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GCMDriverDesktop* driver_;
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<IdentityProvider> identity_provider_;
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<GCMAccountTracker> gcm_account_tracker_;
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The account ID that this service is responsible for. Empty when the service
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // is not running.
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string account_id_;
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::WeakPtrFactory<GCMProfileService::IdentityObserver> weak_ptr_factory_;
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IdentityObserver);
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GCMProfileService::IdentityObserver::IdentityObserver(Profile* profile,
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                      GCMDriverDesktop* driver)
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : profile_(profile), driver_(driver), weak_ptr_factory_(this) {
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  identity_provider_.reset(new ProfileIdentityProvider(
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      SigninManagerFactory::GetForProfile(profile),
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      LoginUIServiceFactory::GetForProfile(profile)));
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  identity_provider_->AddObserver(this);
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  OnActiveAccountLogin();
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GCMProfileService::IdentityObserver::~IdentityObserver() {
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (gcm_account_tracker_)
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gcm_account_tracker_->Shutdown();
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  identity_provider_->RemoveObserver(this);
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GCMProfileService::IdentityObserver::OnActiveAccountLogin() {
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // This might be called multiple times when the password changes.
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const std::string account_id = identity_provider_->GetActiveAccountId();
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (account_id == account_id_)
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  account_id_ = account_id;
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  driver_->OnSignedIn();
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!gcm_account_tracker_) {
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<gaia::AccountTracker> gaia_account_tracker(
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new gaia::AccountTracker(identity_provider_.get(),
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 profile_->GetRequestContext()));
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gcm_account_tracker_.reset(new GCMAccountTracker(
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        gaia_account_tracker.Pass(),
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Bind(&GCMProfileService::IdentityObserver::AccountsUpdated,
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   weak_ptr_factory_.GetWeakPtr())));
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gcm_account_tracker_->Start();
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GCMProfileService::IdentityObserver::OnActiveAccountLogout() {
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  account_id_.clear();
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Check is necessary to not crash browser_tests.
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (gcm_account_tracker_)
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gcm_account_tracker_->Stop();
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(fgorski): If we purge here, what should happen when we get
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // OnActiveAccountLogin() right after that?
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  driver_->Purge();
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::string GCMProfileService::IdentityObserver::SignedInUserName() const {
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return driver_->IsStarted() ? account_id_ : std::string();
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMProfileService::IdentityObserver::AccountsUpdated(
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::map<std::string, std::string>& account_tokens) {
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  driver_->SetAccountsForCheckin(account_tokens);
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // !defined(OS_ANDROID)
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// static
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool GCMProfileService::IsGCMEnabled(Profile* profile) {
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return profile->GetPrefs()->GetBoolean(prefs::kGCMChannelEnabled);
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void GCMProfileService::RegisterProfilePrefs(
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry->RegisterBooleanPref(
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prefs::kGCMChannelEnabled,
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      true,
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PushMessagingServiceImpl::RegisterProfilePrefs(registry);
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_ANDROID)
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GCMProfileService::GCMProfileService(Profile* profile)
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : profile_(profile),
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      push_messaging_service_(this, profile) {
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(!profile->IsOffTheRecord());
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  driver_.reset(new GCMDriverAndroid);
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)GCMProfileService::GCMProfileService(
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Profile* profile,
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    scoped_ptr<GCMClientFactory> gcm_client_factory)
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : profile_(profile),
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      push_messaging_service_(this, profile) {
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(!profile->IsOffTheRecord());
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  driver_ = CreateGCMDriverDesktop(
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gcm_client_factory.Pass(),
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      profile_->GetPrefs(),
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      profile_->GetPath().Append(chrome::kGCMStoreDirname),
17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      profile_->GetRequestContext());
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS)
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos_connection_observer_.reset(new gcm::ChromeOSGCMConnectionObserver);
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  driver_->AddConnectionObserver(chromeos_connection_observer_.get());
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  identity_observer_.reset(new IdentityObserver(
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      profile, static_cast<gcm::GCMDriverDesktop*>(driver_.get())));
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(OS_ANDROID)
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GCMProfileService::GCMProfileService()
185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : profile_(NULL),
186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      push_messaging_service_(this, NULL) {
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GCMProfileService::~GCMProfileService() {
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GCMProfileService::AddAppHandler(const std::string& app_id,
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      GCMAppHandler* handler) {
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (driver_)
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    driver_->AddAppHandler(app_id, handler);
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GCMProfileService::RemoveAppHandler(const std::string& app_id) {
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (driver_)
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    driver_->RemoveAppHandler(app_id);
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GCMProfileService::Register(const std::string& app_id,
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const std::vector<std::string>& sender_ids,
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const GCMDriver::RegisterCallback& callback) {
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (driver_)
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    driver_->Register(app_id, sender_ids, callback);
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GCMProfileService::Shutdown() {
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if !defined(OS_ANDROID)
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  identity_observer_.reset();
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // !defined(OS_ANDROID)
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (driver_) {
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS)
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    driver_->RemoveConnectionObserver(chromeos_connection_observer_.get());
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    chromeos_connection_observer_.reset();
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    driver_->Shutdown();
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    driver_.reset();
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::string GCMProfileService::SignedInUserName() const {
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_ANDROID)
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return std::string();
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return identity_observer_ ? identity_observer_->SignedInUserName()
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            : std::string();
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // defined(OS_ANDROID)
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GCMProfileService::SetDriverForTesting(GCMDriver* driver) {
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  driver_.reset(driver);
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace gcm
238