// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_ARC_USB_USB_HOST_UI_DELEGATE_H_
#define COMPONENTS_ARC_USB_USB_HOST_UI_DELEGATE_H_

#include <string>

#include "base/callback.h"
#include "base/strings/string16.h"

namespace arc {

class ArcUsbHostUiDelegate {
 public:
  using RequestPermissionCallback = base::OnceCallback<void(bool)>;
  // Requests scan device list permission when app tries to get USB device list.
  // Since the calling application will block on the callback being resolved, it
  // should be done as soon as possible to prevent the caller from becoming
  // non-responsive.
  virtual void RequestUsbScanDeviceListPermission(
      const std::string& package_name,
      RequestPermissionCallback callback) = 0;

  // Requests USB device access permission.
  virtual void RequestUsbAccessPermission(
      const std::string& package_name,
      const std::string& guid,
      const base::string16& serial_number,
      const base::string16& manufacturer_string,
      const base::string16& product_string,
      uint16_t vendor_id,
      uint16_t product_id,
      RequestPermissionCallback callback) = 0;

  // Checks if package have access to USB device.
  virtual bool HasUsbAccessPermission(const std::string& package_name,
                                      const std::string& guid,
                                      const base::string16& serial_number,
                                      uint16_t vendor_id,
                                      uint16_t product_id) const = 0;

  // Temporarily grants package access permission to USB device. This is called
  // when Android launches default package for the USB device. Permission
  // granted through this method should never persist.
  virtual void GrantUsbAccessPermission(const std::string& package_name,
                                        const std::string& guid,
                                        uint16_t vendor_id,
                                        uint16_t product_id) = 0;

  // Gets list of packages which should receive USB device attach/detach event.
  virtual std::unordered_set<std::string> GetEventPackageList(
      const std::string& guid,
      const base::string16& serial_number,
      uint16_t vendor_id,
      uint16_t product_id) const = 0;

  // Device is detached. Remove pending permission request to the device and
  // ephemeral device permission if the device is not persistent.
  virtual void DeviceRemoved(const std::string& guid) = 0;

  // Clears all pending permission requests. Called when USB host instance
  // connection is closed.
  virtual void ClearPermissionRequests() = 0;

 protected:
  ~ArcUsbHostUiDelegate() = default;
};

}  // namespace arc

#endif  // COMPONENTS_ARC_USB_USB_HOST_UI_DELEGATE_H_
