Loading packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +30 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +24 −1 Original line number Diff line number Diff line Loading @@ -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"); { Loading Loading @@ -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( Loading packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading
packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +30 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading
packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +24 −1 Original line number Diff line number Diff line Loading @@ -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"); { Loading Loading @@ -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( Loading
packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading