summaryrefslogtreecommitdiffstats
path: root/device/usb/usb_device_android.cc
diff options
context:
space:
mode:
Diffstat (limited to 'device/usb/usb_device_android.cc')
-rw-r--r--device/usb/usb_device_android.cc107
1 files changed, 107 insertions, 0 deletions
diff --git a/device/usb/usb_device_android.cc b/device/usb/usb_device_android.cc
new file mode 100644
index 0000000..ee9e93b
--- /dev/null
+++ b/device/usb/usb_device_android.cc
@@ -0,0 +1,107 @@
+// Copyright 2015 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.
+
+#include "device/usb/usb_device_android.h"
+
+#include "base/android/build_info.h"
+#include "base/android/jni_string.h"
+#include "base/bind.h"
+#include "base/location.h"
+#include "base/thread_task_runner_handle.h"
+#include "device/usb/usb_configuration_android.h"
+#include "device/usb/usb_device_handle.h"
+#include "device/usb/usb_interface_android.h"
+#include "jni/ChromeUsbDevice_jni.h"
+
+using base::android::AttachCurrentThread;
+using base::android::ConvertJavaStringToUTF16;
+using base::android::JavaRef;
+using base::android::ScopedJavaLocalRef;
+
+namespace device {
+
+// static
+bool UsbDeviceAndroid::RegisterJNI(JNIEnv* env) {
+ return RegisterNativesImpl(env); // Generated in ChromeUsbDevice_jni.h
+}
+
+// static
+scoped_refptr<UsbDeviceAndroid> UsbDeviceAndroid::Create(
+ JNIEnv* env,
+ const JavaRef<jobject>& usb_device) {
+ ScopedJavaLocalRef<jobject> wrapper =
+ Java_ChromeUsbDevice_create(env, usb_device.obj());
+ uint16_t vendor_id = Java_ChromeUsbDevice_getVendorId(env, wrapper.obj());
+ uint16_t product_id = Java_ChromeUsbDevice_getProductId(env, wrapper.obj());
+ ScopedJavaLocalRef<jstring> manufacturer_string =
+ Java_ChromeUsbDevice_getManufacturerName(env, wrapper.obj());
+ ScopedJavaLocalRef<jstring> product_string =
+ Java_ChromeUsbDevice_getProductName(env, wrapper.obj());
+ ScopedJavaLocalRef<jstring> serial_number =
+ Java_ChromeUsbDevice_getSerialNumber(env, wrapper.obj());
+ return make_scoped_refptr(new UsbDeviceAndroid(
+ env, vendor_id, product_id,
+ ConvertJavaStringToUTF16(env, manufacturer_string),
+ ConvertJavaStringToUTF16(env, product_string),
+ ConvertJavaStringToUTF16(env, serial_number), wrapper));
+}
+
+void UsbDeviceAndroid::Open(const OpenCallback& callback) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+ base::Bind(callback, nullptr));
+}
+
+const UsbConfigDescriptor* UsbDeviceAndroid::GetActiveConfiguration() {
+ return nullptr;
+}
+
+UsbDeviceAndroid::UsbDeviceAndroid(JNIEnv* env,
+ uint16_t vendor_id,
+ uint16_t product_id,
+ const base::string16& manufacturer_string,
+ const base::string16& product_string,
+ const base::string16& serial_number,
+ const JavaRef<jobject>& wrapper)
+ : UsbDevice(vendor_id,
+ product_id,
+ manufacturer_string,
+ product_string,
+ serial_number) {
+ j_object_.Reset(wrapper);
+
+ if (base::android::BuildInfo::GetInstance()->sdk_int() >= 21) {
+ ScopedJavaLocalRef<jobjectArray> configurations =
+ Java_ChromeUsbDevice_getConfigurations(env, j_object_.obj());
+ jsize count = env->GetArrayLength(configurations.obj());
+ configurations_.reserve(count);
+ for (jsize i = 0; i < count; ++i) {
+ ScopedJavaLocalRef<jobject> config(
+ env, env->GetObjectArrayElement(configurations.obj(), i));
+ configurations_.push_back(UsbConfigurationAndroid::Convert(env, config));
+ }
+ } else {
+ // Pre-lollipop only the first configuration was supported. Build a basic
+ // configuration out of the available interfaces.
+ UsbConfigDescriptor config;
+ config.configuration_value = 1; // Reasonable guess.
+ config.self_powered = false; // Arbitrary default.
+ config.remote_wakeup = false; // Arbitrary default.
+ config.maximum_power = 0; // Arbitrary default.
+
+ ScopedJavaLocalRef<jobjectArray> interfaces =
+ Java_ChromeUsbDevice_getInterfaces(env, wrapper.obj());
+ jsize count = env->GetArrayLength(interfaces.obj());
+ config.interfaces.reserve(count);
+ for (jsize i = 0; i < count; ++i) {
+ ScopedJavaLocalRef<jobject> interface(
+ env, env->GetObjectArrayElement(interfaces.obj(), i));
+ config.interfaces.push_back(UsbInterfaceAndroid::Convert(env, interface));
+ }
+ configurations_.push_back(config);
+ }
+}
+
+UsbDeviceAndroid::~UsbDeviceAndroid() {}
+
+} // namespace device