| Index: google_apis/gcm/gcm_client_impl.cc
|
| diff --git a/google_apis/gcm/gcm_client_impl.cc b/google_apis/gcm/gcm_client_impl.cc
|
| index 4cc0fdd38b0acf28280c6df8b7cef754703a3db2..9aaa043285e8774c24159866596b7134fad6274b 100644
|
| --- a/google_apis/gcm/gcm_client_impl.cc
|
| +++ b/google_apis/gcm/gcm_client_impl.cc
|
| @@ -74,6 +74,7 @@ enum MessageType {
|
| const char kMCSEndpointMain[] = "https://mtalk.google.com:5228";
|
| const char kMCSEndpointFallback[] = "https://mtalk.google.com:443";
|
|
|
| +const int64 kDefaultCheckinInterval = 2 * 24 * 60 * 60LL; // seconds = 2 days.
|
| const int kMaxRegistrationRetries = 5;
|
| const char kMessageTypeDataMessage[] = "gcm";
|
| const char kMessageTypeDeletedMessagesKey[] = "deleted_messages";
|
| @@ -209,18 +210,20 @@ void GCMClientImpl::OnLoadCompleted(scoped_ptr<GCMStore::LoadResult> result) {
|
| }
|
|
|
| registrations_ = result->registrations;
|
| -
|
| device_checkin_info_.android_id = result->device_android_id;
|
| device_checkin_info_.secret = result->device_security_token;
|
| + base::Time last_checkin_time = result->last_checkin_time;
|
| InitializeMCSClient(result.Pass());
|
| - if (!device_checkin_info_.IsValid()) {
|
| - device_checkin_info_.Reset();
|
| - state_ = INITIAL_DEVICE_CHECKIN;
|
| - StartCheckin(device_checkin_info_);
|
| +
|
| + if (device_checkin_info_.IsValid()) {
|
| + SchedulePeriodicCheckin(last_checkin_time);
|
| + OnReady();
|
| return;
|
| }
|
|
|
| - OnReady();
|
| + state_ = INITIAL_DEVICE_CHECKIN;
|
| + device_checkin_info_.Reset();
|
| + StartCheckin();
|
| }
|
|
|
| void GCMClientImpl::InitializeMCSClient(
|
| @@ -281,14 +284,14 @@ void GCMClientImpl::ResetState() {
|
| // TODO(fgorski): reset all of the necessart objects and start over.
|
| }
|
|
|
| -void GCMClientImpl::StartCheckin(const CheckinInfo& checkin_info) {
|
| +void GCMClientImpl::StartCheckin() {
|
| checkin_request_.reset(
|
| new CheckinRequest(base::Bind(&GCMClientImpl::OnCheckinCompleted,
|
| weak_ptr_factory_.GetWeakPtr()),
|
| kDefaultBackoffPolicy,
|
| chrome_build_proto_,
|
| - checkin_info.android_id,
|
| - checkin_info.secret,
|
| + device_checkin_info_.android_id,
|
| + device_checkin_info_.secret,
|
| account_ids_,
|
| url_request_context_getter_));
|
| checkin_request_->Start();
|
| @@ -311,16 +314,43 @@ void GCMClientImpl::OnCheckinCompleted(uint64 android_id,
|
| if (state_ == INITIAL_DEVICE_CHECKIN) {
|
| OnFirstTimeDeviceCheckinCompleted(checkin_info);
|
| } else {
|
| + // checkin_info is not expected to change after a periodic checkin as it
|
| + // would invalidate the registratoin IDs.
|
| DCHECK_EQ(READY, state_);
|
| - if (device_checkin_info_.android_id != checkin_info.android_id ||
|
| - device_checkin_info_.secret != checkin_info.secret) {
|
| - ResetState();
|
| - } else {
|
| - // TODO(fgorski): Reset the checkin timer.
|
| - }
|
| + DCHECK_EQ(device_checkin_info_.android_id, checkin_info.android_id);
|
| + DCHECK_EQ(device_checkin_info_.secret, checkin_info.secret);
|
| + }
|
| +
|
| + if (device_checkin_info_.IsValid()) {
|
| + base::Time last_checkin_time = clock_->Now();
|
| + gcm_store_->SetLastCheckinTime(
|
| + last_checkin_time,
|
| + base::Bind(&GCMClientImpl::SetLastCheckinTimeCallback,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| + SchedulePeriodicCheckin(last_checkin_time);
|
| }
|
| }
|
|
|
| +void GCMClientImpl::SchedulePeriodicCheckin(
|
| + const base::Time& last_checkin_time) {
|
| + base::TimeDelta time_to_next_checkin = last_checkin_time +
|
| + base::TimeDelta::FromSeconds(kDefaultCheckinInterval) - clock_->Now();
|
| + if (time_to_next_checkin < base::TimeDelta::FromSeconds(0L))
|
| + time_to_next_checkin = base::TimeDelta::FromSeconds(0L);
|
| + // TODO(fgorski): Make sure that once dynamic events (like accounts list
|
| + // change) trigger checkin we reset the timer.
|
| + base::MessageLoop::current()->PostDelayedTask(
|
| + FROM_HERE,
|
| + base::Bind(&GCMClientImpl::StartCheckin,
|
| + weak_ptr_factory_.GetWeakPtr()),
|
| + time_to_next_checkin);
|
| +}
|
| +
|
| +void GCMClientImpl::SetLastCheckinTimeCallback(bool success) {
|
| + // TODO(fgorski): This is one of the signals that store needs a rebuild.
|
| + DCHECK(success);
|
| +}
|
| +
|
| void GCMClientImpl::SetDeviceCredentialsCallback(bool success) {
|
| // TODO(fgorski): This is one of the signals that store needs a rebuild.
|
| DCHECK(success);
|
|
|