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