Index: chrome/browser/services/gcm/gcm_driver.cc |
diff --git a/chrome/browser/services/gcm/gcm_driver.cc b/chrome/browser/services/gcm/gcm_driver.cc |
index f8bcf72ca257ff456ac811bc5008b1cbcbc455d9..a855a18eeb09066ada4fe2961226ec6ca1a21c29 100644 |
--- a/chrome/browser/services/gcm/gcm_driver.cc |
+++ b/chrome/browser/services/gcm/gcm_driver.cc |
@@ -382,16 +382,15 @@ void GCMDriver::IOWorker::SetGCMRecording(bool recording) { |
base::Bind(&GCMDriver::GetGCMStatisticsFinished, service_, stats)); |
} |
-GCMDriver::GCMDriver(scoped_ptr<IdentityProvider> identity_provider) |
- : identity_provider_(identity_provider.Pass()), |
+GCMDriver::GCMDriver( |
+ scoped_ptr<GCMClientFactory> gcm_client_factory, |
+ scoped_ptr<IdentityProvider> identity_provider, |
+ const base::FilePath& store_path, |
+ const scoped_refptr<net::URLRequestContextGetter>& request_context) |
+ : gcm_enabled_(true), |
gcm_client_ready_(false), |
+ identity_provider_(identity_provider.Pass()), |
weak_ptr_factory_(this) { |
-} |
- |
-GCMDriver::~GCMDriver() { |
-} |
- |
-void GCMDriver::Initialize(scoped_ptr<GCMClientFactory> gcm_client_factory) { |
// Get the list of available accounts. |
std::vector<std::string> account_ids; |
#if !defined(OS_ANDROID) |
@@ -400,7 +399,6 @@ void GCMDriver::Initialize(scoped_ptr<GCMClientFactory> gcm_client_factory) { |
// Create and initialize the GCMClient. Note that this does not initiate the |
// GCM check-in. |
- DCHECK(!io_worker_); |
io_worker_.reset(new IOWorker()); |
content::BrowserThread::PostTask( |
content::BrowserThread::IO, |
@@ -408,23 +406,42 @@ void GCMDriver::Initialize(scoped_ptr<GCMClientFactory> gcm_client_factory) { |
base::Bind(&GCMDriver::IOWorker::Initialize, |
base::Unretained(io_worker_.get()), |
base::Passed(&gcm_client_factory), |
- GetStorePath(), |
+ store_path, |
account_ids, |
- GetURLRequestContextGetter())); |
- |
- // Start the GCM service if the rollout signal indicates yes. |
- if (ShouldStartAutomatically()) |
- EnsureStarted(); |
+ request_context)); |
identity_provider_->AddObserver(this); |
} |
-void GCMDriver::Start() { |
+GCMDriver::GCMDriver() |
+ : gcm_enabled_(true), |
+ gcm_client_ready_(false), |
+ weak_ptr_factory_(this) { |
+} |
+ |
+GCMDriver::~GCMDriver() { |
+} |
+ |
+void GCMDriver::Enable() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ if (gcm_enabled_) |
+ return; |
+ gcm_enabled_ = true; |
+ |
EnsureStarted(); |
} |
+void GCMDriver::Disable() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ |
+ if (!gcm_enabled_) |
+ return; |
+ gcm_enabled_ = false; |
+ |
+ Stop(); |
+} |
+ |
void GCMDriver::Stop() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
@@ -441,7 +458,7 @@ void GCMDriver::Stop() { |
base::Unretained(io_worker_.get()))); |
} |
-void GCMDriver::ShutdownService() { |
+void GCMDriver::Shutdown() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
identity_provider_->RemoveObserver(this); |
for (GCMAppHandlerMap::const_iterator iter = app_handlers_.begin(); |
@@ -462,6 +479,9 @@ void GCMDriver::AddAppHandler(const std::string& app_id, |
DCHECK(app_handlers_.find(app_id) == app_handlers_.end()); |
app_handlers_[app_id] = handler; |
+ |
+ // Ensures that the GCM service is started when there is an interest. |
+ EnsureStarted(); |
} |
void GCMDriver::RemoveAppHandler(const std::string& app_id) { |
@@ -479,7 +499,7 @@ void GCMDriver::Register(const std::string& app_id, |
DCHECK(!sender_ids.empty()); |
DCHECK(!callback.is_null()); |
- GCMClient::Result result = EnsureAppReady(app_id); |
+ GCMClient::Result result = EnsureStarted(); |
if (result != GCMClient::SUCCESS) { |
callback.Run(std::string(), result); |
return; |
@@ -534,7 +554,7 @@ void GCMDriver::Unregister(const std::string& app_id, |
DCHECK(!app_id.empty()); |
DCHECK(!callback.is_null()); |
- GCMClient::Result result = EnsureAppReady(app_id); |
+ GCMClient::Result result = EnsureStarted(); |
if (result != GCMClient::SUCCESS) { |
callback.Run(result); |
return; |
@@ -582,7 +602,7 @@ void GCMDriver::Send(const std::string& app_id, |
DCHECK(!receiver_id.empty()); |
DCHECK(!callback.is_null()); |
- GCMClient::Result result = EnsureAppReady(app_id); |
+ GCMClient::Result result = EnsureStarted(); |
if (result != GCMClient::SUCCESS) { |
callback.Run(std::string(), result); |
return; |
@@ -667,25 +687,29 @@ void GCMDriver::SetGCMRecording(const GetGCMStatisticsCallback& callback, |
} |
void GCMDriver::OnActiveAccountLogin() { |
- if (ShouldStartAutomatically()) |
- EnsureStarted(); |
+ EnsureStarted(); |
} |
void GCMDriver::OnActiveAccountLogout() { |
CheckOut(); |
} |
-void GCMDriver::EnsureStarted() { |
+GCMClient::Result GCMDriver::EnsureStarted() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ |
+ if (!gcm_enabled_) |
+ return GCMClient::GCM_DISABLED; |
+ |
+ // Is the user signed in? |
const std::string account_id = identity_provider_->GetActiveAccountId(); |
if (account_id.empty()) |
- return; |
+ return GCMClient::NOT_SIGNED_IN; |
// CheckIn could be called more than once when: |
// 1) The password changes. |
// 2) Register/send function calls it to ensure CheckIn is done. |
if (account_id_ == account_id) |
- return; |
+ return GCMClient::SUCCESS; |
account_id_ = account_id; |
DCHECK(!delayed_task_controller_); |
@@ -699,6 +723,8 @@ void GCMDriver::EnsureStarted() { |
base::Bind(&GCMDriver::IOWorker::Start, |
base::Unretained(io_worker_.get()), |
weak_ptr_factory_.GetWeakPtr())); |
+ |
+ return GCMClient::SUCCESS; |
} |
void GCMDriver::RemoveCachedData() { |
@@ -730,19 +756,6 @@ void GCMDriver::CheckOut() { |
base::Unretained(io_worker_.get()))); |
} |
-GCMClient::Result GCMDriver::EnsureAppReady(const std::string& app_id) { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- |
- // Starts the service if not yet. |
- EnsureStarted(); |
- |
- // If the service cannot be started, bail out. |
- if (account_id_.empty()) |
- return GCMClient::NOT_SIGNED_IN; |
- |
- return GCMClient::SUCCESS; |
-} |
- |
bool GCMDriver::IsAsyncOperationPending(const std::string& app_id) const { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
return register_callbacks_.find(app_id) != register_callbacks_.end() || |
@@ -859,4 +872,10 @@ void GCMDriver::GetGCMStatisticsFinished(GCMClient::GCMStatistics stats) { |
LOG(WARNING) << "request_gcm_statistics_callback_ is NULL."; |
} |
+std::string GCMDriver::SignedInUserName() const { |
+ if (IsStarted()) |
+ return identity_provider_->GetActiveUsername(); |
+ return std::string(); |
+} |
+ |
} // namespace gcm |