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