12423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood/* 22423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Copyright (C) 2010 The Android Open Source Project 32423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * 42423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 52423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * you may not use this file except in compliance with the License. 62423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * You may obtain a copy of the License at 72423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * 82423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 92423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * 102423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Unless required by applicable law or agreed to in writing, software 112423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 122423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * See the License for the specific language governing permissions and 142423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * limitations under the License. 152423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 162423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 172423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 18c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodpackage android.hardware.usb; 192423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.app.PendingIntent; 213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.Context; 22e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Bundle; 23e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.ParcelFileDescriptor; 24e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.RemoteException; 2502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwoodimport android.os.SystemProperties; 26e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.util.Log; 27e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 28e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport java.util.HashMap; 2908bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood 302423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood/** 3111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * This class allows you to access the state of USB and communicate with USB devices. 3211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Currently only host mode is supported in the public API. 33e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 34e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * <p>You can obtain an instance of this class by calling 35e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * {@link android.content.Context#getSystemService(java.lang.String) Context.getSystemService()}. 36e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 37e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * {@samplecode 38e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); 39e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * } 402423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 41770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwoodpublic class UsbManager { 42e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private static final String TAG = "UsbManager"; 43e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 442423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 45e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Broadcast Action: A sticky broadcast for USB state change events when in device mode. 46709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood * 47b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * This is a sticky broadcast for clients that includes USB connected/disconnected state, 489182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 499182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <li> {@link #USB_CONNECTED} boolean indicating whether USB is connected or disconnected. 5002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * <li> {@link #USB_CONFIGURED} boolean indicating whether USB is configured. 519eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * currently zero if not configured, one for configured. 529eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_MASS_STORAGE} boolean extra indicating whether the 539eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * mass storage function is enabled 549eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_ADB} boolean extra indicating whether the 559eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * adb function is enabled 569eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_RNDIS} boolean extra indicating whether the 579eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * RNDIS ethernet function is enabled 589eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_MTP} boolean extra indicating whether the 599eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * MTP function is enabled 609eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_PTP} boolean extra indicating whether the 619eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * PTP function is enabled 629eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_PTP} boolean extra indicating whether the 639eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * accessory function is enabled 649182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 65a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 66a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 67709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood */ 68709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood public static final String ACTION_USB_STATE = 69c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_STATE"; 70709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood 71e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 72e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Broadcast Action: A broadcast for USB device attached event. 73e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 74e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * This intent is sent when a USB device is attached to the USB bus when in host mode. 759182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 76c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * <li> {@link #EXTRA_DEVICE} containing the {@link android.hardware.usb.UsbDevice} 779182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * for the attached device 789182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 79e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 80e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static final String ACTION_USB_DEVICE_ATTACHED = 81c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_DEVICE_ATTACHED"; 82e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 83e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 84e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Broadcast Action: A broadcast for USB device detached event. 85e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 86e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * This intent is sent when a USB device is detached from the USB bus when in host mode. 879182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 88c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * <li> {@link #EXTRA_DEVICE} containing the {@link android.hardware.usb.UsbDevice} 89188d00b07ef0b8968868b3489e80dd9f53d3bafaMike Lockwood * for the detached device 909182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 91e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 92e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static final String ACTION_USB_DEVICE_DETACHED = 93c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_DEVICE_DETACHED"; 94e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 959182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 969182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Broadcast Action: A broadcast for USB accessory attached event. 979182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 989182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * This intent is sent when a USB accessory is attached. 999182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 100c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * <li> {@link #EXTRA_ACCESSORY} containing the {@link android.hardware.usb.UsbAccessory} 1019182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * for the attached accessory 1029182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 1039182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 1049182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public static final String ACTION_USB_ACCESSORY_ATTACHED = 105c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_ACCESSORY_ATTACHED"; 1069182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 1079182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 1089182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Broadcast Action: A broadcast for USB accessory detached event. 1099182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 1109182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * This intent is sent when a USB accessory is detached. 1119182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 112980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * <li> {@link #EXTRA_ACCESSORY} containing the {@link UsbAccessory} 1139182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * for the attached accessory that was detached 1149182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 1159182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 1169182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public static final String ACTION_USB_ACCESSORY_DETACHED = 117c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_ACCESSORY_DETACHED"; 1189182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 119709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood /** 120709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood * Boolean extra indicating whether USB is connected or disconnected. 121709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast. 122a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 123a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 124709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood */ 125709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood public static final String USB_CONNECTED = "connected"; 1262423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1272423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 12802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * Boolean extra indicating whether USB is configured. 129b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast. 130a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 131a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 132b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood */ 13302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public static final String USB_CONFIGURED = "configured"; 134b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood 135b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood /** 1362423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Name of the USB mass storage USB function. 137b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 138a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 139a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1402423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1412423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood public static final String USB_FUNCTION_MASS_STORAGE = "mass_storage"; 1422423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1432423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 1442423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Name of the adb USB function. 145b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 146a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 147a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1482423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1492423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood public static final String USB_FUNCTION_ADB = "adb"; 1502423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1512423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 1522423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Name of the RNDIS ethernet USB function. 153b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 154a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 155a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1562423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1572423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood public static final String USB_FUNCTION_RNDIS = "rndis"; 1582423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1592423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 1602423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Name of the MTP USB function. 161b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 162a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 163a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1642423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1652423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood public static final String USB_FUNCTION_MTP = "mtp"; 1662423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1672423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 1689eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * Name of the PTP USB function. 169b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 170a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 171a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1722423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1739eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood public static final String USB_FUNCTION_PTP = "ptp"; 1742423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1752423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 1769eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * Name of the Accessory USB function. 1779eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 178a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 179a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1802423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1819eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood public static final String USB_FUNCTION_ACCESSORY = "accessory"; 18208bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood 183e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 184e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Name of extra for {@link #ACTION_USB_DEVICE_ATTACHED} and 18502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * {@link #ACTION_USB_DEVICE_DETACHED} broadcasts 186e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * containing the UsbDevice object for the device. 187e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 1889182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 189e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static final String EXTRA_DEVICE = "device"; 190e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 1919182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 19202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * Name of extra for {@link #ACTION_USB_ACCESSORY_ATTACHED} and 19302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * {@link #ACTION_USB_ACCESSORY_DETACHED} broadcasts 1949182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * containing the UsbAccessory object for the accessory. 1959182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 1969182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public static final String EXTRA_ACCESSORY = "accessory"; 1979182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 1983a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 1993a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Name of extra added to the {@link android.app.PendingIntent} 200980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * passed into {@link #requestPermission(UsbDevice, PendingIntent)} 201980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * or {@link #requestPermission(UsbAccessory, PendingIntent)} 2023a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * containing a boolean value indicating whether the user granted permission or not. 2033a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 2043a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public static final String EXTRA_PERMISSION_GRANTED = "permission"; 2053a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 2063a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private final Context mContext; 2073a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private final IUsbManager mService; 208e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 209e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 210e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * {@hide} 211e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 2123a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public UsbManager(Context context, IUsbManager service) { 2133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mContext = context; 214e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mService = service; 215e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 216e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 217e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 218e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns a HashMap containing all USB devices currently attached. 219e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * USB device name is the key for the returned HashMap. 220e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * The result will be empty if no devices are attached, or if 221e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * USB host mode is inactive or unsupported. 222e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 223e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return HashMap containing all connected USB devices. 224e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 225e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public HashMap<String,UsbDevice> getDeviceList() { 226e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood Bundle bundle = new Bundle(); 227e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood try { 228e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mService.getDeviceList(bundle); 229e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood HashMap<String,UsbDevice> result = new HashMap<String,UsbDevice>(); 230e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood for (String name : bundle.keySet()) { 231e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood result.put(name, (UsbDevice)bundle.get(name)); 232e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 233e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return result; 234e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } catch (RemoteException e) { 235e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood Log.e(TAG, "RemoteException in getDeviceList", e); 236e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return null; 237e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 238e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 239e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 240e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 241e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Opens the device so it can be used to send and receive 242c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * data using {@link android.hardware.usb.UsbRequest}. 243e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 244e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param device the device to open 245e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return true if we successfully opened the device 246e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 247acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public UsbDeviceConnection openDevice(UsbDevice device) { 248e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood try { 249acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood String deviceName = device.getDeviceName(); 250acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood ParcelFileDescriptor pfd = mService.openDevice(deviceName); 251acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (pfd != null) { 252acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood UsbDeviceConnection connection = new UsbDeviceConnection(device); 253acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood boolean result = connection.open(deviceName, pfd); 254acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood pfd.close(); 255acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (result) { 256acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return connection; 257acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 258e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 259e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } catch (Exception e) { 260e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood Log.e(TAG, "exception in UsbManager.openDevice", e); 261e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 262acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return null; 263e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 264e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 2659182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 2669182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Returns a list of currently attached USB accessories. 2679182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * (in the current implementation there can be at most one) 2689182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 2699182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @return list of USB accessories, or null if none are attached. 2709182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 2719182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public UsbAccessory[] getAccessoryList() { 2729182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood try { 2739182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood UsbAccessory accessory = mService.getCurrentAccessory(); 2749182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood if (accessory == null) { 2759182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return null; 2769182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } else { 2779182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return new UsbAccessory[] { accessory }; 2789182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2799182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } catch (RemoteException e) { 2803a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in getAccessoryList", e); 2819182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return null; 2829182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2839182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2849182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 2859182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 2869182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Opens a file descriptor for reading and writing data to the USB accessory. 2879182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 2889182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @param accessory the USB accessory to open 2899182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @return file descriptor, or null if the accessor could not be opened. 2909182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 2919182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public ParcelFileDescriptor openAccessory(UsbAccessory accessory) { 2929182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood try { 29302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood return mService.openAccessory(accessory); 2949182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } catch (RemoteException e) { 2953a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in openAccessory", e); 2969182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return null; 2979182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2989182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2999182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 3003a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 3013a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Returns true if the caller has permission to access the device. 302c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Permission might have been granted temporarily via 303980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * {@link #requestPermission(UsbDevice, PendingIntent)} or 304c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * by the user choosing the caller as the default application for the device. 3053a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 3063a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param device to check permissions for 3073a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @return true if caller has permission 3083a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 3093a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public boolean hasPermission(UsbDevice device) { 3103a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 3113a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return mService.hasDevicePermission(device); 3123a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 3133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in hasPermission", e); 3143a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return false; 3153a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3163a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3173a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 3183a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 3193a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Returns true if the caller has permission to access the accessory. 320c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Permission might have been granted temporarily via 321980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * {@link #requestPermission(UsbAccessory, PendingIntent)} or 322c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * by the user choosing the caller as the default application for the accessory. 3233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 3243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param accessory to check permissions for 3253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @return true if caller has permission 3263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 3273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public boolean hasPermission(UsbAccessory accessory) { 3283a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 3293a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return mService.hasAccessoryPermission(accessory); 3303a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 3313a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in hasPermission", e); 3323a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return false; 3333a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3343a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3353a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 3363a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 337c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Requests temporary permission for the given package to access the device. 3383a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * This may result in a system dialog being displayed to the user 3393a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * if permission had not already been granted. 3403a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Success or failure is returned via the {@link android.app.PendingIntent} pi. 341c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * If successful, this grants the caller permission to access the device only 342c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * until the device is disconnected. 343c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * 3443a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * The following extras will be added to pi: 3453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <ul> 3463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_DEVICE} containing the device passed into this call 3473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_PERMISSION_GRANTED} containing boolean indicating whether 3483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * permission was granted by the user 3493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * </ul> 3503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 3513a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param device to request permissions for 3523a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param pi PendingIntent for returning result 3533a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 3543a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void requestPermission(UsbDevice device, PendingIntent pi) { 3553a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 3563a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mService.requestDevicePermission(device, mContext.getPackageName(), pi); 3573a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 3583a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in requestPermission", e); 3593a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3603a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 3623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 363c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Requests temporary permission for the given package to access the accessory. 3643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * This may result in a system dialog being displayed to the user 3653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * if permission had not already been granted. 3663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Success or failure is returned via the {@link android.app.PendingIntent} pi. 36762cfeeb821afb2f3d3b78ad93caa13408cd26eacMike Lockwood * If successful, this grants the caller permission to access the accessory only 368c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * until the device is disconnected. 369c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * 3703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * The following extras will be added to pi: 3713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <ul> 3723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_ACCESSORY} containing the accessory passed into this call 3733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_PERMISSION_GRANTED} containing boolean indicating whether 3743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * permission was granted by the user 3753a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * </ul> 3763a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 3773a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param accessory to request permissions for 3783a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param pi PendingIntent for returning result 3793a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 3803a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void requestPermission(UsbAccessory accessory, PendingIntent pi) { 3813a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 3823a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mService.requestAccessoryPermission(accessory, mContext.getPackageName(), pi); 3833a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 3843a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in requestPermission", e); 3853a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3863a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3873a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 38802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private static boolean propertyContainsFunction(String property, String function) { 38902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood String functions = SystemProperties.get(property, ""); 39002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood int index = functions.indexOf(function); 39102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (index < 0) return false; 39202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (index > 0 && functions.charAt(index - 1) != ',') return false; 39302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood int charAfter = index + function.length(); 39402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (charAfter < functions.length() && functions.charAt(charAfter) != ',') return false; 39502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return true; 39608bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood } 39708bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood 39808bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood /** 39902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * Returns true if the specified USB function is currently enabled. 400e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 401e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param function name of the USB function 40202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * @return true if the USB function is enabled. 403a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 404a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 40508bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood */ 40602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public boolean isFunctionEnabled(String function) { 40702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return propertyContainsFunction("sys.usb.config", function); 40808bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood } 40908bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood 41008bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood /** 411e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * Returns the current default USB function. 412e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * 413e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * @return name of the default function. 414e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * 415e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * {@hide} 416e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood */ 417e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood public String getDefaultFunction() { 418e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood String functions = SystemProperties.get("persist.sys.usb.config", ""); 419e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood int commaIndex = functions.indexOf(','); 420e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood if (commaIndex > 0) { 421e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood return functions.substring(0, commaIndex); 422e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood } else { 423e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood return functions; 424e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood } 425e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood } 426e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood 427e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood /** 428f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood * Sets the current USB function. 429875c24b897919a80a711dc79cf625006f1ff366dMike Lockwood * If function is null, then the current function is set to the default function. 430e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 431875c24b897919a80a711dc79cf625006f1ff366dMike Lockwood * @param function name of the USB function, or null to restore the default function 432875c24b897919a80a711dc79cf625006f1ff366dMike Lockwood * @param makeDefault true if the function should be set as the new default function 433a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 434a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 43508bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood */ 436f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood public void setCurrentFunction(String function, boolean makeDefault) { 43708bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood try { 438f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood mService.setCurrentFunction(function, makeDefault); 43902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } catch (RemoteException e) { 440f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood Log.e(TAG, "RemoteException in setCurrentFunction", e); 44102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 44202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 44302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 44402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood /** 44502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * Sets the file path for USB mass storage backing file. 44602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * 44702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * @param path backing file path 44802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * 44902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * {@hide} 45002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood */ 45102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public void setMassStorageBackingFile(String path) { 45202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood try { 45302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mService.setMassStorageBackingFile(path); 45402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } catch (RemoteException e) { 45502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Log.e(TAG, "RemoteException in setDefaultFunction", e); 4569182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 4579182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 4582423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood} 459