privet_notifications.h revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_
6#define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_
7
8#include <map>
9#include <string>
10
11#include "base/prefs/pref_member.h"
12#include "chrome/browser/local_discovery/privet_device_lister.h"
13#include "chrome/browser/local_discovery/privet_http.h"
14#include "chrome/browser/notifications/notification_delegate.h"
15#include "components/browser_context_keyed_service/browser_context_keyed_service.h"
16
17class NotificationUIManager;
18
19namespace content {
20class BrowserContext;
21}  // namespace content
22
23namespace local_discovery {
24
25class ServiceDiscoverySharedClient;
26class PrivetDeviceLister;
27class PrivetHTTPAsynchronousFactory;
28class PrivetHTTPResolution;
29class PrivetTrafficDetector;
30struct DeviceDescription;
31
32// Contains logic related to notifications not tied actually displaying them.
33class PrivetNotificationsListener : public PrivetInfoOperation::Delegate {
34 public:
35  class Delegate {
36   public:
37    virtual ~Delegate() {}
38
39    // Notify user of the existence of device |device_name|.
40    virtual void PrivetNotify(bool multiple, bool added) = 0;
41
42    // Remove the noitification for |device_name| if it still exists.
43    virtual void PrivetRemoveNotification() = 0;
44  };
45
46  PrivetNotificationsListener(
47      scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory,
48      Delegate* delegate);
49  virtual ~PrivetNotificationsListener();
50
51  // These two methods are akin to those of PrivetDeviceLister::Delegate. The
52  // user of PrivetNotificationListener should create a PrivetDeviceLister and
53  // forward device notifications to the PrivetNotificationLister.
54  void DeviceChanged(bool added,
55                     const std::string& name,
56                     const DeviceDescription& description);
57  void DeviceRemoved(const std::string& name);
58  virtual void DeviceCacheFlushed();
59
60  // PrivetInfoOperation::Delegate implementation.
61  virtual void OnPrivetInfoDone(
62      PrivetInfoOperation* operation,
63      int http_code,
64      const base::DictionaryValue* json_value) OVERRIDE;
65
66 private:
67  struct DeviceContext {
68    DeviceContext();
69    ~DeviceContext();
70
71    bool notification_may_be_active;
72    bool registered;
73    scoped_ptr<PrivetInfoOperation> info_operation;
74    scoped_ptr<PrivetHTTPResolution> privet_http_resolution;
75    scoped_ptr<PrivetHTTPClient> privet_http;
76  };
77
78  typedef std::map<std::string, linked_ptr<DeviceContext> > DeviceContextMap;
79
80  void CreateInfoOperation(scoped_ptr<PrivetHTTPClient> http_client);
81
82  void NotifyDeviceRemoved();
83
84  Delegate* delegate_;
85  scoped_ptr<PrivetDeviceLister> device_lister_;
86  scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory_;
87  DeviceContextMap devices_seen_;
88  int devices_active_;
89};
90
91class PrivetNotificationService
92    : public BrowserContextKeyedService,
93      public PrivetDeviceLister::Delegate,
94      public PrivetNotificationsListener::Delegate,
95      public base::SupportsWeakPtr<PrivetNotificationService> {
96 public:
97  explicit PrivetNotificationService(content::BrowserContext* profile);
98  virtual ~PrivetNotificationService();
99
100  // PrivetDeviceLister::Delegate implementation:
101  virtual void DeviceChanged(bool added, const std::string& name,
102                             const DeviceDescription& description) OVERRIDE;
103  virtual void DeviceRemoved(const std::string& name) OVERRIDE;
104
105  // PrivetNotificationListener::Delegate implementation:
106  virtual void PrivetNotify(bool has_multiple, bool added) OVERRIDE;
107
108  virtual void PrivetRemoveNotification() OVERRIDE;
109  virtual void DeviceCacheFlushed() OVERRIDE;
110
111  static bool IsEnabled();
112  static bool IsForced();
113
114 private:
115  void Start();
116  void OnNotificationsEnabledChanged();
117  void StartLister();
118
119  content::BrowserContext* profile_;
120  scoped_ptr<PrivetDeviceLister> device_lister_;
121  scoped_refptr<ServiceDiscoverySharedClient> service_discovery_client_;
122  scoped_refptr<PrivetTrafficDetector> traffic_detector_;
123  scoped_ptr<PrivetNotificationsListener> privet_notifications_listener_;
124  BooleanPrefMember enable_privet_notification_member_;
125};
126
127class PrivetNotificationDelegate : public NotificationDelegate {
128 public:
129  explicit PrivetNotificationDelegate(content::BrowserContext* profile);
130
131  // NotificationDelegate implementation.
132  virtual std::string id() const OVERRIDE;
133  virtual content::RenderViewHost* GetRenderViewHost() const OVERRIDE;
134  virtual void Display() OVERRIDE;
135  virtual void Error() OVERRIDE;
136  virtual void Close(bool by_user) OVERRIDE;
137  virtual void Click() OVERRIDE;
138  virtual void ButtonClick(int button_index) OVERRIDE;
139
140 private:
141  void OpenTab(const GURL& url);
142  void DisableNotifications();
143
144  virtual ~PrivetNotificationDelegate();
145
146  content::BrowserContext* profile_;
147};
148
149}  // namespace local_discovery
150
151#endif  // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_
152