gcm_profile_service.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/logging.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/prefs/pref_service.h" 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/profiles/profile.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/common/pref_names.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_ANDROID) 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/gcm_driver/gcm_driver_android.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#else 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/files/file_path.h" 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/services/gcm/gcm_desktop_utils.h" 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/signin/profile_identity_provider.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/gcm_client_factory.h" 24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "google_apis/gaia/identity_provider.h" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace gcm { 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if !defined(OS_ANDROID) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class GCMProfileService::IdentityObserver : public IdentityProvider::Observer { 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IdentityObserver(Profile* profile, GCMDriver* driver); 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~IdentityObserver(); 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // IdentityProvider::Observer: 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnActiveAccountLogin() OVERRIDE; 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnActiveAccountLogout() OVERRIDE; 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string SignedInUserName() const; 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GCMDriver* driver_; 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<IdentityProvider> identity_provider_; 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The account ID that this service is responsible for. Empty when the service 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // is not running. 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string account_id_; 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(IdentityObserver); 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GCMProfileService::IdentityObserver::IdentityObserver(Profile* profile, 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GCMDriver* driver) 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : driver_(driver) { 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) identity_provider_.reset(new ProfileIdentityProvider( 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SigninManagerFactory::GetForProfile(profile), 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile), 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LoginUIServiceFactory::GetForProfile(profile))); 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) identity_provider_->AddObserver(this); 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnActiveAccountLogin(); 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GCMProfileService::IdentityObserver::~IdentityObserver() { 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) identity_provider_->RemoveObserver(this); 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GCMProfileService::IdentityObserver::OnActiveAccountLogin() { 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // This might be called multiple times when the password changes. 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string account_id = identity_provider_->GetActiveAccountId(); 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (account_id == account_id_) 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) account_id_ = account_id; 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) driver_->OnSignedIn(); 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GCMProfileService::IdentityObserver::OnActiveAccountLogout() { 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) driver_->Purge(); 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::string GCMProfileService::IdentityObserver::SignedInUserName() const { 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return driver_->IsStarted() ? account_id_ : std::string(); 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // !defined(OS_ANDROID) 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// static 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool GCMProfileService::IsGCMEnabled(Profile* profile) { 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return profile->GetPrefs()->GetBoolean(prefs::kGCMChannelEnabled); 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void GCMProfileService::RegisterProfilePrefs( 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registry->RegisterBooleanPref( 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kGCMChannelEnabled, 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) true, 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PushMessagingServiceImpl::RegisterProfilePrefs(registry); 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_ANDROID) 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GCMProfileService::GCMProfileService(Profile* profile) 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : profile_(profile), 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) push_messaging_service_(this, profile) { 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(!profile->IsOffTheRecord()); 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) driver_.reset(new GCMDriverAndroid); 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)GCMProfileService::GCMProfileService( 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile, 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<GCMClientFactory> gcm_client_factory) 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : profile_(profile), 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) push_messaging_service_(this, profile) { 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(!profile->IsOffTheRecord()); 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) driver_ = CreateGCMDriverDesktop( 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gcm_client_factory.Pass(), 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile_->GetPath().Append(chrome::kGCMStoreDirname), 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) profile_->GetRequestContext()); 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) identity_observer_.reset(new IdentityObserver(profile, driver_.get())); 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // defined(OS_ANDROID) 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GCMProfileService::GCMProfileService() 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : profile_(NULL), 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) push_messaging_service_(this, NULL) { 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GCMProfileService::~GCMProfileService() { 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GCMProfileService::AddAppHandler(const std::string& app_id, 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GCMAppHandler* handler) { 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (driver_) 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) driver_->AddAppHandler(app_id, handler); 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GCMProfileService::RemoveAppHandler(const std::string& app_id) { 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (driver_) 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) driver_->RemoveAppHandler(app_id); 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GCMProfileService::Register(const std::string& app_id, 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<std::string>& sender_ids, 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GCMDriver::RegisterCallback& callback) { 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (driver_) 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) driver_->Register(app_id, sender_ids, callback); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GCMProfileService::Shutdown() { 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if !defined(OS_ANDROID) 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) identity_observer_.reset(); 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // !defined(OS_ANDROID) 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (driver_) { 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) driver_->Shutdown(); 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) driver_.reset(); 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::string GCMProfileService::SignedInUserName() const { 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_ANDROID) 168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return std::string(); 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return identity_observer_ ? identity_observer_->SignedInUserName() 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : std::string(); 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // defined(OS_ANDROID) 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GCMProfileService::SetDriverForTesting(GCMDriver* driver) { 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) driver_.reset(driver); 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace gcm 180