android_device_manager.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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;
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  typedef base::Callback<void(int result, net::StreamSocket*)> SocketCallback;
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  typedef base::Callback<void(const std::vector<std::string>&)> SerialsCallback;
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  struct BrowserInfo {
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    BrowserInfo();
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    enum Type {
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kTypeChrome,
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kTypeWebView,
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kTypeOther
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    };
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string socket_name;
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string display_name;
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Type type;
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  struct DeviceInfo {
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DeviceInfo();
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ~DeviceInfo();
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string model;
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool connected;
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::Size screen_size;
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::vector<BrowserInfo> browser_info;
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef base::Callback<void(const DeviceInfo&)> DeviceInfoCallback;
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  class AndroidWebSocket : public base::RefCountedThreadSafe<AndroidWebSocket> {
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)   public:
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    class Delegate {
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)     public:
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      virtual void OnSocketOpened() = 0;
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      virtual void OnFrameRead(const std::string& message) = 0;
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      virtual void OnSocketClosed(bool closed_by_device) = 0;
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)     protected:
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      virtual ~Delegate() {}
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    };
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    AndroidWebSocket() {}
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual void Connect() = 0;
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual void Disconnect() = 0;
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual void SendFrame(const std::string& message) = 0;
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual void ClearDelegate() = 0;
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   protected:
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual ~AndroidWebSocket() {}
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)   private:
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    friend class base::RefCountedThreadSafe<AndroidWebSocket>;
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(AndroidWebSocket);
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  };
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  class DeviceProvider;
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  class Device : public base::RefCountedThreadSafe<Device>,
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 public base::NonThreadSafe {
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)   public:
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    typedef AndroidDeviceManager::DeviceInfoCallback DeviceInfoCallback;
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    typedef AndroidDeviceManager::CommandCallback CommandCallback;
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    typedef AndroidDeviceManager::SocketCallback SocketCallback;
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    void QueryDeviceInfo(const DeviceInfoCallback& callback);
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    void OpenSocket(const std::string& socket_name,
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    const SocketCallback& callback);
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    void SendJsonRequest(const std::string& socket_name,
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                         const std::string& request,
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                         const CommandCallback& callback);
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    void HttpUpgrade(const std::string& socket_name,
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     const std::string& url,
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     const SocketCallback& callback);
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<AndroidWebSocket> CreateWebSocket(
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        const std::string& socket_name,
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        const std::string& url,
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        AndroidWebSocket::Delegate* delegate);
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    std::string serial() { return serial_; }
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)   private:
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    friend class AndroidDeviceManager;
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    Device(scoped_refptr<base::MessageLoopProxy> device_message_loop,
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)           scoped_refptr<DeviceProvider> provider,
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)           const std::string& serial);
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    friend class base::RefCountedThreadSafe<Device>;
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    virtual ~Device();
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> device_message_loop_;
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<DeviceProvider> provider_;
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    std::string serial_;
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    base::WeakPtrFactory<Device> weak_factory_;
126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DISALLOW_COPY_AND_ASSIGN(Device);
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  typedef std::vector<scoped_refptr<Device> > Devices;
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  typedef base::Callback<void(const Devices&)> DevicesCallback;
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  class DeviceProvider : public base::RefCountedThreadSafe<DeviceProvider> {
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)   public:
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    typedef AndroidDeviceManager::SerialsCallback SerialsCallback;
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    typedef AndroidDeviceManager::DeviceInfoCallback DeviceInfoCallback;
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    typedef AndroidDeviceManager::SocketCallback SocketCallback;
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    typedef AndroidDeviceManager::CommandCallback CommandCallback;
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual void QueryDevices(const SerialsCallback& callback) = 0;
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual void QueryDeviceInfo(const std::string& serial,
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                 const DeviceInfoCallback& callback) = 0;
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual void OpenSocket(const std::string& serial,
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                            const std::string& socket_name,
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                            const SocketCallback& callback) = 0;
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual void SendJsonRequest(const std::string& serial,
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                 const std::string& socket_name,
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                 const std::string& request,
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                 const CommandCallback& callback);
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual void HttpUpgrade(const std::string& serial,
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             const std::string& socket_name,
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             const std::string& url,
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             const SocketCallback& callback);
15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual void ReleaseDevice(const std::string& serial);
16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)   protected:
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    friend class base::RefCountedThreadSafe<DeviceProvider>;
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DeviceProvider();
164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    virtual ~DeviceProvider();
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  typedef std::vector<scoped_refptr<DeviceProvider> > DeviceProviders;
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static scoped_refptr<AndroidDeviceManager> Create();
170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SetDeviceProviders(const DeviceProviders& providers);
172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void QueryDevices(const DevicesCallback& callback);
174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  struct DeviceDescriptor {
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DeviceDescriptor();
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ~DeviceDescriptor();
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<DeviceProvider> provider;
18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    std::string serial;
18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  };
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  typedef std::vector<DeviceDescriptor> DeviceDescriptors;
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  class HandlerThread : public base::RefCountedThreadSafe<HandlerThread> {
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)   public:
18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    static scoped_refptr<HandlerThread> GetInstance();
18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> message_loop();
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)   private:
19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    friend class base::RefCountedThreadSafe<HandlerThread>;
19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    static HandlerThread* instance_;
19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    static void StopThread(base::Thread* thread);
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    HandlerThread();
19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual ~HandlerThread();
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    base::Thread* thread_;
19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  };
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  friend struct content::BrowserThread::DeleteOnThread<
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      content::BrowserThread::UI>;
20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  friend class base::DeleteHelper<AndroidDeviceManager>;
20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AndroidDeviceManager();
20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~AndroidDeviceManager();
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void UpdateDevices(const DevicesCallback& callback,
20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     DeviceDescriptors* descriptors);
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  typedef std::map<std::string, base::WeakPtr<Device> > DeviceWeakMap;
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_refptr<HandlerThread> handler_thread_;
21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DeviceProviders providers_;
21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DeviceWeakMap devices_;
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif  // CHROME_BROWSER_DEVTOOLS_DEVICE_ANDROID_DEVICE_MANAGER_H_
218