summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Daichi Hirono <hirono@google.com> 2015-07-27 07:01:49 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2015-07-27 07:01:49 +0000
commit2e6eb521bca297e6dd6581d3fbecd9df02b7375c (patch)
treefcce83b7f268fa3ed365c6bafc40e8561a017923
parent675032330f0c9d5e6d5cf6e55b23123497b467d7 (diff)
parent21c20ad32ceaf9686b823c1a0ea20d114979b63d (diff)
Merge "Implement openDevice/closeDevice method of MtpManager."
-rw-r--r--packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java66
1 files changed, 59 insertions, 7 deletions
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java
index eea38b124714..466a3ac28b54 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java
@@ -17,6 +17,11 @@
package com.android.mtp;
import android.content.Context;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbDeviceConnection;
+import android.hardware.usb.UsbManager;
+import android.mtp.MtpDevice;
+import android.util.SparseArray;
import java.io.IOException;
@@ -24,19 +29,66 @@ import java.io.IOException;
* The model wrapping android.mtp API.
*/
class MtpManager {
+ private final UsbManager mManager;
+ // TODO: Save and restore the set of opened device.
+ private final SparseArray<MtpDevice> mDevices = new SparseArray<MtpDevice>();
+
MtpManager(Context context) {
+ mManager = (UsbManager)context.getSystemService(Context.USB_SERVICE);
}
- void openDevice(int deviceId) throws IOException {
- // TODO: Implement this method.
+ synchronized void openDevice(int deviceId) throws IOException {
+ UsbDevice rawDevice = null;
+ for (final UsbDevice candidate : mManager.getDeviceList().values()) {
+ if (candidate.getDeviceId() == deviceId) {
+ rawDevice = candidate;
+ break;
+ }
+ }
+
+ if (rawDevice == null) {
+ throw new IOException("Not found USB device: " + deviceId);
+ }
+
+ if (!mManager.hasPermission(rawDevice)) {
+ // Permission should be obtained via app selection dialog for intent.
+ throw new IOException("No parmission to operate USB device.");
+ }
+
+ final MtpDevice device = new MtpDevice(rawDevice);
+
+ final UsbDeviceConnection connection = mManager.openDevice(rawDevice);
+ if (connection == null) {
+ throw new IOException("Failed to open a USB connection.");
+ }
+
+ if (!device.open(connection)) {
+ throw new IOException("Failed to open a MTP device.");
+ }
+
+ // Handle devices that fail to obtain storages just after opening a MTP session.
+ final int[] storageIds = device.getStorageIds();
+ if (storageIds == null || storageIds.length == 0) {
+ throw new IOException("Not found MTP storages in the device.");
+ }
+
+ mDevices.put(deviceId, device);
}
- void closeDevice(int deviceId) throws IOException {
- // TODO: Implement this method.
+ synchronized void closeDevice(int deviceId) throws IOException {
+ final MtpDevice device = mDevices.get(deviceId);
+ if (device == null) {
+ throw new IOException("USB device " + deviceId + " is not opened.");
+ }
+ mDevices.get(deviceId).close();
+ mDevices.remove(deviceId);
}
- int[] getOpenedDeviceIds() {
- // TODO: Implement this method.
- return null;
+ synchronized int[] getOpenedDeviceIds() {
+ final int[] result = new int[mDevices.size()];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = mDevices.keyAt(i);
+ }
+ return result;
}
}