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 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
     28     : public BrowserContextKeyedService,
     29       public syncer::InvalidationHandler {
     30  public:
     31   explicit DriveNotificationManager(
     32       invalidation::InvalidationService* invalidation_service);
     33   virtual ~DriveNotificationManager();
     34 
     35   // BrowserContextKeyedService override.
     36   virtual void Shutdown() OVERRIDE;
     37 
     38   // syncer::InvalidationHandler implementation.
     39   virtual void OnInvalidatorStateChange(
     40       syncer::InvalidatorState state) OVERRIDE;
     41   virtual void OnIncomingInvalidation(
     42       const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE;
     43 
     44   void AddObserver(DriveNotificationObserver* observer);
     45   void RemoveObserver(DriveNotificationObserver* observer);
     46 
     47   // True when XMPP notification is currently enabled.
     48   bool push_notification_enabled() const {
     49     return push_notification_enabled_;
     50   }
     51 
     52   // True when XMPP notification has been 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