Index: chrome/browser/services/gcm/gcm_service.cc |
diff --git a/chrome/browser/services/gcm/gcm_profile_service.cc b/chrome/browser/services/gcm/gcm_service.cc |
similarity index 57% |
copy from chrome/browser/services/gcm/gcm_profile_service.cc |
copy to chrome/browser/services/gcm/gcm_service.cc |
index f93b427cf9ba7f97dab449c9559413dd8fa714b5..0b5c74dc601e0143b80e6e65927317069ebc740f 100644 |
--- a/chrome/browser/services/gcm/gcm_profile_service.cc |
+++ b/chrome/browser/services/gcm/gcm_service.cc |
@@ -1,36 +1,23 @@ |
-// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/services/gcm/gcm_profile_service.h" |
+#include "chrome/browser/services/gcm/gcm_service.h" |
#include <algorithm> |
-#include <string> |
-#include <vector> |
+#include <utility> |
-#include "base/base64.h" |
-#include "base/files/file_path.h" |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
+#include "base/location.h" |
#include "base/logging.h" |
-#include "base/path_service.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/strings/string_number_conversions.h" |
+#include "base/sequenced_task_runner.h" |
#include "base/threading/sequenced_worker_pool.h" |
-#include "chrome/browser/chrome_notification_types.h" |
-#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/services/gcm/gcm_app_handler.h" |
#include "chrome/browser/services/gcm/gcm_client_factory.h" |
-#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
-#include "chrome/browser/signin/signin_manager_factory.h" |
-#include "chrome/common/chrome_constants.h" |
-#include "chrome/common/chrome_paths.h" |
#include "chrome/common/chrome_version_info.h" |
-#include "chrome/common/pref_names.h" |
-#include "components/signin/core/browser/profile_oauth2_token_service.h" |
-#include "components/signin/core/browser/signin_manager.h" |
-#include "components/user_prefs/pref_registry_syncable.h" |
#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/notification_details.h" |
-#include "content/public/browser/notification_source.h" |
+#include "google_apis/gaia/oauth2_token_service.h" |
#include "google_apis/gcm/protocol/android_checkin.pb.h" |
#include "net/url_request/url_request_context_getter.h" |
@@ -82,13 +69,13 @@ checkin_proto::ChromeBuildProto_Channel GetChannel() { |
} // namespace |
// Helper class to save tasks to run until we're ready to execute them. |
-class GCMProfileService::DelayedTaskController { |
+class GCMService::DelayedTaskController { |
public: |
DelayedTaskController(); |
~DelayedTaskController(); |
// Adds a task that will be invoked once we're ready. |
- void AddTask(base::Closure task); |
+ void AddTask(const base::Closure& task); |
// Sets ready status. It is ready only when check-in is completed and |
// the GCMClient is fully initialized. |
@@ -104,29 +91,30 @@ class GCMProfileService::DelayedTaskController { |
bool ready_; |
std::vector<base::Closure> delayed_tasks_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DelayedTaskController); |
}; |
-GCMProfileService::DelayedTaskController::DelayedTaskController() |
- : ready_(false) { |
+GCMService::DelayedTaskController::DelayedTaskController() : ready_(false) { |
} |
-GCMProfileService::DelayedTaskController::~DelayedTaskController() { |
+GCMService::DelayedTaskController::~DelayedTaskController() { |
} |
-void GCMProfileService::DelayedTaskController::AddTask(base::Closure task) { |
+void GCMService::DelayedTaskController::AddTask(const base::Closure& task) { |
delayed_tasks_.push_back(task); |
} |
-void GCMProfileService::DelayedTaskController::SetReady() { |
+void GCMService::DelayedTaskController::SetReady() { |
ready_ = true; |
RunTasks(); |
} |
-bool GCMProfileService::DelayedTaskController::CanRunTaskWithoutDelay() const { |
+bool GCMService::DelayedTaskController::CanRunTaskWithoutDelay() const { |
return ready_; |
} |
-void GCMProfileService::DelayedTaskController::RunTasks() { |
+void GCMService::DelayedTaskController::RunTasks() { |
DCHECK(ready_); |
for (size_t i = 0; i < delayed_tasks_.size(); ++i) |
@@ -134,12 +122,11 @@ void GCMProfileService::DelayedTaskController::RunTasks() { |
delayed_tasks_.clear(); |
} |
-class GCMProfileService::IOWorker |
- : public GCMClient::Delegate, |
- public base::RefCountedThreadSafe<GCMProfileService::IOWorker>{ |
+class GCMService::IOWorker : public GCMClient::Delegate { |
public: |
// Called on UI thread. |
IOWorker(); |
+ virtual ~IOWorker(); |
// Overridden from GCMClient::Delegate: |
// Called on IO thread. |
@@ -166,8 +153,7 @@ class GCMProfileService::IOWorker |
const std::vector<std::string>& account_ids, |
const scoped_refptr<net::URLRequestContextGetter>& |
url_request_context_getter); |
- void Reset(); |
- void Load(const base::WeakPtr<GCMProfileService>& service); |
+ void Load(const base::WeakPtr<GCMService>& service); |
void Stop(); |
void CheckOut(); |
void Register(const std::string& app_id, |
@@ -183,22 +169,22 @@ class GCMProfileService::IOWorker |
GCMClient* gcm_client_for_testing() const { return gcm_client_.get(); } |
private: |
- friend class base::RefCountedThreadSafe<IOWorker>; |
- virtual ~IOWorker(); |
- |
- base::WeakPtr<GCMProfileService> service_; |
+ base::WeakPtr<GCMService> service_; |
scoped_ptr<GCMClient> gcm_client_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(IOWorker); |
}; |
-GCMProfileService::IOWorker::IOWorker() { |
+GCMService::IOWorker::IOWorker() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
} |
-GCMProfileService::IOWorker::~IOWorker() { |
+GCMService::IOWorker::~IOWorker() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
} |
-void GCMProfileService::IOWorker::Initialize( |
+void GCMService::IOWorker::Initialize( |
scoped_ptr<GCMClientFactory> gcm_client_factory, |
const base::FilePath& store_path, |
const std::vector<std::string>& account_ids, |
@@ -228,129 +214,111 @@ void GCMProfileService::IOWorker::Initialize( |
this); |
} |
-void GCMProfileService::IOWorker::Reset() { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
- |
- // GCMClient instance must be destroyed from the same thread where it was |
- // created. |
- gcm_client_.reset(); |
-} |
- |
-void GCMProfileService::IOWorker::OnRegisterFinished( |
+void GCMService::IOWorker::OnRegisterFinished( |
const std::string& app_id, |
const std::string& registration_id, |
GCMClient::Result result) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
- content::BrowserThread::PostTask( |
- content::BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&GCMProfileService::RegisterFinished, |
- service_, |
- app_id, |
- registration_id, |
- result)); |
+ content::BrowserThread::PostTask(content::BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&GCMService::RegisterFinished, |
+ service_, |
+ app_id, |
+ registration_id, |
+ result)); |
} |
-void GCMProfileService::IOWorker::OnUnregisterFinished( |
- const std::string& app_id, |
- GCMClient::Result result) { |
+void GCMService::IOWorker::OnUnregisterFinished(const std::string& app_id, |
+ GCMClient::Result result) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
content::BrowserThread::PostTask( |
content::BrowserThread::UI, |
FROM_HERE, |
- base::Bind( |
- &GCMProfileService::UnregisterFinished, service_, app_id, result)); |
+ base::Bind(&GCMService::UnregisterFinished, service_, app_id, result)); |
} |
-void GCMProfileService::IOWorker::OnSendFinished( |
- const std::string& app_id, |
- const std::string& message_id, |
- GCMClient::Result result) { |
+void GCMService::IOWorker::OnSendFinished(const std::string& app_id, |
+ const std::string& message_id, |
+ GCMClient::Result result) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
- content::BrowserThread::PostTask( |
- content::BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&GCMProfileService::SendFinished, |
- service_, |
- app_id, |
- message_id, |
- result)); |
+ content::BrowserThread::PostTask(content::BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&GCMService::SendFinished, |
+ service_, |
+ app_id, |
+ message_id, |
+ result)); |
} |
-void GCMProfileService::IOWorker::OnMessageReceived( |
+void GCMService::IOWorker::OnMessageReceived( |
const std::string& app_id, |
const GCMClient::IncomingMessage& message) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
- content::BrowserThread::PostTask( |
- content::BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&GCMProfileService::MessageReceived, |
- service_, |
- app_id, |
- message)); |
+ content::BrowserThread::PostTask(content::BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&GCMService::MessageReceived, |
+ service_, |
+ app_id, |
+ message)); |
} |
-void GCMProfileService::IOWorker::OnMessagesDeleted(const std::string& app_id) { |
+void GCMService::IOWorker::OnMessagesDeleted(const std::string& app_id) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
- content::BrowserThread::PostTask( |
- content::BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&GCMProfileService::MessagesDeleted, |
- service_, |
- app_id)); |
+ content::BrowserThread::PostTask(content::BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&GCMService::MessagesDeleted, |
+ service_, |
+ app_id)); |
} |
-void GCMProfileService::IOWorker::OnMessageSendError( |
+void GCMService::IOWorker::OnMessageSendError( |
const std::string& app_id, |
const GCMClient::SendErrorDetails& send_error_details) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
- content::BrowserThread::PostTask( |
- content::BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&GCMProfileService::MessageSendError, |
- service_, |
- app_id, |
- send_error_details)); |
+ content::BrowserThread::PostTask(content::BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&GCMService::MessageSendError, |
+ service_, |
+ app_id, |
+ send_error_details)); |
} |
-void GCMProfileService::IOWorker::OnGCMReady() { |
- content::BrowserThread::PostTask( |
- content::BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&GCMProfileService::GCMClientReady, |
- service_)); |
+void GCMService::IOWorker::OnGCMReady() { |
+ content::BrowserThread::PostTask(content::BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&GCMService::GCMClientReady, |
+ service_)); |
} |
-void GCMProfileService::IOWorker::Load( |
- const base::WeakPtr<GCMProfileService>& service) { |
+void GCMService::IOWorker::Load(const base::WeakPtr<GCMService>& service) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
service_ = service; |
gcm_client_->Load(); |
} |
-void GCMProfileService::IOWorker::Stop() { |
+void GCMService::IOWorker::Stop() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
gcm_client_->Stop(); |
} |
-void GCMProfileService::IOWorker::CheckOut() { |
+void GCMService::IOWorker::CheckOut() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
gcm_client_->CheckOut(); |
- // Note that we still need to keep GCMClient instance alive since the profile |
- // might be signed in again. |
+ // Note that we still need to keep GCMClient instance alive since the |
+ // GCMService may check in again. |
} |
-void GCMProfileService::IOWorker::Register( |
+void GCMService::IOWorker::Register( |
const std::string& app_id, |
const std::vector<std::string>& sender_ids) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
@@ -358,22 +326,21 @@ void GCMProfileService::IOWorker::Register( |
gcm_client_->Register(app_id, sender_ids); |
} |
-void GCMProfileService::IOWorker::Unregister(const std::string& app_id) { |
+void GCMService::IOWorker::Unregister(const std::string& app_id) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
gcm_client_->Unregister(app_id); |
} |
-void GCMProfileService::IOWorker::Send( |
- const std::string& app_id, |
- const std::string& receiver_id, |
- const GCMClient::OutgoingMessage& message) { |
+void GCMService::IOWorker::Send(const std::string& app_id, |
+ const std::string& receiver_id, |
+ const GCMClient::OutgoingMessage& message) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
gcm_client_->Send(app_id, receiver_id, message); |
} |
-void GCMProfileService::IOWorker::GetGCMStatistics(bool clear_logs) { |
+void GCMService::IOWorker::GetGCMStatistics(bool clear_logs) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
gcm::GCMClient::GCMStatistics stats; |
@@ -386,12 +353,10 @@ void GCMProfileService::IOWorker::GetGCMStatistics(bool clear_logs) { |
content::BrowserThread::PostTask( |
content::BrowserThread::UI, |
FROM_HERE, |
- base::Bind(&GCMProfileService::GetGCMStatisticsFinished, |
- service_, |
- stats)); |
+ base::Bind(&GCMService::GetGCMStatisticsFinished, service_, stats)); |
} |
-void GCMProfileService::IOWorker::SetGCMRecording(bool recording) { |
+void GCMService::IOWorker::SetGCMRecording(bool recording) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
gcm::GCMClient::GCMStatistics stats; |
@@ -404,114 +369,58 @@ void GCMProfileService::IOWorker::SetGCMRecording(bool recording) { |
content::BrowserThread::PostTask( |
content::BrowserThread::UI, |
FROM_HERE, |
- base::Bind(&GCMProfileService::GetGCMStatisticsFinished, |
- service_, |
- stats)); |
-} |
- |
-std::string GCMProfileService::GetGCMEnabledStateString(GCMEnabledState state) { |
- switch (state) { |
- case GCMProfileService::ALWAYS_ENABLED: |
- return "ALWAYS_ENABLED"; |
- case GCMProfileService::ENABLED_FOR_APPS: |
- return "ENABLED_FOR_APPS"; |
- case GCMProfileService::ALWAYS_DISABLED: |
- return "ALWAYS_DISABLED"; |
- default: |
- NOTREACHED(); |
- return std::string(); |
- } |
+ base::Bind(&GCMService::GetGCMStatisticsFinished, service_, stats)); |
} |
-// static |
-GCMProfileService::GCMEnabledState GCMProfileService::GetGCMEnabledState( |
- Profile* profile) { |
- const base::Value* gcm_enabled_value = |
- profile->GetPrefs()->GetUserPrefValue(prefs::kGCMChannelEnabled); |
- if (!gcm_enabled_value) |
- return ENABLED_FOR_APPS; |
- |
- bool gcm_enabled = false; |
- if (!gcm_enabled_value->GetAsBoolean(&gcm_enabled)) |
- return ENABLED_FOR_APPS; |
- |
- return gcm_enabled ? ALWAYS_ENABLED : ALWAYS_DISABLED; |
-} |
- |
-// static |
-void GCMProfileService::RegisterProfilePrefs( |
- user_prefs::PrefRegistrySyncable* registry) { |
- // GCM support is only enabled by default for Canary/Dev/Custom builds. |
- chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
- bool on_by_default = false; |
- if (channel == chrome::VersionInfo::CHANNEL_UNKNOWN || |
- channel == chrome::VersionInfo::CHANNEL_CANARY || |
- channel == chrome::VersionInfo::CHANNEL_DEV) { |
- on_by_default = true; |
- } |
- registry->RegisterBooleanPref( |
- prefs::kGCMChannelEnabled, |
- on_by_default, |
- user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
-} |
- |
-GCMProfileService::GCMProfileService(Profile* profile) |
- : profile_(profile), |
+GCMService::GCMService(scoped_ptr<IdentityProvider> identity_provider) |
+ : identity_provider_(identity_provider.Pass()), |
gcm_client_ready_(false), |
weak_ptr_factory_(this) { |
- DCHECK(!profile->IsOffTheRecord()); |
} |
-GCMProfileService::~GCMProfileService() { |
+GCMService::~GCMService() { |
} |
-void GCMProfileService::Initialize( |
- scoped_ptr<GCMClientFactory> gcm_client_factory) { |
- registrar_.Add(this, |
- chrome::NOTIFICATION_PROFILE_DESTROYED, |
- content::Source<Profile>(profile_)); |
- |
- SigninManagerFactory::GetForProfile(profile_)->AddObserver(this); |
- |
+void GCMService::Initialize(scoped_ptr<GCMClientFactory> gcm_client_factory) { |
// Get the list of available accounts. |
std::vector<std::string> account_ids; |
#if !defined(OS_ANDROID) |
- account_ids = |
- ProfileOAuth2TokenServiceFactory::GetForProfile(profile_)->GetAccounts(); |
+ account_ids = identity_provider_->GetTokenService()->GetAccounts(); |
#endif |
// Create and initialize the GCMClient. Note that this does not initiate the |
// GCM check-in. |
- io_worker_ = new IOWorker(); |
- scoped_refptr<net::URLRequestContextGetter> url_request_context_getter = |
- profile_->GetRequestContext(); |
+ DCHECK(!io_worker_); |
+ io_worker_.reset(new IOWorker()); |
content::BrowserThread::PostTask( |
content::BrowserThread::IO, |
FROM_HERE, |
- base::Bind(&GCMProfileService::IOWorker::Initialize, |
- io_worker_, |
+ base::Bind(&GCMService::IOWorker::Initialize, |
+ base::Unretained(io_worker_.get()), |
base::Passed(&gcm_client_factory), |
- profile_->GetPath().Append(chrome::kGCMStoreDirname), |
+ GetStorePath(), |
account_ids, |
- url_request_context_getter)); |
+ GetURLRequestContextGetter())); |
// Load from the GCM store and initiate the GCM check-in if the rollout signal |
// indicates yes. |
- if (GetGCMEnabledState(profile_) == ALWAYS_ENABLED) |
+ if (ShouldStartAutomatically()) |
EnsureLoaded(); |
+ |
+ identity_provider_->AddObserver(this); |
} |
-void GCMProfileService::Start() { |
+void GCMService::Start() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
EnsureLoaded(); |
} |
-void GCMProfileService::Stop() { |
+void GCMService::Stop() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
// No need to stop GCM service if not started yet. |
- if (username_.empty()) |
+ if (account_id_.empty()) |
return; |
RemoveCachedData(); |
@@ -519,21 +428,26 @@ void GCMProfileService::Stop() { |
content::BrowserThread::PostTask( |
content::BrowserThread::IO, |
FROM_HERE, |
- base::Bind(&GCMProfileService::IOWorker::Stop, io_worker_)); |
+ base::Bind(&GCMService::IOWorker::Stop, |
+ base::Unretained(io_worker_.get()))); |
} |
-void GCMProfileService::Shutdown() { |
+void GCMService::ShutdownService() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ identity_provider_->RemoveObserver(this); |
for (GCMAppHandlerMap::const_iterator iter = app_handlers_.begin(); |
iter != app_handlers_.end(); ++iter) { |
iter->second->ShutdownHandler(); |
} |
app_handlers_.clear(); |
- |
- SigninManagerFactory::GetForProfile(profile_)->RemoveObserver(this); |
+ content::BrowserThread::DeleteSoon(content::BrowserThread::IO, |
+ FROM_HERE, |
+ io_worker_.release()); |
} |
-void GCMProfileService::AddAppHandler(const std::string& app_id, |
- GCMAppHandler* handler) { |
+void GCMService::AddAppHandler(const std::string& app_id, |
+ GCMAppHandler* handler) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
DCHECK(!app_id.empty()); |
DCHECK(handler); |
DCHECK(app_handlers_.find(app_id) == app_handlers_.end()); |
@@ -541,17 +455,20 @@ void GCMProfileService::AddAppHandler(const std::string& app_id, |
app_handlers_[app_id] = handler; |
} |
-void GCMProfileService::RemoveAppHandler(const std::string& app_id) { |
+void GCMService::RemoveAppHandler(const std::string& app_id) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
DCHECK(!app_id.empty()); |
app_handlers_.erase(app_id); |
} |
-void GCMProfileService::Register(const std::string& app_id, |
- const std::vector<std::string>& sender_ids, |
- RegisterCallback callback) { |
+void GCMService::Register(const std::string& app_id, |
+ const std::vector<std::string>& sender_ids, |
+ RegisterCallback callback) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- DCHECK(!app_id.empty() && !sender_ids.empty() && !callback.is_null()); |
+ DCHECK(!app_id.empty()); |
+ DCHECK(!sender_ids.empty()); |
+ DCHECK(!callback.is_null()); |
GCMClient::Result result = EnsureAppReady(app_id); |
if (result != GCMClient::SUCCESS) { |
@@ -569,19 +486,19 @@ void GCMProfileService::Register(const std::string& app_id, |
// Delay the register operation until GCMClient is ready. |
if (!delayed_task_controller_->CanRunTaskWithoutDelay()) { |
- delayed_task_controller_->AddTask( |
- base::Bind(&GCMProfileService::DoRegister, |
- weak_ptr_factory_.GetWeakPtr(), |
- app_id, |
- sender_ids)); |
+ delayed_task_controller_->AddTask(base::Bind(&GCMService::DoRegister, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ app_id, |
+ sender_ids)); |
return; |
} |
DoRegister(app_id, sender_ids); |
} |
-void GCMProfileService::DoRegister(const std::string& app_id, |
- const std::vector<std::string>& sender_ids) { |
+void GCMService::DoRegister(const std::string& app_id, |
+ const std::vector<std::string>& sender_ids) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
std::map<std::string, RegisterCallback>::iterator callback_iter = |
register_callbacks_.find(app_id); |
if (callback_iter == register_callbacks_.end()) { |
@@ -596,16 +513,17 @@ void GCMProfileService::DoRegister(const std::string& app_id, |
content::BrowserThread::PostTask( |
content::BrowserThread::IO, |
FROM_HERE, |
- base::Bind(&GCMProfileService::IOWorker::Register, |
- io_worker_, |
+ base::Bind(&GCMService::IOWorker::Register, |
+ base::Unretained(io_worker_.get()), |
app_id, |
normalized_sender_ids)); |
} |
-void GCMProfileService::Unregister(const std::string& app_id, |
- UnregisterCallback callback) { |
+void GCMService::Unregister(const std::string& app_id, |
+ UnregisterCallback callback) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- DCHECK(!app_id.empty() && !callback.is_null()); |
+ DCHECK(!app_id.empty()); |
+ DCHECK(!callback.is_null()); |
GCMClient::Result result = EnsureAppReady(app_id); |
if (result != GCMClient::SUCCESS) { |
@@ -623,17 +541,16 @@ void GCMProfileService::Unregister(const std::string& app_id, |
// Delay the unregister operation until GCMClient is ready. |
if (!delayed_task_controller_->CanRunTaskWithoutDelay()) { |
- delayed_task_controller_->AddTask( |
- base::Bind(&GCMProfileService::DoUnregister, |
- weak_ptr_factory_.GetWeakPtr(), |
- app_id)); |
+ delayed_task_controller_->AddTask(base::Bind(&GCMService::DoUnregister, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ app_id)); |
return; |
} |
DoUnregister(app_id); |
} |
-void GCMProfileService::DoUnregister(const std::string& app_id) { |
+void GCMService::DoUnregister(const std::string& app_id) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
// Ask the server to unregister it. There could be a small chance that the |
@@ -642,17 +559,19 @@ void GCMProfileService::DoUnregister(const std::string& app_id) { |
content::BrowserThread::PostTask( |
content::BrowserThread::IO, |
FROM_HERE, |
- base::Bind(&GCMProfileService::IOWorker::Unregister, |
- io_worker_, |
+ base::Bind(&GCMService::IOWorker::Unregister, |
+ base::Unretained(io_worker_.get()), |
app_id)); |
} |
-void GCMProfileService::Send(const std::string& app_id, |
- const std::string& receiver_id, |
- const GCMClient::OutgoingMessage& message, |
- SendCallback callback) { |
+void GCMService::Send(const std::string& app_id, |
+ const std::string& receiver_id, |
+ const GCMClient::OutgoingMessage& message, |
+ SendCallback callback) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- DCHECK(!app_id.empty() && !receiver_id.empty() && !callback.is_null()); |
+ DCHECK(!app_id.empty()); |
+ DCHECK(!receiver_id.empty()); |
+ DCHECK(!callback.is_null()); |
GCMClient::Result result = EnsureAppReady(app_id); |
if (result != GCMClient::SUCCESS) { |
@@ -671,45 +590,48 @@ void GCMProfileService::Send(const std::string& app_id, |
// Delay the send operation until all GCMClient is ready. |
if (!delayed_task_controller_->CanRunTaskWithoutDelay()) { |
- delayed_task_controller_->AddTask( |
- base::Bind(&GCMProfileService::DoSend, |
- weak_ptr_factory_.GetWeakPtr(), |
- app_id, |
- receiver_id, |
- message)); |
+ delayed_task_controller_->AddTask(base::Bind(&GCMService::DoSend, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ app_id, |
+ receiver_id, |
+ message)); |
return; |
} |
DoSend(app_id, receiver_id, message); |
} |
-void GCMProfileService::DoSend(const std::string& app_id, |
- const std::string& receiver_id, |
- const GCMClient::OutgoingMessage& message) { |
+void GCMService::DoSend(const std::string& app_id, |
+ const std::string& receiver_id, |
+ const GCMClient::OutgoingMessage& message) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
content::BrowserThread::PostTask( |
content::BrowserThread::IO, |
FROM_HERE, |
- base::Bind(&GCMProfileService::IOWorker::Send, |
- io_worker_, |
+ base::Bind(&GCMService::IOWorker::Send, |
+ base::Unretained(io_worker_.get()), |
app_id, |
receiver_id, |
message)); |
} |
-GCMClient* GCMProfileService::GetGCMClientForTesting() const { |
+GCMClient* GCMService::GetGCMClientForTesting() const { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
return io_worker_ ? io_worker_->gcm_client_for_testing() : NULL; |
} |
-std::string GCMProfileService::SignedInUserName() const { |
- return username_; |
+bool GCMService::IsStarted() const { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ return !account_id_.empty(); |
} |
-bool GCMProfileService::IsGCMClientReady() const { |
+bool GCMService::IsGCMClientReady() const { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
return gcm_client_ready_; |
} |
-void GCMProfileService::GetGCMStatistics( |
- GetGCMStatisticsCallback callback, bool clear_logs) { |
+void GCMService::GetGCMStatistics(GetGCMStatisticsCallback callback, |
+ bool clear_logs) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
DCHECK(!callback.is_null()); |
@@ -717,62 +639,45 @@ void GCMProfileService::GetGCMStatistics( |
content::BrowserThread::PostTask( |
content::BrowserThread::IO, |
FROM_HERE, |
- base::Bind(&GCMProfileService::IOWorker::GetGCMStatistics, |
- io_worker_, |
+ base::Bind(&GCMService::IOWorker::GetGCMStatistics, |
+ base::Unretained(io_worker_.get()), |
clear_logs)); |
} |
-void GCMProfileService::SetGCMRecording( |
- GetGCMStatisticsCallback callback, bool recording) { |
+void GCMService::SetGCMRecording(GetGCMStatisticsCallback callback, |
+ bool recording) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
request_gcm_statistics_callback_ = callback; |
content::BrowserThread::PostTask( |
content::BrowserThread::IO, |
FROM_HERE, |
- base::Bind(&GCMProfileService::IOWorker::SetGCMRecording, |
- io_worker_, |
+ base::Bind(&GCMService::IOWorker::SetGCMRecording, |
+ base::Unretained(io_worker_.get()), |
recording)); |
} |
-void GCMProfileService::Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- |
- switch (type) { |
- case chrome::NOTIFICATION_PROFILE_DESTROYED: |
- ResetGCMClient(); |
- break; |
- default: |
- NOTREACHED(); |
- } |
-} |
- |
-void GCMProfileService::GoogleSigninSucceeded(const std::string& username, |
- const std::string& password) { |
- if (GetGCMEnabledState(profile_) == ALWAYS_ENABLED) |
+void GCMService::OnActiveAccountLogin() { |
+ if (ShouldStartAutomatically()) |
EnsureLoaded(); |
} |
-void GCMProfileService::GoogleSignedOut(const std::string& username) { |
+void GCMService::OnActiveAccountLogout() { |
CheckOut(); |
} |
-void GCMProfileService::EnsureLoaded() { |
- SigninManagerBase* manager = SigninManagerFactory::GetForProfile(profile_); |
- if (!manager) |
- return; |
- std::string username = manager->GetAuthenticatedUsername(); |
- if (username.empty()) |
+void GCMService::EnsureLoaded() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ const std::string account_id = identity_provider_->GetActiveAccountId(); |
+ if (account_id.empty()) |
return; |
// CheckIn could be called more than once when: |
// 1) The password changes. |
// 2) Register/send function calls it to ensure CheckIn is done. |
- if (username_ == username) |
+ if (account_id_ == account_id) |
return; |
- username_ = username; |
+ account_id_ = account_id; |
DCHECK(!delayed_task_controller_); |
delayed_task_controller_.reset(new DelayedTaskController); |
@@ -784,24 +689,25 @@ void GCMProfileService::EnsureLoaded() { |
content::BrowserThread::PostTask( |
content::BrowserThread::IO, |
FROM_HERE, |
- base::Bind(&GCMProfileService::IOWorker::Load, |
- io_worker_, |
+ base::Bind(&GCMService::IOWorker::Load, |
+ base::Unretained(io_worker_.get()), |
weak_ptr_factory_.GetWeakPtr())); |
} |
-void GCMProfileService::RemoveCachedData() { |
+void GCMService::RemoveCachedData() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
// Remove all the queued tasks since they no longer make sense after |
// GCM service is stopped. |
weak_ptr_factory_.InvalidateWeakPtrs(); |
- username_.clear(); |
+ account_id_.clear(); |
gcm_client_ready_ = false; |
delayed_task_controller_.reset(); |
register_callbacks_.clear(); |
send_callbacks_.clear(); |
} |
-void GCMProfileService::CheckOut() { |
+void GCMService::CheckOut() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
// We still proceed with the check-out logic even if the check-in is not |
@@ -813,36 +719,31 @@ void GCMProfileService::CheckOut() { |
content::BrowserThread::PostTask( |
content::BrowserThread::IO, |
FROM_HERE, |
- base::Bind(&GCMProfileService::IOWorker::CheckOut, io_worker_)); |
+ base::Bind(&GCMService::IOWorker::CheckOut, |
+ base::Unretained(io_worker_.get()))); |
} |
-void GCMProfileService::ResetGCMClient() { |
- content::BrowserThread::PostTask( |
- content::BrowserThread::IO, |
- FROM_HERE, |
- base::Bind(&GCMProfileService::IOWorker::Reset, io_worker_)); |
-} |
- |
-GCMClient::Result GCMProfileService::EnsureAppReady(const std::string& app_id) { |
+GCMClient::Result GCMService::EnsureAppReady(const std::string& app_id) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
// Ensure that check-in has been done. |
EnsureLoaded(); |
- // If the profile was not signed in, bail out. |
- if (username_.empty()) |
+ // If the service was not started, bail out. |
+ if (account_id_.empty()) |
return GCMClient::NOT_SIGNED_IN; |
return GCMClient::SUCCESS; |
} |
-bool GCMProfileService::IsAsyncOperationPending( |
- const std::string& app_id) const { |
+bool GCMService::IsAsyncOperationPending(const std::string& app_id) const { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
return register_callbacks_.find(app_id) != register_callbacks_.end() || |
unregister_callbacks_.find(app_id) != unregister_callbacks_.end(); |
} |
-void GCMProfileService::RegisterFinished(const std::string& app_id, |
- const std::string& registration_id, |
- GCMClient::Result result) { |
+void GCMService::RegisterFinished(const std::string& app_id, |
+ const std::string& registration_id, |
+ GCMClient::Result result) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
std::map<std::string, RegisterCallback>::iterator callback_iter = |
@@ -857,8 +758,8 @@ void GCMProfileService::RegisterFinished(const std::string& app_id, |
callback.Run(registration_id, result); |
} |
-void GCMProfileService::UnregisterFinished(const std::string& app_id, |
- GCMClient::Result result) { |
+void GCMService::UnregisterFinished(const std::string& app_id, |
+ GCMClient::Result result) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
std::map<std::string, UnregisterCallback>::iterator callback_iter = |
@@ -871,9 +772,9 @@ void GCMProfileService::UnregisterFinished(const std::string& app_id, |
callback.Run(result); |
} |
-void GCMProfileService::SendFinished(const std::string& app_id, |
- const std::string& message_id, |
- GCMClient::Result result) { |
+void GCMService::SendFinished(const std::string& app_id, |
+ const std::string& message_id, |
+ GCMClient::Result result) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
std::map<std::pair<std::string, std::string>, SendCallback>::iterator |
@@ -889,40 +790,40 @@ void GCMProfileService::SendFinished(const std::string& app_id, |
callback.Run(message_id, result); |
} |
-void GCMProfileService::MessageReceived(const std::string& app_id, |
- GCMClient::IncomingMessage message) { |
+void GCMService::MessageReceived(const std::string& app_id, |
+ GCMClient::IncomingMessage message) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
// Drop the event if signed out. |
- if (username_.empty()) |
+ if (account_id_.empty()) |
return; |
GetAppHandler(app_id)->OnMessage(app_id, message); |
} |
-void GCMProfileService::MessagesDeleted(const std::string& app_id) { |
+void GCMService::MessagesDeleted(const std::string& app_id) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
// Drop the event if signed out. |
- if (username_.empty()) |
+ if (account_id_.empty()) |
return; |
GetAppHandler(app_id)->OnMessagesDeleted(app_id); |
} |
-void GCMProfileService::MessageSendError( |
+void GCMService::MessageSendError( |
const std::string& app_id, |
const GCMClient::SendErrorDetails& send_error_details) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
// Drop the event if signed out. |
- if (username_.empty()) |
+ if (account_id_.empty()) |
return; |
GetAppHandler(app_id)->OnSendError(app_id, send_error_details); |
} |
-void GCMProfileService::GCMClientReady() { |
+void GCMService::GCMClientReady() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
if (gcm_client_ready_) |
@@ -932,13 +833,15 @@ void GCMProfileService::GCMClientReady() { |
delayed_task_controller_->SetReady(); |
} |
-GCMAppHandler* GCMProfileService::GetAppHandler(const std::string& app_id) { |
+GCMAppHandler* GCMService::GetAppHandler(const std::string& app_id) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ |
std::map<std::string, GCMAppHandler*>::const_iterator iter = |
app_handlers_.find(app_id); |
return iter == app_handlers_.end() ? &default_app_handler_ : iter->second; |
} |
-void GCMProfileService::GetGCMStatisticsFinished( |
+void GCMService::GetGCMStatisticsFinished( |
GCMClient::GCMStatistics stats) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
request_gcm_statistics_callback_.Run(stats); |