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 20badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Parkimport android.annotation.Nullable; 210f3f60b576aedc78524d50da3dadada2201e63c2Jeff Sharkeyimport android.annotation.SdkConstant; 22d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport android.annotation.SystemService; 230f3f60b576aedc78524d50da3dadada2201e63c2Jeff Sharkeyimport android.annotation.SdkConstant.SdkConstantType; 243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.app.PendingIntent; 25badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Parkimport android.content.ComponentName; 263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.Context; 27244259a063c77029326a4150a9dec232ea80bad4Johan T. Halsethimport android.content.pm.PackageManager.NameNotFoundException; 28e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Bundle; 29e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.ParcelFileDescriptor; 304751880a4d770e8916320b5908b58f389d6552deDaichi Hironoimport android.os.Process; 31e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.RemoteException; 32e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.util.Log; 33e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 340f3f60b576aedc78524d50da3dadada2201e63c2Jeff Sharkeyimport com.android.internal.util.Preconditions; 350f3f60b576aedc78524d50da3dadada2201e63c2Jeff Sharkey 36e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport java.util.HashMap; 3708bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood 382423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood/** 3911dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * This class allows you to access the state of USB and communicate with USB devices. 4011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Currently only host mode is supported in the public API. 41e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 423aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference"> 433aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3> 443aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about communicating with USB hardware, read the 458b739903a929f50f9378da675bcdd37cc12bfe52Mark Lu * <a href="{@docRoot}guide/topics/connectivity/usb/index.html">USB developer guide</a>.</p> 463aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div> 472423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 48d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey@SystemService(Context.USB_SERVICE) 49770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwoodpublic class UsbManager { 50e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private static final String TAG = "UsbManager"; 51e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 522423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 53e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Broadcast Action: A sticky broadcast for USB state change events when in device mode. 54709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood * 55b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * This is a sticky broadcast for clients that includes USB connected/disconnected state, 569182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 579182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <li> {@link #USB_CONNECTED} boolean indicating whether USB is connected or disconnected. 58618fa6ffc154fd131697b6107b431b4557ec118cDaichi Hirono * <li> {@link #USB_HOST_CONNECTED} boolean indicating whether USB is connected or 59618fa6ffc154fd131697b6107b431b4557ec118cDaichi Hirono * disconnected as host. 6002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * <li> {@link #USB_CONFIGURED} boolean indicating whether USB is configured. 619eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * currently zero if not configured, one for configured. 629eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_ADB} boolean extra indicating whether the 639eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * adb function is enabled 649eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_RNDIS} boolean extra indicating whether the 659eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * RNDIS ethernet function is enabled 669eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_MTP} boolean extra indicating whether the 679eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * MTP function is enabled 689eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_PTP} boolean extra indicating whether the 699eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * PTP function is enabled 709eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * <li> {@link #USB_FUNCTION_PTP} boolean extra indicating whether the 719eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * accessory function is enabled 729d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * <li> {@link #USB_FUNCTION_AUDIO_SOURCE} boolean extra indicating whether the 739d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * audio source function is enabled 742a57bc7fd602853dc1a22dcee1ff50f92cc29060Mike Lockwood * <li> {@link #USB_FUNCTION_MIDI} boolean extra indicating whether the 752a57bc7fd602853dc1a22dcee1ff50f92cc29060Mike Lockwood * MIDI function is enabled 769182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 7748b9a7c70acff8f1469e487d08bbcb7e6a47ad8aYasuhiro Matsuda * If the sticky intent has not been found, that indicates USB is disconnected, 7848b9a7c70acff8f1469e487d08bbcb7e6a47ad8aYasuhiro Matsuda * USB is not configued, MTP function is enabled, and all the other functions are disabled. 79a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 80a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 81709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood */ 82709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood public static final String ACTION_USB_STATE = 83c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_STATE"; 84709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood 8576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown /** 8676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Broadcast Action: A broadcast for USB port changes. 8776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * 8876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * This intent is sent when a USB port is added, removed, or changes state. 8976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * <ul> 9076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * <li> {@link #EXTRA_PORT} containing the {@link android.hardware.usb.UsbPort} 9176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * for the port. 9276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * <li> {@link #EXTRA_PORT_STATUS} containing the {@link android.hardware.usb.UsbPortStatus} 9376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * for the port, or null if the port has been removed 9476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * </ul> 9576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * 9676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @hide 9776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown */ 9876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown public static final String ACTION_USB_PORT_CHANGED = 9976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown "android.hardware.usb.action.USB_PORT_CHANGED"; 10076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown 101e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 102e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Broadcast Action: A broadcast for USB device attached event. 103e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 104e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * This intent is sent when a USB device is attached to the USB bus when in host mode. 1059182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 106c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * <li> {@link #EXTRA_DEVICE} containing the {@link android.hardware.usb.UsbDevice} 1079182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * for the attached device 1089182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 109e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 1100f3f60b576aedc78524d50da3dadada2201e63c2Jeff Sharkey @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 111e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static final String ACTION_USB_DEVICE_ATTACHED = 112c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_DEVICE_ATTACHED"; 113e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 114e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 115e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Broadcast Action: A broadcast for USB device detached event. 116e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 117e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * This intent is sent when a USB device is detached from the USB bus when in host mode. 1189182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 119c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * <li> {@link #EXTRA_DEVICE} containing the {@link android.hardware.usb.UsbDevice} 120188d00b07ef0b8968868b3489e80dd9f53d3bafaMike Lockwood * for the detached device 1219182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 122e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 1230f3f60b576aedc78524d50da3dadada2201e63c2Jeff Sharkey @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 124e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static final String ACTION_USB_DEVICE_DETACHED = 125c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_DEVICE_DETACHED"; 126e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 1279182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 1289182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Broadcast Action: A broadcast for USB accessory attached event. 1299182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 1309182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * This intent is sent when a USB accessory is attached. 1319182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 132c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * <li> {@link #EXTRA_ACCESSORY} containing the {@link android.hardware.usb.UsbAccessory} 1339182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * for the attached accessory 1349182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 1359182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 1360f3f60b576aedc78524d50da3dadada2201e63c2Jeff Sharkey @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1379182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public static final String ACTION_USB_ACCESSORY_ATTACHED = 138c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_ACCESSORY_ATTACHED"; 1399182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 1409182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 1419182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Broadcast Action: A broadcast for USB accessory detached event. 1429182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 1439182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * This intent is sent when a USB accessory is detached. 1449182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * <ul> 145980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * <li> {@link #EXTRA_ACCESSORY} containing the {@link UsbAccessory} 1469182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * for the attached accessory that was detached 1479182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * </ul> 1489182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 1490f3f60b576aedc78524d50da3dadada2201e63c2Jeff Sharkey @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1509182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public static final String ACTION_USB_ACCESSORY_DETACHED = 151c4308f01c965571dc2354107c3574df113e397eeMike Lockwood "android.hardware.usb.action.USB_ACCESSORY_DETACHED"; 1529182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 153709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood /** 154709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood * Boolean extra indicating whether USB is connected or disconnected. 155709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast. 156a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 157a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 158709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood */ 159709981eeedc5c6d640fbb3ecc1ebdcd39d748802Mike Lockwood public static final String USB_CONNECTED = "connected"; 1602423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1612423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 162618fa6ffc154fd131697b6107b431b4557ec118cDaichi Hirono * Boolean extra indicating whether USB is connected or disconnected as host. 163618fa6ffc154fd131697b6107b431b4557ec118cDaichi Hirono * Used in extras for the {@link #ACTION_USB_STATE} broadcast. 164618fa6ffc154fd131697b6107b431b4557ec118cDaichi Hirono * 165618fa6ffc154fd131697b6107b431b4557ec118cDaichi Hirono * {@hide} 166618fa6ffc154fd131697b6107b431b4557ec118cDaichi Hirono */ 167618fa6ffc154fd131697b6107b431b4557ec118cDaichi Hirono public static final String USB_HOST_CONNECTED = "host_connected"; 168618fa6ffc154fd131697b6107b431b4557ec118cDaichi Hirono 169618fa6ffc154fd131697b6107b431b4557ec118cDaichi Hirono /** 17002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood * Boolean extra indicating whether USB is configured. 171b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast. 172a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 173a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 174b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood */ 17502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public static final String USB_CONFIGURED = "configured"; 176b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood 177b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood /** 178674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich * Boolean extra indicating whether confidential user data, such as photos, should be 179674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich * made available on the USB connection. This variable will only be set when the user 180674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich * has explicitly asked for this data to be unlocked. 181674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich * Used in extras for the {@link #ACTION_USB_STATE} broadcast. 182674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich * 183674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich * {@hide} 184674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich */ 185674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich public static final String USB_DATA_UNLOCKED = "unlocked"; 186674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich 187674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich /** 188bb598ee16f4b61978c88358e8f96153395cdb7adJerry Zhang * Boolean extra indicating whether the intent represents a change in the usb 189bb598ee16f4b61978c88358e8f96153395cdb7adJerry Zhang * configuration (as opposed to a state update). 190bb598ee16f4b61978c88358e8f96153395cdb7adJerry Zhang * 191bb598ee16f4b61978c88358e8f96153395cdb7adJerry Zhang * {@hide} 192bb598ee16f4b61978c88358e8f96153395cdb7adJerry Zhang */ 193bb598ee16f4b61978c88358e8f96153395cdb7adJerry Zhang public static final String USB_CONFIG_CHANGED = "config_changed"; 194bb598ee16f4b61978c88358e8f96153395cdb7adJerry Zhang 195bb598ee16f4b61978c88358e8f96153395cdb7adJerry Zhang /** 196460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * A placeholder indicating that no USB function is being specified. 197460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * Used to distinguish between selecting no function vs. the default function in 198460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * {@link #setCurrentFunction(String)}. 199a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 200a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 2012423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 202460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown public static final String USB_FUNCTION_NONE = "none"; 2032423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 2042423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 2052423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Name of the adb USB function. 206b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 207a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 208a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 2092423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 2102423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood public static final String USB_FUNCTION_ADB = "adb"; 2112423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 2122423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 2132423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Name of the RNDIS ethernet USB function. 214b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 215a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 216a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 2172423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 2182423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood public static final String USB_FUNCTION_RNDIS = "rndis"; 2192423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 2202423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 2212423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Name of the MTP USB function. 222b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 223a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 224a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 2252423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 2262423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood public static final String USB_FUNCTION_MTP = "mtp"; 2272423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 2282423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 2299eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * Name of the PTP USB function. 230b92df0f66926252cf60cdda7812bb1d50ce9378eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 231a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 232a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 2332423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 2349eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood public static final String USB_FUNCTION_PTP = "ptp"; 2352423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 2362423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood /** 2379d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * Name of the audio source USB function. 2389d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 2399d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * 2409d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood * {@hide} 2419d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood */ 2429d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood public static final String USB_FUNCTION_AUDIO_SOURCE = "audio_source"; 2439d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood 2449d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood /** 2452a57bc7fd602853dc1a22dcee1ff50f92cc29060Mike Lockwood * Name of the MIDI USB function. 2462a57bc7fd602853dc1a22dcee1ff50f92cc29060Mike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 2472a57bc7fd602853dc1a22dcee1ff50f92cc29060Mike Lockwood * 2482a57bc7fd602853dc1a22dcee1ff50f92cc29060Mike Lockwood * {@hide} 2492a57bc7fd602853dc1a22dcee1ff50f92cc29060Mike Lockwood */ 2502a57bc7fd602853dc1a22dcee1ff50f92cc29060Mike Lockwood public static final String USB_FUNCTION_MIDI = "midi"; 2512a57bc7fd602853dc1a22dcee1ff50f92cc29060Mike Lockwood 2522a57bc7fd602853dc1a22dcee1ff50f92cc29060Mike Lockwood /** 2539eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * Name of the Accessory USB function. 2549eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood * Used in extras for the {@link #ACTION_USB_STATE} broadcast 255a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 256a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 2572423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 2589eb014aeb0630dab9210f8eb8b6c2f4250d5990eMike Lockwood public static final String USB_FUNCTION_ACCESSORY = "accessory"; 25908bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood 260e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 26176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Name of extra for {@link #ACTION_USB_PORT_CHANGED} 26276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * containing the {@link UsbPort} object for the port. 26376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * 26476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @hide 26576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown */ 26676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown public static final String EXTRA_PORT = "port"; 26776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown 26876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown /** 26976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Name of extra for {@link #ACTION_USB_PORT_CHANGED} 27076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * containing the {@link UsbPortStatus} object for the port, or null if the port 27176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * was removed. 27276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * 27376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @hide 27476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown */ 27576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown public static final String EXTRA_PORT_STATUS = "portStatus"; 27676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown 27776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown /** 278e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Name of extra for {@link #ACTION_USB_DEVICE_ATTACHED} and 27902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * {@link #ACTION_USB_DEVICE_DETACHED} broadcasts 280460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * containing the {@link UsbDevice} object for the device. 281e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 282e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static final String EXTRA_DEVICE = "device"; 283e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 2849182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 28502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * Name of extra for {@link #ACTION_USB_ACCESSORY_ATTACHED} and 28602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * {@link #ACTION_USB_ACCESSORY_DETACHED} broadcasts 287460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * containing the {@link UsbAccessory} object for the accessory. 2889182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 2899182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public static final String EXTRA_ACCESSORY = "accessory"; 2909182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 2913a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 2923a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Name of extra added to the {@link android.app.PendingIntent} 293980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * passed into {@link #requestPermission(UsbDevice, PendingIntent)} 294980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * or {@link #requestPermission(UsbAccessory, PendingIntent)} 2953a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * containing a boolean value indicating whether the user granted permission or not. 2963a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 2973a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public static final String EXTRA_PERMISSION_GRANTED = "permission"; 2983a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 2993a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private final Context mContext; 3003a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private final IUsbManager mService; 301e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 302e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 303e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * {@hide} 304e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 3053a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public UsbManager(Context context, IUsbManager service) { 3063a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mContext = context; 307e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mService = service; 308e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 309e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 310e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 311e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns a HashMap containing all USB devices currently attached. 312e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * USB device name is the key for the returned HashMap. 313e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * The result will be empty if no devices are attached, or if 314e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * USB host mode is inactive or unsupported. 315e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 316e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return HashMap containing all connected USB devices. 317e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 318e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public HashMap<String,UsbDevice> getDeviceList() { 3199b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye HashMap<String,UsbDevice> result = new HashMap<String,UsbDevice>(); 3209b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye if (mService == null) { 3219b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye return result; 3229b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye } 323e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood Bundle bundle = new Bundle(); 324e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood try { 325e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mService.getDeviceList(bundle); 326e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood for (String name : bundle.keySet()) { 327e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood result.put(name, (UsbDevice)bundle.get(name)); 328e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 329e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return result; 330e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } catch (RemoteException e) { 331f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 332e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 333e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 334e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 335e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 336e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Opens the device so it can be used to send and receive 337c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * data using {@link android.hardware.usb.UsbRequest}. 338e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 339e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param device the device to open 3401567a4341bf642e17432a079d3de3381c7a93340mike wakerly * @return a {@link UsbDeviceConnection}, or {@code null} if open failed 341e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 342acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public UsbDeviceConnection openDevice(UsbDevice device) { 343e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood try { 344acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood String deviceName = device.getDeviceName(); 345acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood ParcelFileDescriptor pfd = mService.openDevice(deviceName); 346acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (pfd != null) { 347acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood UsbDeviceConnection connection = new UsbDeviceConnection(device); 348ec3cbb2a66cfd4923b15f7eee0e78bfddb517997Philip P. Moltmann boolean result = connection.open(deviceName, pfd, mContext); 349acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood pfd.close(); 350acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (result) { 351acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return connection; 352acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 353e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 354e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } catch (Exception e) { 355e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood Log.e(TAG, "exception in UsbManager.openDevice", e); 356e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 357acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return null; 358e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 359e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 3609182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 3619182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Returns a list of currently attached USB accessories. 3629182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * (in the current implementation there can be at most one) 3639182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 3649182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @return list of USB accessories, or null if none are attached. 3659182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 3669182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public UsbAccessory[] getAccessoryList() { 3679b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye if (mService == null) { 3689b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye return null; 3699b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye } 3709182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood try { 3719182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood UsbAccessory accessory = mService.getCurrentAccessory(); 3729182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood if (accessory == null) { 3739182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return null; 3749182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } else { 3759182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return new UsbAccessory[] { accessory }; 3769182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 3779182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } catch (RemoteException e) { 378f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 3799182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 3809182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 3819182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 3829182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 3839182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Opens a file descriptor for reading and writing data to the USB accessory. 3849182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 3859182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @param accessory the USB accessory to open 3869182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @return file descriptor, or null if the accessor could not be opened. 3879182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 3889182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public ParcelFileDescriptor openAccessory(UsbAccessory accessory) { 3899182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood try { 39002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood return mService.openAccessory(accessory); 3919182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } catch (RemoteException e) { 392f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 3939182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 3949182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 3959182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 3963a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 3973a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Returns true if the caller has permission to access the device. 398c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Permission might have been granted temporarily via 399980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * {@link #requestPermission(UsbDevice, PendingIntent)} or 400c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * by the user choosing the caller as the default application for the device. 4013a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 4023a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param device to check permissions for 4033a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @return true if caller has permission 4043a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 4053a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public boolean hasPermission(UsbDevice device) { 4069b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye if (mService == null) { 4079b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye return false; 4089b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye } 4093a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 4103a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return mService.hasDevicePermission(device); 4113a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 412f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 4133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 4143a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 4153a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 4163a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 4173a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Returns true if the caller has permission to access the accessory. 418c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Permission might have been granted temporarily via 419980f0430c16a8767061a6f7f3506aabf79735ef6Mike Lockwood * {@link #requestPermission(UsbAccessory, PendingIntent)} or 420c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * by the user choosing the caller as the default application for the accessory. 4213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 4223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param accessory to check permissions for 4233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @return true if caller has permission 4243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 4253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public boolean hasPermission(UsbAccessory accessory) { 4269b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye if (mService == null) { 4279b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye return false; 4289b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye } 4293a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 4303a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return mService.hasAccessoryPermission(accessory); 4313a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 432f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 4333a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 4343a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 4353a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 4363a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 437c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Requests temporary permission for the given package to access the device. 4383a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * This may result in a system dialog being displayed to the user 4393a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * if permission had not already been granted. 4403a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Success or failure is returned via the {@link android.app.PendingIntent} pi. 441c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * If successful, this grants the caller permission to access the device only 442c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * until the device is disconnected. 443c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * 4443a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * The following extras will be added to pi: 4453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <ul> 4463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_DEVICE} containing the device passed into this call 4473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_PERMISSION_GRANTED} containing boolean indicating whether 4483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * permission was granted by the user 4493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * </ul> 4503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 4513a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param device to request permissions for 4523a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param pi PendingIntent for returning result 4533a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 4543a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void requestPermission(UsbDevice device, PendingIntent pi) { 4553a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 4563a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mService.requestDevicePermission(device, mContext.getPackageName(), pi); 4573a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 458f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 4593a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 4603a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 4613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 4623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood /** 463c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * Requests temporary permission for the given package to access the accessory. 4643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * This may result in a system dialog being displayed to the user 4653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * if permission had not already been granted. 4663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Success or failure is returned via the {@link android.app.PendingIntent} pi. 46762cfeeb821afb2f3d3b78ad93caa13408cd26eacMike Lockwood * If successful, this grants the caller permission to access the accessory only 468c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * until the device is disconnected. 469c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood * 4703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * The following extras will be added to pi: 4713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <ul> 4723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_ACCESSORY} containing the accessory passed into this call 4733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * <li> {@link #EXTRA_PERMISSION_GRANTED} containing boolean indicating whether 4743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * permission was granted by the user 4753a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * </ul> 4763a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 4773a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param accessory to request permissions for 4783a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * @param pi PendingIntent for returning result 4793a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 4803a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void requestPermission(UsbAccessory accessory, PendingIntent pi) { 4813a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 4823a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mService.requestAccessoryPermission(accessory, mContext.getPackageName(), pi); 4833a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 484f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 4853a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 4863a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 4873a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 48808bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood /** 4894751880a4d770e8916320b5908b58f389d6552deDaichi Hirono * Grants permission for USB device without showing system dialog. 4904751880a4d770e8916320b5908b58f389d6552deDaichi Hirono * Only system components can call this function. 4914751880a4d770e8916320b5908b58f389d6552deDaichi Hirono * @param device to request permissions for 4924751880a4d770e8916320b5908b58f389d6552deDaichi Hirono * 4934751880a4d770e8916320b5908b58f389d6552deDaichi Hirono * {@hide} 4944751880a4d770e8916320b5908b58f389d6552deDaichi Hirono */ 4954751880a4d770e8916320b5908b58f389d6552deDaichi Hirono public void grantPermission(UsbDevice device) { 496badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park grantPermission(device, Process.myUid()); 497badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park } 498badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park 499badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park /** 500badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * Grants permission for USB device to given uid without showing system dialog. 501badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * Only system components can call this function. 502badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * @param device to request permissions for 503badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * @uid uid to give permission 504badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * 505badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * {@hide} 506badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park */ 507badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park public void grantPermission(UsbDevice device, int uid) { 5084751880a4d770e8916320b5908b58f389d6552deDaichi Hirono try { 509badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park mService.grantDevicePermission(device, uid); 5104751880a4d770e8916320b5908b58f389d6552deDaichi Hirono } catch (RemoteException e) { 511f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 5124751880a4d770e8916320b5908b58f389d6552deDaichi Hirono } 5134751880a4d770e8916320b5908b58f389d6552deDaichi Hirono } 5144751880a4d770e8916320b5908b58f389d6552deDaichi Hirono 5154751880a4d770e8916320b5908b58f389d6552deDaichi Hirono /** 516244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth * Grants permission to specified package for USB device without showing system dialog. 517244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth * Only system components can call this function, as it requires the MANAGE_USB permission. 518244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth * @param device to request permissions for 519244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth * @param packageName of package to grant permissions 520244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth * 521244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth * {@hide} 522244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth */ 523244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth public void grantPermission(UsbDevice device, String packageName) { 524244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth try { 525244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth int uid = mContext.getPackageManager() 526244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth .getPackageUidAsUser(packageName, mContext.getUserId()); 527badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park grantPermission(device, uid); 528244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth } catch (NameNotFoundException e) { 529244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth Log.e(TAG, "Package " + packageName + " not found.", e); 530244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth } 531244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth } 532244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth 533244259a063c77029326a4150a9dec232ea80bad4Johan T. Halseth /** 534460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * Returns true if the specified USB function is currently enabled when in device mode. 535460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * <p> 536460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * USB functions represent interfaces which are published to the host to access 537460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * services offered by the device. 538460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * </p> 539e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * 540fcf10f7c12cb3107bdfedce6f76a8c866d154f3cNick Kralevich * @param function name of the USB function 541460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * @return true if the USB function is enabled 542e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * 543e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood * {@hide} 544e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood */ 545fcf10f7c12cb3107bdfedce6f76a8c866d154f3cNick Kralevich public boolean isFunctionEnabled(String function) { 5469b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye if (mService == null) { 5479b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye return false; 5489b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye } 549460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown try { 550460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown return mService.isFunctionEnabled(function); 551460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } catch (RemoteException e) { 552f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 553460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 554e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood } 555e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood 556e51099f110cf6a77c316402adf7970ae5d3311eaMike Lockwood /** 557460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * Sets the current USB function when in device mode. 558460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * <p> 559460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * USB functions represent interfaces which are published to the host to access 560460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * services offered by the device. 561460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * </p><p> 562460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * This method is intended to select among primary USB functions. The system may 563460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * automatically activate additional functions such as {@link #USB_FUNCTION_ADB} 564460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * or {@link #USB_FUNCTION_ACCESSORY} based on other settings and states. 565460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * </p><p> 566460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * The allowed values are: {@link #USB_FUNCTION_NONE}, {@link #USB_FUNCTION_AUDIO_SOURCE}, 567460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * {@link #USB_FUNCTION_MIDI}, {@link #USB_FUNCTION_MTP}, {@link #USB_FUNCTION_PTP}, 568460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * or {@link #USB_FUNCTION_RNDIS}. 569460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * </p><p> 5707a396be6d5ba8914933a54b5bfac25e118db0e9fJerry Zhang * Also sets whether USB data (for example, MTP exposed pictures) should be made available 5717a396be6d5ba8914933a54b5bfac25e118db0e9fJerry Zhang * on the USB connection when in device mode. Unlocking usb data should only be done with 5727a396be6d5ba8914933a54b5bfac25e118db0e9fJerry Zhang * user involvement, since exposing pictures or other data could leak sensitive 5737a396be6d5ba8914933a54b5bfac25e118db0e9fJerry Zhang * user information. 5747a396be6d5ba8914933a54b5bfac25e118db0e9fJerry Zhang * </p><p> 575460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * Note: This function is asynchronous and may fail silently without applying 576460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * the requested changes. 577460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown * </p> 578e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 579875c24b897919a80a711dc79cf625006f1ff366dMike Lockwood * @param function name of the USB function, or null to restore the default function 5807a396be6d5ba8914933a54b5bfac25e118db0e9fJerry Zhang * @param usbDataUnlocked whether user data is accessible 581a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * 582a75075e1671f57217d8b8bb75b2d9c3a6bab37d8Mike Lockwood * {@hide} 58308bff3b9d4c0a66c3aaac45db68207d08276fd38Mike Lockwood */ 5847a396be6d5ba8914933a54b5bfac25e118db0e9fJerry Zhang public void setCurrentFunction(String function, boolean usbDataUnlocked) { 585674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich try { 5867a396be6d5ba8914933a54b5bfac25e118db0e9fJerry Zhang mService.setCurrentFunction(function, usbDataUnlocked); 587674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich } catch (RemoteException e) { 588f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 589674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich } 590674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich } 591674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich 592674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich /** 59376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Returns a list of physical USB ports on the device. 59476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * <p> 59576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * This list is guaranteed to contain all dual-role USB Type C ports but it might 59676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * be missing other ports depending on whether the kernel USB drivers have been 59776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * updated to publish all of the device's ports through the new "dual_role_usb" 59876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * device class (which supports all types of ports despite its name). 59976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * </p> 60076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * 60176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @return The list of USB ports, or null if none. 60276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * 60376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @hide 60476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown */ 60576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown public UsbPort[] getPorts() { 6069b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye if (mService == null) { 6079b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye return null; 6089b5ee823a8ebe8372b80c1efafaba51322271d79Jim Kaye } 60976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown try { 61076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown return mService.getPorts(); 61176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown } catch (RemoteException e) { 612f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 61376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown } 61476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown } 61576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown 61676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown /** 61776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Gets the status of the specified USB port. 61876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * 61976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @param port The port to query. 62076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @return The status of the specified USB port, or null if unknown. 62176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * 62276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @hide 62376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown */ 62476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown public UsbPortStatus getPortStatus(UsbPort port) { 62576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown Preconditions.checkNotNull(port, "port must not be null"); 62676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown 62776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown try { 62876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown return mService.getPortStatus(port.getId()); 62976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown } catch (RemoteException e) { 630f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 63176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown } 63276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown } 63376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown 63476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown /** 63576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Sets the desired role combination of the port. 63676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * <p> 63776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * The supported role combinations depend on what is connected to the port and may be 63876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * determined by consulting 63976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * {@link UsbPortStatus#isRoleCombinationSupported UsbPortStatus.isRoleCombinationSupported}. 64076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * </p><p> 64176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Note: This function is asynchronous and may fail silently without applying 64276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * the requested changes. If this function does cause a status change to occur then 64376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * a {@link #ACTION_USB_PORT_CHANGED} broadcast will be sent. 64476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * </p> 64576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * 64676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @param powerRole The desired power role: {@link UsbPort#POWER_ROLE_SOURCE} 64776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * or {@link UsbPort#POWER_ROLE_SINK}, or 0 if no power role. 64876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @param dataRole The desired data role: {@link UsbPort#DATA_ROLE_HOST} 64976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * or {@link UsbPort#DATA_ROLE_DEVICE}, or 0 if no data role. 65076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * 65176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @hide 65276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown */ 65376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown public void setPortRoles(UsbPort port, int powerRole, int dataRole) { 65476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown Preconditions.checkNotNull(port, "port must not be null"); 65576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown UsbPort.checkRoles(powerRole, dataRole); 65676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown 6574641fc3e2ae33583f5e93bcfd7a7adf1fb9a81fcBadhri Jagan Sridharan Log.d(TAG, "setPortRoles Package:" + mContext.getPackageName()); 65876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown try { 65976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown mService.setPortRoles(port.getId(), powerRole, dataRole); 66076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown } catch (RemoteException e) { 661f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw e.rethrowFromSystemServer(); 66276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown } 66376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown } 66476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown 665badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park /** 666badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * Sets the component that will handle USB device connection. 667badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * <p> 668badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * Setting component allows to specify external USB host manager to handle use cases, where 669badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * selection dialog for an activity that will handle USB device is undesirable. 670badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * Only system components can call this function, as it requires the MANAGE_USB permission. 671badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * 672badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * @param usbDeviceConnectionHandler The component to handle usb connections, 673badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * {@code null} to unset. 674badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * 675badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park * {@hide} 676badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park */ 677badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park public void setUsbDeviceConnectionHandler(@Nullable ComponentName usbDeviceConnectionHandler) { 678badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park try { 679badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park mService.setUsbDeviceConnectionHandler(usbDeviceConnectionHandler); 680badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park } catch (RemoteException e) { 681badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park throw e.rethrowFromSystemServer(); 682badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park } 683badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park } 684badbbae6fa2846415778b2a152a0758acbf0eb74Keun-young Park 685460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown /** @hide */ 686460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown public static String addFunction(String functions, String function) { 68748b9a7c70acff8f1469e487d08bbcb7e6a47ad8aYasuhiro Matsuda if (USB_FUNCTION_NONE.equals(functions)) { 688460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown return function; 689460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 690460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown if (!containsFunction(functions, function)) { 691460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown if (functions.length() > 0) { 692460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown functions += ","; 693460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 694460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown functions += function; 695460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 696460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown return functions; 697460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 698460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown 699460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown /** @hide */ 700460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown public static String removeFunction(String functions, String function) { 701460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown String[] split = functions.split(","); 702460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown for (int i = 0; i < split.length; i++) { 703460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown if (function.equals(split[i])) { 704460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown split[i] = null; 705460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 706460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 707460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown if (split.length == 1 && split[0] == null) { 70848b9a7c70acff8f1469e487d08bbcb7e6a47ad8aYasuhiro Matsuda return USB_FUNCTION_NONE; 709460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 710460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown StringBuilder builder = new StringBuilder(); 711460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown for (int i = 0; i < split.length; i++) { 712460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown String s = split[i]; 713460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown if (s != null) { 714460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown if (builder.length() > 0) { 715460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown builder.append(","); 716460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 717460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown builder.append(s); 718460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 719460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 720460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown return builder.toString(); 721460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 722460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown 723460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown /** @hide */ 724460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown public static boolean containsFunction(String functions, String function) { 725460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown int index = functions.indexOf(function); 726460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown if (index < 0) return false; 727460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown if (index > 0 && functions.charAt(index - 1) != ',') return false; 728460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown int charAfter = index + function.length(); 729460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown if (charAfter < functions.length() && functions.charAt(charAfter) != ',') return false; 730460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown return true; 731460a146eb8f827e4e70f2dd93d1ba852d0feb06bJeff Brown } 7322423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood} 733