diff options
author | 2016-11-07 06:21:43 +0000 | |
---|---|---|
committer | 2016-11-07 06:21:48 +0000 | |
commit | 2cf7c483a8049e2c657d5f4c138132167fa71ae9 (patch) | |
tree | e12011f6aa71f749cec81e0d4a857af2796a7926 | |
parent | 4b5617742903aeec0c924c298bc42fe0ffa9e5bc (diff) | |
parent | 35b2ec551f670562a779925fe152307f20ad67cd (diff) |
Merge "Not create document under the device."
3 files changed, 58 insertions, 3 deletions
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java index 0508789710b8..3fcc600e67f0 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java @@ -347,6 +347,34 @@ public class MtpDocumentsProvider extends DocumentsProvider { throw new UnsupportedOperationException( "Writing operation is not supported by the device."); } + + final int parentObjectHandle; + final int storageId; + switch (parentId.mDocumentType) { + case MtpDatabaseConstants.DOCUMENT_TYPE_DEVICE: + final String[] storageDocumentIds = + mDatabase.getStorageDocumentIds(parentId.mDocumentId); + if (storageDocumentIds.length == 1) { + final String newDocumentId = + createDocument(storageDocumentIds[0], mimeType, displayName); + notifyChildDocumentsChange(parentDocumentId); + return newDocumentId; + } else { + throw new UnsupportedOperationException( + "Cannot create a file under the device."); + } + case MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE: + storageId = parentId.mStorageId; + parentObjectHandle = -1; + break; + case MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT: + storageId = parentId.mStorageId; + parentObjectHandle = parentId.mObjectHandle; + break; + default: + throw new IllegalArgumentException("Unexpected document type."); + } + pipe = ParcelFileDescriptor.createReliablePipe(); int objectHandle = -1; MtpObjectInfo info = null; @@ -357,8 +385,8 @@ public class MtpDocumentsProvider extends DocumentsProvider { MtpConstants.FORMAT_ASSOCIATION : MediaFile.getFormatCode(displayName, mimeType); info = new MtpObjectInfo.Builder() - .setStorageId(parentId.mStorageId) - .setParent(parentId.mObjectHandle) + .setStorageId(storageId) + .setParent(parentObjectHandle) .setFormat(formatCode) .setName(displayName) .build(); diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java index 70f55530b25c..194e8c727c7a 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java @@ -549,7 +549,7 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { public void testOpenDocument_writing() throws Exception { setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); setupRoots(0, new MtpRoot[] { - new MtpRoot(0, 0, "Storage", 0, 0, "") + new MtpRoot(0, 100, "Storage", 0, 0, "") }); final String documentId = mProvider.createDocument("2", "text/plain", "test.txt"); { @@ -692,6 +692,29 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { } } + public void testCreateDocument() throws Exception { + setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); + setupRoots(0, new MtpRoot[] { + new MtpRoot(0, 100, "Storage A", 100, 100, null) + }); + final String documentId = mProvider.createDocument("1", "text/plain", "note.txt"); + final Uri deviceUri = DocumentsContract.buildChildDocumentsUri( + MtpDocumentsProvider.AUTHORITY, "1"); + final Uri storageUri = DocumentsContract.buildChildDocumentsUri( + MtpDocumentsProvider.AUTHORITY, "2"); + mResolver.waitForNotification(storageUri, 1); + mResolver.waitForNotification(deviceUri, 1); + try (final Cursor cursor = mProvider.queryDocument(documentId, null)) { + assertTrue(cursor.moveToNext()); + assertEquals( + "note.txt", + cursor.getString(cursor.getColumnIndex(Document.COLUMN_DISPLAY_NAME))); + assertEquals( + "text/plain", + cursor.getString(cursor.getColumnIndex(Document.COLUMN_MIME_TYPE))); + } + } + public void testCreateDocument_noWritingSupport() throws Exception { setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); mMtpManager.addValidDevice(new MtpDeviceRecord( diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java index 30d529a768a2..f20bbeca11dd 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import junit.framework.Assert; public class TestMtpManager extends MtpManager { public static final int CREATED_DOCUMENT_HANDLE = 1000; @@ -151,6 +152,9 @@ public class TestMtpManager extends MtpManager { @Override int createDocument(int deviceId, MtpObjectInfo objectInfo, ParcelFileDescriptor source) throws IOException { + Assert.assertNotSame(0, objectInfo.getStorageId()); + Assert.assertNotSame(-1, objectInfo.getStorageId()); + Assert.assertNotSame(0, objectInfo.getParent()); final String key = pack(deviceId, CREATED_DOCUMENT_HANDLE); if (mObjectInfos.containsKey(key)) { throw new IOException(); |