Home | History | Annotate | Download | only in shadows
      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