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 383aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);} 393aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * 403aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference"> 413aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3> 423aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about communicating with USB hardware, read the 433aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/usb/index.html">USB</a> developer guide.</p> 443aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div> 452423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 46770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwoodpublic class UsbManager { 47e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private static final String TAG = "UsbManager"; 48e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 492423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 50e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Broadcast Action: A sticky broadcast for USB state change events when in device mode. 51709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood * 52b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * This is a sticky broadcast for clients that includes USB connected/disconnected state, 539182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 549182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <li> {@link #USB_CONNECTED} boolean indicating whether USB is connected or disconnected. 5502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * <li> {@link #USB_CONFIGURED} boolean indicating whether USB is configured. 569eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * currently zero if not configured, one for configured. 579eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_MASS_STORAGE} boolean extra indicating whether the 589eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * mass storage function is enabled 599eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_ADB} boolean extra indicating whether the 609eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * adb function is enabled 619eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_RNDIS} boolean extra indicating whether the 629eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * RNDIS ethernet function is enabled 639eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_MTP} boolean extra indicating whether the 649eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * MTP function is enabled 659eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_PTP} boolean extra indicating whether the 669eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * PTP function is enabled 679eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_PTP} boolean extra indicating whether the 689eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * accessory function is enabled 699d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * <li> {@link #USB_FUNCTION_AUDIO_SOURCE} boolean extra indicating whether the 709d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * audio source function is enabled 719182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 72a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 73a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 74709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood */ 75709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood public static final String ACTION_USB_STATE = 76c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_STATE"; 77709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood 78e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 79e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Broadcast Action: A broadcast for USB device attached event. 80e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 81e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * This intent is sent when a USB device is attached to the USB bus when in host mode. 829182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 83c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * <li> {@link #EXTRA_DEVICE} containing the {@link android.hardware.usb.UsbDevice} 849182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * for the attached device 859182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 86e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 87e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static final String ACTION_USB_DEVICE_ATTACHED = 88c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_DEVICE_ATTACHED"; 89e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 90e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 91e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Broadcast Action: A broadcast for USB device detached event. 92e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 93e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * This intent is sent when a USB device is detached from the USB bus when in host mode. 949182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 95c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * <li> {@link #EXTRA_DEVICE} containing the {@link android.hardware.usb.UsbDevice} 96188d00b07ef0b8968868b3489e80dd9f53d3bafaMike Lockwood * for the detached device 979182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 98e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 99e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static final String ACTION_USB_DEVICE_DETACHED = 100c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_DEVICE_DETACHED"; 101e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 1029182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 1039182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Broadcast Action: A broadcast for USB accessory attached event. 1049182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 1059182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * This intent is sent when a USB accessory is attached. 1069182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 107c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * <li> {@link #EXTRA_ACCESSORY} containing the {@link android.hardware.usb.UsbAccessory} 1089182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * for the attached accessory 1099182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 1109182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 1119182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public static final String ACTION_USB_ACCESSORY_ATTACHED = 112c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_ACCESSORY_ATTACHED"; 1139182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 1149182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 1159182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Broadcast Action: A broadcast for USB accessory detached event. 1169182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 1179182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * This intent is sent when a USB accessory is detached. 1189182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 119980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * <li> {@link #EXTRA_ACCESSORY} containing the {@link UsbAccessory} 1209182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * for the attached accessory that was detached 1219182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 1229182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 1239182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public static final String ACTION_USB_ACCESSORY_DETACHED = 124c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_ACCESSORY_DETACHED"; 1259182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 126709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood /** 127709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood * Boolean extra indicating whether USB is connected or disconnected. 128709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast. 129a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 130a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 131709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood */ 132709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood public static final String USB_CONNECTED = "connected"; 1332423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1342423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 13502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * Boolean extra indicating whether USB is configured. 136b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast. 137a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 138a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 139b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood */ 14002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public static final String USB_CONFIGURED = "configured"; 141b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood 142b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood /** 1432423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Name of the USB mass storage USB function. 144b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 145a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 146a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1472423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1482423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood public static final String USB_FUNCTION_MASS_STORAGE = "mass_storage"; 1492423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1502423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 1512423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Name of the adb USB function. 152b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 153a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 154a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1552423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1562423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood public static final String USB_FUNCTION_ADB = "adb"; 1572423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1582423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 1592423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Name of the RNDIS ethernet USB function. 160b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 161a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 162a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1632423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1642423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood public static final String USB_FUNCTION_RNDIS = "rndis"; 1652423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1662423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 1672423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Name of the MTP USB function. 168b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 169a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 170a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1712423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1722423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood public static final String USB_FUNCTION_MTP = "mtp"; 1732423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1742423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 1759eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * Name of the PTP USB function. 176b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 177a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 178a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1792423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1809eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood public static final String USB_FUNCTION_PTP = "ptp"; 1812423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1822423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 1839d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * Name of the audio source USB function. 1849d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 1859d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * 1869d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * {@hide} 1879d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood */ 1889d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood public static final String USB_FUNCTION_AUDIO_SOURCE = "audio_source"; 1899d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood 1909d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood /** 1919eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * Name of the Accessory USB function. 1929eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 193a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 194a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 1952423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 1969eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood public static final String USB_FUNCTION_ACCESSORY = "accessory"; 19708bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood 198e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 199e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Name of extra for {@link #ACTION_USB_DEVICE_ATTACHED} and 20002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * {@link #ACTION_USB_DEVICE_DETACHED} broadcasts 201e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * containing the UsbDevice object for the device. 202e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 2039182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 204e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static final String EXTRA_DEVICE = "device"; 205e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 2069182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 20702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * Name of extra for {@link #ACTION_USB_ACCESSORY_ATTACHED} and 20802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * {@link #ACTION_USB_ACCESSORY_DETACHED} broadcasts 2099182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * containing the UsbAccessory object for the accessory. 2109182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 2119182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public static final String EXTRA_ACCESSORY = "accessory"; 2129182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 2133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 2143a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Name of extra added to the {@link android.app.PendingIntent} 215980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * passed into {@link #requestPermission(UsbDevice, PendingIntent)} 216980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * or {@link #requestPermission(UsbAccessory, PendingIntent)} 2173a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * containing a boolean value indicating whether the user granted permission or not. 2183a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 2193a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public static final String EXTRA_PERMISSION_GRANTED = "permission"; 2203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 2213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private final Context mContext; 2223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private final IUsbManager mService; 223e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 224e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 225e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * {@hide} 226e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 2273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public UsbManager(Context context, IUsbManager service) { 2283a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mContext = context; 229e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mService = service; 230e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 231e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 232e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 233e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns a HashMap containing all USB devices currently attached. 234e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * USB device name is the key for the returned HashMap. 235e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * The result will be empty if no devices are attached, or if 236e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * USB host mode is inactive or unsupported. 237e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 238e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return HashMap containing all connected USB devices. 239e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 240e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public HashMap<String,UsbDevice> getDeviceList() { 241e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood Bundle bundle = new Bundle(); 242e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood try { 243e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mService.getDeviceList(bundle); 244e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood HashMap<String,UsbDevice> result = new HashMap<String,UsbDevice>(); 245e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood for (String name : bundle.keySet()) { 246e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood result.put(name, (UsbDevice)bundle.get(name)); 247e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 248e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return result; 249e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } catch (RemoteException e) { 250e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood Log.e(TAG, "RemoteException in getDeviceList", e); 251e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return null; 252e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 253e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 254e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 255e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 256e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Opens the device so it can be used to send and receive 257c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * data using {@link android.hardware.usb.UsbRequest}. 258e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 259e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param device the device to open 2601567a4341bf642e17432a079d3de3381c7a93340mike wakerly * @return a {@link UsbDeviceConnection}, or {@code null} if open failed 261e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 262acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public UsbDeviceConnection openDevice(UsbDevice device) { 263e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood try { 264acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood String deviceName = device.getDeviceName(); 265acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood ParcelFileDescriptor pfd = mService.openDevice(deviceName); 266acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (pfd != null) { 267acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood UsbDeviceConnection connection = new UsbDeviceConnection(device); 268acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood boolean result = connection.open(deviceName, pfd); 269acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood pfd.close(); 270acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (result) { 271acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return connection; 272acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 273e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 274e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } catch (Exception e) { 275e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood Log.e(TAG, "exception in UsbManager.openDevice", e); 276e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 277acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return null; 278e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 279e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 2809182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 2819182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Returns a list of currently attached USB accessories. 2829182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * (in the current implementation there can be at most one) 2839182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 2849182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @return list of USB accessories, or null if none are attached. 2859182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 2869182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public UsbAccessory[] getAccessoryList() { 2879182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood try { 2889182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood UsbAccessory accessory = mService.getCurrentAccessory(); 2899182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood if (accessory == null) { 2909182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return null; 2919182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } else { 2929182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return new UsbAccessory[] { accessory }; 2939182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2949182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } catch (RemoteException e) { 2953a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in getAccessoryList", e); 2969182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return null; 2979182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2989182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2999182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 3009182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 3019182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Opens a file descriptor for reading and writing data to the USB accessory. 3029182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 3039182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @param accessory the USB accessory to open 3049182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @return file descriptor, or null if the accessor could not be opened. 3059182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 3069182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public ParcelFileDescriptor openAccessory(UsbAccessory accessory) { 3079182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood try { 30802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood return mService.openAccessory(accessory); 3099182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } catch (RemoteException e) { 3103a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in openAccessory", e); 3119182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return null; 3129182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 3139182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 3149182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 3153a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 3163a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Returns true if the caller has permission to access the device. 317c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Permission might have been granted temporarily via 318980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * {@link #requestPermission(UsbDevice, PendingIntent)} or 319c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * by the user choosing the caller as the default application for the device. 3203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 3213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param device to check permissions for 3223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @return true if caller has permission 3233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 3243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public boolean hasPermission(UsbDevice device) { 3253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 3263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return mService.hasDevicePermission(device); 3273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 3283a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in hasPermission", e); 3293a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return false; 3303a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3313a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3323a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 3333a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 3343a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Returns true if the caller has permission to access the accessory. 335c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Permission might have been granted temporarily via 336980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * {@link #requestPermission(UsbAccessory, PendingIntent)} or 337c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * by the user choosing the caller as the default application for the accessory. 3383a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 3393a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param accessory to check permissions for 3403a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @return true if caller has permission 3413a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 3423a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public boolean hasPermission(UsbAccessory accessory) { 3433a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 3443a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return mService.hasAccessoryPermission(accessory); 3453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 3463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in hasPermission", e); 3473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return false; 3483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 3513a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 352c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Requests temporary permission for the given package to access the device. 3533a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * This may result in a system dialog being displayed to the user 3543a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * if permission had not already been granted. 3553a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Success or failure is returned via the {@link android.app.PendingIntent} pi. 356c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * If successful, this grants the caller permission to access the device only 357c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * until the device is disconnected. 358c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * 3593a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * The following extras will be added to pi: 3603a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <ul> 3613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_DEVICE} containing the device passed into this call 3623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_PERMISSION_GRANTED} containing boolean indicating whether 3633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * permission was granted by the user 3643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * </ul> 3653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 3663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param device to request permissions for 3673a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param pi PendingIntent for returning result 3683a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 3693a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void requestPermission(UsbDevice device, PendingIntent pi) { 3703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 3713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mService.requestDevicePermission(device, mContext.getPackageName(), pi); 3723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 3733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in requestPermission", e); 3743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3753a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 3763a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 3773a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 378c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Requests temporary permission for the given package to access the accessory. 3793a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * This may result in a system dialog being displayed to the user 3803a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * if permission had not already been granted. 3813a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Success or failure is returned via the {@link android.app.PendingIntent} pi. 38262cfeeb821afb2f3d3b78ad93caa13408cd26eacMike Lockwood * If successful, this grants the caller permission to access the accessory only 383c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * until the device is disconnected. 384c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * 3853a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * The following extras will be added to pi: 3863a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <ul> 3873a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_ACCESSORY} containing the accessory passed into this call 3883a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_PERMISSION_GRANTED} containing boolean indicating whether 3893a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * permission was granted by the user 3903a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * </ul> 3913a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 3923a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param accessory to request permissions for 3933a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param pi PendingIntent for returning result 3943a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 3953a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void requestPermission(UsbAccessory accessory, PendingIntent pi) { 3963a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 3973a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mService.requestAccessoryPermission(accessory, mContext.getPackageName(), pi); 3983a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 3993a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "RemoteException in requestPermission", e); 4003a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 4013a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 4023a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 40302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private static boolean propertyContainsFunction(String property, String function) { 40402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood String functions = SystemProperties.get(property, ""); 40502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood int index = functions.indexOf(function); 40602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (index < 0) return false; 40702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (index > 0 && functions.charAt(index - 1) != ',') return false; 40802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood int charAfter = index + function.length(); 40902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (charAfter < functions.length() && functions.charAt(charAfter) != ',') return false; 41002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return true; 41108bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood } 41208bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood 41308bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood /** 41402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * Returns true if the specified USB function is currently enabled. 415e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 416e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param function name of the USB function 41702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * @return true if the USB function is enabled. 418a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 419a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 42008bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood */ 42102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public boolean isFunctionEnabled(String function) { 42202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return propertyContainsFunction("sys.usb.config", function); 42308bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood } 42408bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood 42508bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood /** 426e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * Returns the current default USB function. 427e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * 428e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * @return name of the default function. 429e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * 430e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * {@hide} 431e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood */ 432e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood public String getDefaultFunction() { 433e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood String functions = SystemProperties.get("persist.sys.usb.config", ""); 434e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood int commaIndex = functions.indexOf(','); 435e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood if (commaIndex > 0) { 436e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood return functions.substring(0, commaIndex); 437e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood } else { 438e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood return functions; 439e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood } 440e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood } 441e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood 442e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood /** 443f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood * Sets the current USB function. 444875c24b897919a80a711dc79cf625006f1ff366dMike Lockwood * If function is null, then the current function is set to the default function. 445e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 446875c24b897919a80a711dc79cf625006f1ff366dMike Lockwood * @param function name of the USB function, or null to restore the default function 447875c24b897919a80a711dc79cf625006f1ff366dMike Lockwood * @param makeDefault true if the function should be set as the new default function 448a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 449a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 45008bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood */ 451f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood public void setCurrentFunction(String function, boolean makeDefault) { 45208bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood try { 453f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood mService.setCurrentFunction(function, makeDefault); 45402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } catch (RemoteException e) { 455f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood Log.e(TAG, "RemoteException in setCurrentFunction", e); 45602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 45702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 45802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 45902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood /** 46002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * Sets the file path for USB mass storage backing file. 46102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * 46202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * @param path backing file path 46302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * 46402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * {@hide} 46502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood */ 46602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public void setMassStorageBackingFile(String path) { 46702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood try { 46802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mService.setMassStorageBackingFile(path); 46902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } catch (RemoteException e) { 47002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Log.e(TAG, "RemoteException in setDefaultFunction", e); 4719182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 4729182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 4732423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood} 474