summaryrefslogtreecommitdiff
path: root/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java')
-rw-r--r--packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java55
1 files changed, 53 insertions, 2 deletions
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
index db88f2c038ec..eb2d8aa71955 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
@@ -17,11 +17,13 @@
package com.android.mtp;
import android.content.ContentResolver;
+import android.content.ContentValues;
import android.content.Context;
import android.content.UriPermission;
import android.content.res.AssetFileDescriptor;
import android.content.res.Resources;
import android.database.Cursor;
+import android.database.DatabaseUtils;
import android.database.MatrixCursor;
import android.database.sqlite.SQLiteDiskIOException;
import android.graphics.Point;
@@ -55,7 +57,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeoutException;
-
import libcore.io.IoUtils;
/**
@@ -177,7 +178,57 @@ public class MtpDocumentsProvider extends DocumentsProvider {
if (projection == null) {
projection = MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION;
}
- return mDatabase.queryDocument(documentId, projection);
+ final Cursor cursor = mDatabase.queryDocument(documentId, projection);
+ final int cursorCount = cursor.getCount();
+ if (cursorCount == 0) {
+ cursor.close();
+ throw new FileNotFoundException();
+ } else if (cursorCount != 1) {
+ cursor.close();
+ Log.wtf(TAG, "Unexpected cursor size: " + cursorCount);
+ return null;
+ }
+
+ final Identifier identifier = mDatabase.createIdentifier(documentId);
+ if (identifier.mDocumentType != MtpDatabaseConstants.DOCUMENT_TYPE_DEVICE) {
+ return cursor;
+ }
+ final String[] storageDocIds = mDatabase.getStorageDocumentIds(documentId);
+ if (storageDocIds.length != 1) {
+ return mDatabase.queryDocument(documentId, projection);
+ }
+
+ // If the documentId specifies a device having exact one storage, we repalce some device
+ // attributes with the storage attributes.
+ try {
+ final String storageName;
+ final int storageFlags;
+ try (final Cursor storageCursor = mDatabase.queryDocument(
+ storageDocIds[0],
+ MtpDatabase.strings(Document.COLUMN_DISPLAY_NAME, Document.COLUMN_FLAGS))) {
+ if (!storageCursor.moveToNext()) {
+ throw new FileNotFoundException();
+ }
+ storageName = storageCursor.getString(0);
+ storageFlags = storageCursor.getInt(1);
+ }
+
+ cursor.moveToNext();
+ final ContentValues values = new ContentValues();
+ DatabaseUtils.cursorRowToContentValues(cursor, values);
+ if (values.containsKey(Document.COLUMN_DISPLAY_NAME)) {
+ values.put(Document.COLUMN_DISPLAY_NAME, mResources.getString(
+ R.string.root_name,
+ values.getAsString(Document.COLUMN_DISPLAY_NAME),
+ storageName));
+ }
+ values.put(Document.COLUMN_FLAGS, storageFlags);
+ final MatrixCursor output = new MatrixCursor(projection, 1);
+ MtpDatabase.putValuesToCursor(values, output);
+ return output;
+ } finally {
+ cursor.close();
+ }
}
@Override