drive_notification_manager.h revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef CHROME_BROWSER_DRIVE_DRIVE_NOTIFICATION_MANAGER_H_
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CHROME_BROWSER_DRIVE_DRIVE_NOTIFICATION_MANAGER_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/observer_list.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/drive/drive_notification_observer.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "sync/notifier/invalidation_handler.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ProfileSyncService;
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace invalidation {
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class InvalidationService;
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace drive {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Informs observers when they should check Google Drive for updates.
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Conditions under which updates should be searched:
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 1. XMPP invalidation is received from Google Drive.
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 2. Polling timer counts down.
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class DriveNotificationManager : public KeyedService,
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 public syncer::InvalidationHandler {
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  explicit DriveNotificationManager(
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      invalidation::InvalidationService* invalidation_service);
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~DriveNotificationManager();
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // KeyedService override.
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Shutdown() OVERRIDE;
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // syncer::InvalidationHandler implementation.
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnInvalidatorStateChange(
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      syncer::InvalidatorState state) OVERRIDE;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnIncomingInvalidation(
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE;
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual std::string GetOwnerName() const OVERRIDE;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AddObserver(DriveNotificationObserver* observer);
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RemoveObserver(DriveNotificationObserver* observer);
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // True when XMPP notification is currently enabled.
48b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool push_notification_enabled() const {
49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return push_notification_enabled_;
50b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
51b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
52b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // True when XMPP notification has been registered.
53b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool push_notification_registered() const {
54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return push_notification_registered_;
55b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum NotificationSource {
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTIFICATION_XMPP,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTIFICATION_POLLING,
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Restarts the polling timer. Used for polling-based notification.
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RestartPollingTimer();
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Notifies the observers that it's time to check for updates.
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |source| indicates where the notification comes from.
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void NotifyObserversToUpdate(NotificationSource source);
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Registers for Google Drive invalidation notifications through XMPP.
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RegisterDriveNotifications();
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns a string representation of NotificationSource.
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static std::string NotificationSourceToString(NotificationSource source);
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  invalidation::InvalidationService* invalidation_service_;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ObserverList<DriveNotificationObserver> observers_;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // True when Drive File Sync Service is registered for Drive notifications.
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool push_notification_registered_;
81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // True if the XMPP-based push notification is currently enabled.
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool push_notification_enabled_;
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // True once observers are notified for the first time.
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool observers_notified_;
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The timer is used for polling based notification. XMPP should usually be
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // used but notification is done per polling when XMPP is not working.
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Timer polling_timer_;
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Note: This should remain the last member so it'll be destroyed and
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // invalidate its weak pointers before any other members are destroyed.
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::WeakPtrFactory<DriveNotificationManager> weak_ptr_factory_;
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DriveNotificationManager);
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace drive
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // CHROME_BROWSER_DRIVE_DRIVE_NOTIFICATION_MANAGER_H_
100