Index: chrome/browser/local_discovery/privet_notifications.cc |
diff --git a/chrome/browser/local_discovery/privet_notifications.cc b/chrome/browser/local_discovery/privet_notifications.cc |
deleted file mode 100644 |
index 4913576062fe50e178d103851c6c13f8a4af3795..0000000000000000000000000000000000000000 |
--- a/chrome/browser/local_discovery/privet_notifications.cc |
+++ /dev/null |
@@ -1,393 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/local_discovery/privet_notifications.h" |
- |
-#include <utility> |
- |
-#include "base/bind.h" |
-#include "base/command_line.h" |
-#include "base/location.h" |
-#include "base/metrics/histogram.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/rand_util.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/thread_task_runner_handle.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/local_discovery/privet_device_lister_impl.h" |
-#include "chrome/browser/local_discovery/privet_http_asynchronous_factory.h" |
-#include "chrome/browser/local_discovery/service_discovery_shared_client.h" |
-#include "chrome/browser/notifications/notification.h" |
-#include "chrome/browser/notifications/notification_ui_manager.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/signin/signin_manager_factory.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_finder.h" |
-#include "chrome/browser/ui/browser_navigator_params.h" |
-#include "chrome/browser/ui/browser_window.h" |
-#include "chrome/browser/ui/host_desktop.h" |
-#include "chrome/browser/ui/tabs/tab_strip_model.h" |
-#include "chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/pref_names.h" |
-#include "chrome/grit/generated_resources.h" |
-#include "components/signin/core/browser/signin_manager_base.h" |
-#include "content/public/browser/browser_context.h" |
-#include "content/public/browser/navigation_controller.h" |
-#include "content/public/browser/web_contents.h" |
-#include "grit/theme_resources.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/page_transition_types.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/message_center/notifier_settings.h" |
- |
-#if defined(ENABLE_MDNS) |
-#include "chrome/browser/local_discovery/privet_traffic_detector.h" |
-#endif |
- |
-namespace local_discovery { |
- |
-namespace { |
- |
-const int kTenMinutesInSeconds = 600; |
-const char kPrivetInfoKeyUptime[] = "uptime"; |
-const char kPrivetNotificationID[] = "privet_notification"; |
-const char kPrivetNotificationOriginUrl[] = "chrome://devices"; |
-const int kStartDelaySeconds = 5; |
- |
-enum PrivetNotificationsEvent { |
- PRIVET_SERVICE_STARTED, |
- PRIVET_LISTER_STARTED, |
- PRIVET_DEVICE_CHANGED, |
- PRIVET_INFO_DONE, |
- PRIVET_NOTIFICATION_SHOWN, |
- PRIVET_NOTIFICATION_CANCELED, |
- PRIVET_NOTIFICATION_CLICKED, |
- PRIVET_DISABLE_NOTIFICATIONS_CLICKED, |
- PRIVET_EVENT_MAX, |
-}; |
- |
-void ReportPrivetUmaEvent(PrivetNotificationsEvent privet_event) { |
- UMA_HISTOGRAM_ENUMERATION("LocalDiscovery.PrivetNotificationsEvent", |
- privet_event, PRIVET_EVENT_MAX); |
-} |
- |
-} // namespace |
- |
-PrivetNotificationsListener::PrivetNotificationsListener( |
- scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory, |
- Delegate* delegate) |
- : delegate_(delegate), devices_active_(0) { |
- privet_http_factory_.swap(privet_http_factory); |
-} |
- |
-PrivetNotificationsListener::~PrivetNotificationsListener() { |
-} |
- |
-void PrivetNotificationsListener::DeviceChanged( |
- bool added, |
- const std::string& name, |
- const DeviceDescription& description) { |
- ReportPrivetUmaEvent(PRIVET_DEVICE_CHANGED); |
- DeviceContextMap::iterator found = devices_seen_.find(name); |
- if (found != devices_seen_.end()) { |
- if (!description.id.empty() && // Device is registered |
- found->second->notification_may_be_active) { |
- found->second->notification_may_be_active = false; |
- NotifyDeviceRemoved(); |
- } |
- return; // Already saw this device. |
- } |
- |
- linked_ptr<DeviceContext> device_context(new DeviceContext); |
- |
- device_context->notification_may_be_active = false; |
- device_context->registered = !description.id.empty(); |
- |
- devices_seen_.insert(make_pair(name, device_context)); |
- |
- if (!device_context->registered) { |
- device_context->privet_http_resolution = |
- privet_http_factory_->CreatePrivetHTTP(name); |
- device_context->privet_http_resolution->Start( |
- description.address, |
- base::Bind(&PrivetNotificationsListener::CreateInfoOperation, |
- base::Unretained(this))); |
- } |
-} |
- |
-void PrivetNotificationsListener::CreateInfoOperation( |
- scoped_ptr<PrivetHTTPClient> http_client) { |
- if (!http_client) { |
- // Do nothing if resolution fails. |
- return; |
- } |
- |
- std::string name = http_client->GetName(); |
- DeviceContextMap::iterator device_iter = devices_seen_.find(name); |
- if (device_iter == devices_seen_.end()) |
- return; |
- DeviceContext* device = device_iter->second.get(); |
- device->privet_http.swap(http_client); |
- device->info_operation = device->privet_http->CreateInfoOperation( |
- base::Bind(&PrivetNotificationsListener::OnPrivetInfoDone, |
- base::Unretained(this), |
- device)); |
- device->info_operation->Start(); |
-} |
- |
-void PrivetNotificationsListener::OnPrivetInfoDone( |
- DeviceContext* device, |
- const base::DictionaryValue* json_value) { |
- int uptime; |
- |
- if (!json_value || |
- !json_value->GetInteger(kPrivetInfoKeyUptime, &uptime) || |
- uptime > kTenMinutesInSeconds) { |
- return; |
- } |
- |
- DCHECK(!device->notification_may_be_active); |
- device->notification_may_be_active = true; |
- devices_active_++; |
- delegate_->PrivetNotify(devices_active_, true); |
-} |
- |
-void PrivetNotificationsListener::DeviceRemoved(const std::string& name) { |
- DeviceContextMap::iterator device_iter = devices_seen_.find(name); |
- if (device_iter == devices_seen_.end()) |
- return; |
- DeviceContext* device = device_iter->second.get(); |
- |
- device->info_operation.reset(); |
- device->privet_http_resolution.reset(); |
- device->notification_may_be_active = false; |
- NotifyDeviceRemoved(); |
-} |
- |
-void PrivetNotificationsListener::DeviceCacheFlushed() { |
- for (DeviceContextMap::iterator i = devices_seen_.begin(); |
- i != devices_seen_.end(); ++i) { |
- DeviceContext* device = i->second.get(); |
- |
- device->info_operation.reset(); |
- device->privet_http_resolution.reset(); |
- if (device->notification_may_be_active) { |
- device->notification_may_be_active = false; |
- } |
- } |
- |
- devices_active_ = 0; |
- delegate_->PrivetRemoveNotification(); |
-} |
- |
-void PrivetNotificationsListener::NotifyDeviceRemoved() { |
- devices_active_--; |
- if (devices_active_ == 0) { |
- delegate_->PrivetRemoveNotification(); |
- } else { |
- delegate_->PrivetNotify(devices_active_, false); |
- } |
-} |
- |
-PrivetNotificationsListener::DeviceContext::DeviceContext() { |
-} |
- |
-PrivetNotificationsListener::DeviceContext::~DeviceContext() { |
-} |
- |
-PrivetNotificationService::PrivetNotificationService( |
- content::BrowserContext* profile) |
- : profile_(profile) { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, base::Bind(&PrivetNotificationService::Start, AsWeakPtr()), |
- base::TimeDelta::FromSeconds(kStartDelaySeconds + |
- base::RandInt(0, kStartDelaySeconds / 4))); |
-} |
- |
-PrivetNotificationService::~PrivetNotificationService() { |
-} |
- |
-void PrivetNotificationService::DeviceChanged( |
- bool added, |
- const std::string& name, |
- const DeviceDescription& description) { |
- privet_notifications_listener_->DeviceChanged(added, name, description); |
-} |
- |
-void PrivetNotificationService::DeviceRemoved(const std::string& name) { |
- privet_notifications_listener_->DeviceRemoved(name); |
-} |
- |
-void PrivetNotificationService::DeviceCacheFlushed() { |
- privet_notifications_listener_->DeviceCacheFlushed(); |
-} |
- |
-// static |
-bool PrivetNotificationService::IsEnabled() { |
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
- return !command_line->HasSwitch( |
- switches::kDisableDeviceDiscoveryNotifications); |
-} |
- |
-// static |
-bool PrivetNotificationService::IsForced() { |
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
- return command_line->HasSwitch(switches::kEnableDeviceDiscoveryNotifications); |
-} |
- |
-void PrivetNotificationService::PrivetNotify(int devices_active, |
- bool added) { |
- base::string16 product_name = l10n_util::GetStringUTF16( |
- IDS_LOCAL_DISCOVERY_SERVICE_NAME_PRINTER); |
- |
- base::string16 title = l10n_util::GetPluralStringFUTF16( |
- IDS_LOCAL_DISCOVERY_NOTIFICATION_TITLE_PRINTER, devices_active); |
- base::string16 body = l10n_util::GetPluralStringFUTF16( |
- IDS_LOCAL_DISCOVERY_NOTIFICATION_CONTENTS_PRINTER, devices_active); |
- |
- Profile* profile_object = Profile::FromBrowserContext(profile_); |
- message_center::RichNotificationData rich_notification_data; |
- |
- rich_notification_data.buttons.push_back( |
- message_center::ButtonInfo(l10n_util::GetStringUTF16( |
- IDS_LOCAL_DISCOVERY_NOTIFICATION_BUTTON_PRINTER))); |
- |
- rich_notification_data.buttons.push_back( |
- message_center::ButtonInfo(l10n_util::GetStringUTF16( |
- IDS_LOCAL_DISCOVERY_NOTIFICATIONS_DISABLE_BUTTON_LABEL))); |
- |
- Notification notification( |
- message_center::NOTIFICATION_TYPE_SIMPLE, title, body, |
- ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
- IDR_LOCAL_DISCOVERY_CLOUDPRINT_ICON), |
- message_center::NotifierId(message_center::NotifierId::SYSTEM_COMPONENT, |
- kPrivetNotificationID), |
- product_name, GURL(kPrivetNotificationOriginUrl), kPrivetNotificationID, |
- rich_notification_data, new PrivetNotificationDelegate(profile_)); |
- |
- bool updated = g_browser_process->notification_ui_manager()->Update( |
- notification, profile_object); |
- if (!updated && added && !LocalDiscoveryUIHandler::GetHasVisible()) { |
- ReportPrivetUmaEvent(PRIVET_NOTIFICATION_SHOWN); |
- g_browser_process->notification_ui_manager()->Add(notification, |
- profile_object); |
- } |
-} |
- |
-void PrivetNotificationService::PrivetRemoveNotification() { |
- ReportPrivetUmaEvent(PRIVET_NOTIFICATION_CANCELED); |
- Profile* profile_object = Profile::FromBrowserContext(profile_); |
- g_browser_process->notification_ui_manager()->CancelById( |
- kPrivetNotificationID, |
- NotificationUIManager::GetProfileID(profile_object)); |
-} |
- |
-void PrivetNotificationService::Start() { |
-#if defined(CHROMEOS) |
- SigninManagerBase* signin_manager = |
- SigninManagerFactory::GetForProfileIfExists( |
- Profile::FromBrowserContext(profile_)); |
- |
- if (!signin_manager || !signin_manager->IsAuthenticated()) |
- return; |
-#endif |
- |
- enable_privet_notification_member_.Init( |
- prefs::kLocalDiscoveryNotificationsEnabled, |
- Profile::FromBrowserContext(profile_)->GetPrefs(), |
- base::Bind(&PrivetNotificationService::OnNotificationsEnabledChanged, |
- base::Unretained(this))); |
- OnNotificationsEnabledChanged(); |
-} |
- |
-void PrivetNotificationService::OnNotificationsEnabledChanged() { |
-#if defined(ENABLE_MDNS) |
- if (IsForced()) { |
- StartLister(); |
- } else if (*enable_privet_notification_member_) { |
- ReportPrivetUmaEvent(PRIVET_SERVICE_STARTED); |
- traffic_detector_ = |
- new PrivetTrafficDetector( |
- net::ADDRESS_FAMILY_IPV4, |
- base::Bind(&PrivetNotificationService::StartLister, AsWeakPtr())); |
- traffic_detector_->Start(); |
- } else { |
- traffic_detector_ = NULL; |
- device_lister_.reset(); |
- service_discovery_client_ = NULL; |
- privet_notifications_listener_.reset(); |
- } |
-#else |
- if (IsForced() || *enable_privet_notification_member_) { |
- StartLister(); |
- } else { |
- device_lister_.reset(); |
- service_discovery_client_ = NULL; |
- privet_notifications_listener_.reset(); |
- } |
-#endif |
-} |
- |
-void PrivetNotificationService::StartLister() { |
- ReportPrivetUmaEvent(PRIVET_LISTER_STARTED); |
-#if defined(ENABLE_MDNS) |
- traffic_detector_ = NULL; |
-#endif // ENABLE_MDNS |
- service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance(); |
- device_lister_.reset( |
- new PrivetDeviceListerImpl(service_discovery_client_.get(), this)); |
- device_lister_->Start(); |
- device_lister_->DiscoverNewDevices(false); |
- |
- scoped_ptr<PrivetHTTPAsynchronousFactory> http_factory( |
- PrivetHTTPAsynchronousFactory::CreateInstance( |
- profile_->GetRequestContext())); |
- |
- privet_notifications_listener_.reset( |
- new PrivetNotificationsListener(std::move(http_factory), this)); |
-} |
- |
-PrivetNotificationDelegate::PrivetNotificationDelegate( |
- content::BrowserContext* profile) |
- : profile_(profile) { |
-} |
- |
-PrivetNotificationDelegate::~PrivetNotificationDelegate() { |
-} |
- |
-std::string PrivetNotificationDelegate::id() const { |
- return kPrivetNotificationID; |
-} |
- |
-void PrivetNotificationDelegate::ButtonClick(int button_index) { |
- if (button_index == 0) { |
- ReportPrivetUmaEvent(PRIVET_NOTIFICATION_CLICKED); |
- OpenTab(GURL(kPrivetNotificationOriginUrl)); |
- } else if (button_index == 1) { |
- ReportPrivetUmaEvent(PRIVET_DISABLE_NOTIFICATIONS_CLICKED); |
- DisableNotifications(); |
- } |
-} |
- |
-void PrivetNotificationDelegate::OpenTab(const GURL& url) { |
- Profile* profile_obj = Profile::FromBrowserContext(profile_); |
- |
- chrome::NavigateParams params(profile_obj, |
- url, |
- ui::PAGE_TRANSITION_AUTO_TOPLEVEL); |
- params.disposition = NEW_FOREGROUND_TAB; |
- chrome::Navigate(¶ms); |
-} |
- |
-void PrivetNotificationDelegate::DisableNotifications() { |
- Profile* profile_obj = Profile::FromBrowserContext(profile_); |
- |
- profile_obj->GetPrefs()->SetBoolean( |
- prefs::kLocalDiscoveryNotificationsEnabled, |
- false); |
-} |
- |
-} // namespace local_discovery |