Index: trunk/src/chrome/browser/chromeos/drive/drive_system_service.cc |
=================================================================== |
--- trunk/src/chrome/browser/chromeos/drive/drive_system_service.cc (revision 195487) |
+++ trunk/src/chrome/browser/chromeos/drive/drive_system_service.cc (working copy) |
@@ -25,12 +25,12 @@ |
#include "chrome/browser/google_apis/auth_service.h" |
#include "chrome/browser/google_apis/drive_api_service.h" |
#include "chrome/browser/google_apis/drive_api_util.h" |
-#include "chrome/browser/google_apis/drive_notification_manager.h" |
-#include "chrome/browser/google_apis/drive_notification_manager_factory.h" |
#include "chrome/browser/google_apis/gdata_wapi_service.h" |
#include "chrome/browser/google_apis/gdata_wapi_url_generator.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/profiles/profile_dependency_manager.h" |
+#include "chrome/browser/sync/profile_sync_service.h" |
+#include "chrome/browser/sync/profile_sync_service_factory.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/chrome_version_info.h" |
#include "chrome/common/pref_names.h" |
@@ -49,6 +49,9 @@ |
static const size_t kEventLogHistorySize = 100; |
+// The sync invalidation object ID for Google Drive. |
+const char kDriveInvalidationObjectId[] = "CHANGELOG"; |
+ |
// Returns true if Drive is enabled for the given Profile. |
bool IsDriveEnabledForProfile(Profile* profile) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -103,6 +106,7 @@ |
DriveFileSystemInterface* test_file_system) |
: profile_(profile), |
drive_disabled_(false), |
+ push_notification_registered_(false), |
ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
base::SequencedWorkerPool* blocking_pool = BrowserThread::GetBlockingPool(); |
@@ -172,10 +176,19 @@ |
void DriveSystemService::Shutdown() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- google_apis::DriveNotificationManager* drive_notification_manager = |
- google_apis::DriveNotificationManagerFactory::GetForProfile(profile_); |
- DCHECK(drive_notification_manager); |
- drive_notification_manager->RemoveObserver(this); |
+ ProfileSyncService* profile_sync_service = |
+ profile_ ? ProfileSyncServiceFactory::GetForProfile(profile_) : NULL; |
+ if (profile_sync_service && push_notification_registered_) { |
+ // TODO(kochi): Once DriveSystemService gets started / stopped at runtime, |
+ // this ID needs to be unregistered *before* the handler is unregistered |
+ // as ID persists across browser restarts. |
+ if (!IsDriveEnabledForProfile(profile_)) { |
+ profile_sync_service->UpdateRegisteredInvalidationIds( |
+ this, syncer::ObjectIdSet()); |
+ } |
+ profile_sync_service->UnregisterInvalidationHandler(this); |
+ push_notification_registered_ = false; |
+ } |
RemoveDriveMountPoint(); |
} |
@@ -190,10 +203,6 @@ |
observers_.RemoveObserver(observer); |
} |
-void DriveSystemService::OnNotificationReceived() { |
- file_system_->CheckForUpdates(); |
-} |
- |
bool DriveSystemService::IsDriveEnabled() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -207,6 +216,22 @@ |
return true; |
} |
+void DriveSystemService::OnInvalidatorStateChange( |
+ syncer::InvalidatorState state) { |
+ DVLOG(1) << "InvalidatorState changed to " << state; |
+} |
+ |
+void DriveSystemService::OnIncomingInvalidation( |
+ const syncer::ObjectIdInvalidationMap& invalidation_map) { |
+ DCHECK_EQ(1U, invalidation_map.size()); |
+ const invalidation::ObjectId object_id( |
+ ipc::invalidation::ObjectSource::COSMO_CHANGELOG, |
+ kDriveInvalidationObjectId); |
+ DCHECK_EQ(1U, invalidation_map.count(object_id)); |
+ |
+ file_system_->CheckForUpdates(); |
+} |
+ |
void DriveSystemService::ClearCacheAndRemountFileSystem( |
const base::Callback<void(bool)>& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -264,6 +289,19 @@ |
AddDriveMountPoint(); |
} |
+bool DriveSystemService::PushNotificationEnabled() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(profile_); |
+ |
+ ProfileSyncService* profile_sync_service = |
+ ProfileSyncServiceFactory::GetForProfile(profile_); |
+ if (!profile_sync_service) |
+ return false; |
+ |
+ return (profile_sync_service->GetInvalidatorState() == |
+ syncer::INVALIDATIONS_ENABLED); |
+} |
+ |
void DriveSystemService::AddDriveMountPoint() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!file_system_proxy_.get()); |
@@ -341,10 +379,18 @@ |
cache_->GetCacheDirectoryPath(DriveCache::CACHE_TYPE_TMP_DOWNLOADS)); |
// Register for Google Drive invalidation notifications. |
- google_apis::DriveNotificationManager* drive_notification_manager = |
- google_apis::DriveNotificationManagerFactory::GetForProfile(profile_); |
- DCHECK(drive_notification_manager); |
- drive_notification_manager->AddObserver(this); |
+ ProfileSyncService* profile_sync_service = |
+ profile_ ? ProfileSyncServiceFactory::GetForProfile(profile_) : NULL; |
+ if (profile_sync_service) { |
+ DCHECK(!push_notification_registered_); |
+ profile_sync_service->RegisterInvalidationHandler(this); |
+ syncer::ObjectIdSet ids; |
+ ids.insert(invalidation::ObjectId( |
+ ipc::invalidation::ObjectSource::COSMO_CHANGELOG, |
+ kDriveInvalidationObjectId)); |
+ profile_sync_service->UpdateRegisteredInvalidationIds(this, ids); |
+ push_notification_registered_ = true; |
+ } |
AddDriveMountPoint(); |
} |
@@ -413,7 +459,7 @@ |
DriveSystemServiceFactory::DriveSystemServiceFactory() |
: ProfileKeyedServiceFactory("DriveSystemService", |
ProfileDependencyManager::GetInstance()) { |
- DependsOn(google_apis::DriveNotificationManagerFactory::GetInstance()); |
+ DependsOn(ProfileSyncServiceFactory::GetInstance()); |
DependsOn(DownloadServiceFactory::GetInstance()); |
} |