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 5bf7b550be6e656189d5432afd05be2b4f35ff16..7b51d4ff9e013362c60788f08ad73a04781cdf87 100644 |
--- a/chrome/browser/devtools/device/devtools_android_bridge.cc |
+++ b/chrome/browser/devtools/device/devtools_android_bridge.cc |
@@ -63,7 +63,7 @@ class DiscoveryRequest : public base::RefCountedThreadSafe< |
DiscoveryRequest, |
BrowserThread::DeleteOnUIThread> { |
public: |
- typedef base::Callback<void(scoped_ptr<DevToolsAndroidBridge::RemoteDevices>)> |
+ typedef base::Callback<void(const DevToolsAndroidBridge::RemoteDevices&)> |
DiscoveryCallback; |
typedef AndroidDeviceManager::Device Device; |
typedef AndroidDeviceManager::Devices Devices; |
@@ -99,7 +99,7 @@ class DiscoveryRequest : public base::RefCountedThreadSafe< |
DiscoveryCallback callback_; |
Devices devices_; |
DevToolsAndroidBridge::RemoteBrowsers browsers_; |
- scoped_ptr<DevToolsAndroidBridge::RemoteDevices> remote_devices_; |
+ DevToolsAndroidBridge::RemoteDevices remote_devices_; |
}; |
DiscoveryRequest::DiscoveryRequest( |
@@ -107,7 +107,6 @@ DiscoveryRequest::DiscoveryRequest( |
const DiscoveryCallback& callback) |
: callback_(callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- remote_devices_.reset(new DevToolsAndroidBridge::RemoteDevices()); |
device_manager->QueryDevices( |
base::Bind(&DiscoveryRequest::ReceivedDevices, this)); |
@@ -136,9 +135,9 @@ void DiscoveryRequest::ProcessDevices() { |
void DiscoveryRequest::ReceivedDeviceInfo( |
const AndroidDeviceManager::DeviceInfo& device_info) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- remote_devices_->push_back( |
+ remote_devices_.push_back( |
new DevToolsAndroidBridge::RemoteDevice(current_device(), device_info)); |
- browsers_ = remote_devices_->back()->browsers(); |
+ browsers_ = remote_devices_.back()->browsers(); |
ProcessSockets(); |
} |
@@ -212,7 +211,7 @@ void DiscoveryRequest::NextDevice() { |
} |
void DiscoveryRequest::Respond() { |
- callback_.Run(remote_devices_.Pass()); |
+ callback_.Run(remote_devices_); |
} |
// ProtocolCommand ------------------------------------------------------------ |
@@ -766,7 +765,8 @@ DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() { |
DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) |
: profile_(profile), |
- device_manager_(AndroidDeviceManager::Create()) { |
+ device_manager_(AndroidDeviceManager::Create()), |
+ task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
pref_change_registrar_.Init(profile_->GetPrefs()); |
pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, |
@@ -780,7 +780,7 @@ void DevToolsAndroidBridge::AddDeviceListListener( |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
device_list_listeners_.push_back(listener); |
if (device_list_listeners_.size() == 1) |
- RequestDeviceList(); |
+ StartDeviceListPolling(); |
} |
void DevToolsAndroidBridge::RemoveDeviceListListener( |
@@ -791,14 +791,14 @@ void DevToolsAndroidBridge::RemoveDeviceListListener( |
DCHECK(it != device_list_listeners_.end()); |
device_list_listeners_.erase(it); |
if (device_list_listeners_.empty()) |
- devices_.clear(); |
+ StopDeviceListPolling(); |
} |
void DevToolsAndroidBridge::AddDeviceCountListener( |
DeviceCountListener* listener) { |
device_count_listeners_.push_back(listener); |
if (device_count_listeners_.size() == 1) |
- RequestDeviceCount(); |
+ StartDeviceCountPolling(); |
} |
void DevToolsAndroidBridge::RemoveDeviceCountListener( |
@@ -808,6 +808,8 @@ void DevToolsAndroidBridge::RemoveDeviceCountListener( |
device_count_listeners_.begin(), device_count_listeners_.end(), listener); |
DCHECK(it != device_count_listeners_.end()); |
device_count_listeners_.erase(it); |
+ if (device_count_listeners_.empty()) |
+ StopDeviceCountPolling(); |
} |
// static |
@@ -822,61 +824,87 @@ DevToolsAndroidBridge::~DevToolsAndroidBridge() { |
DCHECK(device_count_listeners_.empty()); |
} |
-void DevToolsAndroidBridge::RequestDeviceList() { |
+void DevToolsAndroidBridge::StartDeviceListPolling() { |
+ device_list_callback_.Reset( |
+ base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this)); |
+ RequestDeviceList(device_list_callback_.callback()); |
+} |
+ |
+void DevToolsAndroidBridge::StopDeviceListPolling() { |
+ device_list_callback_.Cancel(); |
+ devices_.clear(); |
+} |
+ |
+void DevToolsAndroidBridge::RequestDeviceList( |
+ const base::Callback<void(const RemoteDevices&)>& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (device_list_listeners_.empty()) |
+ if (device_list_listeners_.empty() || |
+ !callback.Equals(device_list_callback_.callback())) |
return; |
- new DiscoveryRequest( |
- device_manager_.get(), |
- base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this)); |
+ new DiscoveryRequest(device_manager_.get(), callback); |
} |
-void DevToolsAndroidBridge::ReceivedDeviceList( |
- scoped_ptr<RemoteDevices> devices) { |
+void DevToolsAndroidBridge::ReceivedDeviceList(const RemoteDevices& devices) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DeviceListListeners copy(device_list_listeners_); |
+ for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) |
+ (*it)->DeviceListChanged(devices); |
+ |
if (device_list_listeners_.empty()) |
return; |
- devices_ = *devices; |
+ devices_ = devices; |
- DeviceListListeners copy(device_list_listeners_); |
- for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) |
- (*it)->DeviceListChanged(*devices.get()); |
+ task_scheduler_.Run( |
+ base::Bind(&DevToolsAndroidBridge::RequestDeviceList, |
+ this, device_list_callback_.callback())); |
+} |
- BrowserThread::PostDelayedTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&DevToolsAndroidBridge::RequestDeviceList, this), |
- base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); |
+void DevToolsAndroidBridge::StartDeviceCountPolling() { |
+ device_count_callback_.Reset( |
+ base::Bind(&DevToolsAndroidBridge::ReceivedDeviceCount, this)); |
+ RequestDeviceCount(device_count_callback_.callback()); |
+} |
+ |
+void DevToolsAndroidBridge::StopDeviceCountPolling() { |
+ device_count_callback_.Cancel(); |
} |
-void DevToolsAndroidBridge::RequestDeviceCount() { |
+void DevToolsAndroidBridge::RequestDeviceCount( |
+ const base::Callback<void(int)>& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (device_count_listeners_.empty()) |
+ if (device_count_listeners_.empty() || |
+ !callback.Equals(device_count_callback_.callback())) |
return; |
- UsbDeviceProvider::CountDevices( |
- base::Bind(&DevToolsAndroidBridge::ReceivedDeviceCount, this)); |
+ UsbDeviceProvider::CountDevices(callback); |
} |
void DevToolsAndroidBridge::ReceivedDeviceCount(int count) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (device_count_listeners_.empty()) |
- return; |
- |
DeviceCountListeners copy(device_count_listeners_); |
for (DeviceCountListeners::iterator it = copy.begin(); it != copy.end(); ++it) |
(*it)->DeviceCountChanged(count); |
+ if (device_count_listeners_.empty()) |
+ return; |
+ |
+ task_scheduler_.Run( |
+ base::Bind(&DevToolsAndroidBridge::RequestDeviceCount, |
+ this, device_count_callback_.callback())); |
+} |
+ |
+// static |
+void DevToolsAndroidBridge::ScheduleTaskDefault(const base::Closure& task) { |
BrowserThread::PostDelayedTask( |
BrowserThread::UI, |
FROM_HERE, |
- base::Bind(&DevToolsAndroidBridge::RequestDeviceCount, this), |
+ task, |
base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); |
} |
@@ -901,4 +929,8 @@ void DevToolsAndroidBridge::CreateDeviceProviders() { |
device_providers.push_back(new UsbDeviceProvider(profile_)); |
} |
device_manager_->SetDeviceProviders(device_providers); |
+ if (!device_list_listeners_.empty()) { |
+ StopDeviceListPolling(); |
+ StartDeviceListPolling(); |
+ } |
} |