drive_notification_manager.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_keyed_service.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "sync/notifier/invalidation_handler.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Profile; 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ProfileSyncService; 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace drive { 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Informs observers when they should check Google Drive for updates. 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Conditions under which updates should be searched: 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 1. XMPP invalidation is received from Google Drive. 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 2. Polling timer counts down. 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DriveNotificationManager 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : public BrowserContextKeyedService, 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public syncer::InvalidationHandler { 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit DriveNotificationManager(Profile* profile); 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DriveNotificationManager(); 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // BrowserContextKeyedService override. 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Shutdown() OVERRIDE; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // syncer::InvalidationHandler implementation. 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnInvalidatorStateChange( 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) syncer::InvalidatorState state) OVERRIDE; 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnIncomingInvalidation( 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE; 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void AddObserver(DriveNotificationObserver* observer); 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RemoveObserver(DriveNotificationObserver* observer); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // True when XMPP notification is currently enabled. 44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool push_notification_enabled() const { 45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return push_notification_enabled_; 46b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 48b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // True when XMPP notification has been registered. 49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool push_notification_registered() const { 50b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return push_notification_registered_; 51b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enum NotificationSource { 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTIFICATION_XMPP, 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTIFICATION_POLLING, 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Restarts the polling timer. Used for polling-based notification. 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RestartPollingTimer(); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Notifies the observers that it's time to check for updates. 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |source| indicates where the notification comes from. 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void NotifyObserversToUpdate(NotificationSource source); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Registers for Google Drive invalidation notifications through XMPP. 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RegisterDriveNotifications(); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns a string representation of NotificationSource. 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static std::string NotificationSourceToString(NotificationSource source); 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile_; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ObserverList<DriveNotificationObserver> observers_; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True when Drive File Sync Service is registered for Drive notifications. 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool push_notification_registered_; 77b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // True if the XMPP-based push notification is currently enabled. 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool push_notification_enabled_; 79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // True once observers are notified for the first time. 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool observers_notified_; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The timer is used for polling based notification. XMPP should usually be 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // used but notification is done per polling when XMPP is not working. 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Timer polling_timer_; 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Note: This should remain the last member so it'll be destroyed and 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // invalidate its weak pointers before any other members are destroyed. 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::WeakPtrFactory<DriveNotificationManager> weak_ptr_factory_; 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DriveNotificationManager); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace drive 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif // CHROME_BROWSER_DRIVE_DRIVE_NOTIFICATION_MANAGER_H_ 96