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