diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java index 9c726ba24ce65..0d81a30fbaafb 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java @@ -188,6 +188,15 @@ class MtpManager { } } + @VisibleForTesting + long getPartialObject(int deviceId, int objectHandle, long offset, long size, byte[] buffer) + throws IOException { + final MtpDevice device = getDevice(deviceId); + synchronized (device) { + return device.getPartialObject(objectHandle, offset, size, buffer); + } + } + byte[] getThumbnail(int deviceId, int objectHandle) throws IOException { final MtpDevice device = getDevice(deviceId); synchronized (device) { diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerTest.java index 7527f549e87f5..25e990011a544 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerTest.java @@ -21,8 +21,10 @@ import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.mtp.MtpConstants; import android.mtp.MtpEvent; +import android.mtp.MtpObjectInfo; import android.os.CancellationSignal; import android.os.OperationCanceledException; +import android.os.ParcelFileDescriptor; import android.os.SystemClock; import android.test.InstrumentationTestCase; @@ -98,6 +100,52 @@ public class MtpManagerTest extends InstrumentationTestCase { } } + public void testCreateDocumentAndGetPartialObject() throws Exception { + final ParcelFileDescriptor[] fds = ParcelFileDescriptor.createPipe(); + final ParcelFileDescriptor.AutoCloseOutputStream stream = + new ParcelFileDescriptor.AutoCloseOutputStream(fds[1]); + int storageId = 0; + for (final MtpDeviceRecord record : mManager.getDevices()) { + if (record.deviceId == mUsbDevice.getDeviceId()) { + storageId = record.roots[0].mStorageId; + break; + } + } + assertTrue("Valid storage not found.", storageId != 0); + final String testFileName = "MtpManagerTest_testFile.txt"; + for (final int handle : mManager.getObjectHandles( + mUsbDevice.getDeviceId(), storageId, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN)) { + if (mManager.getObjectInfo(mUsbDevice.getDeviceId(), handle) + .getName().equals(testFileName)) { + mManager.deleteDocument(mUsbDevice.getDeviceId(), handle); + break; + } + } + final byte[] expectedBytes = "Hello Android!".getBytes("ascii"); + final int objectHandle; + try { + stream.write(expectedBytes); + objectHandle = mManager.createDocument( + mUsbDevice.getDeviceId(), + new MtpObjectInfo.Builder() + .setStorageId(storageId) + .setName(testFileName) + .setCompressedSize(expectedBytes.length) + .setFormat(MtpConstants.FORMAT_TEXT) + .build(), + fds[0]); + } finally { + stream.close(); + } + final byte[] bytes = new byte[100]; + assertEquals(5, mManager.getPartialObject( + mUsbDevice.getDeviceId(), objectHandle, 0, 5, bytes)); + assertEquals("Hello", new String(bytes, 0, 5, "ascii")); + assertEquals(8, mManager.getPartialObject( + mUsbDevice.getDeviceId(), objectHandle, 6, 100, bytes)); + assertEquals("Android!", new String(bytes, 0, 8, "ascii")); + } + private Context getContext() { return getInstrumentation().getContext(); }