1 package org.robolectric.shadows; 2 3 import android.hardware.usb.UsbAccessory; 4 import android.hardware.usb.UsbDevice; 5 import android.hardware.usb.UsbManager; 6 import android.os.ParcelFileDescriptor; 7 import com.google.common.base.Preconditions; 8 import java.io.File; 9 import java.io.FileNotFoundException; 10 import java.util.HashMap; 11 import org.robolectric.RuntimeEnvironment; 12 import org.robolectric.annotation.Implementation; 13 import org.robolectric.annotation.Implements; 14 15 /** Robolectric implementation of {@link android.hardware.usb.UsbManager}. */ 16 @Implements(value = UsbManager.class) 17 public class ShadowUsbManager { 18 private HashMap<UsbDevice, Boolean> usbDevicesPermissionMap = new HashMap<>(); 19 20 /** Returns true if the caller has permission to access the device. */ 21 @Implementation 22 public boolean hasPermission(UsbDevice device) { 23 return usbDevicesPermissionMap.containsKey(device) 24 ? usbDevicesPermissionMap.get(device) 25 : false; 26 } 27 28 /** 29 * Returns a HashMap containing all USB devices currently attached. USB device name is the key for 30 * the returned HashMap. The result will be empty if no devices are attached, or if USB host mode 31 * is inactive or unsupported. 32 */ 33 @Implementation 34 public HashMap<String, UsbDevice> getDeviceList() { 35 HashMap<String, UsbDevice> usbDeviceMap = new HashMap<>(); 36 for (UsbDevice usbDevice : usbDevicesPermissionMap.keySet()) { 37 usbDeviceMap.put(usbDevice.getDeviceName(), usbDevice); 38 } 39 return usbDeviceMap; 40 } 41 42 /** Clears all the data of {@link ShadowUsbManager}. */ 43 public void reset() { 44 usbDevicesPermissionMap.clear(); 45 } 46 47 /** 48 * Adds a USB device into available USB devices map with permission value. If the USB device 49 * already exists, updates the USB device with new permission value. 50 */ 51 public void addOrUpdateUsbDevice(UsbDevice usbDevice, boolean hasPermission) { 52 Preconditions.checkNotNull(usbDevice); 53 Preconditions.checkNotNull(usbDevice.getDeviceName()); 54 usbDevicesPermissionMap.put(usbDevice, hasPermission); 55 } 56 57 /** Removes a USB device from available USB devices map. */ 58 public void removeUsbDevice(UsbDevice usbDevice) { 59 Preconditions.checkNotNull(usbDevice); 60 usbDevicesPermissionMap.remove(usbDevice); 61 } 62 63 /** 64 * Opens a file descriptor from a temporary file. 65 */ 66 @Implementation 67 public ParcelFileDescriptor openAccessory(UsbAccessory accessory) { 68 try { 69 File tmpUsbDir = 70 RuntimeEnvironment.getTempDirectory().createIfNotExists("usb-accessory").toFile(); 71 return ParcelFileDescriptor.open( 72 new File(tmpUsbDir, "usb-accessory-file"), ParcelFileDescriptor.MODE_READ_WRITE); 73 } catch (FileNotFoundException error) { 74 throw new RuntimeException("Error shadowing openAccessory", error); 75 } 76 } 77 } 78