Home | History | Annotate | Download | only in drive
      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