blob: ee646c0876088486ce235227b6fdc4f9d8ebcefd [file] [log] [blame]
Mike Lockwood24236072010-06-23 17:36:36 -04001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
Mike Lockwoodc4308f02011-03-01 08:04:54 -080018package android.hardware.usb;
Mike Lockwood24236072010-06-23 17:36:36 -040019
Jeff Brown76c4c662015-07-07 12:44:17 -070020import com.android.internal.util.Preconditions;
21
Mike Lockwood3a68b832011-03-08 10:08:59 -050022import android.app.PendingIntent;
23import android.content.Context;
Johan T. Halseth244259a2016-05-24 14:49:04 +010024import android.content.pm.PackageManager.NameNotFoundException;
Mike Lockwoode7d511e2010-12-30 13:39:37 -050025import android.os.Bundle;
26import android.os.ParcelFileDescriptor;
Daichi Hirono47518802015-12-08 09:51:19 +090027import android.os.Process;
Mike Lockwoode7d511e2010-12-30 13:39:37 -050028import android.os.RemoteException;
29import android.util.Log;
30
Mike Lockwoode7d511e2010-12-30 13:39:37 -050031import java.util.HashMap;
Mike Lockwood08bff3b2010-08-31 13:27:05 -040032
Mike Lockwood24236072010-06-23 17:36:36 -040033/**
Mike Lockwood11dd5ae2011-04-01 14:00:08 -040034 * This class allows you to access the state of USB and communicate with USB devices.
35 * Currently only host mode is supported in the public API.
Mike Lockwoode7d511e2010-12-30 13:39:37 -050036 *
37 * <p>You can obtain an instance of this class by calling
38 * {@link android.content.Context#getSystemService(java.lang.String) Context.getSystemService()}.
39 *
40 * {@samplecode
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080041 * UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);}
42 *
43 * <div class="special reference">
44 * <h3>Developer Guides</h3>
45 * <p>For more information about communicating with USB hardware, read the
Mark Lu8b739902016-06-24 15:38:02 -070046 * <a href="{@docRoot}guide/topics/connectivity/usb/index.html">USB developer guide</a>.</p>
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080047 * </div>
Mike Lockwood24236072010-06-23 17:36:36 -040048 */
Mike Lockwood770126a2010-12-09 22:30:37 -080049public class UsbManager {
Mike Lockwoode7d511e2010-12-30 13:39:37 -050050 private static final String TAG = "UsbManager";
51
Mike Lockwood24236072010-06-23 17:36:36 -040052 /**
Mike Lockwoode7d511e2010-12-30 13:39:37 -050053 * Broadcast Action: A sticky broadcast for USB state change events when in device mode.
Mike Lockwood709981e2010-06-28 09:58:58 -040054 *
Mike Lockwoodb92df0f2010-12-10 16:19:32 -080055 * This is a sticky broadcast for clients that includes USB connected/disconnected state,
Mike Lockwood9182d3c2011-02-15 09:50:22 -050056 * <ul>
57 * <li> {@link #USB_CONNECTED} boolean indicating whether USB is connected or disconnected.
Daichi Hirono618fa6f2016-03-17 14:14:32 +090058 * <li> {@link #USB_HOST_CONNECTED} boolean indicating whether USB is connected or
59 * disconnected as host.
Mike Lockwood02e45692011-06-14 15:43:51 -040060 * <li> {@link #USB_CONFIGURED} boolean indicating whether USB is configured.
Mike Lockwood9eb014a2011-06-08 09:17:45 -070061 * currently zero if not configured, one for configured.
Mike Lockwood9eb014a2011-06-08 09:17:45 -070062 * <li> {@link #USB_FUNCTION_ADB} boolean extra indicating whether the
63 * adb function is enabled
64 * <li> {@link #USB_FUNCTION_RNDIS} boolean extra indicating whether the
65 * RNDIS ethernet function is enabled
66 * <li> {@link #USB_FUNCTION_MTP} boolean extra indicating whether the
67 * MTP function is enabled
68 * <li> {@link #USB_FUNCTION_PTP} boolean extra indicating whether the
69 * PTP function is enabled
70 * <li> {@link #USB_FUNCTION_PTP} boolean extra indicating whether the
71 * accessory function is enabled
Mike Lockwood9d5a4be2012-04-06 09:41:32 -070072 * <li> {@link #USB_FUNCTION_AUDIO_SOURCE} boolean extra indicating whether the
73 * audio source function is enabled
Mike Lockwood2a57bc72014-09-19 11:16:52 -070074 * <li> {@link #USB_FUNCTION_MIDI} boolean extra indicating whether the
75 * MIDI function is enabled
Mike Lockwood9182d3c2011-02-15 09:50:22 -050076 * </ul>
Yasuhiro Matsuda48b9a7c2015-07-16 19:00:16 +090077 * If the sticky intent has not been found, that indicates USB is disconnected,
78 * USB is not configued, MTP function is enabled, and all the other functions are disabled.
Mike Lockwooda75075e12011-03-11 11:26:11 -050079 *
80 * {@hide}
Mike Lockwood709981e2010-06-28 09:58:58 -040081 */
82 public static final String ACTION_USB_STATE =
Mike Lockwoodc4308f02011-03-01 08:04:54 -080083 "android.hardware.usb.action.USB_STATE";
Mike Lockwood709981e2010-06-28 09:58:58 -040084
Jeff Brown76c4c662015-07-07 12:44:17 -070085 /**
86 * Broadcast Action: A broadcast for USB port changes.
87 *
88 * This intent is sent when a USB port is added, removed, or changes state.
89 * <ul>
90 * <li> {@link #EXTRA_PORT} containing the {@link android.hardware.usb.UsbPort}
91 * for the port.
92 * <li> {@link #EXTRA_PORT_STATUS} containing the {@link android.hardware.usb.UsbPortStatus}
93 * for the port, or null if the port has been removed
94 * </ul>
95 *
96 * @hide
97 */
98 public static final String ACTION_USB_PORT_CHANGED =
99 "android.hardware.usb.action.USB_PORT_CHANGED";
100
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500101 /**
102 * Broadcast Action: A broadcast for USB device attached event.
103 *
104 * This intent is sent when a USB device is attached to the USB bus when in host mode.
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500105 * <ul>
Mike Lockwoodc4308f02011-03-01 08:04:54 -0800106 * <li> {@link #EXTRA_DEVICE} containing the {@link android.hardware.usb.UsbDevice}
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500107 * for the attached device
108 * </ul>
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500109 */
110 public static final String ACTION_USB_DEVICE_ATTACHED =
Mike Lockwoodc4308f02011-03-01 08:04:54 -0800111 "android.hardware.usb.action.USB_DEVICE_ATTACHED";
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500112
113 /**
114 * Broadcast Action: A broadcast for USB device detached event.
115 *
116 * This intent is sent when a USB device is detached from the USB bus when in host mode.
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500117 * <ul>
Mike Lockwoodc4308f02011-03-01 08:04:54 -0800118 * <li> {@link #EXTRA_DEVICE} containing the {@link android.hardware.usb.UsbDevice}
Mike Lockwood188d00b2011-02-23 13:14:33 -0800119 * for the detached device
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500120 * </ul>
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500121 */
122 public static final String ACTION_USB_DEVICE_DETACHED =
Mike Lockwoodc4308f02011-03-01 08:04:54 -0800123 "android.hardware.usb.action.USB_DEVICE_DETACHED";
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500124
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500125 /**
126 * Broadcast Action: A broadcast for USB accessory attached event.
127 *
128 * This intent is sent when a USB accessory is attached.
129 * <ul>
Mike Lockwoodc4308f02011-03-01 08:04:54 -0800130 * <li> {@link #EXTRA_ACCESSORY} containing the {@link android.hardware.usb.UsbAccessory}
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500131 * for the attached accessory
132 * </ul>
133 */
134 public static final String ACTION_USB_ACCESSORY_ATTACHED =
Mike Lockwoodc4308f02011-03-01 08:04:54 -0800135 "android.hardware.usb.action.USB_ACCESSORY_ATTACHED";
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500136
137 /**
138 * Broadcast Action: A broadcast for USB accessory detached event.
139 *
140 * This intent is sent when a USB accessory is detached.
141 * <ul>
Mike Lockwood980f0432011-03-09 15:49:13 -0500142 * <li> {@link #EXTRA_ACCESSORY} containing the {@link UsbAccessory}
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500143 * for the attached accessory that was detached
144 * </ul>
145 */
146 public static final String ACTION_USB_ACCESSORY_DETACHED =
Mike Lockwoodc4308f02011-03-01 08:04:54 -0800147 "android.hardware.usb.action.USB_ACCESSORY_DETACHED";
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500148
Mike Lockwood709981e2010-06-28 09:58:58 -0400149 /**
150 * Boolean extra indicating whether USB is connected or disconnected.
151 * Used in extras for the {@link #ACTION_USB_STATE} broadcast.
Mike Lockwooda75075e12011-03-11 11:26:11 -0500152 *
153 * {@hide}
Mike Lockwood709981e2010-06-28 09:58:58 -0400154 */
155 public static final String USB_CONNECTED = "connected";
Mike Lockwood24236072010-06-23 17:36:36 -0400156
157 /**
Daichi Hirono618fa6f2016-03-17 14:14:32 +0900158 * Boolean extra indicating whether USB is connected or disconnected as host.
159 * Used in extras for the {@link #ACTION_USB_STATE} broadcast.
160 *
161 * {@hide}
162 */
163 public static final String USB_HOST_CONNECTED = "host_connected";
164
165 /**
Mike Lockwood02e45692011-06-14 15:43:51 -0400166 * Boolean extra indicating whether USB is configured.
Mike Lockwoodb92df0f2010-12-10 16:19:32 -0800167 * Used in extras for the {@link #ACTION_USB_STATE} broadcast.
Mike Lockwooda75075e12011-03-11 11:26:11 -0500168 *
169 * {@hide}
Mike Lockwoodb92df0f2010-12-10 16:19:32 -0800170 */
Mike Lockwood02e45692011-06-14 15:43:51 -0400171 public static final String USB_CONFIGURED = "configured";
Mike Lockwoodb92df0f2010-12-10 16:19:32 -0800172
173 /**
Nick Kralevich67401902015-06-10 09:38:42 -0700174 * Boolean extra indicating whether confidential user data, such as photos, should be
175 * made available on the USB connection. This variable will only be set when the user
176 * has explicitly asked for this data to be unlocked.
177 * Used in extras for the {@link #ACTION_USB_STATE} broadcast.
178 *
179 * {@hide}
180 */
181 public static final String USB_DATA_UNLOCKED = "unlocked";
182
183 /**
Jerry Zhangbb598ee2016-10-24 14:35:08 -0700184 * Boolean extra indicating whether the intent represents a change in the usb
185 * configuration (as opposed to a state update).
186 *
187 * {@hide}
188 */
189 public static final String USB_CONFIG_CHANGED = "config_changed";
190
191 /**
Jeff Brown460a1462015-06-30 17:57:12 -0700192 * A placeholder indicating that no USB function is being specified.
193 * Used to distinguish between selecting no function vs. the default function in
194 * {@link #setCurrentFunction(String)}.
Mike Lockwooda75075e12011-03-11 11:26:11 -0500195 *
196 * {@hide}
Mike Lockwood24236072010-06-23 17:36:36 -0400197 */
Jeff Brown460a1462015-06-30 17:57:12 -0700198 public static final String USB_FUNCTION_NONE = "none";
Mike Lockwood24236072010-06-23 17:36:36 -0400199
200 /**
201 * Name of the adb USB function.
Mike Lockwoodb92df0f2010-12-10 16:19:32 -0800202 * Used in extras for the {@link #ACTION_USB_STATE} broadcast
Mike Lockwooda75075e12011-03-11 11:26:11 -0500203 *
204 * {@hide}
Mike Lockwood24236072010-06-23 17:36:36 -0400205 */
206 public static final String USB_FUNCTION_ADB = "adb";
207
208 /**
209 * Name of the RNDIS ethernet USB function.
Mike Lockwoodb92df0f2010-12-10 16:19:32 -0800210 * Used in extras for the {@link #ACTION_USB_STATE} broadcast
Mike Lockwooda75075e12011-03-11 11:26:11 -0500211 *
212 * {@hide}
Mike Lockwood24236072010-06-23 17:36:36 -0400213 */
214 public static final String USB_FUNCTION_RNDIS = "rndis";
215
216 /**
217 * Name of the MTP USB function.
Mike Lockwoodb92df0f2010-12-10 16:19:32 -0800218 * Used in extras for the {@link #ACTION_USB_STATE} broadcast
Mike Lockwooda75075e12011-03-11 11:26:11 -0500219 *
220 * {@hide}
Mike Lockwood24236072010-06-23 17:36:36 -0400221 */
222 public static final String USB_FUNCTION_MTP = "mtp";
223
224 /**
Mike Lockwood9eb014a2011-06-08 09:17:45 -0700225 * Name of the PTP USB function.
226 * Used in extras for the {@link #ACTION_USB_STATE} broadcast
227 *
228 * {@hide}
229 */
230 public static final String USB_FUNCTION_PTP = "ptp";
231
232 /**
Mike Lockwood9d5a4be2012-04-06 09:41:32 -0700233 * Name of the audio source USB function.
234 * Used in extras for the {@link #ACTION_USB_STATE} broadcast
235 *
236 * {@hide}
237 */
238 public static final String USB_FUNCTION_AUDIO_SOURCE = "audio_source";
239
240 /**
Mike Lockwood2a57bc72014-09-19 11:16:52 -0700241 * Name of the MIDI USB function.
242 * Used in extras for the {@link #ACTION_USB_STATE} broadcast
243 *
244 * {@hide}
245 */
246 public static final String USB_FUNCTION_MIDI = "midi";
247
248 /**
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500249 * Name of the Accessory USB function.
Mike Lockwoodb92df0f2010-12-10 16:19:32 -0800250 * Used in extras for the {@link #ACTION_USB_STATE} broadcast
Mike Lockwooda75075e12011-03-11 11:26:11 -0500251 *
252 * {@hide}
Mike Lockwood24236072010-06-23 17:36:36 -0400253 */
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500254 public static final String USB_FUNCTION_ACCESSORY = "accessory";
255
256 /**
Jeff Brown76c4c662015-07-07 12:44:17 -0700257 * Name of extra for {@link #ACTION_USB_PORT_CHANGED}
258 * containing the {@link UsbPort} object for the port.
259 *
260 * @hide
261 */
262 public static final String EXTRA_PORT = "port";
263
264 /**
265 * Name of extra for {@link #ACTION_USB_PORT_CHANGED}
266 * containing the {@link UsbPortStatus} object for the port, or null if the port
267 * was removed.
268 *
269 * @hide
270 */
271 public static final String EXTRA_PORT_STATUS = "portStatus";
272
273 /**
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500274 * Name of extra for {@link #ACTION_USB_DEVICE_ATTACHED} and
Mike Lockwood02eb8742011-02-27 09:10:37 -0800275 * {@link #ACTION_USB_DEVICE_DETACHED} broadcasts
Jeff Brown460a1462015-06-30 17:57:12 -0700276 * containing the {@link UsbDevice} object for the device.
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500277 */
278 public static final String EXTRA_DEVICE = "device";
279
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500280 /**
Mike Lockwood02eb8742011-02-27 09:10:37 -0800281 * Name of extra for {@link #ACTION_USB_ACCESSORY_ATTACHED} and
282 * {@link #ACTION_USB_ACCESSORY_DETACHED} broadcasts
Jeff Brown460a1462015-06-30 17:57:12 -0700283 * containing the {@link UsbAccessory} object for the accessory.
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500284 */
285 public static final String EXTRA_ACCESSORY = "accessory";
286
Mike Lockwood3a68b832011-03-08 10:08:59 -0500287 /**
288 * Name of extra added to the {@link android.app.PendingIntent}
Mike Lockwood980f0432011-03-09 15:49:13 -0500289 * passed into {@link #requestPermission(UsbDevice, PendingIntent)}
290 * or {@link #requestPermission(UsbAccessory, PendingIntent)}
Mike Lockwood3a68b832011-03-08 10:08:59 -0500291 * containing a boolean value indicating whether the user granted permission or not.
292 */
293 public static final String EXTRA_PERMISSION_GRANTED = "permission";
294
295 private final Context mContext;
296 private final IUsbManager mService;
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500297
298 /**
299 * {@hide}
300 */
Mike Lockwood3a68b832011-03-08 10:08:59 -0500301 public UsbManager(Context context, IUsbManager service) {
302 mContext = context;
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500303 mService = service;
304 }
305
306 /**
307 * Returns a HashMap containing all USB devices currently attached.
308 * USB device name is the key for the returned HashMap.
309 * The result will be empty if no devices are attached, or if
310 * USB host mode is inactive or unsupported.
311 *
312 * @return HashMap containing all connected USB devices.
313 */
314 public HashMap<String,UsbDevice> getDeviceList() {
315 Bundle bundle = new Bundle();
316 try {
317 mService.getDeviceList(bundle);
318 HashMap<String,UsbDevice> result = new HashMap<String,UsbDevice>();
319 for (String name : bundle.keySet()) {
320 result.put(name, (UsbDevice)bundle.get(name));
321 }
322 return result;
323 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700324 throw e.rethrowFromSystemServer();
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500325 }
326 }
327
328 /**
329 * Opens the device so it can be used to send and receive
Mike Lockwoodc4308f02011-03-01 08:04:54 -0800330 * data using {@link android.hardware.usb.UsbRequest}.
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500331 *
332 * @param device the device to open
mike wakerly1567a432012-07-17 19:58:19 -0700333 * @return a {@link UsbDeviceConnection}, or {@code null} if open failed
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500334 */
Mike Lockwoodacc29cc2011-03-11 08:18:08 -0500335 public UsbDeviceConnection openDevice(UsbDevice device) {
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500336 try {
Mike Lockwoodacc29cc2011-03-11 08:18:08 -0500337 String deviceName = device.getDeviceName();
338 ParcelFileDescriptor pfd = mService.openDevice(deviceName);
339 if (pfd != null) {
340 UsbDeviceConnection connection = new UsbDeviceConnection(device);
Philip P. Moltmann5201f1e2016-09-30 14:58:27 -0700341 boolean result = connection.open(deviceName, pfd, mContext);
Mike Lockwoodacc29cc2011-03-11 08:18:08 -0500342 pfd.close();
343 if (result) {
344 return connection;
345 }
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500346 }
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500347 } catch (Exception e) {
348 Log.e(TAG, "exception in UsbManager.openDevice", e);
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500349 }
Mike Lockwoodacc29cc2011-03-11 08:18:08 -0500350 return null;
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500351 }
352
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500353 /**
354 * Returns a list of currently attached USB accessories.
355 * (in the current implementation there can be at most one)
356 *
357 * @return list of USB accessories, or null if none are attached.
358 */
359 public UsbAccessory[] getAccessoryList() {
360 try {
361 UsbAccessory accessory = mService.getCurrentAccessory();
362 if (accessory == null) {
363 return null;
364 } else {
365 return new UsbAccessory[] { accessory };
366 }
367 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700368 throw e.rethrowFromSystemServer();
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500369 }
370 }
371
372 /**
373 * Opens a file descriptor for reading and writing data to the USB accessory.
374 *
375 * @param accessory the USB accessory to open
376 * @return file descriptor, or null if the accessor could not be opened.
377 */
378 public ParcelFileDescriptor openAccessory(UsbAccessory accessory) {
379 try {
Mike Lockwood02eb8742011-02-27 09:10:37 -0800380 return mService.openAccessory(accessory);
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500381 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700382 throw e.rethrowFromSystemServer();
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500383 }
384 }
385
Mike Lockwood3a68b832011-03-08 10:08:59 -0500386 /**
387 * Returns true if the caller has permission to access the device.
Mike Lockwoodc6f23e82011-03-09 12:05:20 -0500388 * Permission might have been granted temporarily via
Mike Lockwood980f0432011-03-09 15:49:13 -0500389 * {@link #requestPermission(UsbDevice, PendingIntent)} or
Mike Lockwoodc6f23e82011-03-09 12:05:20 -0500390 * by the user choosing the caller as the default application for the device.
Mike Lockwood3a68b832011-03-08 10:08:59 -0500391 *
392 * @param device to check permissions for
393 * @return true if caller has permission
394 */
395 public boolean hasPermission(UsbDevice device) {
396 try {
397 return mService.hasDevicePermission(device);
398 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700399 throw e.rethrowFromSystemServer();
Mike Lockwood3a68b832011-03-08 10:08:59 -0500400 }
401 }
402
403 /**
404 * Returns true if the caller has permission to access the accessory.
Mike Lockwoodc6f23e82011-03-09 12:05:20 -0500405 * Permission might have been granted temporarily via
Mike Lockwood980f0432011-03-09 15:49:13 -0500406 * {@link #requestPermission(UsbAccessory, PendingIntent)} or
Mike Lockwoodc6f23e82011-03-09 12:05:20 -0500407 * by the user choosing the caller as the default application for the accessory.
Mike Lockwood3a68b832011-03-08 10:08:59 -0500408 *
409 * @param accessory to check permissions for
410 * @return true if caller has permission
411 */
412 public boolean hasPermission(UsbAccessory accessory) {
413 try {
414 return mService.hasAccessoryPermission(accessory);
415 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700416 throw e.rethrowFromSystemServer();
Mike Lockwood3a68b832011-03-08 10:08:59 -0500417 }
418 }
419
420 /**
Mike Lockwoodc6f23e82011-03-09 12:05:20 -0500421 * Requests temporary permission for the given package to access the device.
Mike Lockwood3a68b832011-03-08 10:08:59 -0500422 * This may result in a system dialog being displayed to the user
423 * if permission had not already been granted.
424 * Success or failure is returned via the {@link android.app.PendingIntent} pi.
Mike Lockwoodc6f23e82011-03-09 12:05:20 -0500425 * If successful, this grants the caller permission to access the device only
426 * until the device is disconnected.
427 *
Mike Lockwood3a68b832011-03-08 10:08:59 -0500428 * The following extras will be added to pi:
429 * <ul>
430 * <li> {@link #EXTRA_DEVICE} containing the device passed into this call
431 * <li> {@link #EXTRA_PERMISSION_GRANTED} containing boolean indicating whether
432 * permission was granted by the user
433 * </ul>
434 *
435 * @param device to request permissions for
436 * @param pi PendingIntent for returning result
437 */
438 public void requestPermission(UsbDevice device, PendingIntent pi) {
439 try {
440 mService.requestDevicePermission(device, mContext.getPackageName(), pi);
441 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700442 throw e.rethrowFromSystemServer();
Mike Lockwood3a68b832011-03-08 10:08:59 -0500443 }
444 }
445
446 /**
Mike Lockwoodc6f23e82011-03-09 12:05:20 -0500447 * Requests temporary permission for the given package to access the accessory.
Mike Lockwood3a68b832011-03-08 10:08:59 -0500448 * This may result in a system dialog being displayed to the user
449 * if permission had not already been granted.
450 * Success or failure is returned via the {@link android.app.PendingIntent} pi.
Mike Lockwood62cfeeb2011-03-11 18:39:03 -0500451 * If successful, this grants the caller permission to access the accessory only
Mike Lockwoodc6f23e82011-03-09 12:05:20 -0500452 * until the device is disconnected.
453 *
Mike Lockwood3a68b832011-03-08 10:08:59 -0500454 * The following extras will be added to pi:
455 * <ul>
456 * <li> {@link #EXTRA_ACCESSORY} containing the accessory passed into this call
457 * <li> {@link #EXTRA_PERMISSION_GRANTED} containing boolean indicating whether
458 * permission was granted by the user
459 * </ul>
460 *
461 * @param accessory to request permissions for
462 * @param pi PendingIntent for returning result
463 */
464 public void requestPermission(UsbAccessory accessory, PendingIntent pi) {
465 try {
466 mService.requestAccessoryPermission(accessory, mContext.getPackageName(), pi);
467 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700468 throw e.rethrowFromSystemServer();
Mike Lockwood3a68b832011-03-08 10:08:59 -0500469 }
470 }
471
Mike Lockwood02e45692011-06-14 15:43:51 -0400472 /**
Daichi Hirono47518802015-12-08 09:51:19 +0900473 * Grants permission for USB device without showing system dialog.
474 * Only system components can call this function.
475 * @param device to request permissions for
476 *
477 * {@hide}
478 */
479 public void grantPermission(UsbDevice device) {
480 try {
481 mService.grantDevicePermission(device, Process.myUid());
482 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700483 throw e.rethrowFromSystemServer();
Daichi Hirono47518802015-12-08 09:51:19 +0900484 }
485 }
486
487 /**
Johan T. Halseth244259a2016-05-24 14:49:04 +0100488 * Grants permission to specified package for USB device without showing system dialog.
489 * Only system components can call this function, as it requires the MANAGE_USB permission.
490 * @param device to request permissions for
491 * @param packageName of package to grant permissions
492 *
493 * {@hide}
494 */
495 public void grantPermission(UsbDevice device, String packageName) {
496 try {
497 int uid = mContext.getPackageManager()
498 .getPackageUidAsUser(packageName, mContext.getUserId());
499 mService.grantDevicePermission(device, uid);
500 } catch (NameNotFoundException e) {
501 Log.e(TAG, "Package " + packageName + " not found.", e);
502 } catch (RemoteException e) {
503 throw e.rethrowFromSystemServer();
504 }
505 }
506
507 /**
Jeff Brown460a1462015-06-30 17:57:12 -0700508 * Returns true if the specified USB function is currently enabled when in device mode.
509 * <p>
510 * USB functions represent interfaces which are published to the host to access
511 * services offered by the device.
512 * </p>
Mike Lockwoode51099f2011-08-02 12:54:49 -0400513 *
Nick Kralevichfcf10f72015-05-13 11:54:03 -0700514 * @param function name of the USB function
Jeff Brown460a1462015-06-30 17:57:12 -0700515 * @return true if the USB function is enabled
Mike Lockwoode51099f2011-08-02 12:54:49 -0400516 *
517 * {@hide}
518 */
Nick Kralevichfcf10f72015-05-13 11:54:03 -0700519 public boolean isFunctionEnabled(String function) {
Jeff Brown460a1462015-06-30 17:57:12 -0700520 try {
521 return mService.isFunctionEnabled(function);
522 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700523 throw e.rethrowFromSystemServer();
Jeff Brown460a1462015-06-30 17:57:12 -0700524 }
Mike Lockwoode51099f2011-08-02 12:54:49 -0400525 }
526
527 /**
Jeff Brown460a1462015-06-30 17:57:12 -0700528 * Sets the current USB function when in device mode.
529 * <p>
530 * USB functions represent interfaces which are published to the host to access
531 * services offered by the device.
532 * </p><p>
533 * This method is intended to select among primary USB functions. The system may
534 * automatically activate additional functions such as {@link #USB_FUNCTION_ADB}
535 * or {@link #USB_FUNCTION_ACCESSORY} based on other settings and states.
536 * </p><p>
537 * The allowed values are: {@link #USB_FUNCTION_NONE}, {@link #USB_FUNCTION_AUDIO_SOURCE},
538 * {@link #USB_FUNCTION_MIDI}, {@link #USB_FUNCTION_MTP}, {@link #USB_FUNCTION_PTP},
539 * or {@link #USB_FUNCTION_RNDIS}.
540 * </p><p>
Jerry Zhang935372b2016-10-12 15:49:32 -0700541 * Also sets whether USB data (for example, MTP exposed pictures) should be made available
542 * on the USB connection when in device mode. Unlocking usb data should only be done with
543 * user involvement, since exposing pictures or other data could leak sensitive
544 * user information.
545 * </p><p>
Jeff Brown460a1462015-06-30 17:57:12 -0700546 * Note: This function is asynchronous and may fail silently without applying
547 * the requested changes.
548 * </p>
Mike Lockwood02e45692011-06-14 15:43:51 -0400549 *
Mike Lockwood875c24b2011-07-18 10:54:32 -0700550 * @param function name of the USB function, or null to restore the default function
Jerry Zhang935372b2016-10-12 15:49:32 -0700551 * @param usbDataUnlocked whether user data is accessible
Mike Lockwood02e45692011-06-14 15:43:51 -0400552 *
553 * {@hide}
554 */
Jerry Zhang935372b2016-10-12 15:49:32 -0700555 public void setCurrentFunction(String function, boolean usbDataUnlocked) {
Mike Lockwood08bff3b2010-08-31 13:27:05 -0400556 try {
Jerry Zhang935372b2016-10-12 15:49:32 -0700557 mService.setCurrentFunction(function, usbDataUnlocked);
Nick Kralevich67401902015-06-10 09:38:42 -0700558 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700559 throw e.rethrowFromSystemServer();
Nick Kralevich67401902015-06-10 09:38:42 -0700560 }
561 }
562
563 /**
Jeff Brown76c4c662015-07-07 12:44:17 -0700564 * Returns a list of physical USB ports on the device.
565 * <p>
566 * This list is guaranteed to contain all dual-role USB Type C ports but it might
567 * be missing other ports depending on whether the kernel USB drivers have been
568 * updated to publish all of the device's ports through the new "dual_role_usb"
569 * device class (which supports all types of ports despite its name).
570 * </p>
571 *
572 * @return The list of USB ports, or null if none.
573 *
574 * @hide
575 */
576 public UsbPort[] getPorts() {
577 try {
578 return mService.getPorts();
579 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700580 throw e.rethrowFromSystemServer();
Jeff Brown76c4c662015-07-07 12:44:17 -0700581 }
Jeff Brown76c4c662015-07-07 12:44:17 -0700582 }
583
584 /**
585 * Gets the status of the specified USB port.
586 *
587 * @param port The port to query.
588 * @return The status of the specified USB port, or null if unknown.
589 *
590 * @hide
591 */
592 public UsbPortStatus getPortStatus(UsbPort port) {
593 Preconditions.checkNotNull(port, "port must not be null");
594
595 try {
596 return mService.getPortStatus(port.getId());
597 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700598 throw e.rethrowFromSystemServer();
Jeff Brown76c4c662015-07-07 12:44:17 -0700599 }
Jeff Brown76c4c662015-07-07 12:44:17 -0700600 }
601
602 /**
603 * Sets the desired role combination of the port.
604 * <p>
605 * The supported role combinations depend on what is connected to the port and may be
606 * determined by consulting
607 * {@link UsbPortStatus#isRoleCombinationSupported UsbPortStatus.isRoleCombinationSupported}.
608 * </p><p>
609 * Note: This function is asynchronous and may fail silently without applying
610 * the requested changes. If this function does cause a status change to occur then
611 * a {@link #ACTION_USB_PORT_CHANGED} broadcast will be sent.
612 * </p>
613 *
614 * @param powerRole The desired power role: {@link UsbPort#POWER_ROLE_SOURCE}
615 * or {@link UsbPort#POWER_ROLE_SINK}, or 0 if no power role.
616 * @param dataRole The desired data role: {@link UsbPort#DATA_ROLE_HOST}
617 * or {@link UsbPort#DATA_ROLE_DEVICE}, or 0 if no data role.
618 *
619 * @hide
620 */
621 public void setPortRoles(UsbPort port, int powerRole, int dataRole) {
622 Preconditions.checkNotNull(port, "port must not be null");
623 UsbPort.checkRoles(powerRole, dataRole);
624
625 try {
626 mService.setPortRoles(port.getId(), powerRole, dataRole);
627 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700628 throw e.rethrowFromSystemServer();
Jeff Brown76c4c662015-07-07 12:44:17 -0700629 }
630 }
631
Jeff Brown460a1462015-06-30 17:57:12 -0700632 /** @hide */
633 public static String addFunction(String functions, String function) {
Yasuhiro Matsuda48b9a7c2015-07-16 19:00:16 +0900634 if (USB_FUNCTION_NONE.equals(functions)) {
Jeff Brown460a1462015-06-30 17:57:12 -0700635 return function;
636 }
637 if (!containsFunction(functions, function)) {
638 if (functions.length() > 0) {
639 functions += ",";
640 }
641 functions += function;
642 }
643 return functions;
644 }
645
646 /** @hide */
647 public static String removeFunction(String functions, String function) {
648 String[] split = functions.split(",");
649 for (int i = 0; i < split.length; i++) {
650 if (function.equals(split[i])) {
651 split[i] = null;
652 }
653 }
654 if (split.length == 1 && split[0] == null) {
Yasuhiro Matsuda48b9a7c2015-07-16 19:00:16 +0900655 return USB_FUNCTION_NONE;
Jeff Brown460a1462015-06-30 17:57:12 -0700656 }
657 StringBuilder builder = new StringBuilder();
658 for (int i = 0; i < split.length; i++) {
659 String s = split[i];
660 if (s != null) {
661 if (builder.length() > 0) {
662 builder.append(",");
663 }
664 builder.append(s);
665 }
666 }
667 return builder.toString();
668 }
669
670 /** @hide */
671 public static boolean containsFunction(String functions, String function) {
672 int index = functions.indexOf(function);
673 if (index < 0) return false;
674 if (index > 0 && functions.charAt(index - 1) != ',') return false;
675 int charAfter = index + function.length();
676 if (charAfter < functions.length() && functions.charAt(charAfter) != ',') return false;
677 return true;
678 }
Mike Lockwood24236072010-06-23 17:36:36 -0400679}