OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/printing/cloud_print/privet_notifications.h" | 5 #include "chrome/browser/printing/cloud_print/privet_notifications.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 privet_http_factory_.swap(privet_http_factory); | 84 privet_http_factory_.swap(privet_http_factory); |
85 } | 85 } |
86 | 86 |
87 PrivetNotificationsListener::~PrivetNotificationsListener() { | 87 PrivetNotificationsListener::~PrivetNotificationsListener() { |
88 } | 88 } |
89 | 89 |
90 void PrivetNotificationsListener::DeviceChanged( | 90 void PrivetNotificationsListener::DeviceChanged( |
91 const std::string& name, | 91 const std::string& name, |
92 const DeviceDescription& description) { | 92 const DeviceDescription& description) { |
93 ReportPrivetUmaEvent(PRIVET_DEVICE_CHANGED); | 93 ReportPrivetUmaEvent(PRIVET_DEVICE_CHANGED); |
94 DeviceContextMap::iterator found = devices_seen_.find(name); | 94 DeviceContextMap::iterator it = devices_seen_.find(name); |
95 if (found != devices_seen_.end()) { | 95 if (it != devices_seen_.end()) { |
96 if (!description.id.empty() && // Device is registered | 96 if (!description.id.empty() && // Device is registered |
97 found->second->notification_may_be_active) { | 97 it->second->notification_may_be_active) { |
98 found->second->notification_may_be_active = false; | 98 it->second->notification_may_be_active = false; |
| 99 devices_active_--; |
99 NotifyDeviceRemoved(); | 100 NotifyDeviceRemoved(); |
100 } | 101 } |
101 return; // Already saw this device. | 102 return; // Already saw this device. |
102 } | 103 } |
103 | 104 |
104 std::unique_ptr<DeviceContext>& device_context = devices_seen_[name]; | 105 std::unique_ptr<DeviceContext>& device_context = devices_seen_[name]; |
105 device_context.reset(new DeviceContext); | 106 device_context.reset(new DeviceContext); |
106 device_context->notification_may_be_active = false; | 107 device_context->notification_may_be_active = false; |
107 device_context->registered = !description.id.empty(); | 108 device_context->registered = !description.id.empty(); |
108 | 109 |
109 if (!device_context->registered) { | 110 if (device_context->registered) |
110 device_context->privet_http_resolution = | 111 return; |
111 privet_http_factory_->CreatePrivetHTTP(name); | 112 |
112 device_context->privet_http_resolution->Start( | 113 device_context->privet_http_resolution = |
113 description.address, | 114 privet_http_factory_->CreatePrivetHTTP(name); |
114 base::Bind(&PrivetNotificationsListener::CreateInfoOperation, | 115 device_context->privet_http_resolution->Start( |
115 base::Unretained(this))); | 116 description.address, |
116 } | 117 base::Bind(&PrivetNotificationsListener::CreateInfoOperation, |
| 118 base::Unretained(this))); |
117 } | 119 } |
118 | 120 |
119 void PrivetNotificationsListener::CreateInfoOperation( | 121 void PrivetNotificationsListener::CreateInfoOperation( |
120 std::unique_ptr<PrivetHTTPClient> http_client) { | 122 std::unique_ptr<PrivetHTTPClient> http_client) { |
121 if (!http_client) { | 123 // Do nothing if resolution fails. |
122 // Do nothing if resolution fails. | 124 if (!http_client) |
123 return; | 125 return; |
124 } | |
125 | 126 |
126 std::string name = http_client->GetName(); | 127 std::string name = http_client->GetName(); |
127 DeviceContextMap::iterator device_iter = devices_seen_.find(name); | 128 DeviceContextMap::iterator it = devices_seen_.find(name); |
128 if (device_iter == devices_seen_.end()) | 129 if (it == devices_seen_.end()) |
129 return; | 130 return; |
130 DeviceContext* device = device_iter->second.get(); | 131 |
| 132 DeviceContext* device = it->second.get(); |
131 device->privet_http.swap(http_client); | 133 device->privet_http.swap(http_client); |
132 device->info_operation = device->privet_http->CreateInfoOperation( | 134 device->info_operation = device->privet_http->CreateInfoOperation( |
133 base::Bind(&PrivetNotificationsListener::OnPrivetInfoDone, | 135 base::Bind(&PrivetNotificationsListener::OnPrivetInfoDone, |
134 base::Unretained(this), | 136 base::Unretained(this), |
135 device)); | 137 device)); |
136 device->info_operation->Start(); | 138 device->info_operation->Start(); |
137 } | 139 } |
138 | 140 |
139 void PrivetNotificationsListener::OnPrivetInfoDone( | 141 void PrivetNotificationsListener::OnPrivetInfoDone( |
140 DeviceContext* device, | 142 DeviceContext* device, |
141 const base::DictionaryValue* json_value) { | 143 const base::DictionaryValue* json_value) { |
142 int uptime; | 144 int uptime; |
143 | 145 |
144 if (!json_value || | 146 if (!json_value || |
145 !json_value->GetInteger(kPrivetInfoKeyUptime, &uptime) || | 147 !json_value->GetInteger(kPrivetInfoKeyUptime, &uptime) || |
146 uptime > kTenMinutesInSeconds) { | 148 uptime > kTenMinutesInSeconds) { |
147 return; | 149 return; |
148 } | 150 } |
149 | 151 |
150 DCHECK(!device->notification_may_be_active); | 152 DCHECK(!device->notification_may_be_active); |
151 device->notification_may_be_active = true; | 153 device->notification_may_be_active = true; |
152 devices_active_++; | 154 devices_active_++; |
153 delegate_->PrivetNotify(devices_active_, true); | 155 delegate_->PrivetNotify(devices_active_, true); |
154 } | 156 } |
155 | 157 |
156 void PrivetNotificationsListener::DeviceRemoved(const std::string& name) { | 158 void PrivetNotificationsListener::DeviceRemoved(const std::string& name) { |
157 DeviceContextMap::iterator device_iter = devices_seen_.find(name); | 159 DeviceContextMap::iterator it = devices_seen_.find(name); |
158 if (device_iter == devices_seen_.end()) | 160 if (it == devices_seen_.end()) |
159 return; | 161 return; |
160 DeviceContext* device = device_iter->second.get(); | |
161 | 162 |
| 163 DeviceContext* device = it->second.get(); |
162 device->info_operation.reset(); | 164 device->info_operation.reset(); |
163 device->privet_http_resolution.reset(); | 165 device->privet_http_resolution.reset(); |
| 166 if (!device->notification_may_be_active) |
| 167 return; |
| 168 |
164 device->notification_may_be_active = false; | 169 device->notification_may_be_active = false; |
| 170 devices_active_--; |
165 NotifyDeviceRemoved(); | 171 NotifyDeviceRemoved(); |
166 } | 172 } |
167 | 173 |
168 void PrivetNotificationsListener::DeviceCacheFlushed() { | 174 void PrivetNotificationsListener::DeviceCacheFlushed() { |
169 for (DeviceContextMap::iterator i = devices_seen_.begin(); | 175 for (const auto& it : devices_seen_) { |
170 i != devices_seen_.end(); ++i) { | 176 DeviceContext* device = it.second.get(); |
171 DeviceContext* device = i->second.get(); | |
172 | |
173 device->info_operation.reset(); | 177 device->info_operation.reset(); |
174 device->privet_http_resolution.reset(); | 178 device->privet_http_resolution.reset(); |
175 if (device->notification_may_be_active) { | 179 device->notification_may_be_active = false; |
176 device->notification_may_be_active = false; | |
177 } | |
178 } | 180 } |
179 | 181 |
180 devices_active_ = 0; | 182 devices_active_ = 0; |
181 delegate_->PrivetRemoveNotification(); | 183 NotifyDeviceRemoved(); |
182 } | 184 } |
183 | 185 |
184 void PrivetNotificationsListener::NotifyDeviceRemoved() { | 186 void PrivetNotificationsListener::NotifyDeviceRemoved() { |
185 devices_active_--; | |
186 if (devices_active_ == 0) { | 187 if (devices_active_ == 0) { |
187 delegate_->PrivetRemoveNotification(); | 188 delegate_->PrivetRemoveNotification(); |
188 } else { | 189 } else { |
189 delegate_->PrivetNotify(devices_active_, false); | 190 delegate_->PrivetNotify(devices_active_, false); |
190 } | 191 } |
191 } | 192 } |
192 | 193 |
193 PrivetNotificationsListener::DeviceContext::DeviceContext() { | 194 PrivetNotificationsListener::DeviceContext::DeviceContext() { |
194 } | 195 } |
195 | 196 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 } | 231 } |
231 | 232 |
232 // static | 233 // static |
233 bool PrivetNotificationService::IsForced() { | 234 bool PrivetNotificationService::IsForced() { |
234 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | 235 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
235 return command_line->HasSwitch(switches::kEnableDeviceDiscoveryNotifications); | 236 return command_line->HasSwitch(switches::kEnableDeviceDiscoveryNotifications); |
236 } | 237 } |
237 | 238 |
238 void PrivetNotificationService::PrivetNotify(int devices_active, | 239 void PrivetNotificationService::PrivetNotify(int devices_active, |
239 bool added) { | 240 bool added) { |
240 base::string16 product_name = l10n_util::GetStringUTF16( | 241 DCHECK_GT(devices_active, 0); |
241 IDS_LOCAL_DISCOVERY_SERVICE_NAME_PRINTER); | 242 |
| 243 message_center::RichNotificationData rich_notification_data; |
| 244 rich_notification_data.buttons.push_back( |
| 245 message_center::ButtonInfo(l10n_util::GetStringUTF16( |
| 246 IDS_LOCAL_DISCOVERY_NOTIFICATION_BUTTON_PRINTER))); |
| 247 rich_notification_data.buttons.push_back( |
| 248 message_center::ButtonInfo(l10n_util::GetStringUTF16( |
| 249 IDS_LOCAL_DISCOVERY_NOTIFICATIONS_DISABLE_BUTTON_LABEL))); |
242 | 250 |
243 base::string16 title = l10n_util::GetPluralStringFUTF16( | 251 base::string16 title = l10n_util::GetPluralStringFUTF16( |
244 IDS_LOCAL_DISCOVERY_NOTIFICATION_TITLE_PRINTER, devices_active); | 252 IDS_LOCAL_DISCOVERY_NOTIFICATION_TITLE_PRINTER, devices_active); |
245 base::string16 body = l10n_util::GetPluralStringFUTF16( | 253 base::string16 body = l10n_util::GetPluralStringFUTF16( |
246 IDS_LOCAL_DISCOVERY_NOTIFICATION_CONTENTS_PRINTER, devices_active); | 254 IDS_LOCAL_DISCOVERY_NOTIFICATION_CONTENTS_PRINTER, devices_active); |
247 | 255 base::string16 product_name = |
248 Profile* profile_object = Profile::FromBrowserContext(profile_); | 256 l10n_util::GetStringUTF16(IDS_LOCAL_DISCOVERY_SERVICE_NAME_PRINTER); |
249 message_center::RichNotificationData rich_notification_data; | |
250 | |
251 rich_notification_data.buttons.push_back( | |
252 message_center::ButtonInfo(l10n_util::GetStringUTF16( | |
253 IDS_LOCAL_DISCOVERY_NOTIFICATION_BUTTON_PRINTER))); | |
254 | |
255 rich_notification_data.buttons.push_back( | |
256 message_center::ButtonInfo(l10n_util::GetStringUTF16( | |
257 IDS_LOCAL_DISCOVERY_NOTIFICATIONS_DISABLE_BUTTON_LABEL))); | |
258 | 257 |
259 Notification notification( | 258 Notification notification( |
260 message_center::NOTIFICATION_TYPE_SIMPLE, title, body, | 259 message_center::NOTIFICATION_TYPE_SIMPLE, title, body, |
261 ui::ResourceBundle::GetSharedInstance().GetImageNamed( | 260 ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
262 IDR_LOCAL_DISCOVERY_CLOUDPRINT_ICON), | 261 IDR_LOCAL_DISCOVERY_CLOUDPRINT_ICON), |
263 message_center::NotifierId(message_center::NotifierId::SYSTEM_COMPONENT, | 262 message_center::NotifierId(message_center::NotifierId::SYSTEM_COMPONENT, |
264 kPrivetNotificationID), | 263 kPrivetNotificationID), |
265 product_name, GURL(kPrivetNotificationOriginUrl), kPrivetNotificationID, | 264 product_name, GURL(kPrivetNotificationOriginUrl), kPrivetNotificationID, |
266 rich_notification_data, new PrivetNotificationDelegate(profile_)); | 265 rich_notification_data, new PrivetNotificationDelegate(profile_)); |
267 | 266 |
268 bool updated = g_browser_process->notification_ui_manager()->Update( | 267 auto* notification_ui_manager = g_browser_process->notification_ui_manager(); |
269 notification, profile_object); | 268 Profile* profile = Profile::FromBrowserContext(profile_); |
| 269 bool updated = notification_ui_manager->Update(notification, profile); |
270 if (!updated && added && | 270 if (!updated && added && |
271 !local_discovery::LocalDiscoveryUIHandler::GetHasVisible()) { | 271 !local_discovery::LocalDiscoveryUIHandler::GetHasVisible()) { |
272 ReportPrivetUmaEvent(PRIVET_NOTIFICATION_SHOWN); | 272 ReportPrivetUmaEvent(PRIVET_NOTIFICATION_SHOWN); |
273 g_browser_process->notification_ui_manager()->Add(notification, | 273 notification_ui_manager->Add(notification, profile); |
274 profile_object); | |
275 } | 274 } |
276 } | 275 } |
277 | 276 |
278 void PrivetNotificationService::PrivetRemoveNotification() { | 277 void PrivetNotificationService::PrivetRemoveNotification() { |
279 ReportPrivetUmaEvent(PRIVET_NOTIFICATION_CANCELED); | 278 ReportPrivetUmaEvent(PRIVET_NOTIFICATION_CANCELED); |
280 Profile* profile_object = Profile::FromBrowserContext(profile_); | 279 Profile* profile_object = Profile::FromBrowserContext(profile_); |
281 g_browser_process->notification_ui_manager()->CancelById( | 280 g_browser_process->notification_ui_manager()->CancelById( |
282 kPrivetNotificationID, | 281 kPrivetNotificationID, |
283 NotificationUIManager::GetProfileID(profile_object)); | 282 NotificationUIManager::GetProfileID(profile_object)); |
284 } | 283 } |
(...skipping 21 matching lines...) Expand all Loading... |
306 if (IsForced()) { | 305 if (IsForced()) { |
307 StartLister(); | 306 StartLister(); |
308 } else if (*enable_privet_notification_member_) { | 307 } else if (*enable_privet_notification_member_) { |
309 ReportPrivetUmaEvent(PRIVET_SERVICE_STARTED); | 308 ReportPrivetUmaEvent(PRIVET_SERVICE_STARTED); |
310 traffic_detector_ = | 309 traffic_detector_ = |
311 new PrivetTrafficDetector( | 310 new PrivetTrafficDetector( |
312 net::ADDRESS_FAMILY_IPV4, | 311 net::ADDRESS_FAMILY_IPV4, |
313 base::Bind(&PrivetNotificationService::StartLister, AsWeakPtr())); | 312 base::Bind(&PrivetNotificationService::StartLister, AsWeakPtr())); |
314 traffic_detector_->Start(); | 313 traffic_detector_->Start(); |
315 } else { | 314 } else { |
316 traffic_detector_ = NULL; | 315 traffic_detector_ = nullptr; |
317 device_lister_.reset(); | 316 device_lister_.reset(); |
318 service_discovery_client_ = NULL; | 317 service_discovery_client_ = nullptr; |
319 privet_notifications_listener_.reset(); | 318 privet_notifications_listener_.reset(); |
320 } | 319 } |
321 #else | 320 #else |
322 if (IsForced() || *enable_privet_notification_member_) { | 321 if (IsForced() || *enable_privet_notification_member_) { |
323 StartLister(); | 322 StartLister(); |
324 } else { | 323 } else { |
325 device_lister_.reset(); | 324 device_lister_.reset(); |
326 service_discovery_client_ = NULL; | 325 service_discovery_client_ = nullptr; |
327 privet_notifications_listener_.reset(); | 326 privet_notifications_listener_.reset(); |
328 } | 327 } |
329 #endif | 328 #endif |
330 } | 329 } |
331 | 330 |
332 void PrivetNotificationService::StartLister() { | 331 void PrivetNotificationService::StartLister() { |
333 ReportPrivetUmaEvent(PRIVET_LISTER_STARTED); | 332 ReportPrivetUmaEvent(PRIVET_LISTER_STARTED); |
334 #if defined(ENABLE_MDNS) | 333 #if defined(ENABLE_MDNS) |
335 traffic_detector_ = NULL; | 334 traffic_detector_ = nullptr; |
336 #endif // ENABLE_MDNS | 335 #endif // ENABLE_MDNS |
337 service_discovery_client_ = | 336 service_discovery_client_ = |
338 local_discovery::ServiceDiscoverySharedClient::GetInstance(); | 337 local_discovery::ServiceDiscoverySharedClient::GetInstance(); |
339 device_lister_.reset( | 338 device_lister_.reset( |
340 new PrivetDeviceListerImpl(service_discovery_client_.get(), this)); | 339 new PrivetDeviceListerImpl(service_discovery_client_.get(), this)); |
341 device_lister_->Start(); | 340 device_lister_->Start(); |
342 device_lister_->DiscoverNewDevices(false); | 341 device_lister_->DiscoverNewDevices(false); |
343 | 342 |
344 std::unique_ptr<PrivetHTTPAsynchronousFactory> http_factory( | 343 std::unique_ptr<PrivetHTTPAsynchronousFactory> http_factory( |
345 PrivetHTTPAsynchronousFactory::CreateInstance( | 344 PrivetHTTPAsynchronousFactory::CreateInstance( |
(...skipping 13 matching lines...) Expand all Loading... |
359 } | 358 } |
360 | 359 |
361 std::string PrivetNotificationDelegate::id() const { | 360 std::string PrivetNotificationDelegate::id() const { |
362 return kPrivetNotificationID; | 361 return kPrivetNotificationID; |
363 } | 362 } |
364 | 363 |
365 void PrivetNotificationDelegate::ButtonClick(int button_index) { | 364 void PrivetNotificationDelegate::ButtonClick(int button_index) { |
366 if (button_index == 0) { | 365 if (button_index == 0) { |
367 ReportPrivetUmaEvent(PRIVET_NOTIFICATION_CLICKED); | 366 ReportPrivetUmaEvent(PRIVET_NOTIFICATION_CLICKED); |
368 OpenTab(GURL(kPrivetNotificationOriginUrl)); | 367 OpenTab(GURL(kPrivetNotificationOriginUrl)); |
369 } else if (button_index == 1) { | 368 return; |
370 ReportPrivetUmaEvent(PRIVET_DISABLE_NOTIFICATIONS_CLICKED); | |
371 DisableNotifications(); | |
372 } | 369 } |
| 370 |
| 371 DCHECK_EQ(1, button_index); |
| 372 ReportPrivetUmaEvent(PRIVET_DISABLE_NOTIFICATIONS_CLICKED); |
| 373 DisableNotifications(); |
373 } | 374 } |
374 | 375 |
375 void PrivetNotificationDelegate::OpenTab(const GURL& url) { | 376 void PrivetNotificationDelegate::OpenTab(const GURL& url) { |
376 Profile* profile_obj = Profile::FromBrowserContext(profile_); | 377 Profile* profile = Profile::FromBrowserContext(profile_); |
377 | 378 chrome::NavigateParams params(profile, url, |
378 chrome::NavigateParams params(profile_obj, | 379 ui::PAGE_TRANSITION_AUTO_TOPLEVEL); |
379 url, | |
380 ui::PAGE_TRANSITION_AUTO_TOPLEVEL); | |
381 params.disposition = NEW_FOREGROUND_TAB; | 380 params.disposition = NEW_FOREGROUND_TAB; |
382 chrome::Navigate(¶ms); | 381 chrome::Navigate(¶ms); |
383 } | 382 } |
384 | 383 |
385 void PrivetNotificationDelegate::DisableNotifications() { | 384 void PrivetNotificationDelegate::DisableNotifications() { |
386 Profile* profile_obj = Profile::FromBrowserContext(profile_); | 385 Profile* profile = Profile::FromBrowserContext(profile_); |
387 | 386 profile->GetPrefs()->SetBoolean(prefs::kLocalDiscoveryNotificationsEnabled, |
388 profile_obj->GetPrefs()->SetBoolean( | 387 false); |
389 prefs::kLocalDiscoveryNotificationsEnabled, | |
390 false); | |
391 } | 388 } |
392 | 389 |
393 } // namespace cloud_print | 390 } // namespace cloud_print |
OLD | NEW |