2929import java .util .concurrent .atomic .AtomicReference ;
3030
3131import androidx .annotation .NonNull ;
32+ import androidx .annotation .Nullable ;
3233
3334public class UsbAPI {
3435
@@ -138,19 +139,22 @@ protected void listDevices(JsonWriter out) throws IOException {
138139 protected void runPermissionAction (Intent intent ) {
139140 mThreadPoolExecutor .submit (() -> {
140141 String deviceName = intent .getStringExtra ("device" );
142+ String vendorId = intent .getStringExtra ("vendorId" );
143+ String productId = intent .getStringExtra ("productId" );
144+ String device = (deviceName != null ) ? deviceName : vendorId + ":" + productId ;
141145
142- Logger .logVerbose (LOG_TAG ,"Running 'permission' action for device \" " + deviceName + "\" " );
146+ Logger .logVerbose (LOG_TAG ,"Running 'permission' action for device \" " + device + "\" " );
143147
144- UsbDevice device = getDevice (intent , deviceName );
145- if (device == null ) return ;
148+ UsbDevice usbDevice = getDevice (intent , deviceName , vendorId , productId );
149+ if (usbDevice == null ) return ;
146150
147- int status = checkAndRequestUsbDevicePermission (intent , device );
151+ int status = checkAndRequestUsbDevicePermission (intent , usbDevice );
148152 ResultReturner .returnData (this , intent , out -> {
149153 if (status == 0 ) {
150- Logger .logVerbose (LOG_TAG , "Permission granted for device \" " + device .getDeviceName () + "\" " );
154+ Logger .logVerbose (LOG_TAG , "Permission granted for device \" " + usbDevice .getDeviceName () + "\" " );
151155 out .append ("Permission granted.\n " );
152156 } else if (status == 1 ) {
153- Logger .logVerbose (LOG_TAG , "Permission denied for device \" " + device .getDeviceName () + "\" " );
157+ Logger .logVerbose (LOG_TAG , "Permission denied for device \" " + usbDevice .getDeviceName () + "\" " );
154158 out .append ("Permission denied.\n " );
155159 } else if (status == -1 ) {
156160 out .append ("Permission request timeout.\n " );
@@ -164,27 +168,30 @@ protected void runPermissionAction(Intent intent) {
164168 protected void runOpenAction (Intent intent ) {
165169 mThreadPoolExecutor .submit (() -> {
166170 String deviceName = intent .getStringExtra ("device" );
171+ String vendorId = intent .getStringExtra ("vendorId" );
172+ String productId = intent .getStringExtra ("productId" );
173+ String device = (deviceName != null ) ? deviceName : vendorId + ":" + productId ;
167174
168- Logger .logVerbose (LOG_TAG ,"Running 'open' action for device \" " + deviceName + "\" " );
175+ Logger .logVerbose (LOG_TAG ,"Running 'open' action for device \" " + device + "\" " );
169176
170- UsbDevice device = getDevice (intent , deviceName );
171- if (device == null ) return ;
177+ UsbDevice usbDevice = getDevice (intent , deviceName , vendorId , productId );
178+ if (usbDevice == null ) return ;
172179
173- int status = checkAndRequestUsbDevicePermission (intent , device );
180+ int status = checkAndRequestUsbDevicePermission (intent , usbDevice );
174181 ResultReturner .returnData (this , intent , new ResultReturner .WithAncillaryFd () {
175182 @ Override
176183 public void writeResult (PrintWriter out ) {
177184 if (status == 0 ) {
178- int fd = open (device );
185+ int fd = open (usbDevice );
179186 if (fd < 0 ) {
180- Logger .logVerbose (LOG_TAG , "Failed to open device \" " + device .getDeviceName () + "\" : " + fd );
187+ Logger .logVerbose (LOG_TAG , "Failed to open device \" " + usbDevice .getDeviceName () + "\" : " + fd );
181188 out .append ("Open device failed.\n " );
182189 } else {
183- Logger .logVerbose (LOG_TAG , "Open device \" " + device .getDeviceName () + "\" successful" );
190+ Logger .logVerbose (LOG_TAG , "Open device \" " + usbDevice .getDeviceName () + "\" successful" );
184191 this .sendFd (out , fd );
185192 }
186193 } else if (status == 1 ) {
187- Logger .logVerbose (LOG_TAG , "Permission denied to open device \" " + device .getDeviceName () + "\" " );
194+ Logger .logVerbose (LOG_TAG , "Permission denied to open device \" " + usbDevice .getDeviceName () + "\" " );
188195 out .append ("Permission denied.\n " );
189196 } else if (status == -1 ) {
190197 out .append ("Permission request timeout.\n " );
@@ -212,17 +219,34 @@ protected int open(@NonNull UsbDevice device) {
212219
213220
214221
215- protected UsbDevice getDevice (Intent intent , String deviceName ) {
222+ protected UsbDevice getDevice (Intent intent , @ Nullable String deviceName , @ Nullable String vendorId , @ Nullable String productId ) {
216223 UsbManager usbManager = (UsbManager ) getSystemService (Context .USB_SERVICE );
217224
218- HashMap <String , UsbDevice > deviceList = usbManager .getDeviceList ();
219- UsbDevice device = deviceList .get (deviceName );
220- if (device == null ) {
221- Logger .logVerbose (LOG_TAG , "Failed to find device \" " + deviceName + "\" " );
222- ResultReturner .returnData (this , intent , out -> out .append ("No such device.\n " ));
225+ if (deviceName != null ) {
226+ HashMap <String , UsbDevice > deviceList = usbManager .getDeviceList ();
227+ UsbDevice usbDevice = deviceList .get (deviceName );
228+ if (usbDevice != null ) return usbDevice ;
223229 }
224230
225- return device ;
231+ if (vendorId != null && productId != null ){
232+ // UsbDevice returns int, not hex, correct for that.
233+ int iVendorId = Integer .parseInt (vendorId , 16 );
234+ int iProductId = Integer .parseInt (productId , 16 );
235+ for (UsbDevice usbDevice : usbManager .getDeviceList ().values ()) {
236+ if (usbDevice .getVendorId () == iVendorId && usbDevice .getProductId () == iProductId ) {
237+ if (deviceName != null && !(deviceName .equals (usbDevice .getDeviceName ()))){
238+ Logger .logVerbose (LOG_TAG , "Device \" " +deviceName +"\" mismatch with " +vendorId +":" +productId );
239+ ResultReturner .returnData (this , intent , out -> out .append ("No such device.\n " ));
240+ return null ;
241+ }
242+ return usbDevice ;
243+ }
244+ }
245+ }
246+
247+ Logger .logVerbose (LOG_TAG , "No intent extras were passed for device name or vendor and product id." );
248+ ResultReturner .returnData (this , intent , out -> out .append ("No such device.\n " ));
249+ return null ;
226250 }
227251
228252
0 commit comments