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 15class Profile; 16class ProfileSyncService; 17 18namespace 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. 24class 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