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