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