OLD | NEW |
| (Empty) |
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 | |
5 #include "device/usb/usb_device_android.h" | |
6 | |
7 #include "base/android/build_info.h" | |
8 #include "base/android/jni_string.h" | |
9 #include "base/bind.h" | |
10 #include "base/location.h" | |
11 #include "base/thread_task_runner_handle.h" | |
12 #include "device/usb/usb_configuration_android.h" | |
13 #include "device/usb/usb_device_handle.h" | |
14 #include "device/usb/usb_interface_android.h" | |
15 #include "jni/ChromeUsbDevice_jni.h" | |
16 | |
17 using base::android::AttachCurrentThread; | |
18 using base::android::ConvertJavaStringToUTF16; | |
19 using base::android::JavaRef; | |
20 using base::android::ScopedJavaLocalRef; | |
21 | |
22 namespace device { | |
23 | |
24 // static | |
25 bool UsbDeviceAndroid::RegisterJNI(JNIEnv* env) { | |
26 return RegisterNativesImpl(env); // Generated in ChromeUsbDevice_jni.h | |
27 } | |
28 | |
29 // static | |
30 scoped_refptr<UsbDeviceAndroid> UsbDeviceAndroid::Create( | |
31 JNIEnv* env, | |
32 const JavaRef<jobject>& usb_device) { | |
33 ScopedJavaLocalRef<jobject> wrapper = | |
34 Java_ChromeUsbDevice_create(env, usb_device.obj()); | |
35 uint16_t vendor_id = Java_ChromeUsbDevice_getVendorId(env, wrapper.obj()); | |
36 uint16_t product_id = Java_ChromeUsbDevice_getProductId(env, wrapper.obj()); | |
37 ScopedJavaLocalRef<jstring> manufacturer_string = | |
38 Java_ChromeUsbDevice_getManufacturerName(env, wrapper.obj()); | |
39 ScopedJavaLocalRef<jstring> product_string = | |
40 Java_ChromeUsbDevice_getProductName(env, wrapper.obj()); | |
41 ScopedJavaLocalRef<jstring> serial_number = | |
42 Java_ChromeUsbDevice_getSerialNumber(env, wrapper.obj()); | |
43 return make_scoped_refptr(new UsbDeviceAndroid( | |
44 env, vendor_id, product_id, | |
45 ConvertJavaStringToUTF16(env, manufacturer_string), | |
46 ConvertJavaStringToUTF16(env, product_string), | |
47 ConvertJavaStringToUTF16(env, serial_number), wrapper)); | |
48 } | |
49 | |
50 void UsbDeviceAndroid::Open(const OpenCallback& callback) { | |
51 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | |
52 base::Bind(callback, nullptr)); | |
53 } | |
54 | |
55 const UsbConfigDescriptor* UsbDeviceAndroid::GetActiveConfiguration() { | |
56 return nullptr; | |
57 } | |
58 | |
59 UsbDeviceAndroid::UsbDeviceAndroid(JNIEnv* env, | |
60 uint16_t vendor_id, | |
61 uint16_t product_id, | |
62 const base::string16& manufacturer_string, | |
63 const base::string16& product_string, | |
64 const base::string16& serial_number, | |
65 const JavaRef<jobject>& wrapper) | |
66 : UsbDevice(vendor_id, | |
67 product_id, | |
68 manufacturer_string, | |
69 product_string, | |
70 serial_number) { | |
71 j_object_.Reset(wrapper); | |
72 | |
73 if (base::android::BuildInfo::GetInstance()->sdk_int() >= 21) { | |
74 ScopedJavaLocalRef<jobjectArray> configurations = | |
75 Java_ChromeUsbDevice_getConfigurations(env, j_object_.obj()); | |
76 jsize count = env->GetArrayLength(configurations.obj()); | |
77 configurations_.reserve(count); | |
78 for (jsize i = 0; i < count; ++i) { | |
79 ScopedJavaLocalRef<jobject> config( | |
80 env, env->GetObjectArrayElement(configurations.obj(), i)); | |
81 configurations_.push_back(UsbConfigurationAndroid::Convert(env, config)); | |
82 } | |
83 } else { | |
84 // Pre-lollipop only the first configuration was supported. Build a basic | |
85 // configuration out of the available interfaces. | |
86 UsbConfigDescriptor config; | |
87 config.configuration_value = 1; // Reasonable guess. | |
88 config.self_powered = false; // Arbitrary default. | |
89 config.remote_wakeup = false; // Arbitrary default. | |
90 config.maximum_power = 0; // Arbitrary default. | |
91 | |
92 ScopedJavaLocalRef<jobjectArray> interfaces = | |
93 Java_ChromeUsbDevice_getInterfaces(env, wrapper.obj()); | |
94 jsize count = env->GetArrayLength(interfaces.obj()); | |
95 config.interfaces.reserve(count); | |
96 for (jsize i = 0; i < count; ++i) { | |
97 ScopedJavaLocalRef<jobject> interface( | |
98 env, env->GetObjectArrayElement(interfaces.obj(), i)); | |
99 config.interfaces.push_back(UsbInterfaceAndroid::Convert(env, interface)); | |
100 } | |
101 configurations_.push_back(config); | |
102 } | |
103 } | |
104 | |
105 UsbDeviceAndroid::~UsbDeviceAndroid() {} | |
106 | |
107 } // namespace device | |
OLD | NEW |