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