Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Unified Diff: device/usb/usb_service_android.cc

Issue 2017273002: Support USB device hotplug on Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add dependency on //device/usb:java. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « device/usb/usb_service_android.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/usb/usb_service_android.cc
diff --git a/device/usb/usb_service_android.cc b/device/usb/usb_service_android.cc
index aa620d456657494ac745c3b5a7e238141206f02b..f867a2bc481c592cdda1362288d1fd1dee179d61 100644
--- a/device/usb/usb_service_android.cc
+++ b/device/usb/usb_service_android.cc
@@ -11,10 +11,12 @@
#include "base/bind.h"
#include "base/location.h"
#include "base/threading/thread_task_runner_handle.h"
+#include "components/device_event_log/device_event_log.h"
#include "device/usb/usb_device_android.h"
#include "jni/ChromeUsbService_jni.h"
using base::android::AttachCurrentThread;
+using base::android::JavaRef;
using base::android::ScopedJavaLocalRef;
namespace device {
@@ -25,31 +27,81 @@ bool UsbServiceAndroid::RegisterJNI(JNIEnv* env) {
}
UsbServiceAndroid::UsbServiceAndroid() {
- j_object_.Reset(Java_ChromeUsbService_create(
- AttachCurrentThread(), base::android::GetApplicationContext()));
-}
-
-UsbServiceAndroid::~UsbServiceAndroid() {}
-
-scoped_refptr<UsbDevice> UsbServiceAndroid::GetDevice(const std::string& guid) {
- return nullptr;
-}
-
-void UsbServiceAndroid::GetDevices(const GetDevicesCallback& callback) {
JNIEnv* env = AttachCurrentThread();
+ j_object_.Reset(
+ Java_ChromeUsbService_create(env, base::android::GetApplicationContext(),
+ reinterpret_cast<jlong>(this)));
ScopedJavaLocalRef<jobjectArray> devices =
Java_ChromeUsbService_getDevices(env, j_object_.obj());
jsize length = env->GetArrayLength(devices.obj());
-
- std::vector<scoped_refptr<UsbDevice>> results;
for (jsize i = 0; i < length; ++i) {
- ScopedJavaLocalRef<jobject> raw_device(
+ ScopedJavaLocalRef<jobject> usb_device(
env, env->GetObjectArrayElement(devices.obj(), i));
- results.push_back(UsbDeviceAndroid::Create(env, raw_device));
+ scoped_refptr<UsbDeviceAndroid> device(
+ UsbDeviceAndroid::Create(env, usb_device));
+ AddDevice(device);
}
+}
+
+UsbServiceAndroid::~UsbServiceAndroid() {
+ JNIEnv* env = AttachCurrentThread();
+ Java_ChromeUsbService_close(env, j_object_.obj());
+}
+
+scoped_refptr<UsbDevice> UsbServiceAndroid::GetDevice(const std::string& guid) {
+ auto it = devices_by_guid_.find(guid);
+ if (it == devices_by_guid_.end())
+ return nullptr;
+ return it->second;
+}
+void UsbServiceAndroid::GetDevices(const GetDevicesCallback& callback) {
+ std::vector<scoped_refptr<UsbDevice>> devices;
+ devices.reserve(devices_by_guid_.size());
+ for (const auto& map_entry : devices_by_guid_)
+ devices.push_back(map_entry.second);
base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
- base::Bind(callback, results));
+ base::Bind(callback, devices));
+}
+
+void UsbServiceAndroid::DeviceAttached(JNIEnv* env,
+ const JavaRef<jobject>& caller,
+ const JavaRef<jobject>& usb_device) {
+ scoped_refptr<UsbDeviceAndroid> device(
+ UsbDeviceAndroid::Create(env, usb_device));
+ AddDevice(device);
+ NotifyDeviceAdded(device);
+}
+
+void UsbServiceAndroid::DeviceDetached(JNIEnv* env,
+ const JavaRef<jobject>& caller,
+ jint device_id) {
+ auto it = devices_by_id_.find(device_id);
+ if (it == devices_by_id_.end())
+ return;
+
+ scoped_refptr<UsbDeviceAndroid> device = it->second;
+ devices_by_id_.erase(it);
+ devices_by_guid_.erase(device->guid());
+
+ USB_LOG(USER) << "USB device removed: id=" << device->device_id()
+ << " guid=" << device->guid();
+
+ NotifyDeviceRemoved(device);
+}
+
+void UsbServiceAndroid::AddDevice(scoped_refptr<UsbDeviceAndroid> device) {
+ DCHECK(!ContainsKey(devices_by_id_, device->device_id()));
+ DCHECK(!ContainsKey(devices_by_guid_, device->guid()));
+ devices_by_id_[device->device_id()] = device;
+ devices_by_guid_[device->guid()] = device;
+
+ USB_LOG(USER) << "USB device added: id=" << device->device_id()
+ << " vendor=" << device->vendor_id() << " \""
+ << device->manufacturer_string()
+ << "\", product=" << device->product_id() << " \""
+ << device->product_string() << "\", serial=\""
+ << device->serial_number() << "\", guid=" << device->guid();
}
} // namespace device
« no previous file with comments | « device/usb/usb_service_android.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698