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(); |
} |