usb_service_android.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/device/usb/usb_service_android.h"
  5. #include <string>
  6. #include <vector>
  7. #include "base/bind.h"
  8. #include "base/containers/contains.h"
  9. #include "base/location.h"
  10. #include "base/task/sequenced_task_runner.h"
  11. #include "components/device_event_log/device_event_log.h"
  12. #include "services/device/usb/jni_headers/ChromeUsbService_jni.h"
  13. #include "services/device/usb/usb_device_android.h"
  14. using base::android::AttachCurrentThread;
  15. using base::android::JavaRef;
  16. using base::android::ScopedJavaLocalRef;
  17. namespace device {
  18. UsbServiceAndroid::UsbServiceAndroid() : UsbService() {
  19. JNIEnv* env = AttachCurrentThread();
  20. j_object_.Reset(
  21. Java_ChromeUsbService_create(env, reinterpret_cast<jlong>(this)));
  22. ScopedJavaLocalRef<jobjectArray> devices =
  23. Java_ChromeUsbService_getDevices(env, j_object_);
  24. for (auto usb_device : devices.ReadElements<jobject>()) {
  25. scoped_refptr<UsbDeviceAndroid> device =
  26. UsbDeviceAndroid::Create(env, weak_factory_.GetWeakPtr(), usb_device);
  27. AddDevice(device);
  28. }
  29. }
  30. UsbServiceAndroid::~UsbServiceAndroid() {
  31. NotifyWillDestroyUsbService();
  32. JNIEnv* env = AttachCurrentThread();
  33. Java_ChromeUsbService_close(env, j_object_);
  34. }
  35. void UsbServiceAndroid::DeviceAttached(JNIEnv* env,
  36. const JavaRef<jobject>& caller,
  37. const JavaRef<jobject>& usb_device) {
  38. scoped_refptr<UsbDeviceAndroid> device =
  39. UsbDeviceAndroid::Create(env, weak_factory_.GetWeakPtr(), usb_device);
  40. AddDevice(device);
  41. NotifyDeviceAdded(device);
  42. }
  43. void UsbServiceAndroid::DeviceDetached(JNIEnv* env,
  44. const JavaRef<jobject>& caller,
  45. jint device_id) {
  46. auto it = devices_by_id_.find(device_id);
  47. if (it == devices_by_id_.end())
  48. return;
  49. scoped_refptr<UsbDeviceAndroid> device = it->second;
  50. devices_by_id_.erase(it);
  51. devices().erase(device->guid());
  52. device->OnDisconnect();
  53. USB_LOG(USER) << "USB device removed: id=" << device->device_id()
  54. << " guid=" << device->guid();
  55. NotifyDeviceRemoved(device);
  56. }
  57. void UsbServiceAndroid::DevicePermissionRequestComplete(
  58. JNIEnv* env,
  59. const base::android::JavaRef<jobject>& caller,
  60. jint device_id,
  61. jboolean granted) {
  62. const auto it = devices_by_id_.find(device_id);
  63. DCHECK(it != devices_by_id_.end());
  64. it->second->PermissionGranted(env, granted);
  65. }
  66. ScopedJavaLocalRef<jobject> UsbServiceAndroid::OpenDevice(
  67. JNIEnv* env,
  68. const JavaRef<jobject>& wrapper) {
  69. return Java_ChromeUsbService_openDevice(env, j_object_, wrapper);
  70. }
  71. bool UsbServiceAndroid::HasDevicePermission(const JavaRef<jobject>& wrapper) {
  72. return Java_ChromeUsbService_hasDevicePermission(AttachCurrentThread(),
  73. j_object_, wrapper);
  74. }
  75. void UsbServiceAndroid::RequestDevicePermission(
  76. const JavaRef<jobject>& wrapper) {
  77. Java_ChromeUsbService_requestDevicePermission(AttachCurrentThread(),
  78. j_object_, wrapper);
  79. }
  80. void UsbServiceAndroid::AddDevice(scoped_refptr<UsbDeviceAndroid> device) {
  81. DCHECK(!base::Contains(devices_by_id_, device->device_id()));
  82. DCHECK(!base::Contains(devices(), device->guid()));
  83. devices_by_id_[device->device_id()] = device;
  84. devices()[device->guid()] = device;
  85. USB_LOG(USER) << "USB device added: id=" << device->device_id()
  86. << " vendor=" << device->vendor_id() << " \""
  87. << device->manufacturer_string()
  88. << "\", product=" << device->product_id() << " \""
  89. << device->product_string() << "\", serial=\""
  90. << device->serial_number() << "\", guid=" << device->guid();
  91. }
  92. } // namespace device