diff options
| -rw-r--r-- | packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java | 18 | ||||
| -rw-r--r-- | packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java | 73 |
2 files changed, 91 insertions, 0 deletions
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java index 5d2270840456..f1e24b80fad9 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java @@ -442,6 +442,24 @@ public class MtpDocumentsProvider extends DocumentsProvider { } } + @Override + public boolean isChildDocument(String parentDocumentId, String documentId) { + try { + Identifier identifier = mDatabase.createIdentifier(documentId); + while (true) { + if (parentDocumentId.equals(identifier.mDocumentId)) { + return true; + } + if (identifier.mDocumentType == MtpDatabaseConstants.DOCUMENT_TYPE_DEVICE) { + return false; + } + identifier = mDatabase.getParentIdentifier(identifier.mDocumentId); + } + } catch (FileNotFoundException error) { + return false; + } + } + void openDevice(int deviceId) throws IOException { synchronized (mDeviceListLock) { if (mDeviceToolkits.containsKey(deviceId)) { diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java index 2bd190f7411b..8831ae292fe6 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java @@ -34,6 +34,8 @@ import android.test.suitebuilder.annotation.MediumTest; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; +import java.util.LinkedList; +import java.util.Queue; import java.util.concurrent.TimeoutException; import static com.android.mtp.MtpDatabase.strings; @@ -792,6 +794,18 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { assertEquals(0x400000000L, cursor.getLong(0)); } + public void testIsChildDocument() throws Exception { + setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); + setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") }); + setupHierarchyDocuments("1"); + assertTrue(mProvider.isChildDocument("1", "1")); + assertTrue(mProvider.isChildDocument("1", "14")); + assertTrue(mProvider.isChildDocument("2", "14")); + assertTrue(mProvider.isChildDocument("5", "14")); + assertFalse(mProvider.isChildDocument("3", "14")); + assertFalse(mProvider.isChildDocument("6", "14")); + } + private void setupProvider(int flag) { mDatabase = new MtpDatabase(getContext(), flag); mProvider = new MtpDocumentsProvider(); @@ -845,4 +859,63 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { return getStrings(mProvider.queryChildDocuments( parentDocumentId, strings(DocumentsContract.Document.COLUMN_DOCUMENT_ID), null)); } + + static class HierarchyDocument { + int depth; + String documentId; + int objectHandle; + int parentHandle; + + HierarchyDocument createChildDocument(int newHandle) { + final HierarchyDocument doc = new HierarchyDocument(); + doc.depth = depth - 1; + doc.objectHandle = newHandle; + doc.parentHandle = objectHandle; + return doc; + } + + MtpObjectInfo toObjectInfo() { + return new MtpObjectInfo.Builder() + .setName("doc_" + documentId) + .setFormat(depth > 0 ? + MtpConstants.FORMAT_ASSOCIATION : MtpConstants.FORMAT_TEXT) + .setObjectHandle(objectHandle) + .setParent(parentHandle) + .build(); + } + } + + private void setupHierarchyDocuments(String documentId) throws Exception { + final Queue<HierarchyDocument> ids = new LinkedList<>(); + final HierarchyDocument firstDocument = new HierarchyDocument(); + firstDocument.depth = 3; + firstDocument.documentId = documentId; + firstDocument.objectHandle = MtpManager.OBJECT_HANDLE_ROOT_CHILDREN; + ids.add(firstDocument); + + int objectHandle = 100; + while (!ids.isEmpty()) { + final HierarchyDocument document = ids.remove(); + final HierarchyDocument[] children = new HierarchyDocument[] { + document.createChildDocument(objectHandle++), + document.createChildDocument(objectHandle++), + document.createChildDocument(objectHandle++), + }; + final String[] childDocIds = setupDocuments( + 0, 0, document.objectHandle, document.documentId, new MtpObjectInfo[] { + children[0].toObjectInfo(), + children[1].toObjectInfo(), + children[2].toObjectInfo(), + }); + children[0].documentId = childDocIds[0]; + children[1].documentId = childDocIds[1]; + children[2].documentId = childDocIds[2]; + + if (children[0].depth > 0) { + ids.add(children[0]); + ids.add(children[1]); + ids.add(children[2]); + } + } + } } |