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