Skip to content

Commit 431ac70

Browse files
committed
Fixed(UsbAPI): Use product and vendor ids from termux/termux-api-package@7531d57
1 parent 760c177 commit 431ac70

File tree

1 file changed

+45
-21
lines changed

1 file changed

+45
-21
lines changed

app/src/main/java/com/termux/api/apis/UsbAPI.java

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.concurrent.atomic.AtomicReference;
3030

3131
import androidx.annotation.NonNull;
32+
import androidx.annotation.Nullable;
3233

3334
public 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

Comments
 (0)