drive_notification_manager.h revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef CHROME_BROWSER_DRIVE_DRIVE_NOTIFICATION_MANAGER_H_ 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CHROME_BROWSER_DRIVE_DRIVE_NOTIFICATION_MANAGER_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/observer_list.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/drive/drive_notification_observer.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "sync/notifier/invalidation_handler.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ProfileSyncService; 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace invalidation { 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class InvalidationService; 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace drive { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Informs observers when they should check Google Drive for updates. 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Conditions under which updates should be searched: 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 1. XMPP invalidation is received from Google Drive. 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 2. Polling timer counts down. 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class DriveNotificationManager : public KeyedService, 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public syncer::InvalidationHandler { 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) explicit DriveNotificationManager( 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation::InvalidationService* invalidation_service); 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DriveNotificationManager(); 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // KeyedService override. 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Shutdown() OVERRIDE; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // syncer::InvalidationHandler implementation. 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnInvalidatorStateChange( 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) syncer::InvalidatorState state) OVERRIDE; 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnIncomingInvalidation( 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE; 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual std::string GetOwnerName() const OVERRIDE; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void AddObserver(DriveNotificationObserver* observer); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RemoveObserver(DriveNotificationObserver* observer); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // True when XMPP notification is currently enabled. 48b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool push_notification_enabled() const { 49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return push_notification_enabled_; 50b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 51b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 52b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // True when XMPP notification has been registered. 53b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool push_notification_registered() const { 54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return push_notification_registered_; 55b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enum NotificationSource { 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTIFICATION_XMPP, 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTIFICATION_POLLING, 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Restarts the polling timer. Used for polling-based notification. 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RestartPollingTimer(); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Notifies the observers that it's time to check for updates. 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |source| indicates where the notification comes from. 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void NotifyObserversToUpdate(NotificationSource source); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Registers for Google Drive invalidation notifications through XMPP. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RegisterDriveNotifications(); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns a string representation of NotificationSource. 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static std::string NotificationSourceToString(NotificationSource source); 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation::InvalidationService* invalidation_service_; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ObserverList<DriveNotificationObserver> observers_; 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True when Drive File Sync Service is registered for Drive notifications. 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool push_notification_registered_; 81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // True if the XMPP-based push notification is currently enabled. 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool push_notification_enabled_; 83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // True once observers are notified for the first time. 84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool observers_notified_; 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The timer is used for polling based notification. XMPP should usually be 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // used but notification is done per polling when XMPP is not working. 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Timer polling_timer_; 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Note: This should remain the last member so it'll be destroyed and 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // invalidate its weak pointers before any other members are destroyed. 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::WeakPtrFactory<DriveNotificationManager> weak_ptr_factory_; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DriveNotificationManager); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace drive 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif // CHROME_BROWSER_DRIVE_DRIVE_NOTIFICATION_MANAGER_H_ 100