blob: f3e5e7e179a9af73669d59d8ac77fa105d571a5a [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_DEVTOOLS_DEVICE_USB_USB_DEVICE_MANAGER_HELPER_H_
#define CHROME_BROWSER_DEVTOOLS_DEVICE_USB_USB_DEVICE_MANAGER_HELPER_H_
#include <string>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/sequence_checker.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/device/public/mojom/usb_device.mojom.h"
#include "services/device/public/mojom/usb_manager.mojom.h"
struct AndroidInterfaceInfo {
AndroidInterfaceInfo(
uint8_t interface_number,
const device::mojom::UsbAlternateInterfaceInfo* alternate);
uint8_t interface_number;
raw_ptr<const device::mojom::UsbAlternateInterfaceInfo> alternate;
};
struct AndroidDeviceInfo {
AndroidDeviceInfo(const std::string& guid,
const std::string& serial,
int interface_id,
int inbound_address,
int outbound_address,
int zero_mask);
AndroidDeviceInfo(const AndroidDeviceInfo& other);
std::string guid;
std::string serial;
int interface_id = 0;
int inbound_address = 0;
int outbound_address = 0;
int zero_mask = 0;
};
using AndroidDeviceInfoListCallback =
base::OnceCallback<void(std::vector<AndroidDeviceInfo>)>;
// All methods in this class should be called in the single thread,
// handler_thread_ in AndroidDeviceManager.
class UsbDeviceManagerHelper {
public:
// This is prefered way to get UsbDeviceManagerHelper instance.
static UsbDeviceManagerHelper* GetInstance();
static void CountDevices(base::OnceCallback<void(int)> callback);
static void SetUsbManagerForTesting(
mojo::PendingRemote<device::mojom::UsbDeviceManager> fake_usb_manager);
// Please do not create UsbDeviceManagerHelper instance from this constructor
// directly, use static method GetInstance() instead.
UsbDeviceManagerHelper();
UsbDeviceManagerHelper(const UsbDeviceManagerHelper&) = delete;
UsbDeviceManagerHelper& operator=(const UsbDeviceManagerHelper&) = delete;
virtual ~UsbDeviceManagerHelper();
void GetAndroidDevices(AndroidDeviceInfoListCallback callback);
void GetDevice(
const std::string& guid,
mojo::PendingReceiver<device::mojom::UsbDevice> device_receiver);
private:
void CountDevicesInternal(base::OnceCallback<void(int)> callback);
void SetUsbManagerForTestingInternal(
mojo::PendingRemote<device::mojom::UsbDeviceManager> fake_usb_manager);
void EnsureUsbDeviceManagerConnection();
void OnDeviceManagerConnectionError();
mojo::Remote<device::mojom::UsbDeviceManager> device_manager_
GUARDED_BY_CONTEXT(sequence_checker_);
// Just for test.
mojo::PendingRemote<device::mojom::UsbDeviceManager> testing_device_manager_
GUARDED_BY_CONTEXT(sequence_checker_);
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<UsbDeviceManagerHelper> weak_factory_{this};
};
#endif // CHROME_BROWSER_DEVTOOLS_DEVICE_USB_USB_DEVICE_MANAGER_HELPER_H_