10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file. 41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#ifndef CHROME_BROWSER_DEVTOOLS_DEVICE_ANDROID_DEVICE_MANAGER_H_ 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define CHROME_BROWSER_DEVTOOLS_DEVICE_ANDROID_DEVICE_MANAGER_H_ 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <vector> 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/ref_counted.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/threading/non_thread_safe.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/size.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace net { 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class StreamSocket; 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass AndroidDeviceManager 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : public base::RefCountedThreadSafe< 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AndroidDeviceManager, 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::BrowserThread::DeleteOnUIThread>, 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public base::NonThreadSafe { 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) typedef base::Callback<void(int, const std::string&)> CommandCallback; 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) typedef base::Callback<void(int result, scoped_ptr<net::StreamSocket>)> 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SocketCallback; 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef base::Callback<void(const std::vector<std::string>&)> SerialsCallback; 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct BrowserInfo { 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserInfo(); 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) enum Type { 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTypeChrome, 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTypeWebView, 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTypeOther 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string socket_name; 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string display_name; 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Type type; 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct DeviceInfo { 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DeviceInfo(); 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ~DeviceInfo(); 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string model; 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool connected; 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Size screen_size; 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<BrowserInfo> browser_info; 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) typedef base::Callback<void(const DeviceInfo&)> DeviceInfoCallback; 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) class AndroidWebSocket { 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) class Delegate { 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnSocketOpened() = 0; 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnFrameRead(const std::string& message) = 0; 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void OnSocketClosed() = 0; 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected: 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~Delegate() {} 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~AndroidWebSocket() {} 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void SendFrame(const std::string& message) = 0; 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) class DeviceProvider; 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) class Device : public base::RefCountedThreadSafe<Device>, 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public base::NonThreadSafe { 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef AndroidDeviceManager::DeviceInfoCallback DeviceInfoCallback; 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch typedef AndroidDeviceManager::CommandCallback CommandCallback; 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch typedef AndroidDeviceManager::SocketCallback SocketCallback; 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void QueryDeviceInfo(const DeviceInfoCallback& callback); 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OpenSocket(const std::string& socket_name, 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const SocketCallback& callback); 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SendJsonRequest(const std::string& socket_name, 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& request, 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const CommandCallback& callback); 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void HttpUpgrade(const std::string& socket_name, 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& url, 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const SocketCallback& callback); 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AndroidWebSocket* CreateWebSocket( 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& socket_name, 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& url, 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AndroidWebSocket::Delegate* delegate); 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string serial() { return serial_; } 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) friend class AndroidDeviceManager; 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Device(scoped_refptr<base::MessageLoopProxy> device_message_loop, 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<DeviceProvider> provider, 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& serial); 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) friend class base::RefCountedThreadSafe<Device>; 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~Device(); 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<base::MessageLoopProxy> device_message_loop_; 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<DeviceProvider> provider_; 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string serial_; 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::WeakPtrFactory<Device> weak_factory_; 116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DISALLOW_COPY_AND_ASSIGN(Device); 118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch typedef std::vector<scoped_refptr<Device> > Devices; 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef base::Callback<void(const Devices&)> DevicesCallback; 1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) class DeviceProvider : public base::RefCountedThreadSafe<DeviceProvider> { 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef AndroidDeviceManager::SerialsCallback SerialsCallback; 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef AndroidDeviceManager::DeviceInfoCallback DeviceInfoCallback; 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef AndroidDeviceManager::SocketCallback SocketCallback; 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef AndroidDeviceManager::CommandCallback CommandCallback; 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void QueryDevices(const SerialsCallback& callback) = 0; 1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void QueryDeviceInfo(const std::string& serial, 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const DeviceInfoCallback& callback) = 0; 134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OpenSocket(const std::string& serial, 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& socket_name, 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const SocketCallback& callback) = 0; 138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void SendJsonRequest(const std::string& serial, 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& socket_name, 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& request, 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const CommandCallback& callback); 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void HttpUpgrade(const std::string& serial, 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& socket_name, 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& url, 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const SocketCallback& callback); 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void ReleaseDevice(const std::string& serial); 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected: 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) friend class base::RefCountedThreadSafe<DeviceProvider>; 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DeviceProvider(); 154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~DeviceProvider(); 155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch typedef std::vector<scoped_refptr<DeviceProvider> > DeviceProviders; 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static scoped_refptr<AndroidDeviceManager> Create(); 160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SetDeviceProviders(const DeviceProviders& providers); 162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void QueryDevices(const DevicesCallback& callback); 164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) struct DeviceDescriptor { 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DeviceDescriptor(); 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ~DeviceDescriptor(); 168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<DeviceProvider> provider; 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string serial; 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef std::vector<DeviceDescriptor> DeviceDescriptors; 174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) class HandlerThread : public base::RefCountedThreadSafe<HandlerThread> { 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static scoped_refptr<HandlerThread> GetInstance(); 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<base::MessageLoopProxy> message_loop(); 180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) friend class base::RefCountedThreadSafe<HandlerThread>; 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static HandlerThread* instance_; 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static void StopThread(base::Thread* thread); 185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) HandlerThread(); 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~HandlerThread(); 18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Thread* thread_; 18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) friend struct content::BrowserThread::DeleteOnThread< 19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::BrowserThread::UI>; 19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) friend class base::DeleteHelper<AndroidDeviceManager>; 19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AndroidDeviceManager(); 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~AndroidDeviceManager(); 1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void UpdateDevices(const DevicesCallback& callback, 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DeviceDescriptors* descriptors); 1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef std::map<std::string, base::WeakPtr<Device> > DeviceWeakMap; 2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<HandlerThread> handler_thread_; 20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DeviceProviders providers_; 20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DeviceWeakMap devices_; 2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif // CHROME_BROWSER_DEVTOOLS_DEVICE_ANDROID_DEVICE_MANAGER_H_ 208