gcm_profile_service.cc revision 116680a4aac90f2aa7413d9095a592090648e557
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/services/gcm/gcm_profile_service.h" 690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/prefs/pref_service.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/common/pref_names.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 1458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_ANDROID) 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/gcm_driver/gcm_driver_android.h" 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/files/file_path.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/services/gcm/gcm_account_tracker.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/services/gcm/gcm_desktop_utils.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/profile_identity_provider.h" 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/gcm_driver/gcm_client_factory.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/gcm_driver/gcm_driver_desktop.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/signin/core/browser/signin_manager.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/account_tracker.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/identity_provider.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gcm { 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Identity observer only has actual work to do when the user is actually signed 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in. It ensures that account tracker is taking 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GCMProfileService::IdentityObserver : public IdentityProvider::Observer { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IdentityObserver(Profile* profile, GCMDriverDesktop* driver); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~IdentityObserver(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IdentityProvider::Observer: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnActiveAccountLogin() OVERRIDE; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnActiveAccountLogout() OVERRIDE; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string SignedInUserName() const; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to inform IdentityObserver that a list of accounts was updated. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |account_tokens| maps email addresses to OAuth2 access tokens. 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void AccountsUpdated( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::map<std::string, std::string>& account_tokens); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Profile* profile_; 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GCMDriverDesktop* driver_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<IdentityProvider> identity_provider_; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<GCMAccountTracker> gcm_account_tracker_; 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The account ID that this service is responsible for. Empty when the service 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // is not running. 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string account_id_; 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<GCMProfileService::IdentityObserver> weak_ptr_factory_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(IdentityObserver); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GCMProfileService::IdentityObserver::IdentityObserver(Profile* profile, 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GCMDriverDesktop* driver) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile), driver_(driver), weak_ptr_factory_(this) { 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) identity_provider_.reset(new ProfileIdentityProvider( 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SigninManagerFactory::GetForProfile(profile), 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUIServiceFactory::GetForProfile(profile))); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) identity_provider_->AddObserver(this); 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnActiveAccountLogin(); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)GCMProfileService::IdentityObserver::~IdentityObserver() { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gcm_account_tracker_) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gcm_account_tracker_->Shutdown(); 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) identity_provider_->RemoveObserver(this); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GCMProfileService::IdentityObserver::OnActiveAccountLogin() { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This might be called multiple times when the password changes. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string account_id = identity_provider_->GetActiveAccountId(); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (account_id == account_id_) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) account_id_ = account_id; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) driver_->OnSignedIn(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gcm_account_tracker_) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<gaia::AccountTracker> gaia_account_tracker( 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new gaia::AccountTracker(identity_provider_.get(), 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetRequestContext())); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gcm_account_tracker_.reset(new GCMAccountTracker( 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gaia_account_tracker.Pass(), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GCMProfileService::IdentityObserver::AccountsUpdated, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()))); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gcm_account_tracker_->Start(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GCMProfileService::IdentityObserver::OnActiveAccountLogout() { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check is necessary to not crash browser_tests. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gcm_account_tracker_) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gcm_account_tracker_->Stop(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(fgorski): If we purge here, what should happen when we get 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnActiveAccountLogin() right after that? 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) driver_->Purge(); 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GCMProfileService::IdentityObserver::SignedInUserName() const { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return driver_->IsStarted() ? account_id_ : std::string(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void GCMProfileService::IdentityObserver::AccountsUpdated( 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::map<std::string, std::string>& account_tokens) { 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) driver_->SetAccountsForCheckin(account_tokens); 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif // !defined(OS_ANDROID) 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// static 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool GCMProfileService::IsGCMEnabled(Profile* profile) { 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return profile->GetPrefs()->GetBoolean(prefs::kGCMChannelEnabled); 13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// static 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void GCMProfileService::RegisterProfilePrefs( 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry->RegisterBooleanPref( 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) prefs::kGCMChannelEnabled, 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) true, 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PushMessagingServiceImpl::RegisterProfilePrefs(registry); 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_ANDROID) 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)GCMProfileService::GCMProfileService(Profile* profile) 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : profile_(profile), 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) push_messaging_service_(this, profile) { 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(!profile->IsOffTheRecord()); 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) driver_.reset(new GCMDriverAndroid); 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)GCMProfileService::GCMProfileService( 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Profile* profile, 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<GCMClientFactory> gcm_client_factory) 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : profile_(profile), 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) push_messaging_service_(this, profile) { 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(!profile->IsOffTheRecord()); 16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) driver_ = CreateGCMDriverDesktop( 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gcm_client_factory.Pass(), 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile_->GetPath().Append(chrome::kGCMStoreDirname), 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile_->GetRequestContext()); 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) identity_observer_.reset(new IdentityObserver( 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile, static_cast<gcm::GCMDriverDesktop*>(driver_.get()))); 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(OS_ANDROID) 17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)GCMProfileService::GCMProfileService() 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : profile_(NULL), 17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) push_messaging_service_(this, NULL) { 17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)GCMProfileService::~GCMProfileService() { 17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void GCMProfileService::AddAppHandler(const std::string& app_id, 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GCMAppHandler* handler) { 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (driver_) 18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) driver_->AddAppHandler(app_id, handler); 18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void GCMProfileService::RemoveAppHandler(const std::string& app_id) { 18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (driver_) 18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) driver_->RemoveAppHandler(app_id); 19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void GCMProfileService::Register(const std::string& app_id, 19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::vector<std::string>& sender_ids, 19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GCMDriver::RegisterCallback& callback) { 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (driver_) 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) driver_->Register(app_id, sender_ids, callback); 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void GCMProfileService::Shutdown() { 20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if !defined(OS_ANDROID) 20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) identity_observer_.reset(); 20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // !defined(OS_ANDROID) 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (driver_) { 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) driver_->Shutdown(); 20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) driver_.reset(); 20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)std::string GCMProfileService::SignedInUserName() const { 21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_ANDROID) 21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return std::string(); 21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#else 21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return identity_observer_ ? identity_observer_->SignedInUserName() 21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) : std::string(); 21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(OS_ANDROID) 21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void GCMProfileService::SetDriverForTesting(GCMDriver* driver) { 22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) driver_.reset(driver); 22168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace gcm 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)