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/invalidation/invalidation_handler.h" 13#include "components/keyed_service/core/keyed_service.h" 14 15class ProfileSyncService; 16 17namespace invalidation { 18class InvalidationService; 19} 20 21namespace 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. 27class 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. 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