OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/google_apis/drive_notification_manager.h" | 5 #include "chrome/browser/google_apis/drive_notification_manager.h" |
6 | 6 |
7 #include "base/metrics/histogram.h" | 7 #include "base/metrics/histogram.h" |
8 #include "chrome/browser/google_apis/drive_notification_observer.h" | 8 #include "chrome/browser/google_apis/drive_notification_observer.h" |
| 9 #include "chrome/browser/invalidation/invalidation_service.h" |
| 10 #include "chrome/browser/invalidation/invalidation_service_factory.h" |
9 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
10 #include "chrome/browser/sync/profile_sync_service.h" | |
11 #include "chrome/browser/sync/profile_sync_service_factory.h" | |
12 #include "google/cacheinvalidation/types.pb.h" | 12 #include "google/cacheinvalidation/types.pb.h" |
13 | 13 |
14 namespace google_apis { | 14 namespace google_apis { |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 // The polling interval time is used when XMPP is disabled. | 18 // The polling interval time is used when XMPP is disabled. |
19 const int kFastPollingIntervalInSecs = 60; | 19 const int kFastPollingIntervalInSecs = 60; |
20 | 20 |
21 // The polling interval time is used when XMPP is enabled. Theoretically | 21 // The polling interval time is used when XMPP is enabled. Theoretically |
(...skipping 13 matching lines...) Expand all Loading... |
35 polling_timer_(true /* retain_user_task */, false /* is_repeating */), | 35 polling_timer_(true /* retain_user_task */, false /* is_repeating */), |
36 weak_ptr_factory_(this) { | 36 weak_ptr_factory_(this) { |
37 RegisterDriveNotifications(); | 37 RegisterDriveNotifications(); |
38 RestartPollingTimer(); | 38 RestartPollingTimer(); |
39 } | 39 } |
40 | 40 |
41 DriveNotificationManager::~DriveNotificationManager() {} | 41 DriveNotificationManager::~DriveNotificationManager() {} |
42 | 42 |
43 void DriveNotificationManager::Shutdown() { | 43 void DriveNotificationManager::Shutdown() { |
44 // Unregister for Drive notifications. | 44 // Unregister for Drive notifications. |
45 ProfileSyncService* profile_sync_service = | 45 invalidation::InvalidationService* invalidation_service = |
46 ProfileSyncServiceFactory::GetForProfile(profile_); | 46 invalidation::InvalidationServiceFactory::GetForProfile(profile_); |
47 if (!profile_sync_service || !push_notification_registered_) { | 47 if (!invalidation_service || !push_notification_registered_) { |
48 return; | 48 return; |
49 } | 49 } |
50 | 50 |
51 profile_sync_service->UpdateRegisteredInvalidationIds( | 51 invalidation_service->UpdateRegisteredInvalidationIds( |
52 this, syncer::ObjectIdSet()); | 52 this, syncer::ObjectIdSet()); |
53 profile_sync_service->UnregisterInvalidationHandler(this); | 53 invalidation_service->UnregisterInvalidationHandler(this); |
54 } | 54 } |
55 | 55 |
56 void DriveNotificationManager::OnInvalidatorStateChange( | 56 void DriveNotificationManager::OnInvalidatorStateChange( |
57 syncer::InvalidatorState state) { | 57 syncer::InvalidatorState state) { |
58 push_notification_enabled_ = (state == syncer::INVALIDATIONS_ENABLED); | 58 push_notification_enabled_ = (state == syncer::INVALIDATIONS_ENABLED); |
59 if (push_notification_enabled_) { | 59 if (push_notification_enabled_) { |
60 DVLOG(1) << "XMPP Notifications enabled"; | 60 DVLOG(1) << "XMPP Notifications enabled"; |
61 } else { | 61 } else { |
62 DVLOG(1) << "XMPP Notifications disabled (state=" << state << ")"; | 62 DVLOG(1) << "XMPP Notifications disabled (state=" << state << ")"; |
63 } | 63 } |
64 FOR_EACH_OBSERVER(DriveNotificationObserver, observers_, | 64 FOR_EACH_OBSERVER(DriveNotificationObserver, observers_, |
65 OnPushNotificationEnabled(push_notification_enabled_)); | 65 OnPushNotificationEnabled(push_notification_enabled_)); |
66 } | 66 } |
67 | 67 |
68 void DriveNotificationManager::OnIncomingInvalidation( | 68 void DriveNotificationManager::OnIncomingInvalidation( |
69 const syncer::ObjectIdInvalidationMap& invalidation_map) { | 69 const syncer::ObjectIdInvalidationMap& invalidation_map) { |
70 DVLOG(2) << "XMPP Drive Notification Received"; | 70 DVLOG(2) << "XMPP Drive Notification Received"; |
71 DCHECK_EQ(1U, invalidation_map.size()); | 71 DCHECK_EQ(1U, invalidation_map.size()); |
72 const invalidation::ObjectId object_id( | 72 const invalidation::ObjectId object_id( |
73 ipc::invalidation::ObjectSource::COSMO_CHANGELOG, | 73 ipc::invalidation::ObjectSource::COSMO_CHANGELOG, |
74 kDriveInvalidationObjectId); | 74 kDriveInvalidationObjectId); |
75 DCHECK_EQ(1U, invalidation_map.count(object_id)); | 75 DCHECK_EQ(1U, invalidation_map.count(object_id)); |
76 | 76 |
77 // TODO(dcheng): Only acknowledge the invalidation once the fetch has | 77 // TODO(dcheng): Only acknowledge the invalidation once the fetch has |
78 // completed. http://crbug.com/156843 | 78 // completed. http://crbug.com/156843 |
79 ProfileSyncService* profile_sync_service = | 79 invalidation::InvalidationService* invalidation_service = |
80 ProfileSyncServiceFactory::GetForProfile(profile_); | 80 invalidation::InvalidationServiceFactory::GetForProfile(profile_); |
81 profile_sync_service->AcknowledgeInvalidation( | 81 CHECK(invalidation_service); |
| 82 invalidation_service->AcknowledgeInvalidation( |
82 invalidation_map.begin()->first, | 83 invalidation_map.begin()->first, |
83 invalidation_map.begin()->second.ack_handle); | 84 invalidation_map.begin()->second.ack_handle); |
84 | 85 |
85 NotifyObserversToUpdate(NOTIFICATION_XMPP); | 86 NotifyObserversToUpdate(NOTIFICATION_XMPP); |
86 } | 87 } |
87 | 88 |
88 void DriveNotificationManager::AddObserver( | 89 void DriveNotificationManager::AddObserver( |
89 DriveNotificationObserver* observer) { | 90 DriveNotificationObserver* observer) { |
90 observers_.AddObserver(observer); | 91 observers_.AddObserver(observer); |
91 } | 92 } |
(...skipping 29 matching lines...) Expand all Loading... |
121 | 122 |
122 // Note that polling_timer_ is not a repeating timer. Restarting manually | 123 // Note that polling_timer_ is not a repeating timer. Restarting manually |
123 // here is better as XMPP may be received right before the polling timer is | 124 // here is better as XMPP may be received right before the polling timer is |
124 // fired (i.e. we don't notify observers twice in a row). | 125 // fired (i.e. we don't notify observers twice in a row). |
125 RestartPollingTimer(); | 126 RestartPollingTimer(); |
126 } | 127 } |
127 | 128 |
128 void DriveNotificationManager::RegisterDriveNotifications() { | 129 void DriveNotificationManager::RegisterDriveNotifications() { |
129 DCHECK(!push_notification_enabled_); | 130 DCHECK(!push_notification_enabled_); |
130 | 131 |
131 ProfileSyncService* profile_sync_service = | 132 invalidation::InvalidationService* invalidation_service = |
132 ProfileSyncServiceFactory::GetForProfile(profile_); | 133 invalidation::InvalidationServiceFactory::GetForProfile(profile_); |
133 if (!profile_sync_service) | 134 if (!invalidation_service) |
134 return; | 135 return; |
135 | 136 |
136 profile_sync_service->RegisterInvalidationHandler(this); | 137 invalidation_service->RegisterInvalidationHandler(this); |
137 syncer::ObjectIdSet ids; | 138 syncer::ObjectIdSet ids; |
138 ids.insert(invalidation::ObjectId( | 139 ids.insert(invalidation::ObjectId( |
139 ipc::invalidation::ObjectSource::COSMO_CHANGELOG, | 140 ipc::invalidation::ObjectSource::COSMO_CHANGELOG, |
140 kDriveInvalidationObjectId)); | 141 kDriveInvalidationObjectId)); |
141 profile_sync_service->UpdateRegisteredInvalidationIds(this, ids); | 142 invalidation_service->UpdateRegisteredInvalidationIds(this, ids); |
142 push_notification_registered_ = true; | 143 push_notification_registered_ = true; |
143 OnInvalidatorStateChange(profile_sync_service->GetInvalidatorState()); | 144 OnInvalidatorStateChange(invalidation_service->GetInvalidatorState()); |
144 | 145 |
145 UMA_HISTOGRAM_BOOLEAN("Drive.PushNotificationRegistered", | 146 UMA_HISTOGRAM_BOOLEAN("Drive.PushNotificationRegistered", |
146 push_notification_registered_); | 147 push_notification_registered_); |
147 } | 148 } |
148 | 149 |
149 // static | 150 // static |
150 std::string DriveNotificationManager::NotificationSourceToString( | 151 std::string DriveNotificationManager::NotificationSourceToString( |
151 NotificationSource source) { | 152 NotificationSource source) { |
152 switch (source) { | 153 switch (source) { |
153 case NOTIFICATION_XMPP: | 154 case NOTIFICATION_XMPP: |
154 return "NOTIFICATION_XMPP"; | 155 return "NOTIFICATION_XMPP"; |
155 case NOTIFICATION_POLLING: | 156 case NOTIFICATION_POLLING: |
156 return "NOTIFICATION_POLLING"; | 157 return "NOTIFICATION_POLLING"; |
157 } | 158 } |
158 | 159 |
159 NOTREACHED(); | 160 NOTREACHED(); |
160 return ""; | 161 return ""; |
161 } | 162 } |
162 | 163 |
163 } // namespace google_apis | 164 } // namespace google_apis |
OLD | NEW |