| Index: chrome/browser/devtools/device/devtools_android_bridge.cc
|
| diff --git a/chrome/browser/devtools/device/devtools_android_bridge.cc b/chrome/browser/devtools/device/devtools_android_bridge.cc
|
| index c850b5cccd5e48a8ce6c44c99b0f44ad4e675101..db7f1f5f4262b7ae0dc618db73f88cb8bbafb803 100644
|
| --- a/chrome/browser/devtools/device/devtools_android_bridge.cc
|
| +++ b/chrome/browser/devtools/device/devtools_android_bridge.cc
|
| @@ -23,6 +23,7 @@
|
| #include "chrome/browser/devtools/browser_list_tabcontents_provider.h"
|
| #include "chrome/browser/devtools/device/adb/adb_device_info_query.h"
|
| #include "chrome/browser/devtools/device/adb/adb_device_provider.h"
|
| +#include "chrome/browser/devtools/device/port_forwarding_controller.h"
|
| #include "chrome/browser/devtools/device/self_device_provider.h"
|
| #include "chrome/browser/devtools/device/usb/usb_device_provider.h"
|
| #include "chrome/browser/devtools/devtools_protocol.h"
|
| @@ -733,7 +734,8 @@ DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() {
|
| DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
|
| : profile_(profile),
|
| device_manager_(AndroidDeviceManager::Create()),
|
| - task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)) {
|
| + task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)),
|
| + port_forwarding_controller_(new PortForwardingController(profile)) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| pref_change_registrar_.Init(profile_->GetPrefs());
|
| pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled,
|
| @@ -745,8 +747,9 @@ DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
|
| void DevToolsAndroidBridge::AddDeviceListListener(
|
| DeviceListListener* listener) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + bool polling_was_off = !NeedsDeviceListPolling();
|
| device_list_listeners_.push_back(listener);
|
| - if (device_list_listeners_.size() == 1)
|
| + if (polling_was_off)
|
| StartDeviceListPolling();
|
| }
|
|
|
| @@ -757,7 +760,7 @@ void DevToolsAndroidBridge::RemoveDeviceListListener(
|
| device_list_listeners_.begin(), device_list_listeners_.end(), listener);
|
| DCHECK(it != device_list_listeners_.end());
|
| device_list_listeners_.erase(it);
|
| - if (device_list_listeners_.empty())
|
| + if (!NeedsDeviceListPolling())
|
| StopDeviceListPolling();
|
| }
|
|
|
| @@ -779,6 +782,26 @@ void DevToolsAndroidBridge::RemoveDeviceCountListener(
|
| StopDeviceCountPolling();
|
| }
|
|
|
| +void DevToolsAndroidBridge::AddPortForwardingListener(
|
| + PortForwardingListener* listener) {
|
| + bool polling_was_off = !NeedsDeviceListPolling();
|
| + port_forwarding_listeners_.push_back(listener);
|
| + if (polling_was_off)
|
| + StartDeviceListPolling();
|
| +}
|
| +
|
| +void DevToolsAndroidBridge::RemovePortForwardingListener(
|
| + PortForwardingListener* listener) {
|
| + PortForwardingListeners::iterator it = std::find(
|
| + port_forwarding_listeners_.begin(),
|
| + port_forwarding_listeners_.end(),
|
| + listener);
|
| + DCHECK(it != port_forwarding_listeners_.end());
|
| + port_forwarding_listeners_.erase(it);
|
| + if (!NeedsDeviceListPolling())
|
| + StopDeviceListPolling();
|
| +}
|
| +
|
| // static
|
| bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| @@ -789,6 +812,7 @@ DevToolsAndroidBridge::~DevToolsAndroidBridge() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(device_list_listeners_.empty());
|
| DCHECK(device_count_listeners_.empty());
|
| + DCHECK(port_forwarding_listeners_.empty());
|
| }
|
|
|
| void DevToolsAndroidBridge::StartDeviceListPolling() {
|
| @@ -802,11 +826,15 @@ void DevToolsAndroidBridge::StopDeviceListPolling() {
|
| devices_.clear();
|
| }
|
|
|
| +bool DevToolsAndroidBridge::NeedsDeviceListPolling() {
|
| + return !device_list_listeners_.empty() || !port_forwarding_listeners_.empty();
|
| +}
|
| +
|
| void DevToolsAndroidBridge::RequestDeviceList(
|
| const base::Callback<void(const RemoteDevices&)>& callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - if (device_list_listeners_.empty() ||
|
| + if (!NeedsDeviceListPolling() ||
|
| !callback.Equals(device_list_callback_.callback()))
|
| return;
|
|
|
| @@ -820,7 +848,15 @@ void DevToolsAndroidBridge::ReceivedDeviceList(const RemoteDevices& devices) {
|
| for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it)
|
| (*it)->DeviceListChanged(devices);
|
|
|
| - if (device_list_listeners_.empty())
|
| + DevicesStatus status =
|
| + port_forwarding_controller_->DeviceListChanged(devices);
|
| + PortForwardingListeners forwarding_listeners(port_forwarding_listeners_);
|
| + for (PortForwardingListeners::iterator it = forwarding_listeners.begin();
|
| + it != forwarding_listeners.end(); ++it) {
|
| + (*it)->PortStatusChanged(status);
|
| + }
|
| +
|
| + if (!NeedsDeviceListPolling())
|
| return;
|
|
|
| devices_ = devices;
|
| @@ -896,7 +932,7 @@ void DevToolsAndroidBridge::CreateDeviceProviders() {
|
| device_providers.push_back(new UsbDeviceProvider(profile_));
|
| }
|
| device_manager_->SetDeviceProviders(device_providers);
|
| - if (!device_list_listeners_.empty()) {
|
| + if (NeedsDeviceListPolling()) {
|
| StopDeviceListPolling();
|
| StartDeviceListPolling();
|
| }
|
|
|